diff options
Diffstat (limited to 'attic/muse2-oom/muse2/muse/widgets/canvas.cpp')
-rw-r--r-- | attic/muse2-oom/muse2/muse/widgets/canvas.cpp | 1463 |
1 files changed, 0 insertions, 1463 deletions
diff --git a/attic/muse2-oom/muse2/muse/widgets/canvas.cpp b/attic/muse2-oom/muse2/muse/widgets/canvas.cpp deleted file mode 100644 index 4ea5f568..00000000 --- a/attic/muse2-oom/muse2/muse/widgets/canvas.cpp +++ /dev/null @@ -1,1463 +0,0 @@ -//========================================================= -// MusE -// Linux Music Editor -// $Id: canvas.cpp,v 1.10.2.17 2009/05/03 04:14:01 terminator356 Exp $ -// (C) Copyright 1999 Werner Schweer (ws@seh.de) -//========================================================= - -#include <stdio.h> - -#include "canvas.h" - -#include <QApplication> -#include <QMenu> -#include <QPainter> -#include <QCursor> -#include <QTimer> -#include <QKeyEvent> -#include <QMouseEvent> -#include <QWheelEvent> - -#include "song.h" -#include "event.h" -#include "citem.h" -#include "icons.h" -#include "../marker/marker.h" -#include "part.h" - -#define ABS(x) ((x) < 0) ? -(x) : (x) - -//--------------------------------------------------------- -// Canvas -//--------------------------------------------------------- - -Canvas::Canvas(QWidget* parent, int sx, int sy, const char* name) - : View(parent, sx, sy, name) - { - canvasTools = 0; - itemPopupMenu = 0; - - button = Qt::NoButton; - keyState = 0; - - canScrollLeft = true; - canScrollRight = true; - canScrollUp = true; - canScrollDown = true; - hscrollDir = HSCROLL_NONE; - vscrollDir = VSCROLL_NONE; - scrollTimer=NULL; - - scrollSpeed=10; // hardcoded scroll jump - - drag = DRAG_OFF; - _tool = PointerTool; - pos[0] = song->cpos(); - pos[1] = song->lpos(); - pos[2] = song->rpos(); - curPart = NULL; - curPartId = -1; - curItem = NULL; - connect(song, SIGNAL(posChanged(int, unsigned, bool)), this, SLOT(setPos(int, unsigned, bool))); - } - -//--------------------------------------------------------- -// setPos -// set one of three markers -// idx - 0-cpos 1-lpos 2-rpos -// flag - emit followEvent() -//--------------------------------------------------------- - -void Canvas::setPos(int idx, unsigned val, bool adjustScrollbar) - { - //if (pos[idx] == val) // Seems to be some refresh problems here, pos[idx] might be val but the gui not updated. - // return; // skipping this return forces update even if values match. Matching values only seem - // to occur when initializing - int opos = mapx(pos[idx]); - int npos = mapx(val); - - if (adjustScrollbar && idx == 0) { - switch (song->follow()) { - case Song::NO: - break; - case Song::JUMP: - if (npos >= width()) { - int ppos = val - xorg - rmapxDev(width()/8); - if (ppos < 0) - ppos = 0; - emit followEvent(ppos); - opos = mapx(pos[idx]); - npos = mapx(val); - } - else if (npos < 0) { - int ppos = val - xorg - rmapxDev(width()*3/4); - if (ppos < 0) - ppos = 0; - emit followEvent(ppos); - opos = mapx(pos[idx]); - npos = mapx(val); - } - break; - case Song::CONTINUOUS: - if (npos > (width()/2)) { - int ppos = pos[idx] - xorg - rmapxDev(width()/2); - if (ppos < 0) - ppos = 0; - emit followEvent(ppos); - opos = mapx(pos[idx]); - npos = mapx(val); - } - else if (npos < (width()/2)) { - int ppos = pos[idx] - xorg - rmapxDev(width()/2); - if (ppos < 0) - ppos = 0; - emit followEvent(ppos); - opos = mapx(pos[idx]); - npos = mapx(val); - } - break; - } - } - - int x; - int w = 1; - if (opos > npos) { - w += opos - npos; - x = npos; - } - else { - w += npos - opos; - x = opos; - } - pos[idx] = val; - redraw(QRect(x-1, 0, w+2, height())); - } - -//--------------------------------------------------------- -// draw -//--------------------------------------------------------- - -void Canvas::draw(QPainter& p, const QRect& rect) -{ -// printf("draw canvas %x virt %d\n", this, virt()); - - int x = rect.x(); - int y = rect.y(); - int w = rect.width(); - int h = rect.height(); - int x2 = x + w; - - if (virt()) { - drawCanvas(p, rect); - - //--------------------------------------------------- - // draw Canvas Items - //--------------------------------------------------- - - iCItem to(items.lower_bound(x2)); - - // Draw items from other parts behind all others. - // Only for items with events (not arranger parts). - for(iCItem i = items.begin(); i != to; ++i) - { - CItem* ci = i->second; - if(!ci->event().empty() && ci->part() != curPart) - { - drawItem(p, ci, rect); - } - } - - for (iCItem i = items.begin(); i != to; ++i) - { - CItem* ci = i->second; - // Draw unselected parts behind selected. - if(!ci->isSelected() && !ci->isMoving() && (ci->event().empty() || ci->part() == curPart)) - { - drawItem(p, ci, rect); - } - } - - // Draw selected parts in front of unselected. - for (iCItem i = items.begin(); i != to; ++i) - { - CItem* ci = i->second; - if(ci->isSelected() && !ci->isMoving() && (ci->event().empty() || ci->part() == curPart)) - { - drawItem(p, ci, rect); - } - } - to = moving.lower_bound(x2); - for (iCItem i = moving.begin(); i != to; ++i) - { - drawItem(p, i->second, rect); - } - } - else { - p.save(); - setPainter(p); - - if (xmag <= 0) { - x -= 1; - w += 2; - x = (x + xpos + rmapx(xorg)) * (-xmag); - w = w * (-xmag); - } - else { - x = (x + xpos + rmapx(xorg)) / xmag; - w = (w + xmag - 1) / xmag; - x -= 1; - w += 2; - } - if (ymag <= 0) { - y -= 1; - h += 2; - y = (y + ypos + rmapy(yorg)) * (-ymag); - h = h * (-ymag); - } - else { - y = (rect.y() + ypos + rmapy(yorg))/ymag; - h = (rect.height()+ymag-1)/ymag; - y -= 1; - h += 2; - } - - if (x < 0) - x = 0; - if (y < 0) - y = 0; - x2 = x + w; - - drawCanvas(p, QRect(x, y, w, h)); - p.restore(); - - //--------------------------------------------------- - // draw Canvas Items - //--------------------------------------------------- - - // Draw items from other parts behind all others. - // Only for items with events (not arranger parts). - for(iCItem i = items.begin(); i != items.end(); ++i) - { - CItem* ci = i->second; - if(!ci->event().empty() && ci->part() != curPart) - { - drawItem(p, ci, rect); - } - } - - for (iCItem i = items.begin(); i != items.end(); ++i) { - CItem* ci = i->second; - // Draw unselected parts behind selected. - if(!ci->isSelected() && !ci->isMoving() && (ci->event().empty() || ci->part() == curPart)) - { - drawItem(p, ci, rect); - } - } - - // Draw selected parts in front of unselected. - for (iCItem i = items.begin(); i != items.end(); ++i) { - CItem* ci = i->second; - if(ci->isSelected() && !ci->isMoving() && (ci->event().empty() || ci->part() == curPart)) - { - drawItem(p, ci, rect); - } - } - for (iCItem i = moving.begin(); i != moving.end(); ++i) - { - drawItem(p, i->second, rect); - } - p.save(); - setPainter(p); - } - - //--------------------------------------------------- - // draw marker - //--------------------------------------------------- - - int y2 = y + h; - MarkerList* marker = song->marker(); - for (iMarker m = marker->begin(); m != marker->end(); ++m) { - int xp = m->second.tick(); - if (xp >= x && xp < x+w) { - p.setPen(Qt::green); - p.drawLine(xp, y, xp, y2); - } - } - - // //--------------------------------------------------- - // // draw location marker - // //--------------------------------------------------- - - // p.setPen(Qt::blue); - // if (pos[1] >= unsigned(x) && pos[1] < unsigned(x2)) - // { - // p.drawLine(pos[1], y, pos[1], y2); - // } - // if (pos[2] >= unsigned(x) && pos[2] < unsigned(x2)) - // p.drawLine(pos[2], y, pos[2], y2); - // - // QPen playbackPen(QColor(51,56,55), 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin); - // p.setPen(playbackPen); - // //p.setPen(Qt::red); - - // if (pos[0] >= unsigned(x) && pos[0] < unsigned(x2)) - // { - // p.drawLine(pos[0], y, pos[0], y2); - // } - // - - //--------------------------------------------------- - // draw lasso - //--------------------------------------------------- - - if (drag == DRAG_LASSO) - { - p.setPen(QColor(181,109,16)); - p.setBrush(Qt::NoBrush); - p.drawRect(lasso); - } - - //--------------------------------------------------- - // draw moving items - //--------------------------------------------------- - - if(virt()) - { - for(iCItem i = moving.begin(); i != moving.end(); ++i) - drawMoving(p, i->second, rect); - } - else - { - p.restore(); - for(iCItem i = moving.begin(); i != moving.end(); ++i) - drawMoving(p, i->second, rect); - setPainter(p); - } - //--------------------------------------------------- - // draw location marker - //--------------------------------------------------- - - //p.setPen(Qt::blue); - p.setPen(QColor(139,225,69)); - if (pos[1] >= unsigned(x) && pos[1] < unsigned(x2)) - { - p.drawLine(pos[1], y, pos[1], y2); - } - if (pos[2] >= unsigned(x) && pos[2] < unsigned(x2)) - p.drawLine(pos[2], y, pos[2], y2); - - //QPen playbackPen(QColor(8,193,156), 1); - //p.setPen(playbackPen); - //p.setPen(Qt::green); - p.setPen(QColor(0,186,255)); - - if (pos[0] >= unsigned(x) && pos[0] < unsigned(x2)) - { - p.drawLine(pos[0], y, pos[0], y2); - } - -} - -#define WHEEL_STEPSIZE 40 -#define WHEEL_DELTA 120 - -//--------------------------------------------------------- -// wheelEvent -//--------------------------------------------------------- -void Canvas::wheelEvent(QWheelEvent* ev) - { - int delta = ev->delta() / WHEEL_DELTA; - int ypixelscale = rmapyDev(1); - - if (ypixelscale <= 0) - ypixelscale = 1; - - int scrollstep = WHEEL_STEPSIZE * (-delta); - ///if (ev->state() == Qt::ShiftModifier) - if (((QInputEvent*)ev)->modifiers() == Qt::ShiftModifier) - scrollstep = scrollstep / 10; - - int newYpos = ypos + ypixelscale * scrollstep; - - if (newYpos < 0) - newYpos = 0; - - //setYPos(newYpos); - emit verticalScroll((unsigned)newYpos); - -} - -void Canvas::redirectedWheelEvent(QWheelEvent* ev) -{ - wheelEvent(ev); -} - -//--------------------------------------------------------- -// deselectAll -//--------------------------------------------------------- - -void Canvas::deselectAll() -{ - for (iCItem i = items.begin(); i != items.end(); ++i) - i->second->setSelected(false); -} - -//--------------------------------------------------------- -// selectItem -//--------------------------------------------------------- - -void Canvas::selectItem(CItem* e, bool flag) -{ - e->setSelected(flag); -} - -//--------------------------------------------------------- -// startMoving -// copy selection-List to moving-List -//--------------------------------------------------------- - -void Canvas::startMoving(const QPoint& pos, DragType) -{ - for (iCItem i = items.begin(); i != items.end(); ++i) { - if (i->second->isSelected()) { - i->second->setMoving(true); - moving.add(i->second); - } - } - moveItems(pos, 0); -} - -//--------------------------------------------------------- -// moveItems -// dir = 0 move in all directions -// 1 move only horizontal -// 2 move only vertical -//--------------------------------------------------------- - -void Canvas::moveItems(const QPoint& pos, int dir = 0, bool rasterize) -{ - int dp; - if(rasterize) - dp = y2pitch(pos.y()) - y2pitch(start.y()); - else - dp = pos.y() - start.y(); - int dx = pos.x() - start.x(); - if (dir == 1) - dp = 0; - else if (dir == 2) - dx = 0; - for (iCItem i = moving.begin(); i != moving.end(); ++i) { - int x = i->second->pos().x(); - int y = i->second->pos().y(); - int nx = x + dx; - int ny; - QPoint mp; - if(rasterize) - { - ny = pitch2y(y2pitch(y) + dp); - mp = raster(QPoint(nx, ny)); - } - else - { - ny = y + dp; - mp = QPoint(nx, ny); - } - if (i->second->mp() != mp) - { - i->second->setMp(mp); - itemMoved(i->second, mp); - } - } - redraw(); -} - -//--------------------------------------------------------- -// viewKeyPressEvent -//--------------------------------------------------------- - -void Canvas::viewKeyPressEvent(QKeyEvent* event) - { - keyPress(event); - } - -//--------------------------------------------------------- -// viewMousePressEvent -//--------------------------------------------------------- - -void Canvas::viewMousePressEvent(QMouseEvent* event) - { - ///keyState = event->state(); - keyState = ((QInputEvent*)event)->modifiers(); - button = event->button(); - - //printf("viewMousePressEvent buttons:%x mods:%x button:%x\n", (int)event->buttons(), (int)keyState, event->button()); - - // special events if right button is clicked while operations - // like moving or drawing lasso is performed. - ///if (event->stateAfter() & Qt::RightButton) { - if (event->buttons() & Qt::RightButton & ~(event->button())) { - //printf("viewMousePressEvent special buttons:%x mods:%x button:%x\n", (int)event->buttons(), (int)keyState, event->button()); - switch (drag) { - case DRAG_LASSO: - drag = DRAG_OFF; - redraw(); - return; - case DRAG_MOVE: - drag = DRAG_OFF; - endMoveItems (start, MOVE_MOVE, 0); - return; - default: - break; - } - } - - // ignore event if (another) button is already active: - ///if (keyState & (Qt::LeftButton|Qt::RightButton|Qt::MidButton)) { - if (event->buttons() & (Qt::LeftButton|Qt::RightButton|Qt::MidButton) & ~(event->button())) { - //printf("viewMousePressEvent ignoring buttons:%x mods:%x button:%x\n", (int)event->buttons(), (int)keyState, event->button()); - return; - } - bool shift = keyState & Qt::ShiftModifier; - bool alt = keyState & Qt::AltModifier; - bool ctrl = keyState & Qt::ControlModifier; - start = event->pos(); - - //--------------------------------------------------- - // set curItem to item mouse is pointing - // (if any) - //--------------------------------------------------- - - if (virt()) - curItem = items.find(start); - else { - curItem = 0; - iCItem ius; - bool usfound = false; - for (iCItem i = items.begin(); i != items.end(); ++i) { - QRect box = i->second->bbox(); - int x = rmapxDev(box.x()); - int y = rmapyDev(box.y()); - int w = rmapxDev(box.width()); - int h = rmapyDev(box.height()); - QRect r(x, y, w, h); - ///r.moveBy(i->second->pos().x(), i->second->pos().y()); - r.translate(i->second->pos().x(), i->second->pos().y()); - if (r.contains(start)) { - if(i->second->isSelected()) - { - curItem = i->second; - break; - } - else - if(!usfound) - { - ius = i; - usfound = true; - } - } - } - if(!curItem && usfound) - curItem = ius->second; - } - - if (curItem && (event->button() == Qt::MidButton)) { - if (!curItem->isSelected()) { - selectItem(curItem, true); - updateSelection(); - redraw(); - } - startDrag(curItem, shift); - } - else if (event->button() == Qt::RightButton) { - if (curItem) { - if (shift) { - drag = DRAG_RESIZE; - setCursor(); - int dx = start.x() - curItem->x(); - curItem->setWidth(dx); - start.setX(curItem->x()); - deselectAll(); - selectItem(curItem, true); - updateSelection(); - redraw(); - } - else { - itemPopupMenu = genItemPopup(curItem); - if (itemPopupMenu) { - QAction *act = itemPopupMenu->exec(QCursor::pos()); - if (act) - itemPopup(curItem, act->data().toInt(), start); - delete itemPopupMenu; - } - } - } - else { - canvasPopupMenu = genCanvasPopup(); - if (canvasPopupMenu) { - QAction *act = canvasPopupMenu->exec(QCursor::pos(), 0); - if (act) - canvasPopup(act->data().toInt()); - delete canvasPopupMenu; - } - } - } - else if (event->button() == Qt::LeftButton) { - switch (_tool) { - case PointerTool: - if (curItem) { - if (curItem->part() != curPart) { - curPart = curItem->part(); - curPartId = curPart->sn(); - curPartChanged(); - } - itemPressed(curItem); - // Changed by T356. Alt is default reserved for moving the whole window in KDE. Changed to Shift-Alt. - // Hmm, nope, shift-alt is also reserved sometimes. Must find a way to bypass, - // why make user turn off setting? Left alone for now... - if (shift) - drag = DRAG_COPY_START; - else if (alt) { - drag = DRAG_CLONE_START; - } - // - //if (shift) - //{ - // if (alt) - // drag = DRAG_CLONE_START; - // else - // drag = DRAG_COPY_START; - //} - else if (ctrl) { //Select all on the same pitch (e.g. same y-value) - deselectAll(); - //printf("Yes, ctrl and press\n"); - for (iCItem i = items.begin(); i != items.end(); ++i) { - if (i->second->y() == curItem->y() ) - selectItem(i->second, true); - } - updateSelection(); - redraw(); - } - else - drag = DRAG_MOVE_START; - } - else - drag = DRAG_LASSO_START; - setCursor(); - break; - - case RubberTool: - deleteItem(start); - drag = DRAG_DELETE; - setCursor(); - break; - - case PencilTool: - if (curItem) { - drag = DRAG_RESIZE; - setCursor(); - int dx = start.x() - curItem->x(); - curItem->setWidth(dx); - start.setX(curItem->x()); - } - else { - drag = DRAG_NEW; - setCursor(); - curItem = newItem(start, event->modifiers()); - if (curItem) - items.add(curItem); - else { - drag = DRAG_OFF; - setCursor(); - } - } - deselectAll(); - if (curItem) - selectItem(curItem, true); - updateSelection(); - redraw(); - break; - - default: - break; - } - } - mousePress(event); - } - -void Canvas::scrollTimerDone() -{ - //printf("Canvas::scrollTimerDone drag:%d doScroll:%d\n", drag, doScroll); - - if (drag != DRAG_OFF && doScroll) - { - //printf("Canvas::scrollTimerDone drag != DRAG_OFF && doScroll\n"); - - bool doHMove = false; - bool doVMove = false; - int hoff = rmapx(xOffset())+mapx(xorg)-1; - int curxpos; - switch(hscrollDir) - { - case HSCROLL_RIGHT: - hoff += scrollSpeed; - switch(drag) - { - case DRAG_NEW: - case DRAG_RESIZE: - case DRAGX_MOVE: - case DRAGX_COPY: - case DRAGX_CLONE: - case DRAGY_MOVE: - case DRAGY_COPY: - case DRAGY_CLONE: - case DRAG_MOVE: - case DRAG_COPY: - case DRAG_CLONE: - emit horizontalScrollNoLimit(hoff); - canScrollLeft = true; - ev_pos.setX(rmapxDev(rmapx(ev_pos.x()) + scrollSpeed)); - doHMove = true; - break; - default: - if(canScrollRight) - { - curxpos = xpos; - emit horizontalScroll(hoff); - if(xpos <= curxpos) - { - canScrollRight = false; - } - else - { - canScrollLeft = true; - ev_pos.setX(rmapxDev(rmapx(ev_pos.x()) + scrollSpeed)); - doHMove = true; - } - } - else - { - } - break; - } - break; - case HSCROLL_LEFT: - if(canScrollLeft) - { - curxpos = xpos; - hoff -= scrollSpeed; - emit horizontalScroll(hoff); - if(xpos >= curxpos) - { - canScrollLeft = false; - } - else - { - canScrollRight = true; - ev_pos.setX(rmapxDev(rmapx(ev_pos.x()) - scrollSpeed)); - doHMove = true; - } - } - else - { - } - break; - default: - break; - } - int voff = rmapy(yOffset())+mapy(yorg); - int curypos; - switch(vscrollDir) - { - case VSCROLL_DOWN: - if(canScrollDown) - { - curypos = ypos; - voff += scrollSpeed; - emit verticalScroll(voff); - if(ypos <= curypos) - { - canScrollDown = false; - } - else - { - canScrollUp = true; - ev_pos.setY(rmapyDev(rmapy(ev_pos.y()) + scrollSpeed)); - doVMove = true; - } - } - else - { - } - break; - case VSCROLL_UP: - if(canScrollUp) - { - curypos = ypos; - voff -= scrollSpeed; - emit verticalScroll(voff); - if(ypos >= curypos) - { - canScrollUp = false; - } - else - { - canScrollDown = true; - ev_pos.setY(rmapyDev(rmapy(ev_pos.y()) - scrollSpeed)); - doVMove = true; - } - } - else - { - } - break; - default: - break; - } - - //printf("Canvas::scrollTimerDone doHMove:%d doVMove:%d\n", doHMove, doVMove); - - if(!doHMove && !doVMove) - { - delete scrollTimer; - scrollTimer=NULL; - doScroll = false; - return; - } - QPoint dist = ev_pos - start; - switch(drag) - { - case DRAG_MOVE: - case DRAG_COPY: - case DRAG_CLONE: - moveItems(ev_pos, 0, false); - break; - case DRAGX_MOVE: - case DRAGX_COPY: - case DRAGX_CLONE: - moveItems(ev_pos, 1, false); - break; - case DRAGY_MOVE: - case DRAGY_COPY: - case DRAGY_CLONE: - moveItems(ev_pos, 2, false); - break; - case DRAG_LASSO: - lasso = QRect(start.x(), start.y(), dist.x(), dist.y()); - redraw(); - break; - case DRAG_NEW: - case DRAG_RESIZE: - if (dist.x()) { - if (dist.x() < 1) - curItem->setWidth(1); - else - curItem->setWidth(dist.x()); - redraw(); - } - break; - default: - break; - } - //printf("Canvas::scrollTimerDone starting scrollTimer: Currently active?%d\n", scrollTimer->isActive()); - - // p3.3.43 Make sure to yield to other events (for up to 3 seconds), otherwise other events - // take a long time to reach us, causing scrolling to take a painfully long time to stop. - // FIXME: Didn't help at all. - //qApp->processEvents(); - // No, try up to 100 ms for each yield. - //qApp->processEvents(100); - // - //scrollTimer->start( 40, TRUE ); // X ms single-shot timer - // OK, changing the timeout from 40 to 80 helped. - //scrollTimer->start( 80, TRUE ); // X ms single-shot timer - scrollTimer->setSingleShot(true); - scrollTimer->start(80); - } - else - { - //printf("Canvas::scrollTimerDone !(drag != DRAG_OFF && doScroll) deleting scrollTimer\n"); - - delete scrollTimer; - scrollTimer=NULL; - } -} - - -//--------------------------------------------------------- -// viewMouseMoveEvent -//--------------------------------------------------------- - -void Canvas::viewMouseMoveEvent(QMouseEvent* event) - { - - ev_pos = event->pos(); - QPoint dist = ev_pos - start; - int ax = ABS(rmapx(dist.x())); - int ay = ABS(rmapy(dist.y())); - bool moving = (ax >= 2) || (ay > 2); - - // set scrolling variables: doScroll, scrollRight - if (drag != DRAG_OFF) { - - - int ex = rmapx(event->x())+mapx(0); - if(ex < 40 && canScrollLeft) - hscrollDir = HSCROLL_LEFT; - else - if(ex > (width() - 40)) - switch(drag) - { - case DRAG_NEW: - case DRAG_RESIZE: - case DRAGX_MOVE: - case DRAGX_COPY: - case DRAGX_CLONE: - case DRAGY_MOVE: - case DRAGY_COPY: - case DRAGY_CLONE: - case DRAG_MOVE: - case DRAG_COPY: - case DRAG_CLONE: - hscrollDir = HSCROLL_RIGHT; - break; - default: - if(canScrollRight) - hscrollDir = HSCROLL_RIGHT; - else - hscrollDir = HSCROLL_NONE; - break; - } - else - hscrollDir = HSCROLL_NONE; - int ey = rmapy(event->y())+mapy(0); - if(ey < 15 && canScrollUp) - vscrollDir = VSCROLL_UP; - else - if(ey > (height() - 15) && canScrollDown) - vscrollDir = VSCROLL_DOWN; - else - vscrollDir = VSCROLL_NONE; - if(hscrollDir != HSCROLL_NONE || vscrollDir != VSCROLL_NONE) - { - doScroll=true; - if (!scrollTimer) - { - scrollTimer= new QTimer(this); - connect( scrollTimer, SIGNAL(timeout()), SLOT(scrollTimerDone()) ); - //scrollTimer->start( 0, TRUE ); // single-shot timer - scrollTimer->setSingleShot(true); // single-shot timer - scrollTimer->start(0); - } - } - else - doScroll=false; - - } - else - { - doScroll=false; - - canScrollLeft = true; - canScrollRight = true; - canScrollUp = true; - canScrollDown = true; - } - - switch (drag) { - case DRAG_LASSO_START: - if (!moving) - break; - drag = DRAG_LASSO; - setCursor(); - // proceed with DRAG_LASSO: - - case DRAG_LASSO: - { - lasso = QRect(start.x(), start.y(), dist.x(), dist.y()); - - // printf("xorg=%d xmag=%d event->x=%d, mapx(xorg)=%d rmapx0=%d xOffset=%d rmapx(xOffset()=%d\n", - // xorg, xmag, event->x(),mapx(xorg), rmapx(0), xOffset(),rmapx(xOffset())); - - } - redraw(); - break; - - case DRAG_MOVE_START: - case DRAG_COPY_START: - case DRAG_CLONE_START: - if (!moving) - break; - if (keyState & Qt::ControlModifier) { - if (ax > ay) { - if (drag == DRAG_MOVE_START) - drag = DRAGX_MOVE; - else if (drag == DRAG_COPY_START) - drag = DRAGX_COPY; - else - drag = DRAGX_CLONE; - } - else { - if (drag == DRAG_MOVE_START) - drag = DRAGY_MOVE; - else if (drag == DRAG_COPY_START) - drag = DRAGY_COPY; - else - drag = DRAGY_CLONE; - } - } - else { - if (drag == DRAG_MOVE_START) - drag = DRAG_MOVE; - else if (drag == DRAG_COPY_START) - drag = DRAG_COPY; - else - drag = DRAG_CLONE; - } - setCursor(); - if (!curItem->isSelected()) { - if (drag == DRAG_MOVE) - deselectAll(); - selectItem(curItem, true); - updateSelection(); - redraw(); - } - DragType dt; - if (drag == DRAG_MOVE) - dt = MOVE_MOVE; - else if (drag == DRAG_COPY) - dt = MOVE_COPY; - else - dt = MOVE_CLONE; - - startMoving(ev_pos, dt); - break; - - case DRAG_MOVE: - case DRAG_COPY: - case DRAG_CLONE: - - if(!scrollTimer) - moveItems(ev_pos, 0); - break; - - case DRAGX_MOVE: - case DRAGX_COPY: - case DRAGX_CLONE: - if(!scrollTimer) - moveItems(ev_pos, 1); - break; - - case DRAGY_MOVE: - case DRAGY_COPY: - case DRAGY_CLONE: - if(!scrollTimer) - moveItems(ev_pos, 2); - break; - - case DRAG_NEW: - case DRAG_RESIZE: - if (dist.x()) { - if (dist.x() < 1) - curItem->setWidth(1); - else - curItem->setWidth(dist.x()); - redraw(); - } - break; - case DRAG_DELETE: - deleteItem(ev_pos); - break; - - case DRAG_OFF: - break; - } - - mouseMove(ev_pos); - } - -//--------------------------------------------------------- -// viewMouseReleaseEvent -//--------------------------------------------------------- - -void Canvas::viewMouseReleaseEvent(QMouseEvent* event) - { -// printf("release %x %x\n", event->state(), event->button()); - - doScroll = false; - canScrollLeft = true; - canScrollRight = true; - canScrollUp = true; - canScrollDown = true; - ///if (event->state() & (Qt::LeftButton|Qt::RightButton|Qt::MidButton) & ~(event->button())) { - if (event->buttons() & (Qt::LeftButton|Qt::RightButton|Qt::MidButton) & ~(event->button())) { - ///printf("ignore %x %x\n", keyState, event->button()); - //printf("viewMouseReleaseEvent ignore buttons:%x mods:%x button:%x\n", (int)event->buttons(), (int)keyState, event->button()); - return; - } - - QPoint pos = event->pos(); - ///bool shift = event->state() & Qt::ShiftModifier; - bool shift = ((QInputEvent*)event)->modifiers() & Qt::ShiftModifier; - bool redrawFlag = false; - - switch (drag) { - case DRAG_MOVE_START: - case DRAG_COPY_START: - case DRAG_CLONE_START: - if (!shift) - deselectAll(); - selectItem(curItem, !(shift && curItem->isSelected())); - updateSelection(); - redrawFlag = true; - itemReleased(curItem, curItem->pos()); - break; - case DRAG_COPY: - endMoveItems(pos, MOVE_COPY, 0); - break; - case DRAGX_COPY: - endMoveItems(pos, MOVE_COPY, 1); - break; - case DRAGY_COPY: - endMoveItems(pos, MOVE_COPY, 2); - break; - case DRAG_MOVE: - endMoveItems(pos, MOVE_MOVE, 0); - break; - case DRAGX_MOVE: - endMoveItems(pos, MOVE_MOVE, 1); - break; - case DRAGY_MOVE: - endMoveItems(pos, MOVE_MOVE, 2); - break; - case DRAG_CLONE: - endMoveItems(pos, MOVE_CLONE, 0); - break; - case DRAGX_CLONE: - endMoveItems(pos, MOVE_CLONE, 1); - break; - case DRAGY_CLONE: - endMoveItems(pos, MOVE_CLONE, 2); - break; - case DRAG_OFF: - break; - case DRAG_RESIZE: - resizeItem(curItem, false); - break; - case DRAG_NEW: - newItem(curItem, false); - redrawFlag = true; - break; - case DRAG_LASSO_START: - lasso.setRect(-1, -1, -1, -1); - if (!shift) - deselectAll(); - updateSelection(); - redrawFlag = true; - break; - - case DRAG_LASSO: - if (!shift) - deselectAll(); - lasso = lasso.normalized(); - selectLasso(shift); - updateSelection(); - redrawFlag = true; - break; - - case DRAG_DELETE: - break; - } - //printf("Canvas::viewMouseReleaseEvent setting drag to DRAG_OFF\n"); - - drag = DRAG_OFF; - if (redrawFlag) - redraw(); - setCursor(); - } - -//--------------------------------------------------------- -// selectLasso -//--------------------------------------------------------- - -void Canvas::selectLasso(bool toggle) - { - int n = 0; - if (virt()) { - for (iCItem i = items.begin(); i != items.end(); ++i) { - if (i->second->intersects(lasso)) { - selectItem(i->second, !(toggle && i->second->isSelected())); - ++n; - } - } - } - else { - for (iCItem i = items.begin(); i != items.end(); ++i) { - QRect box = i->second->bbox(); - int x = rmapxDev(box.x()); - int y = rmapyDev(box.y()); - int w = rmapxDev(box.width()); - int h = rmapyDev(box.height()); - QRect r(x, y, w, h); - ///r.moveBy(i->second->pos().x(), i->second->pos().y()); - r.translate(i->second->pos().x(), i->second->pos().y()); - if (r.intersects(lasso)) { - selectItem(i->second, !(toggle && i->second->isSelected())); - ++n; - } - } - } - - - - if (n) { - updateSelection(); - redraw(); - } - } - -//--------------------------------------------------------- -// endMoveItems -// dir = 0 move in all directions -// 1 move only horizontal -// 2 move only vertical -//--------------------------------------------------------- - -void Canvas::endMoveItems(const QPoint& pos, DragType dragtype, int dir) - { - startUndo(dragtype); - - int dp = y2pitch(pos.y()) - y2pitch(start.y()); - int dx = pos.x() - start.x(); - - if (dir == 1) - dp = 0; - else if (dir == 2) - dx = 0; - - - - int modified = 0; - - // Removed by T356. - /* - for (iCItem i = moving.begin(); i != moving.end(); ++i) { - int x = i->second->pos().x(); - int y = i->second->pos().y(); - int nx = x + dx; - int ny = pitch2y(y2pitch(y) + dp); - QPoint newpos = raster(QPoint(nx, ny)); - selectItem(i->second, true); - - if (moveItem(i->second, newpos, dragtype, &modified)) - i->second->move(newpos); - if (moving.size() == 1) { - itemReleased(curItem, newpos); - } - if (dragtype == MOVE_COPY || dragtype == MOVE_CLONE) - selectItem(i->second, false); - } - */ - - moveCanvasItems(moving, dp, dx, dragtype, &modified); - - endUndo(dragtype, modified); - moving.clear(); - updateSelection(); - redraw(); - } - -//--------------------------------------------------------- -// getCurrentDrag -// returns 0 if there is no drag operation -//--------------------------------------------------------- - -int Canvas::getCurrentDrag() - { - //printf("getCurrentDrag=%d\n", drag); - return drag; - } - -//--------------------------------------------------------- -// deleteItem -//--------------------------------------------------------- - -void Canvas::deleteItem(const QPoint& p) - { - if (virt()) { - for (iCItem i = items.begin(); i != items.end(); ++i) { - if (i->second->contains(p)) { - selectItem(i->second, false); - if (!deleteItem(i->second)) { - if (drag == DRAG_DELETE) - drag = DRAG_OFF; - } - break; - } - } - } - else { - for (iCItem i = items.begin(); i != items.end(); ++i) { - QRect box = i->second->bbox(); - int x = rmapxDev(box.x()); - int y = rmapyDev(box.y()); - int w = rmapxDev(box.width()); - int h = rmapyDev(box.height()); - QRect r(x, y, w, h); - ///r.moveBy(i->second->pos().x(), i->second->pos().y()); - r.translate(i->second->pos().x(), i->second->pos().y()); - if (r.contains(p)) { - if (deleteItem(i->second)) { - selectItem(i->second, false); - } - break; - } - } - } - } - -//--------------------------------------------------------- -// setTool -//--------------------------------------------------------- - -void Canvas::setTool(int t) - { - if (_tool == Tool(t)) - return; - _tool = Tool(t); - setCursor(); - } - -//--------------------------------------------------------- -// setCursor -//--------------------------------------------------------- - -void Canvas::setCursor() - { - switch (drag) { - case DRAGX_MOVE: - case DRAGX_COPY: - case DRAGX_CLONE: - QWidget::setCursor(QCursor(Qt::SizeHorCursor)); - break; - - case DRAGY_MOVE: - case DRAGY_COPY: - case DRAGY_CLONE: - QWidget::setCursor(QCursor(Qt::SizeVerCursor)); - break; - - case DRAG_MOVE: - case DRAG_COPY: - case DRAG_CLONE: - QWidget::setCursor(QCursor(Qt::SizeAllCursor)); - break; - - case DRAG_RESIZE: - QWidget::setCursor(QCursor(Qt::SizeHorCursor)); - break; - - case DRAG_DELETE: - case DRAG_COPY_START: - case DRAG_CLONE_START: - case DRAG_MOVE_START: - case DRAG_NEW: - case DRAG_LASSO_START: - case DRAG_LASSO: - case DRAG_OFF: - switch(_tool) { - case PencilTool: - QWidget::setCursor(QCursor(*pencilIcon, 4, 15)); - break; - case RubberTool: - QWidget::setCursor(QCursor(*deleteIcon, 4, 15)); - break; - case GlueTool: - QWidget::setCursor(QCursor(*glueIcon, 4, 15)); - break; - case CutTool: - QWidget::setCursor(QCursor(*cutIcon, 4, 15)); - break; - case MuteTool: - QWidget::setCursor(QCursor(*editmuteIcon, 4, 15)); - break; - default: - QWidget::setCursor(QCursor(Qt::ArrowCursor)); - break; - } - break; - } - } - -//--------------------------------------------------------- -// keyPress -//--------------------------------------------------------- - -void Canvas::keyPress(QKeyEvent* event) - { - event->ignore(); - } - -//--------------------------------------------------------- -// isSingleSelection -//--------------------------------------------------------- - -bool Canvas::isSingleSelection() - { - return selectionSize() == 1; - } - -//--------------------------------------------------------- -// selectionSize -//--------------------------------------------------------- - -int Canvas::selectionSize() - { - int n = 0; - for (iCItem i = items.begin(); i != items.end(); ++i) { - if (i->second->isSelected()) - ++n; - } - return n; - } - -//--------------------------------------------------------- -// genCanvasPopup -//--------------------------------------------------------- - -QMenu* Canvas::genCanvasPopup() - { - if (canvasTools == 0) - return 0; - QMenu* canvasPopup = new QMenu(this); - QAction* act0 = 0; - - for (unsigned i = 0; i < 9; ++i) { - if ((canvasTools & (1 << i))==0) - continue; - QAction* act = canvasPopup->addAction(QIcon(**toolList[i].icon), tr(toolList[i].tip)); - act->setData(1<<i); // ddskrjo - if (!act0) - act0 = act; - } - canvasPopup->setActiveAction(act0); - return canvasPopup; - } - -//--------------------------------------------------------- -// canvasPopup -//--------------------------------------------------------- - -void Canvas::canvasPopup(int n) - { - setTool(n); - emit toolChanged(n); - } - -void Canvas::setCurrentPart(Part* part) -{ - curItem = NULL; - deselectAll(); - curPart = part; - curPartId = curPart->sn(); - curPartChanged(); -} |