diff --git a/src/app/puzzle/scene/vpmaingraphicsview.cpp b/src/app/puzzle/scene/vpmaingraphicsview.cpp index a0b25494e..6f5b76526 100644 --- a/src/app/puzzle/scene/vpmaingraphicsview.cpp +++ b/src/app/puzzle/scene/vpmaingraphicsview.cpp @@ -639,6 +639,10 @@ void VPMainGraphicsView::RemovePiece() const } const QList &graphicsPieces = sheet->SceneData()->GraphicsPieces(); + + QVector commands; + commands.reserve(graphicsPieces.size()); + for (auto *graphicsPiece : graphicsPieces) { VPPiecePtr const piece = graphicsPiece->GetPiece(); @@ -646,15 +650,26 @@ void VPMainGraphicsView::RemovePiece() const if (not piece.isNull() && piece->IsSelected()) { piece->SetSelected(false); + emit layout->PieceSelectionChanged(piece); - VPLayoutPtr const layout = m_layout.toStrongRef(); - if (not layout.isNull()) - { - emit layout->PieceSelectionChanged(piece); - layout->UndoStack()->push(new VPUndoMovePieceOnSheet(VPSheetPtr(), piece)); - } + commands.append(new VPUndoMovePieceOnSheet(VPSheetPtr(), piece)); } } + + if (commands.size() > 1) + { + layout->UndoStack()->beginMacro(tr("Remove pieces")); + } + + for (auto *command : commands) + { + layout->UndoStack()->push(command); + } + + if (commands.size() > 1) + { + layout->UndoStack()->endMacro(); + } } //--------------------------------------------------------------------------------------------------------------------- diff --git a/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp b/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp index a2a54ae05..7343554ce 100644 --- a/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp +++ b/src/app/puzzle/undocommands/vpundomovepieceonsheet.cpp @@ -76,9 +76,26 @@ void VPUndoMovePieceOnSheet::undo() piece->SetSheet(sourceSheet); piece->SetSelected(false); + if ((m_followGrainline || piece->IsFollowGrainline()) && !sourceSheet.isNull()) + { + QT_WARNING_PUSH + QT_WARNING_DISABLE_GCC("-Wnoexcept") + + VPTransformationOrigon origin; + origin.custom = true; + + QT_WARNING_POP + + piece->RotateToGrainline(origin); + } + if (not layout.isNull()) { emit layout->PieceSheetChanged(piece); + if (!sourceSheet.isNull()) + { + emit layout->PieceTransformationChanged(piece); + } emit layout->PieceSelectionChanged(piece); } } @@ -115,7 +132,7 @@ void VPUndoMovePieceOnSheet::redo() piece->SetSelected(false); } - if (m_followGrainline || piece->IsFollowGrainline()) + if ((m_followGrainline || piece->IsFollowGrainline()) && !sourceSheet.isNull()) { QT_WARNING_PUSH QT_WARNING_DISABLE_GCC("-Wnoexcept") @@ -131,7 +148,10 @@ void VPUndoMovePieceOnSheet::redo() if (not layout.isNull()) { emit layout->PieceSheetChanged(piece); - emit layout->PieceTransformationChanged(piece); + if (!sourceSheet.isNull()) + { + emit layout->PieceTransformationChanged(piece); + } emit layout->LayoutChanged(); } }