Undo some selection actions.

This commit is contained in:
Leonardo Zide
2026-01-10 11:00:39 -08:00
parent 75ac6fe0cb
commit f69166cf3d
6 changed files with 127 additions and 60 deletions
+104 -46
View File
@@ -1734,12 +1734,10 @@ void lcModel::SubModelAddBoundingBoxPoints(const lcMatrix44& WorldMatrix, std::v
void lcModel::RecordSelectionAction(lcModelActionSelectionMode ModelActionSelectionMode)
{
std::unique_ptr<lcModelActionSelection> ModelActionSelection = std::make_unique<lcModelActionSelection>(ModelActionSelectionMode);
std::unique_ptr<lcModelActionSelection> ModelActionSelection = std::make_unique<lcModelActionSelection>(ModelActionSelectionMode, mCurrentStep);
ModelActionSelection->SetSelection(mPieces, mCameras, mLights);
RunSelectionAction(ModelActionSelection.get(), true);
mActionSequence.emplace_back(std::move(ModelActionSelection));
}
@@ -1757,9 +1755,31 @@ void lcModel::RunSelectionAction(const lcModelActionSelection* ModelActionSelect
switch (ModelActionSelection->GetMode())
{
case lcModelActionSelectionMode::Clear:
case lcModelActionSelectionMode::ClearSelection:
if (Apply)
ClearSelection(true);
DeselectAllObjects();
else
LoadSelection();
break;
case lcModelActionSelectionMode::SelectAllPieces:
if (Apply)
{
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
if (Piece->IsVisible(ModelActionSelection->GetStep()))
Piece->SetSelected(true);
}
else
LoadSelection();
break;
case lcModelActionSelectionMode::InvertPieceSelection:
if (Apply)
{
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
if (Piece->IsVisible(ModelActionSelection->GetStep()))
Piece->SetSelected(!Piece->IsSelected());
}
else
LoadSelection();
break;
@@ -1824,8 +1844,6 @@ void lcModel::RecordGroupPiecesAction(lcModelActionGroupPiecesMode Mode, const Q
{
std::unique_ptr<lcModelActionGroupPieces> ModelActionGroupPieces = std::make_unique<lcModelActionGroupPieces>(Mode, GroupName);
RunGroupPiecesAction(ModelActionGroupPieces.get(), true);
mActionSequence.emplace_back(std::move(ModelActionGroupPieces));
}
@@ -1901,12 +1919,18 @@ void lcModel::RunGroupPiecesAction(const lcModelActionGroupPieces* ModelActionGr
gMainWindow->UpdateSelectedObjects(true);
}
void lcModel::PerformActionSequence(const std::vector<std::unique_ptr<lcModelAction>>& ActionSequence, bool Apply)
void lcModel::RunActionSequence(const std::vector<std::unique_ptr<lcModelAction>>& ActionSequence, bool Apply)
{
auto PerformAction=[this](const lcModelAction* ModelAction, bool Apply)
bool SelectionChanged = false;
auto RunAction=[this, &SelectionChanged](const lcModelAction* ModelAction, bool Apply)
{
if (const lcModelActionSelection* ModelActionSelection = dynamic_cast<const lcModelActionSelection*>(ModelAction))
{
RunSelectionAction(ModelActionSelection, Apply);
SelectionChanged = true;
}
else if (const lcModelActionObjectEdit* ModelActionObjectEdit = dynamic_cast<const lcModelActionObjectEdit*>(ModelAction))
RunObjectEditAction(ModelActionObjectEdit, Apply);
else if (const lcModelActionGroupPieces* ModelActionGroupPieces = dynamic_cast<const lcModelActionGroupPieces*>(ModelAction))
@@ -1916,13 +1940,16 @@ void lcModel::PerformActionSequence(const std::vector<std::unique_ptr<lcModelAct
if (Apply)
{
for (auto ModelAction = ActionSequence.begin(); ModelAction != ActionSequence.end(); ++ModelAction)
PerformAction(ModelAction->get(), true);
RunAction(ModelAction->get(), true);
}
else
{
for (auto ModelAction = ActionSequence.rbegin(); ModelAction != ActionSequence.rend(); ++ModelAction)
PerformAction(ModelAction->get(), false);
RunAction(ModelAction->get(), false);
}
if (SelectionChanged)
gMainWindow->UpdateSelectedObjects(true);
UpdateAllViews();
}
@@ -1934,6 +1961,11 @@ void lcModel::BeginActionSequence()
void lcModel::EndActionSequence(const QString& Description)
{
if (mActionSequence.empty())
return;
RunActionSequence(mActionSequence, true);
std::unique_ptr<lcModelHistoryEntry> ModelHistoryEntry = std::make_unique<lcModelHistoryEntry>(lcModelHistoryEntry());
ModelHistoryEntry->Description = Description;
@@ -1953,7 +1985,7 @@ void lcModel::DiscardActionSequence()
void lcModel::RevertActionSequence()
{
PerformActionSequence(mActionSequence, false);
RunActionSequence(mActionSequence, false);
mActionSequence.clear();
}
@@ -1985,7 +2017,7 @@ void lcModel::LoadCheckPoint(lcModelHistoryEntry* CheckPoint, bool Apply)
{
if (!CheckPoint->ModelActions.empty())
{
PerformActionSequence(CheckPoint->ModelActions, Apply);
RunActionSequence(CheckPoint->ModelActions, Apply);
return;
}
@@ -2362,7 +2394,8 @@ void lcModel::ShowEditGroupsDialog()
if (Modified)
{
ClearSelection(true);
DeselectAllObjects();
gMainWindow->UpdateSelectedObjects(true);
SaveCheckpoint(tr("Editing Groups"));
}
}
@@ -4373,22 +4406,68 @@ std::vector<lcObject*> lcModel::GetSelectionModePieces(const lcPiece* SelectedPi
return Pieces;
}
void lcModel::ClearSelection(bool UpdateInterface)
void lcModel::ClearSelection()
{
if (!AnyObjectsSelected())
return;
BeginActionSequence();
RecordSelectionAction(lcModelActionSelectionMode::ClearSelection);
EndActionSequence(tr("Selection"));
}
void lcModel::SelectAllPieces()
{
bool UnselectedPieces = false;
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
{
if (Piece->IsVisible(mCurrentStep) && !Piece->IsSelected())
{
UnselectedPieces = true;
break;
}
}
if (!UnselectedPieces)
return;
BeginActionSequence();
RecordSelectionAction(lcModelActionSelectionMode::SelectAllPieces);
EndActionSequence(tr("Selection"));
}
void lcModel::InvertPieceSelection()
{
bool VisiblePieces = false;
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
{
if (Piece->IsVisible(mCurrentStep))
{
VisiblePieces = true;
break;
}
}
if (!VisiblePieces)
return;
BeginActionSequence();
RecordSelectionAction(lcModelActionSelectionMode::InvertPieceSelection);
EndActionSequence(tr("Selection"));
}
void lcModel::DeselectAllObjects()
{
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
Piece->SetSelected(false);
for (const std::unique_ptr<lcCamera>& Camera : mCameras)
Camera->SetSelected(false);
for (const std::unique_ptr<lcLight>& Light : mLights)
Light->SetSelected(false);
if (UpdateInterface)
{
gMainWindow->UpdateSelectedObjects(true);
UpdateAllViews();
}
}
void lcModel::SelectGroup(lcGroup* TopGroup, bool Select)
@@ -4448,7 +4527,7 @@ void lcModel::FocusOrDeselectObject(const lcObjectSection& ObjectSection)
void lcModel::ClearSelectionAndSetFocus(lcObject* Object, quint32 Section, bool EnableSelectionMode)
{
ClearSelection(false);
DeselectAllObjects();
if (Object)
{
@@ -4479,7 +4558,7 @@ void lcModel::ClearSelectionAndSetFocus(const lcObjectSection& ObjectSection, bo
void lcModel::SetSelectionAndFocus(const std::vector<lcObject*>& Selection, lcObject* Focus, quint32 Section, bool EnableSelectionMode)
{
ClearSelection(false);
DeselectAllObjects();
if (Focus)
{
@@ -4596,27 +4675,6 @@ void lcModel::RemoveFromSelection(const lcObjectSection& ObjectSection)
UpdateAllViews();
}
void lcModel::SelectAllPieces()
{
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
if (Piece->IsVisible(mCurrentStep))
Piece->SetSelected(true);
if (!mIsPreview)
gMainWindow->UpdateSelectedObjects(true);
UpdateAllViews();
}
void lcModel::InvertSelection()
{
for (const std::unique_ptr<lcPiece>& Piece : mPieces)
if (Piece->IsVisible(mCurrentStep))
Piece->SetSelected(!Piece->IsSelected());
gMainWindow->UpdateSelectedObjects(true);
UpdateAllViews();
}
void lcModel::HideSelectedPieces()
{
BeginActionSequence();