Added group/ungroup actions.

This commit is contained in:
Leonardo Zide
2025-10-26 10:56:55 -07:00
parent d1064ad5c1
commit ecc994d569
4 changed files with 55 additions and 77 deletions
+36 -72
View File
@@ -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<lcModelActionGroupPieces> ModelActionGroupPieces = std::make_unique<lcModelActionGroupPieces>(GroupName);
std::unique_ptr<lcModelActionGroupPieces> ModelActionGroupPieces = std::make_unique<lcModelActionGroupPieces>(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<lcPiece>& Piece : mPieces)
{
@@ -1898,6 +1901,8 @@ void lcModel::RunGroupPiecesAction(const lcModelActionGroupPieces* ModelActionGr
RemoveEmptyGroups();
}
gMainWindow->UpdateSelectedObjects(true);
}
void lcModel::PerformActionSequence(const std::vector<std::unique_ptr<lcModelAction>>& 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<lcPiece>& 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<lcGroup*> SelectedGroups;
BeginActionSequence();
for (const std::unique_ptr<lcPiece>& 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<std::unique_ptr<lcGroup>>::iterator GroupIt = mGroups.begin(); GroupIt != mGroups.end(); GroupIt++)
{
if (GroupIt->get() == Group)
{
GroupIt->release();
mGroups.erase(GroupIt);
break;
}
}
}
}
}
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
{
lcGroup* Group = Piece->GetGroup();
if (SelectedGroups.find(Group) != SelectedGroups.end())
Piece->SetGroup(nullptr);
}
for (const std::unique_ptr<lcGroup>& 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"));
+2 -1
View File
@@ -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<lcInsertPieceInfo>& 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<std::unique_ptr<lcModelAction>>& ActionSequence, bool Apply);
+2 -2
View File
@@ -127,7 +127,7 @@ void lcModelActionAddPieces::SetPieceData(const std::vector<lcInsertPieceInfo>&
}
}
lcModelActionGroupPieces::lcModelActionGroupPieces(const QString& GroupName)
: mGroupName(GroupName)
lcModelActionGroupPieces::lcModelActionGroupPieces(lcModelActionGroupPiecesMode Mode, const QString& GroupName)
: mMode(Mode), mGroupName(GroupName)
{
}
+15 -2
View File
@@ -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;
};