diff --git a/resources/forms/mainWindow.ui b/resources/forms/mainWindow.ui index a2ac84b8..6f81085c 100644 --- a/resources/forms/mainWindow.ui +++ b/resources/forms/mainWindow.ui @@ -1649,6 +1649,22 @@ Group items + + + true + + + + :/images/stylusPalette/handPlay.png + :/images/stylusPalette/handPlayOn.png:/images/stylusPalette/handPlay.png + + + Play + + + Interact with items + + diff --git a/resources/images/stylusPalette/handPlay.png b/resources/images/stylusPalette/handPlay.png new file mode 100644 index 00000000..999f7703 Binary files /dev/null and b/resources/images/stylusPalette/handPlay.png differ diff --git a/resources/images/stylusPalette/handPlayOn.png b/resources/images/stylusPalette/handPlayOn.png new file mode 100644 index 00000000..9191cffa Binary files /dev/null and b/resources/images/stylusPalette/handPlayOn.png differ diff --git a/resources/sankore.qrc b/resources/sankore.qrc index f94729e7..ced5d120 100644 --- a/resources/sankore.qrc +++ b/resources/sankore.qrc @@ -125,6 +125,8 @@ images/toolbar/tools.png images/stylusPalette/arrow.png images/stylusPalette/arrowOn.png + images/stylusPalette/handPlay.png + images/stylusPalette/handPlayOn.png images/stylusPalette/eraser.png images/stylusPalette/eraserOn.png images/stylusPalette/hand.png diff --git a/src/api/UBWidgetUniboardAPI.cpp b/src/api/UBWidgetUniboardAPI.cpp index 260734ad..b58b3c3f 100644 --- a/src/api/UBWidgetUniboardAPI.cpp +++ b/src/api/UBWidgetUniboardAPI.cpp @@ -123,6 +123,10 @@ void UBWidgetUniboardAPI::setTool(const QString& toolString) { UBDrawingController::drawingController()->setStylusTool(UBStylusTool::Selector); } + else if (lower == "play") + { + UBDrawingController::drawingController()->setStylusTool(UBStylusTool::Play); + } else if (lower == "line") { UBDrawingController::drawingController()->setStylusTool(UBStylusTool::Line); diff --git a/src/board/UBBoardPaletteManager.h b/src/board/UBBoardPaletteManager.h index cdb02870..eef04194 100644 --- a/src/board/UBBoardPaletteManager.h +++ b/src/board/UBBoardPaletteManager.h @@ -89,6 +89,8 @@ class UBBoardPaletteManager : public QObject void slot_changeMainMode(UBApplicationController::MainMode); void slot_changeDesktopMode(bool); + void toggleErasePalette(bool ckecked); + private: void setupPalettes(); @@ -168,7 +170,6 @@ class UBBoardPaletteManager : public QObject void erasePaletteButtonPressed(); void erasePaletteButtonReleased(); - void toggleErasePalette(bool ckecked); void erasePaletteClosed(); void togglePagePalette(bool ckecked); diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp index 59f4e8e5..3f51560c 100644 --- a/src/board/UBBoardView.cpp +++ b/src/board/UBBoardView.cpp @@ -40,6 +40,7 @@ #include "gui/UBTeacherGuideWidgetsTools.h" #include "board/UBBoardController.h" +#include "board/UBBoardPaletteManager.h" #include "domain/UBGraphicsTextItem.h" #include "domain/UBGraphicsPixmapItem.h" @@ -57,6 +58,7 @@ #include "tools/UBGraphicsCompass.h" #include "tools/UBGraphicsCache.h" #include "tools/UBGraphicsTriangle.h" +#include "tools/UBGraphicsProtractor.h" #include "core/memcheck.h" @@ -67,23 +69,33 @@ UBBoardView::UBBoardView (UBBoardController* pController, QWidget* pParent) , mIsCreatingSceneGrabZone (false) , mOkOnWidget(false) , suspendedMousePressEvent(NULL) +, mLongPressInterval(1000) +, mIsDragInProgress(false) { init (); mFilterZIndex = false; + + mLongPressTimer.setInterval(mLongPressInterval); + mLongPressTimer.setSingleShot(true); } UBBoardView::UBBoardView (UBBoardController* pController, int pStartLayer, int pEndLayer, QWidget* pParent) : QGraphicsView (pParent) , mController (pController) , suspendedMousePressEvent(NULL) +, mLongPressInterval(1000) +, mIsDragInProgress(false) { init (); mStartLayer = pStartLayer; mEndLayer = pEndLayer; - mFilterZIndex = true; + mFilterZIndex = true; + + mLongPressTimer.setInterval(mLongPressInterval); + mLongPressTimer.setSingleShot(true); } UBBoardView::~UBBoardView () { @@ -375,8 +387,300 @@ void UBBoardView::tabletEvent (QTabletEvent * event) } +bool UBBoardView::itemIsLocked(QGraphicsItem *item) +{ + if (!item) + return false; + + if (item->data(UBGraphicsItemData::ItemLocked).toBool()) + return true; + + return itemIsLocked(item->parentItem()); + +} + +bool UBBoardView::itemHaveParentWithType(QGraphicsItem *item, int type) +{ + if (!item) + return false; + + if (type == item->type()) + return true; + + return itemHaveParentWithType(item->parentItem(), type); + +} + +bool UBBoardView::itemShouldReceiveMousePressEvent(QGraphicsItem *item) +{ + if (!item) + return true; + + if (item == scene()->backgroundObject()) + return true; + + if (itemIsLocked(item)) + return false; + + + UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController()->stylusTool(); + + if ((currentTool == UBStylusTool::Play) && UBGraphicsGroupContainerItem::Type == movingItem->type()) + return movingItem = NULL; + + switch(item->type()) + { + + case UBGraphicsMediaItem::Type: + return false; + + case UBGraphicsPixmapItem::Type: + case UBGraphicsTextItem::Type: + if ((currentTool == UBStylusTool::Selector) && item->isSelected()) + return true; + if ((currentTool == UBStylusTool::Selector) && item->parentItem() && item->parentItem()->isSelected()) + return true; + if (currentTool != UBStylusTool::Selector) + return false; + break; + + case UBGraphicsGroupContainerItem::Type: + return (currentTool == UBStylusTool::Selector); + + case UBGraphicsW3CWidgetItem::Type: + if (currentTool == UBStylusTool::Selector && item->parentItem() && item->parentItem()->isSelected()) + return true; + if (currentTool == UBStylusTool::Selector && item->isSelected()) + return true; + if (currentTool == UBStylusTool::Play) + return true; + break; + + default: + return true; + } + + return false; +} + +bool UBBoardView::itemShouldReceiveSuspendedMousePressEvent(QGraphicsItem *item) +{ + if (!item) + return false; + + if (item == scene()->backgroundObject()) + return false; + + if (itemIsLocked(item)) + return false; + + UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController()->stylusTool(); + + switch(item->type()) + { + case UBGraphicsPixmapItem::Type: + case UBGraphicsTextItem::Type: + case UBGraphicsW3CWidgetItem::Type: + if (currentTool != UBStylusTool::Play && !item->isSelected() && item->parentItem()) + return true; + if (currentTool != UBStylusTool::Play && !item->isSelected()) + return true; + break; + + case UBGraphicsMediaItem::Type: + return true; + + default: + return false; + } + return false; +} + +bool UBBoardView::itemShouldBeMoved(QGraphicsItem *item) +{ + if (!item) + return false; + + if (item == scene()->backgroundObject()) + return false; + + if (!(mMouseButtonIsPressed || mTabletStylusIsPressed)) + return false; + + if (movingItem->data(UBGraphicsItemData::ItemLocked).toBool()) + return false; + + UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController()->stylusTool(); + + if (movingItem->parentItem() && !movingItem->isSelected() && movingItem->parentItem()->isSelected()) + return false; + + switch(item->type()) + { + case UBGraphicsGroupContainerItem::Type: + return true; + + case UBGraphicsW3CWidgetItem::Type: + if(currentTool == UBStylusTool::Selector && item->isSelected()) + return false; + if(currentTool == UBStylusTool::Play) + return false; + + case UBGraphicsPixmapItem::Type: + if (item->isSelected()) + return false; + case UBGraphicsMediaItem::Type: + case UBGraphicsStrokesGroup::Type: + return true; + case UBGraphicsTextItem::Type: + return !item->isSelected(); + + default: + false; + } + + return false; +} + +// determine item to interacts: item self or it's container. +QGraphicsItem* UBBoardView::determineItemToMove(QGraphicsItem *item) +{ + if(item) + { + UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController()->stylusTool(); + if ((UBStylusTool::Play == currentTool) && (UBGraphicsW3CWidgetItem::Type == item->type())) + return item; + + if(item->parentItem() && UBGraphicsGroupContainerItem::Type == item->parentItem()->type()) + { + if (UBStylusTool::Play == currentTool && item->parentItem()->isSelected()) + return item->parentItem(); + + if (item->parentItem()->isSelected()) + return item; + + + if (item->isSelected()) + return NULL; + + return item->parentItem(); + } + + if(item->parentItem() && UBGraphicsStrokesGroup::Type == item->parentItem()->type()) + return determineItemToMove(item->parentItem()); + } + + return item; +} + +void UBBoardView::handleItemMousePress(QMouseEvent *event) +{ + mLastPressedMousePos = mapToScene(event->pos()); + + if (itemShouldReceiveMousePressEvent(movingItem)) + QGraphicsView::mousePressEvent (event); + else + if (itemShouldReceiveSuspendedMousePressEvent(movingItem)) + { + if (suspendedMousePressEvent) + delete suspendedMousePressEvent; + suspendedMousePressEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers()); + } +} + +void UBBoardView::handleItemMouseMove(QMouseEvent *event) +{ + if (movingItem) + movingItem = determineItemToMove(movingItem); + + if (movingItem && itemShouldBeMoved(movingItem) && (mMouseButtonIsPressed || mTabletStylusIsPressed)) + { + QPointF scenePos = mapToScene(event->pos()); + QPointF newPos = movingItem->pos() + scenePos - mLastPressedMousePos; + movingItem->setPos(newPos); + mLastPressedMousePos = scenePos; + mWidgetMoved = true; + event->accept(); + } + else + { + QPointF posBeforeMove; + QPointF posAfterMove; + + if (movingItem) + posBeforeMove = movingItem->pos(); + + QGraphicsView::mouseMoveEvent (event); + + if (movingItem) + posAfterMove = movingItem->pos(); + + mWidgetMoved = ((posAfterMove-posBeforeMove).manhattanLength() != 0); + + // a cludge for terminate moving of w3c widgets. + if (mWidgetMoved && UBGraphicsW3CWidgetItem::Type == movingItem->type()) + movingItem->setPos(posBeforeMove); + + } +} + +void UBBoardView::rubberItems() +{ + if (mUBRubberBand) + mRubberedItems = items(mUBRubberBand->geometry()); +} + +void UBBoardView::moveRubberedItems(QPointF movingVector) +{ + QRectF invalidateRect = scene()->itemsBoundingRect(); + + foreach (QGraphicsItem *item, mRubberedItems) + { + + if (item->type() == UBGraphicsW3CWidgetItem::Type + || item->type() == UBGraphicsPixmapItem::Type + || item->type() == UBGraphicsMediaItem::Type + || item->type() == UBGraphicsSvgItem::Type + || item->type() == UBGraphicsTextItem::Type + || item->type() == UBGraphicsStrokesGroup::Type + || item->type() == UBGraphicsGroupContainerItem::Type) + { + item->setPos(item->pos()+movingVector); + } + } + + scene()->invalidate(invalidateRect); +} + +void UBBoardView::longPressEvent() +{ + UBDrawingController *drawingController = UBDrawingController::drawingController(); + UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); + + + disconnect(&mLongPressTimer, SIGNAL(timeout()), this, SLOT(longPressEvent())); + + if (UBStylusTool::Selector == currentTool) + { + drawingController->setStylusTool(UBStylusTool::Play); + } + else + if (currentTool == UBStylusTool::Play) + { + drawingController->setStylusTool(UBStylusTool::Selector); + } + else + if (UBStylusTool::Eraser == currentTool) + { + UBApplication::boardController->paletteManager()->toggleErasePalette(true); + } + +} + void UBBoardView::mousePressEvent (QMouseEvent *event) { + mIsDragInProgress = false; + if (isAbsurdPoint (event->pos ())) { event->accept (); @@ -411,12 +715,13 @@ void UBBoardView::mousePressEvent (QMouseEvent *event) mPreviousPoint = event->posF (); event->accept (); } - else if (currentTool == UBStylusTool::Selector) + else if (currentTool == UBStylusTool::Selector || currentTool == UBStylusTool::Play) { -// QSet existingTools = scene()->tools(); why do we need to get tools here? - movingItem = scene()->itemAt(this->mapToScene(event->posF().toPoint())); + connect(&mLongPressTimer, SIGNAL(timeout()), this, SLOT(longPressEvent())); + mLongPressTimer.start(); + if (!movingItem) { // Rubberband selection implementation if (!mUBRubberBand) { @@ -425,34 +730,12 @@ void UBBoardView::mousePressEvent (QMouseEvent *event) mUBRubberBand->setGeometry (QRect (mMouseDownPos, QSize ())); mUBRubberBand->show(); } - - if (!movingItem - || movingItem->isSelected() - || movingItem->type() == UBGraphicsDelegateFrame::Type - || movingItem->type() == DelegateButton::Type - || movingItem->type() == UBGraphicsCompass::Type - || movingItem->type() == UBGraphicsPDFItem::Type - || movingItem->type() == UBGraphicsPolygonItem::Type - || movingItem->type() == UBGraphicsCache::Type - || movingItem->type() == UBGraphicsTriangle::Type - || movingItem == this->scene()->backgroundObject() - || (movingItem->parentItem() && movingItem->parentItem()->type() == UBGraphicsGroupContainerItem::Type)) - { - movingItem = NULL; - QGraphicsView::mousePressEvent (event); - - } else { - mLastPressedMousePos = mapToScene(event->pos()); - if (suspendedMousePressEvent) - { - delete suspendedMousePressEvent; - } - suspendedMousePressEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers()); // удалить + mUBRubberBand->hide(); } - + handleItemMousePress(event); event->accept(); } else if (currentTool == UBStylusTool::Text) @@ -509,6 +792,11 @@ void UBBoardView::mousePressEvent (QMouseEvent *event) if (scene () && !mTabletStylusIsPressed) { + if (currentTool == UBStylusTool::Eraser) + { + connect(&mLongPressTimer, SIGNAL(timeout()), this, SLOT(longPressEvent())); + mLongPressTimer.start(); + } scene ()->inputDevicePress (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ()))); } event->accept (); @@ -519,8 +807,16 @@ void UBBoardView::mousePressEvent (QMouseEvent *event) void UBBoardView::mouseMoveEvent (QMouseEvent *event) { + if(!mIsDragInProgress && ((mapToScene(event->pos()) - mLastPressedMousePos).manhattanLength() < QApplication::startDragDistance())) + { + return; + } + + mIsDragInProgress = true; UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); + mLongPressTimer.stop(); + if (isAbsurdPoint (event->pos ())) { event->accept (); @@ -536,14 +832,16 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event) mPreviousPoint = eventPosition; event->accept (); } - else if (currentTool == UBStylusTool::Selector) + else if (currentTool == UBStylusTool::Selector || currentTool == UBStylusTool::Play) { if((event->pos() - mLastPressedMousePos).manhattanLength() < QApplication::startDragDistance()) { return; } - if (mUBRubberBand && mUBRubberBand->isVisible()) { + if (!movingItem && (mMouseButtonIsPressed || mTabletStylusIsPressed) && mUBRubberBand && mUBRubberBand->isVisible()) { + QRect bandRect(mMouseDownPos, event->pos()); + bandRect = bandRect.normalized(); mUBRubberBand->setGeometry(bandRect); @@ -555,6 +853,8 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event) mJustSelectedItems.remove(item); } } + + if (currentTool == UBStylusTool::Selector) foreach (QGraphicsItem *item, items(bandRect)) { if (item->type() == UBGraphicsW3CWidgetItem::Type @@ -573,16 +873,7 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event) } } - if (movingItem && (mMouseButtonIsPressed || mTabletStylusIsPressed)) - { - QPointF scenePos = mapToScene(event->pos()); - QPointF newPos = movingItem->pos() + scenePos - mLastPressedMousePos; - movingItem->setPos(newPos); - mLastPressedMousePos = scenePos; - mWidgetMoved = true; - event->accept(); - } - else QGraphicsView::mouseMoveEvent (event); + handleItemMouseMove(event); } else if ((UBDrawingController::drawingController()->isDrawingTool()) && !mMouseButtonIsPressed) @@ -604,11 +895,14 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event) else { if (!mTabletStylusIsPressed && scene ()) - { + { scene ()->inputDeviceMove (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ())), mMouseButtonIsPressed); } event->accept (); } + + if((event->pos() - mLastPressedMousePos).manhattanLength() < QApplication::startDragDistance()) + mWidgetMoved = true; } void @@ -616,9 +910,7 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); - scene ()->setToolCursor (currentTool); - setToolCursor (currentTool); - + setToolCursor (currentTool); // first propagate device release to the scene if (scene ()) scene ()->inputDeviceRelease (); @@ -630,20 +922,44 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event) mWidgetMoved = false; movingItem = NULL; } - else if (movingItem && suspendedMousePressEvent) - { - QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop - movingItem = NULL; - delete suspendedMousePressEvent; - suspendedMousePressEvent = NULL; - } + else + if (movingItem) + { + if (suspendedMousePressEvent && !movingItem->data(UBGraphicsItemData::ItemLocked).toBool()) + { + QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop + movingItem = NULL; + delete suspendedMousePressEvent; + suspendedMousePressEvent = NULL; + } + } - if (mUBRubberBand && mUBRubberBand->isVisible()) { - mUBRubberBand->hide(); + if (mUBRubberBand && mUBRubberBand->isVisible()) { + mUBRubberBand->hide(); } QGraphicsView::mouseReleaseEvent (event); } + else if (currentTool == UBStylusTool::Play) + { + if (mWidgetMoved) + { + movingItem = NULL; + mWidgetMoved = false; + } + else + { + if (suspendedMousePressEvent && movingItem && !movingItem->data(UBGraphicsItemData::ItemLocked).toBool()) + { + QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop + movingItem = NULL; + delete suspendedMousePressEvent; + suspendedMousePressEvent = NULL; + } + + QGraphicsView::mouseReleaseEvent (event); + } + } else if (currentTool == UBStylusTool::Text) { if (mRubberBand) @@ -702,6 +1018,7 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event) mPendingStylusReleaseEvent = false; mTabletStylusIsPressed = false; + mLongPressTimer.stop(); } void @@ -1008,6 +1325,7 @@ UBBoardView::setToolCursor (int tool) break; case UBStylusTool::Eraser: controlViewport->setCursor (UBResources::resources ()->eraserCursor); + scene()->hideEraser(); break; case UBStylusTool::Marker: controlViewport->setCursor (UBResources::resources ()->markerCursor); @@ -1027,6 +1345,9 @@ UBBoardView::setToolCursor (int tool) case UBStylusTool::Selector: controlViewport->setCursor (UBResources::resources ()->arrowCursor); break; + case UBStylusTool::Play: + controlViewport->setCursor (UBResources::resources ()->drawLineRulerCursor); + break; case UBStylusTool::Line: controlViewport->setCursor (UBResources::resources ()->penCursor); break; diff --git a/src/board/UBBoardView.h b/src/board/UBBoardView.h index 21bc12b8..b8b6429f 100644 --- a/src/board/UBBoardView.h +++ b/src/board/UBBoardView.h @@ -42,6 +42,9 @@ class UBBoardView : public QGraphicsView void setToolCursor(int tool); + void rubberItems(); + void moveRubberedItems(QPointF movingVector); + signals: void resized(QResizeEvent* event); @@ -51,6 +54,15 @@ class UBBoardView : public QGraphicsView protected: + bool itemIsLocked(QGraphicsItem *item); + bool itemShouldReceiveMousePressEvent(QGraphicsItem *item); + bool itemShouldReceiveSuspendedMousePressEvent(QGraphicsItem *item); + bool itemHaveParentWithType(QGraphicsItem *item, int type); + bool itemShouldBeMoved(QGraphicsItem *item); + QGraphicsItem* determineItemToMove(QGraphicsItem *item); + void handleItemMousePress(QMouseEvent *event); + void handleItemMouseMove(QMouseEvent *event); + virtual bool event (QEvent * e); virtual void keyPressEvent(QKeyEvent *event); @@ -124,9 +136,17 @@ class UBBoardView : public QGraphicsView QGraphicsItem *movingItem; QMouseEvent *suspendedMousePressEvent; + bool moveRubberBand; UBRubberBand *mUBRubberBand; + + QList mRubberedItems; QSet mJustSelectedItems; + int mLongPressInterval; + QTimer mLongPressTimer; + + bool mIsDragInProgress; + private slots: void settingChanged(QVariant newValue); @@ -134,6 +154,7 @@ class UBBoardView : public QGraphicsView public slots: void virtualKeyboardActivated(bool b); + void longPressEvent(); }; diff --git a/src/board/UBDrawingController.cpp b/src/board/UBDrawingController.cpp index e03ef408..70c54905 100644 --- a/src/board/UBDrawingController.cpp +++ b/src/board/UBDrawingController.cpp @@ -54,6 +54,7 @@ UBDrawingController::UBDrawingController(QObject * parent) connect(UBApplication::mainWindow->actionEraser, SIGNAL(triggered(bool)), this, SLOT(eraserToolSelected(bool))); connect(UBApplication::mainWindow->actionMarker, SIGNAL(triggered(bool)), this, SLOT(markerToolSelected(bool))); connect(UBApplication::mainWindow->actionSelector, SIGNAL(triggered(bool)), this, SLOT(selectorToolSelected(bool))); + connect(UBApplication::mainWindow->actionPlay, SIGNAL(triggered(bool)), this, SLOT(playToolSelected(bool))); connect(UBApplication::mainWindow->actionHand, SIGNAL(triggered(bool)), this, SLOT(handToolSelected(bool))); connect(UBApplication::mainWindow->actionZoomIn, SIGNAL(triggered(bool)), this, SLOT(zoomInToolSelected(bool))); connect(UBApplication::mainWindow->actionZoomOut, SIGNAL(triggered(bool)), this, SLOT(zoomOutToolSelected(bool))); @@ -120,6 +121,8 @@ void UBDrawingController::setStylusTool(int tool) UBApplication::mainWindow->actionMarker->setChecked(true); else if (mStylusTool == UBStylusTool::Selector) UBApplication::mainWindow->actionSelector->setChecked(true); + else if (mStylusTool == UBStylusTool::Play) + UBApplication::mainWindow->actionPlay->setChecked(true); else if (mStylusTool == UBStylusTool::Hand) UBApplication::mainWindow->actionHand->setChecked(true); else if (mStylusTool == UBStylusTool::ZoomIn) @@ -347,6 +350,12 @@ void UBDrawingController::selectorToolSelected(bool checked) setStylusTool(UBStylusTool::Selector); } +void UBDrawingController::playToolSelected(bool checked) +{ + if (checked) + setStylusTool(UBStylusTool::Play); +} + void UBDrawingController::handToolSelected(bool checked) { if (checked) diff --git a/src/board/UBDrawingController.h b/src/board/UBDrawingController.h index 4c620f1c..429c8b24 100644 --- a/src/board/UBDrawingController.h +++ b/src/board/UBDrawingController.h @@ -88,6 +88,7 @@ class UBDrawingController : public QObject void eraserToolSelected(bool checked); void markerToolSelected(bool checked); void selectorToolSelected(bool checked); + void playToolSelected(bool checked); void handToolSelected(bool checked); void zoomInToolSelected(bool checked); void zoomOutToolSelected(bool checked); diff --git a/src/core/UB.h b/src/core/UB.h index 46fa6e8c..21d635b0 100644 --- a/src/core/UB.h +++ b/src/core/UB.h @@ -28,6 +28,7 @@ struct UBStylusTool Eraser, Marker, Selector, + Play, Hand, ZoomIn, ZoomOut, diff --git a/src/domain/UBGraphicsDelegateFrame.cpp b/src/domain/UBGraphicsDelegateFrame.cpp index 3270abf9..0f98e689 100644 --- a/src/domain/UBGraphicsDelegateFrame.cpp +++ b/src/domain/UBGraphicsDelegateFrame.cpp @@ -249,8 +249,8 @@ bool UBGraphicsDelegateFrame::canResizeBottomRight(qreal width, qreal height, qr void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if (mDelegate->delegated()->data(UBGraphicsItemData::ItemLocked).toBool()) - return; + if (None == mCurrentTool) + return; QLineF move(mStartingPoint, event->scenePos()); qreal moveX = move.length() * cos((move.angle() - mAngle) * PI / 180); @@ -713,8 +713,8 @@ QGraphicsItem* UBGraphicsDelegateFrame::delegated() UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF pos) { - if(mDelegate->isLocked()) - return None; + if(mDelegate->isLocked()) + return None; else if (bottomRightResizeGripRect().contains(pos)) return ResizeBottomRight; else if (bottomResizeGripRect().contains(pos)){ diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp index d1759d3f..318a9b89 100644 --- a/src/domain/UBGraphicsItemDelegate.cpp +++ b/src/domain/UBGraphicsItemDelegate.cpp @@ -328,9 +328,11 @@ void UBGraphicsItemDelegate::positionHandles() if (mDelegated->isSelected()) { bool shownOnDisplay = mDelegated->data(UBGraphicsItemData::ItemLayerType).toInt() != UBItemLayerType::Control; showHide(shownOnDisplay); - lock(isLocked()); + mDelegated->setData(UBGraphicsItemData::ItemLocked, QVariant(isLocked())); updateFrame(); - mFrame->show(); + + if (UBStylusTool::Play != UBDrawingController::drawingController()->stylusTool()) + mFrame->show(); updateButtons(true); @@ -451,6 +453,7 @@ void UBGraphicsItemDelegate::lock(bool locked) } mDelegated->update(); + positionHandles(); mFrame->positionHandles(); } @@ -676,7 +679,7 @@ UBGraphicsToolBarItem::UBGraphicsToolBarItem(QGraphicsItem * parent) : rect.setWidth(parent->boundingRect().width()); this->setRect(rect); - setBrush(QColor(UBSettings::paletteColor)); + // setBrush(QColor(UBSettings::paletteColor)); setPen(Qt::NoPen); hide(); @@ -708,6 +711,17 @@ void UBGraphicsToolBarItem::paint(QPainter *painter, const QStyleOptionGraphicsI QPainterPath path; path.addRoundedRect(rect(), 10, 10); + if (parentItem() && parentItem()->data(UBGraphicsItemData::ItemLocked).toBool()) + { + QColor baseColor = UBSettings::paletteColor; + baseColor.setAlphaF(baseColor.alphaF() / 3); + setBrush(QBrush(baseColor)); + } + else + { + setBrush(QBrush(UBSettings::paletteColor)); + } + painter->fillPath(path, brush()); } @@ -1215,6 +1229,7 @@ void DelegateMediaControl::mousePressEvent(QGraphicsSceneMouseEvent *event) seekToMousePos(event->pos()); this->update(); event->accept(); + emit used(); } } @@ -1227,6 +1242,7 @@ void DelegateMediaControl::mouseMoveEvent(QGraphicsSceneMouseEvent *event) seekToMousePos(event->pos()); this->update(); event->accept(); + emit used(); } } @@ -1251,6 +1267,7 @@ void DelegateMediaControl::seekToMousePos(QPointF mousePos) //OSX is a bit lazy updateTicker(tickPos); } + emit used(); } void DelegateMediaControl::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h index 79ed8d2d..8ae131d0 100644 --- a/src/domain/UBGraphicsItemDelegate.h +++ b/src/domain/UBGraphicsItemDelegate.h @@ -102,8 +102,10 @@ uint smallPoint : 1; }; -class DelegateMediaControl: public QGraphicsRectItem +class DelegateMediaControl: public QObject, public QGraphicsRectItem { + Q_OBJECT + public: DelegateMediaControl(UBGraphicsMediaItem* pDelegated, QGraphicsItem * parent = 0); @@ -127,7 +129,10 @@ class DelegateMediaControl: public QGraphicsRectItem void updateTicker(qint64 time); void totalTimeChanged(qint64 newTotalTime); - protected: + signals: + void used(); + + protected: void seekToMousePos(QPointF mousePos); UBGraphicsMediaItem* mDelegate; diff --git a/src/domain/UBGraphicsMediaItem.cpp b/src/domain/UBGraphicsMediaItem.cpp index 08c8bd52..2228b87a 100644 --- a/src/domain/UBGraphicsMediaItem.cpp +++ b/src/domain/UBGraphicsMediaItem.cpp @@ -34,8 +34,8 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte , mInitialPos(0) , mVideoWidget(NULL) , mAudioWidget(NULL) + , mLinkedImage(NULL) { - update(); QString s = pMediaFileUrl.toLocalFile(); @@ -60,6 +60,7 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte mVideoWidget->resize(320,240); } setWidget(mVideoWidget); + haveLinkedImage = true; } else if (pMediaFileUrl.toLocalFile().contains("audios")) @@ -71,6 +72,7 @@ UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsIte mAudioWidget = new QWidget(); mAudioWidget->resize(320,26); setWidget(mAudioWidget); + haveLinkedImage = false; } Phonon::createPath(mMediaObject, mAudioOutput); @@ -226,7 +228,7 @@ void UBGraphicsMediaItem::mousePressEvent(QGraphicsSceneMouseEvent *event) if (mDelegate) { mDelegate->mousePressEvent(event); - if (mDelegate && parentItem() && UBGraphicsGroupContainerItem::Type == parentItem()->type()) + if (parentItem() && UBGraphicsGroupContainerItem::Type == parentItem()->type()) { UBGraphicsGroupContainerItem *group = qgraphicsitem_cast(parentItem()); if (group) @@ -242,11 +244,6 @@ void UBGraphicsMediaItem::mousePressEvent(QGraphicsSceneMouseEvent *event) } } - else - { - mDelegate->getToolBarItem()->show(); - } - } if (parentItem() && parentItem()->type() == UBGraphicsGroupContainerItem::Type) @@ -271,9 +268,6 @@ void UBGraphicsMediaItem::mousePressEvent(QGraphicsSceneMouseEvent *event) void UBGraphicsMediaItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if (data(UBGraphicsItemData::ItemLocked).toBool()) - return; - if(mShouldMove && (event->buttons() & Qt::LeftButton)) { QPointF offset = event->scenePos() - mMousePressPos; diff --git a/src/domain/UBGraphicsMediaItem.h b/src/domain/UBGraphicsMediaItem.h index 8d545944..e14e27b8 100644 --- a/src/domain/UBGraphicsMediaItem.h +++ b/src/domain/UBGraphicsMediaItem.h @@ -73,6 +73,8 @@ public: return mVideoWidget; } + bool hasLinkedImage(){return haveLinkedImage;} + mediaType getMediaType() { return mMediaType; } virtual UBGraphicsScene* scene(); @@ -115,6 +117,8 @@ private: QPointF mMousePressPos; QPointF mMouseMovePos; + bool haveLinkedImage; + QGraphicsPixmapItem *mLinkedImage; }; diff --git a/src/domain/UBGraphicsMediaItemDelegate.cpp b/src/domain/UBGraphicsMediaItemDelegate.cpp index f9b14639..7d164c58 100644 --- a/src/domain/UBGraphicsMediaItemDelegate.cpp +++ b/src/domain/UBGraphicsMediaItemDelegate.cpp @@ -33,6 +33,8 @@ UBGraphicsMediaItemDelegate::UBGraphicsMediaItemDelegate(UBGraphicsMediaItem* pDelegated, Phonon::MediaObject* pMedia, QObject * parent) : UBGraphicsItemDelegate(pDelegated, parent, true, false) , mMedia(pMedia) + , mToolBarShowTimer(NULL) + , m_iToolBarShowingInterval(5000) { QPalette palette; palette.setBrush ( QPalette::Light, Qt::darkGray ); @@ -42,27 +44,47 @@ UBGraphicsMediaItemDelegate::UBGraphicsMediaItemDelegate(UBGraphicsMediaItem* pD connect(mMedia, SIGNAL(finished()), this, SLOT(updatePlayPauseState())); connect(mMedia, SIGNAL(tick(qint64)), this, SLOT(updateTicker(qint64))); connect(mMedia, SIGNAL(totalTimeChanged(qint64)), this, SLOT(totalTimeChanged(qint64))); + + if (delegated()->hasLinkedImage()) + { + mToolBarShowTimer = new QTimer(); + connect(mToolBarShowTimer, SIGNAL(timeout()), this, SLOT(hideToolBar())); + mToolBarShowTimer->setInterval(m_iToolBarShowingInterval); + } } bool UBGraphicsMediaItemDelegate::mousePressEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED(event); mToolBarItem->show(); + + if (mToolBarShowTimer) + mToolBarShowTimer->start(); + return UBGraphicsItemDelegate::mousePressEvent(event); } +void UBGraphicsMediaItemDelegate::hideToolBar() +{ + mToolBarItem->hide(); +} + void UBGraphicsMediaItemDelegate::buildButtons() { mPlayPauseButton = new DelegateButton(":/images/play.svg", mDelegated, mToolBarItem, Qt::TitleBarArea); connect(mPlayPauseButton, SIGNAL(clicked(bool)), this, SLOT(togglePlayPause())); + connect(mPlayPauseButton, SIGNAL(clicked(bool)), mToolBarShowTimer, SLOT(start())); + mStopButton = new DelegateButton(":/images/stop.svg", mDelegated, mToolBarItem, Qt::TitleBarArea); connect(mStopButton, SIGNAL(clicked(bool)), mMedia, SLOT(stop())); + connect(mStopButton, SIGNAL(clicked(bool)), mToolBarShowTimer, SLOT(start())); mMediaControl = new DelegateMediaControl(delegated(), mToolBarItem); mMediaControl->setFlag(QGraphicsItem::ItemIsSelectable, true); UBGraphicsItem::assignZValue(mMediaControl, delegated()->zValue()); - + connect(mMediaControl, SIGNAL(used()), mToolBarShowTimer, SLOT(start())); + if (delegated()->isMuted()) mMuteButton = new DelegateButton(":/images/soundOff.svg", mDelegated, mToolBarItem, Qt::TitleBarArea); else @@ -70,6 +92,7 @@ void UBGraphicsMediaItemDelegate::buildButtons() connect(mMuteButton, SIGNAL(clicked(bool)), delegated(), SLOT(toggleMute())); connect(mMuteButton, SIGNAL(clicked(bool)), this, SLOT(toggleMute())); // for changing button image + connect(mMuteButton, SIGNAL(clicked(bool)), mToolBarShowTimer, SLOT(start())); mButtons << mPlayPauseButton << mStopButton << mMuteButton; @@ -89,7 +112,8 @@ void UBGraphicsMediaItemDelegate::buildButtons() UBGraphicsMediaItemDelegate::~UBGraphicsMediaItemDelegate() { - //NOOP + if (mToolBarShowTimer) + delete mToolBarShowTimer; } void UBGraphicsMediaItemDelegate::positionHandles() diff --git a/src/domain/UBGraphicsMediaItemDelegate.h b/src/domain/UBGraphicsMediaItemDelegate.h index 63c3f058..3454e1d1 100644 --- a/src/domain/UBGraphicsMediaItemDelegate.h +++ b/src/domain/UBGraphicsMediaItemDelegate.h @@ -18,6 +18,7 @@ #include #include +#include #include "core/UB.h" #include "UBGraphicsItemDelegate.h" @@ -54,6 +55,8 @@ class UBGraphicsMediaItemDelegate : public UBGraphicsItemDelegate void totalTimeChanged(qint64 newTotalTime); + void hideToolBar(); + protected: virtual void buildButtons(); @@ -65,6 +68,9 @@ class UBGraphicsMediaItemDelegate : public UBGraphicsItemDelegate DelegateMediaControl *mMediaControl; Phonon::MediaObject* mMedia; + + QTimer *mToolBarShowTimer; + int m_iToolBarShowingInterval; }; #endif /* UBGRAPHICSMEDIAITEMDELEGATE_H_ */ \ No newline at end of file diff --git a/src/domain/UBGraphicsProxyWidget.cpp b/src/domain/UBGraphicsProxyWidget.cpp index 7b949b19..567eafa4 100644 --- a/src/domain/UBGraphicsProxyWidget.cpp +++ b/src/domain/UBGraphicsProxyWidget.cpp @@ -47,6 +47,10 @@ UBGraphicsProxyWidget::~UBGraphicsProxyWidget() QVariant UBGraphicsProxyWidget::itemChange(GraphicsItemChange change, const QVariant &value) { + if (change == QGraphicsItem::ItemCursorHasChanged && scene()) + { + unsetCursor(); + } if ((change == QGraphicsItem::ItemSelectedHasChanged) && scene()) { @@ -82,9 +86,10 @@ void UBGraphicsProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event) else { // QT Proxy Widget is a bit lazy, we force the selection ... - QGraphicsProxyWidget::mousePressEvent(event); + setSelected(true); } + QGraphicsProxyWidget::mousePressEvent(event); } diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 0542e598..20d657d7 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -2366,14 +2366,10 @@ void UBGraphicsScene::createPointer() void UBGraphicsScene::setToolCursor(int tool) { - if (tool != (int)UBStylusTool::Selector - && tool != (int)UBStylusTool::Text) + if (tool == (int)UBStylusTool::Selector || + tool == (int)UBStylusTool::Text || + tool == (int)UBStylusTool::Play) { deselectAllItems(); } - - if (tool != (int)UBStylusTool::Eraser) - { - hideEraser(); - } } diff --git a/src/domain/UBGraphicsTextItemDelegate.cpp b/src/domain/UBGraphicsTextItemDelegate.cpp index ce47c04c..a93b8c91 100644 --- a/src/domain/UBGraphicsTextItemDelegate.cpp +++ b/src/domain/UBGraphicsTextItemDelegate.cpp @@ -303,11 +303,14 @@ void UBGraphicsTextItemDelegate::positionHandles() UBGraphicsGroupContainerItem *group = qgraphicsitem_cast(mDelegated->parentItem()); mToolBarItem->hide(); - if (group && group->getCurrentItem() == mDelegated && group->isSelected()) - mToolBarItem->show(); + if (mToolBarItem->parentItem() && !mToolBarItem->parentItem()->data(UBGraphicsItemData::ItemLocked).toBool()) + { + if (group && group->getCurrentItem() == mDelegated && group->isSelected()) + mToolBarItem->show(); - if (!group) - mToolBarItem->show(); + if (!group) + mToolBarItem->show(); + } } } diff --git a/src/gui/UBRubberBand.cpp b/src/gui/UBRubberBand.cpp index 04fcd26c..2453d6b6 100644 --- a/src/gui/UBRubberBand.cpp +++ b/src/gui/UBRubberBand.cpp @@ -23,10 +23,18 @@ #include #endif +#include "core/UBApplication.h" +#include "board/UBBoardController.h" +#include "board/UBBoardView.h" + #include "core/memcheck.h" UBRubberBand::UBRubberBand(Shape s, QWidget * p) : QRubberBand(s, p) + , mResizingMode(None) + , mMouseIsPressed(false) + , mLastPressedPoint(QPoint()) + , mResizingBorderHeight(20) { customStyle = NULL; @@ -41,6 +49,8 @@ UBRubberBand::UBRubberBand(Shape s, QWidget * p) if (customStyle) QRubberBand::setStyle(customStyle); + setAttribute(Qt::WA_TransparentForMouseEvents, false); + setMouseTracking(true); } UBRubberBand::~UBRubberBand() @@ -48,3 +58,192 @@ UBRubberBand::~UBRubberBand() if (customStyle) delete customStyle; } + +UBRubberBand::enm_resizingMode UBRubberBand::determineResizingMode(QPoint pos) +{ + if (mMouseIsPressed) + return mResizingMode; + + QRect resizerTop (mResizingBorderHeight , 0 , rect().width()-2*mResizingBorderHeight, mResizingBorderHeight ); + QRect resizerBottom (mResizingBorderHeight , rect().height() - mResizingBorderHeight, rect().width()-2*mResizingBorderHeight, mResizingBorderHeight ); + QRect resizerLeft (0 , mResizingBorderHeight , mResizingBorderHeight , rect().height() - 2*mResizingBorderHeight); + QRect resizerRight (rect().width()-mResizingBorderHeight, mResizingBorderHeight , mResizingBorderHeight , rect().height() - 2*mResizingBorderHeight); + + QRect resizerTopLeft (0 , 0 , mResizingBorderHeight, mResizingBorderHeight); + QRect resizerTopRight (rect().width()-mResizingBorderHeight, 0 , mResizingBorderHeight, mResizingBorderHeight); + QRect resizerBottomLeft (0 , rect().height() - mResizingBorderHeight, mResizingBorderHeight, mResizingBorderHeight); + QRect resizerBottomRight(rect().width()-mResizingBorderHeight, rect().height() - mResizingBorderHeight, mResizingBorderHeight, mResizingBorderHeight); + + enm_resizingMode resizingMode; + + QTransform cursorTransrofm; + + if (resizerTop.contains(pos)) + { + resizingMode = Top; + cursorTransrofm.rotate(90); + } + else + if (resizerBottom.contains(pos)) + { + resizingMode = Bottom; + cursorTransrofm.rotate(90); + } + else + if (resizerLeft.contains(pos)) + { + resizingMode = Left; + } + else + if (resizerRight.contains(pos)) + { + resizingMode = Right; + } + else + if (resizerTopLeft.contains(pos)) + { + resizingMode = TopLeft; + cursorTransrofm.rotate(45); + } + else + if (resizerTopRight.contains(pos)) + { + resizingMode = TopRight; + cursorTransrofm.rotate(-45); + } + else + if (resizerBottomLeft.contains(pos)) + { + resizingMode = BottomLeft; + cursorTransrofm.rotate(-45); + } + else + if (resizerBottomRight.contains(pos)) + { + resizingMode = BottomRight; + cursorTransrofm.rotate(45); + } + else + resizingMode = None; + + if (None != resizingMode) + { + QPixmap pix(":/images/cursors/resize.png"); + QCursor resizeCursor = QCursor(pix.transformed(cursorTransrofm, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2); + setCursor(resizeCursor); + } + else + unsetCursor(); + + return resizingMode; +} + +void UBRubberBand::mousePressEvent(QMouseEvent *event) +{ + mResizingMode = determineResizingMode(event->pos()); + mMouseIsPressed = true; + + mLastPressedPoint = event->pos(); + mLastMousePos = event->pos(); + + if (None == mResizingMode) + { + UBApplication::boardController->controlView()->rubberItems(); + setCursor(QCursor(Qt::SizeAllCursor)); + } +} + +void UBRubberBand::mouseMoveEvent(QMouseEvent *event) +{ + determineResizingMode(event->pos()); + + if (mMouseIsPressed) + { + UBBoardView *view = UBApplication::boardController->controlView(); + QRect currentGeometry = geometry(); + + QPoint pressPoint(event->pos()); + QPoint pressPointGlobal(view->mapToGlobal(pressPoint)); + QPoint prevPressPointGlobal(view->mapToGlobal(mLastPressedPoint)); + QPoint movePointGlogal = (view->mapToGlobal(mLastMousePos)); + + QPoint topLeftResizeVector(pressPointGlobal - prevPressPointGlobal); + QPoint rightBottomResizeVector(pressPointGlobal - movePointGlogal); + + bool bGeometryChange = true; + + switch(mResizingMode) + { + case None: + { + QPointF itemsMoveVector(view->mapToScene(pressPointGlobal) - view->mapToScene(prevPressPointGlobal)); + + move(pos()+pressPointGlobal - prevPressPointGlobal); + view->moveRubberedItems(itemsMoveVector); + + bGeometryChange = false; + break; + } + + case Top: + { + currentGeometry.setY(currentGeometry.y()+topLeftResizeVector.y()); + }break; + + case Bottom: + { + currentGeometry.setHeight(currentGeometry.height()+rightBottomResizeVector.y()); + }break; + + case Left: + { + currentGeometry.setX(currentGeometry.x()+topLeftResizeVector.x()); + }break; + case Right: + { + currentGeometry.setWidth(currentGeometry.width()+rightBottomResizeVector.x()); + }break; + + case TopLeft: + { + currentGeometry.setX(currentGeometry.x()+topLeftResizeVector.x()); + currentGeometry.setY(currentGeometry.y()+topLeftResizeVector.y()); + }break; + + case TopRight: + { + currentGeometry.setY(currentGeometry.y()+topLeftResizeVector.y()); + currentGeometry.setWidth(currentGeometry.width()+rightBottomResizeVector.x()); + } + break; + + case BottomLeft: + { + currentGeometry.setX(currentGeometry.x()+topLeftResizeVector.x()); + currentGeometry.setHeight(currentGeometry.height()+rightBottomResizeVector.y()); + }break; + + case BottomRight: + { + currentGeometry.setWidth(currentGeometry.width()+rightBottomResizeVector.x()); + currentGeometry.setHeight(currentGeometry.height()+rightBottomResizeVector.y()); + }break; + + } + if(bGeometryChange) + { + setGeometry(currentGeometry); + } + + mLastMousePos = event->pos(); + } + + QRubberBand::mouseMoveEvent(event); +} + +void UBRubberBand::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event); + mMouseIsPressed = false; + unsetCursor(); +} \ No newline at end of file diff --git a/src/gui/UBRubberBand.h b/src/gui/UBRubberBand.h index e95e10bb..793524b8 100644 --- a/src/gui/UBRubberBand.h +++ b/src/gui/UBRubberBand.h @@ -26,8 +26,32 @@ class UBRubberBand : public QRubberBand UBRubberBand(Shape s, QWidget * p = 0); virtual ~UBRubberBand(); + private: + enum enm_resizingMode + { + None, + Top, + TopLeft, + TopRight, + Bottom, + BottomLeft, + BottomRight, + Left, + Right + }; + + enm_resizingMode determineResizingMode(QPoint pos); + virtual void mousePressEvent(QMouseEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mouseReleaseEvent(QMouseEvent *event); + private: QStyle* customStyle; + enm_resizingMode mResizingMode; + int mResizingBorderHeight; + bool mMouseIsPressed; + QPoint mLastPressedPoint; + QPoint mLastMousePos; }; #endif /* UBRUBBERBAND_H_ */ diff --git a/src/gui/UBStylusPalette.cpp b/src/gui/UBStylusPalette.cpp index 93073ccd..50da9720 100644 --- a/src/gui/UBStylusPalette.cpp +++ b/src/gui/UBStylusPalette.cpp @@ -39,6 +39,7 @@ UBStylusPalette::UBStylusPalette(QWidget *parent, Qt::Orientation orient) actions << UBApplication::mainWindow->actionEraser; actions << UBApplication::mainWindow->actionMarker; actions << UBApplication::mainWindow->actionSelector; + actions << UBApplication::mainWindow->actionPlay; actions << UBApplication::mainWindow->actionHand; actions << UBApplication::mainWindow->actionZoomIn; diff --git a/src/tools/UBGraphicsCompass.cpp b/src/tools/UBGraphicsCompass.cpp index c0386d1a..f73fd274 100644 --- a/src/tools/UBGraphicsCompass.cpp +++ b/src/tools/UBGraphicsCompass.cpp @@ -170,7 +170,8 @@ QVariant UBGraphicsCompass::itemChange(GraphicsItemChange change, const QVariant void UBGraphicsCompass::mousePressEvent(QGraphicsSceneMouseEvent *event) { - if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector) + if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector && + UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; if (resizeButtonRect().contains(event->pos())) @@ -205,7 +206,8 @@ void UBGraphicsCompass::mousePressEvent(QGraphicsSceneMouseEvent *event) void UBGraphicsCompass::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { - if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector) + if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector && + UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; if (!mResizing && !mRotating && !mDrawing) @@ -249,7 +251,8 @@ void UBGraphicsCompass::mouseMoveEvent(QGraphicsSceneMouseEvent *event) void UBGraphicsCompass::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { - if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector) + if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector && + UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; if (mResizing) @@ -289,7 +292,8 @@ void UBGraphicsCompass::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void UBGraphicsCompass::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { - if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector) + if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector && + UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; mOuterCursor = cursor(); @@ -318,7 +322,8 @@ void UBGraphicsCompass::hoverEnterEvent(QGraphicsSceneHoverEvent *event) void UBGraphicsCompass::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { - if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector) + if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector && + UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; mShowButtons = false; @@ -331,7 +336,8 @@ void UBGraphicsCompass::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) void UBGraphicsCompass::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { - if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector) + if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector && + UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; mShowButtons = shape().contains(event->pos()); diff --git a/src/tools/UBGraphicsProtractor.cpp b/src/tools/UBGraphicsProtractor.cpp index f00bf275..3d38a21b 100644 --- a/src/tools/UBGraphicsProtractor.cpp +++ b/src/tools/UBGraphicsProtractor.cpp @@ -250,13 +250,19 @@ void UBGraphicsProtractor::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) if (scene()) scene()->setModified(true); + if (!mShowButtons) + { + mShowButtons = true; + update(); + } + mCurrentTool = None; } void UBGraphicsProtractor::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { - if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector) + if (UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Selector && UBDrawingController::drawingController ()->stylusTool() != UBStylusTool::Play) return; if (!mShowButtons) @@ -292,12 +298,6 @@ void UBGraphicsProtractor::hoverMoveEvent(QGraphicsSceneHoverEvent *event) Tool currentTool = toolFromPos(event->pos()); - if (!mShowButtons) - { - mShowButtons = true; - update(); - } - if (currentTool == Move) setCursor(Qt::SizeAllCursor); else diff --git a/src/tools/UBGraphicsRuler.cpp b/src/tools/UBGraphicsRuler.cpp index 720b7b22..97f37084 100644 --- a/src/tools/UBGraphicsRuler.cpp +++ b/src/tools/UBGraphicsRuler.cpp @@ -268,7 +268,7 @@ void UBGraphicsRuler::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); - if (currentTool == UBStylusTool::Selector) + if (currentTool == UBStylusTool::Selector || currentTool == UBStylusTool::Play) { mCloseSvgItem->setVisible(mShowButtons); mResizeSvgItem->setVisible(mShowButtons); @@ -376,7 +376,8 @@ void UBGraphicsRuler::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); - if (currentTool == UBStylusTool::Selector) + if (currentTool == UBStylusTool::Selector || + currentTool == UBStylusTool::Play) { mCloseSvgItem->setParentItem(this); mResizeSvgItem->setParentItem(this); diff --git a/src/tools/UBGraphicsTriangle.cpp b/src/tools/UBGraphicsTriangle.cpp index ef946af7..57d77d7f 100644 --- a/src/tools/UBGraphicsTriangle.cpp +++ b/src/tools/UBGraphicsTriangle.cpp @@ -763,7 +763,9 @@ void UBGraphicsTriangle::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); - if (currentTool == UBStylusTool::Selector) { + if (currentTool == UBStylusTool::Selector || + currentTool == UBStylusTool::Play) + { mCloseSvgItem->setParentItem(this); mShowButtons = true; @@ -813,7 +815,8 @@ void UBGraphicsTriangle::hoverMoveEvent(QGraphicsSceneHoverEvent *event) { UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool (); - if (currentTool == UBStylusTool::Selector) + if (currentTool == UBStylusTool::Selector || + currentTool == UBStylusTool::Play) { mCloseSvgItem->setVisible(mShowButtons); mVFlipSvgItem->setVisible(mShowButtons);