From 6ff78892c072745a5cd2072520e92ea9e71ee6e9 Mon Sep 17 00:00:00 2001 From: Craig Watson Date: Sun, 26 Feb 2017 18:29:39 -0500 Subject: [PATCH] Don't move a selection containing locked items Fixes an issue where locked items could be moved if they were selected along with other items, and these items all moved by dragging the selection frame. This implementation prevents any movement of the selected items if at least one of them is locked. It also changes the colour of the selection frame, like a locked UBGraphicsDelegateFrame. --- src/domain/UBSelectionFrame.cpp | 17 +++++++++++++++++ src/domain/UBSelectionFrame.h | 2 ++ 2 files changed, 19 insertions(+) diff --git a/src/domain/UBSelectionFrame.cpp b/src/domain/UBSelectionFrame.cpp index ed3cbbd3..0ebc912d 100644 --- a/src/domain/UBSelectionFrame.cpp +++ b/src/domain/UBSelectionFrame.cpp @@ -111,9 +111,15 @@ void UBSelectionFrame::setEnclosedItems(const QList pGraphicsIte QRegion resultRegion; UBGraphicsFlags resultFlags; mEnclosedtems.clear(); + + // If at least one of the enclosed items is locked, the entire selection is + // considered to be locked. + mIsLocked = false; + foreach (QGraphicsItem *nextItem, pGraphicsItems) { UBGraphicsItemDelegate *nextDelegate = UBGraphicsItem::Delegate(nextItem); if (nextDelegate) { + mIsLocked = (mIsLocked || nextDelegate->isLocked()); mEnclosedtems.append(nextDelegate); resultRegion |= nextItem->boundingRegion(nextItem->sceneTransform()); resultFlags |= nextDelegate->ubflags(); @@ -129,6 +135,14 @@ void UBSelectionFrame::setEnclosedItems(const QList pGraphicsIte if (resultRect.isEmpty()) { hide(); } + + if (mIsLocked) { + QColor baseColor = UBSettings::paletteColor; + baseColor.setAlphaF(baseColor.alphaF() / 3); + setLocalBrush(QBrush(baseColor)); + } + else + setLocalBrush(QBrush(UBSettings::paletteColor)); } void UBSelectionFrame::updateRect() @@ -168,6 +182,9 @@ void UBSelectionFrame::mousePressEvent(QGraphicsSceneMouseEvent *event) void UBSelectionFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + if (mIsLocked) + return; + QPointF dp = event->pos() - mPressedPos; QPointF rotCenter = mapToScene(rect().center()); diff --git a/src/domain/UBSelectionFrame.h b/src/domain/UBSelectionFrame.h index 47d482a6..cda1f5f0 100644 --- a/src/domain/UBSelectionFrame.h +++ b/src/domain/UBSelectionFrame.h @@ -103,6 +103,8 @@ private: QPointF mLastTranslateOffset; qreal mRotationAngle; + bool mIsLocked; + QList mButtons; DelegateButton *mDeleteButton;