From 214764dce3fc9fcf8c6445014c05d3b7b8ee95ca Mon Sep 17 00:00:00 2001 From: Craig Watson Date: Wed, 9 Mar 2016 14:57:51 +0100 Subject: [PATCH] zValue tweaks - Sort by Z before duplicating a selection (so that relative Z's are kept) - in UBZLayerController, iterate only through UBGraphicsScene's fast access items, not QGraphicsScene::items --- src/domain/UBGraphicsScene.cpp | 2 +- src/domain/UBSelectionFrame.cpp | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 9aa3d76a..f4091c21 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -302,7 +302,7 @@ void UBZLayerController::shiftStoredZValue(QGraphicsItem *item, qreal zValue) */ bool UBZLayerController::zLevelAvailable(qreal z) { - foreach(QGraphicsItem* it, mScene->items()) { + foreach(QGraphicsItem* it, dynamic_cast(mScene)->getFastAccessItems()) { if (it->zValue() == z) return false; } diff --git a/src/domain/UBSelectionFrame.cpp b/src/domain/UBSelectionFrame.cpp index 653e50f2..72a28de9 100644 --- a/src/domain/UBSelectionFrame.cpp +++ b/src/domain/UBSelectionFrame.cpp @@ -258,9 +258,20 @@ void UBSelectionFrame::remove() updateRect(); } +static bool sortByZ(UBGraphicsItemDelegate* A, UBGraphicsItemDelegate* B) +{ + return (A->delegated()->data(UBGraphicsItemData::ItemOwnZValue).toReal() + < B->delegated()->data(UBGraphicsItemData::ItemOwnZValue).toReal() ); +} + void UBSelectionFrame::duplicate() { UBApplication::undoStack->beginMacro(UBSettings::undoCommandTransactionName); + + // The mEnclosedtems list items are in order of selection. To avoid losing their + // relative zValues when duplicating, we re-order the list. + std::sort(mEnclosedtems.begin(), mEnclosedtems.end(), sortByZ); + foreach (UBGraphicsItemDelegate *d, mEnclosedtems) { d->duplicate(); }