diff --git a/common/lc_model.cpp b/common/lc_model.cpp index dd68c180..2756d225 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -1729,31 +1729,30 @@ void lcModel::RunSelectionAction(const lcModelActionSelection* ModelActionSelect if (!ModelActionSelection) return; + auto LoadSelection = [this, ModelActionSelection]() + { + auto [SelectedObjects, FocusObject, FocusSection] = ModelActionSelection->GetSelection(mPieces, mCameras, mLights); + + SetSelectionAndFocus(SelectedObjects, FocusObject, FocusSection, false); + }; + switch (ModelActionSelection->GetMode()) { case lcModelActionSelectionMode::Clear: if (Apply) - { ClearSelection(true); - } else - { - auto [SelectedObjects, FocusObject, FocusSection] = ModelActionSelection->GetSelection(mPieces, mCameras, mLights); - - SetSelectionAndFocus(SelectedObjects, FocusObject, FocusSection, false); - } + LoadSelection(); break; case lcModelActionSelectionMode::Save: - if (Apply) - { - } - else - { - auto [SelectedObjects, FocusObject, FocusSection] = ModelActionSelection->GetSelection(mPieces, mCameras, mLights); + if (!Apply) + LoadSelection(); + break; - SetSelectionAndFocus(SelectedObjects, FocusObject, FocusSection, false); - } + case lcModelActionSelectionMode::Restore: + if (Apply) + LoadSelection(); break; } } @@ -1825,9 +1824,9 @@ void lcModel::RunAddPiecesAction(const lcModelActionAddPieces* ModelActionAddPie } } -void lcModel::RecordGroupPiecesAction(const QString& GroupName) +void lcModel::RecordGroupPiecesAction(lcModelActionGroupPiecesMode Mode, const QString& GroupName) { - std::unique_ptr ModelActionGroupPieces = std::make_unique(GroupName); + std::unique_ptr ModelActionGroupPieces = std::make_unique(Mode, GroupName); RunGroupPiecesAction(ModelActionGroupPieces.get(), true); @@ -1839,9 +1838,13 @@ void lcModel::RunGroupPiecesAction(const lcModelActionGroupPieces* ModelActionGr if (!ModelActionGroupPieces) return; - if (Apply) + if (Apply == (ModelActionGroupPieces->GetMode() == lcModelActionGroupPiecesMode::Group)) { - lcGroup* NewGroup = AddGroup(ModelActionGroupPieces->GetGroupName(), nullptr); + lcGroup* NewGroup = new lcGroup(); + mGroups.emplace_back(NewGroup); + + NewGroup->mName = ModelActionGroupPieces->GetGroupName(); + NewGroup->mGroup = nullptr; for (const std::unique_ptr& Piece : mPieces) { @@ -1898,6 +1901,8 @@ void lcModel::RunGroupPiecesAction(const lcModelActionGroupPieces* ModelActionGr RemoveEmptyGroups(); } + + gMainWindow->UpdateSelectedObjects(true); } void lcModel::PerformActionSequence(const std::vector>& ActionSequence, bool Apply) @@ -2201,69 +2206,28 @@ void lcModel::GroupSelection() } lcGroupDialog Dialog(gMainWindow, GetGroupName(tr("Group #"))); + if (Dialog.exec() != QDialog::Accepted) return; - lcGroup* NewGroup = GetGroup(Dialog.mName, true); + BeginActionSequence(); - for (const std::unique_ptr& Piece : mPieces) - { - if (Piece->IsSelected()) - { - lcGroup* Group = Piece->GetTopGroup(); + RecordSelectionAction(lcModelActionSelectionMode::Restore); + RecordGroupPiecesAction(lcModelActionGroupPiecesMode::Group, Dialog.mName); + RecordSelectionAction(lcModelActionSelectionMode::Save); - if (!Group) - Piece->SetGroup(NewGroup); - else if (Group != NewGroup) - Group->mGroup = NewGroup; - } - } - - SaveCheckpoint(tr("Grouping")); + EndActionSequence(tr("Group")); } void lcModel::UngroupSelection() { - std::set SelectedGroups; + BeginActionSequence(); - for (const std::unique_ptr& Piece : mPieces) - { - if (Piece->IsSelected()) - { - lcGroup* Group = Piece->GetTopGroup(); + RecordSelectionAction(lcModelActionSelectionMode::Restore); + RecordGroupPiecesAction(lcModelActionGroupPiecesMode::Ungroup, QString()); + RecordSelectionAction(lcModelActionSelectionMode::Save); - if (SelectedGroups.insert(Group).second) - { - for (std::vector>::iterator GroupIt = mGroups.begin(); GroupIt != mGroups.end(); GroupIt++) - { - if (GroupIt->get() == Group) - { - GroupIt->release(); - mGroups.erase(GroupIt); - break; - } - } - } - } - } - - for (const std::unique_ptr& Piece : mPieces) - { - lcGroup* Group = Piece->GetGroup(); - - if (SelectedGroups.find(Group) != SelectedGroups.end()) - Piece->SetGroup(nullptr); - } - - for (const std::unique_ptr& Group : mGroups) - if (SelectedGroups.find(Group->mGroup) != SelectedGroups.end()) - Group->mGroup = nullptr; - - for (lcGroup* Group : SelectedGroups) - delete Group; - - RemoveEmptyGroups(); - SaveCheckpoint(tr("Ungrouping")); + EndActionSequence(tr("Ungroup")); } void lcModel::AddSelectedPiecesToGroup() @@ -5353,7 +5317,7 @@ void lcModel::ShowMinifigDialog() RecordSelectionAction(lcModelActionSelectionMode::Save); RecordAddPiecesAction(PieceInfoTransforms, lcModelActionAddPieceSelectionMode::SelectAll); - RecordGroupPiecesAction(tr("Minifig #")); + RecordGroupPiecesAction(lcModelActionGroupPiecesMode::Group, GetGroupName(tr("Minifig #"))); RecordSelectionAction(lcModelActionSelectionMode::Save); EndActionSequence(tr("Add Minifig")); diff --git a/common/lc_model.h b/common/lc_model.h index 6a33269d..edbf6344 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -10,6 +10,7 @@ class lcModelActionAddPieces; class lcModelActionGroupPieces; enum class lcModelActionSelectionMode; enum class lcModelActionAddPieceSelectionMode; +enum class lcModelActionGroupPiecesMode; #define LC_SEL_NO_PIECES 0x0001 // No pieces in model #define LC_SEL_PIECE 0x0002 // At least 1 piece selected @@ -403,7 +404,7 @@ protected: void RunSelectionAction(const lcModelActionSelection* ModelActionSelection, bool Apply); void RecordAddPiecesAction(const std::vector& PieceInfoTransforms, lcModelActionAddPieceSelectionMode SelectionMode); void RunAddPiecesAction(const lcModelActionAddPieces* ModelActionAddPieces, bool Apply); - void RecordGroupPiecesAction(const QString& GroupName); + void RecordGroupPiecesAction(lcModelActionGroupPiecesMode Mode, const QString& GroupName); void RunGroupPiecesAction(const lcModelActionGroupPieces* ModelActionGroupPieces, bool Apply); void PerformActionSequence(const std::vector>& ActionSequence, bool Apply); diff --git a/common/lc_modelaction.cpp b/common/lc_modelaction.cpp index e4da549b..33740a74 100644 --- a/common/lc_modelaction.cpp +++ b/common/lc_modelaction.cpp @@ -127,7 +127,7 @@ void lcModelActionAddPieces::SetPieceData(const std::vector& } } -lcModelActionGroupPieces::lcModelActionGroupPieces(const QString& GroupName) - : mGroupName(GroupName) +lcModelActionGroupPieces::lcModelActionGroupPieces(lcModelActionGroupPiecesMode Mode, const QString& GroupName) + : mMode(Mode), mGroupName(GroupName) { } diff --git a/common/lc_modelaction.h b/common/lc_modelaction.h index 8003d377..be718346 100644 --- a/common/lc_modelaction.h +++ b/common/lc_modelaction.h @@ -15,7 +15,8 @@ public: enum class lcModelActionSelectionMode { Clear, - Save + Save, + Restore }; class lcModelActionSelection : public lcModelAction @@ -84,17 +85,29 @@ protected: lcModelActionAddPieceSelectionMode mSelectionMode; }; +enum class lcModelActionGroupPiecesMode +{ + Group, + Ungroup +}; + class lcModelActionGroupPieces : public lcModelAction { public: - lcModelActionGroupPieces(const QString& GroupName); + lcModelActionGroupPieces(lcModelActionGroupPiecesMode Mode, const QString& GroupName); virtual ~lcModelActionGroupPieces() = default; + lcModelActionGroupPiecesMode GetMode() const + { + return mMode; + } + const QString& GetGroupName() const { return mGroupName; } protected: + lcModelActionGroupPiecesMode mMode; QString mGroupName; };