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(); }