|
|
|
@ -57,6 +57,7 @@ |
|
|
|
|
#include "tools/UBGraphicsCompass.h" |
|
|
|
|
#include "tools/UBGraphicsCache.h" |
|
|
|
|
#include "tools/UBGraphicsTriangle.h" |
|
|
|
|
#include "tools/UBGraphicsProtractor.h" |
|
|
|
|
|
|
|
|
|
#include "core/memcheck.h" |
|
|
|
|
|
|
|
|
@ -399,18 +400,217 @@ bool UBBoardView::itemHaveParentWithType(QGraphicsItem *item, int type) |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QGraphicsItem* UBBoardView::determinedItemToMove() |
|
|
|
|
bool UBBoardView::itemShouldReceiveMousePressEvent(QGraphicsItem *item) |
|
|
|
|
{ |
|
|
|
|
// groupConteinerItem should be moved instead of it's owned items
|
|
|
|
|
if(movingItem && movingItem->parentItem() && |
|
|
|
|
(UBGraphicsGroupContainerItem::Type == movingItem->parentItem()->type() || |
|
|
|
|
UBGraphicsStrokesGroup::Type == movingItem->parentItem()->type()
|
|
|
|
|
) |
|
|
|
|
) |
|
|
|
|
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()) |
|
|
|
|
{ |
|
|
|
|
movingItem = movingItem->parentItem();
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
return movingItem; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void UBBoardView::mousePressEvent (QMouseEvent *event) |
|
|
|
@ -451,8 +651,6 @@ void UBBoardView::mousePressEvent (QMouseEvent *event) |
|
|
|
|
} |
|
|
|
|
else if (currentTool == UBStylusTool::Selector) |
|
|
|
|
{ |
|
|
|
|
// QSet<QGraphicsItem*> existingTools = scene()->tools(); why do we need to get tools here?
|
|
|
|
|
|
|
|
|
|
movingItem = scene()->itemAt(this->mapToScene(event->posF().toPoint())); |
|
|
|
|
|
|
|
|
|
if (!movingItem) { |
|
|
|
@ -464,35 +662,7 @@ void UBBoardView::mousePressEvent (QMouseEvent *event) |
|
|
|
|
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)) |
|
|
|
|
{ |
|
|
|
|
if (movingItem && !itemIsLocked(movingItem) |
|
|
|
|
|| itemHaveParentWithType(movingItem, UBGraphicsMediaItem::Type)) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
QGraphicsView::mousePressEvent (event); |
|
|
|
|
} |
|
|
|
|
movingItem = NULL; |
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
mLastPressedMousePos = mapToScene(event->pos()); |
|
|
|
|
if (suspendedMousePressEvent) |
|
|
|
|
{ |
|
|
|
|
delete suspendedMousePressEvent; |
|
|
|
|
} |
|
|
|
|
suspendedMousePressEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers()); // удалить
|
|
|
|
|
} |
|
|
|
|
handleItemMousePress(event); |
|
|
|
|
|
|
|
|
|
event->accept(); |
|
|
|
|
} |
|
|
|
@ -500,40 +670,7 @@ void UBBoardView::mousePressEvent (QMouseEvent *event) |
|
|
|
|
{ |
|
|
|
|
movingItem = scene()->itemAt(this->mapToScene(event->posF().toPoint())); |
|
|
|
|
|
|
|
|
|
mLastPressedMousePos = mapToScene(event->pos()); |
|
|
|
|
|
|
|
|
|
// items, who shouldn't receive mouse press event
|
|
|
|
|
if (movingItem &&
|
|
|
|
|
UBGraphicsTextItem ::Type != movingItem->type() |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
QGraphicsView::mousePressEvent(event);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// items, who should receive suspended mouse press event
|
|
|
|
|
if (movingItem && |
|
|
|
|
UBGraphicsMediaItem::Type == movingItem->type() |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
if (suspendedMousePressEvent) |
|
|
|
|
{ |
|
|
|
|
delete suspendedMousePressEvent; |
|
|
|
|
} |
|
|
|
|
suspendedMousePressEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers()); // удалить
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// groups shouldn't be moved independant of items)
|
|
|
|
|
if(movingItem &&
|
|
|
|
|
(UBGraphicsGroupContainerItem::Type == movingItem->type() || |
|
|
|
|
UBGraphicsStrokesGroup::Type == movingItem->type() |
|
|
|
|
) |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
movingItem = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
movingItem = determinedItemToMove();
|
|
|
|
|
|
|
|
|
|
handleItemMousePress(event); |
|
|
|
|
event->accept(); |
|
|
|
|
} |
|
|
|
|
else if (currentTool == UBStylusTool::Text) |
|
|
|
@ -654,43 +791,11 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (movingItem && (mMouseButtonIsPressed || mTabletStylusIsPressed) && |
|
|
|
|
!movingItem->data(UBGraphicsItemData::ItemLocked).toBool()) |
|
|
|
|
{ |
|
|
|
|
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 (currentTool == UBStylusTool::Play) |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
// items, who shouldn't receive mouse move events
|
|
|
|
|
if (movingItem && |
|
|
|
|
(UBGraphicsW3CWidgetItem::Type == movingItem->type() || |
|
|
|
|
itemHaveParentWithType(movingItem, UBGraphicsToolBarItem::Type) |
|
|
|
|
) |
|
|
|
|
) |
|
|
|
|
{ |
|
|
|
|
movingItem = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (movingItem && (mMouseButtonIsPressed || mTabletStylusIsPressed) && |
|
|
|
|
!movingItem->data(UBGraphicsItemData::ItemLocked).toBool()) |
|
|
|
|
{ |
|
|
|
|
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) |
|
|
|
@ -717,6 +822,9 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event) |
|
|
|
|
} |
|
|
|
|
event->accept (); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if((event->pos() - mLastPressedMousePos).manhattanLength() < QApplication::startDragDistance())
|
|
|
|
|
mWidgetMoved = true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
@ -746,29 +854,32 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event) |
|
|
|
|
delete suspendedMousePressEvent; |
|
|
|
|
suspendedMousePressEvent = NULL;
|
|
|
|
|
} |
|
|
|
|
else
|
|
|
|
|
{ |
|
|
|
|
movingItem->setSelected(true); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (mUBRubberBand && mUBRubberBand->isVisible()) { |
|
|
|
|
mUBRubberBand->hide(); |
|
|
|
|
if (mUBRubberBand && mUBRubberBand->isVisible()) { |
|
|
|
|
mUBRubberBand->hide(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QGraphicsView::mouseReleaseEvent (event); |
|
|
|
|
QGraphicsView::mouseReleaseEvent (event); |
|
|
|
|
} |
|
|
|
|
else if (currentTool == UBStylusTool::Play) |
|
|
|
|
{ |
|
|
|
|
if (suspendedMousePressEvent && !movingItem->data(UBGraphicsItemData::ItemLocked).toBool())
|
|
|
|
|
if (mWidgetMoved) |
|
|
|
|
{ |
|
|
|
|
QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop
|
|
|
|
|
movingItem = NULL; |
|
|
|
|
delete suspendedMousePressEvent; |
|
|
|
|
suspendedMousePressEvent = 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); |
|
|
|
|
QGraphicsView::mouseReleaseEvent (event); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
else if (currentTool == UBStylusTool::Text) |
|
|
|
|
{ |
|
|
|
|