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
+2 -2
View File
@@ -2784,12 +2784,12 @@ void lcMainWindow::HandleCommand(lcCommandId CommandId)
case LC_EDIT_SELECT_NONE:
if (ActiveModel)
ActiveModel->ClearSelection(true);
ActiveModel->ClearSelection();
break;
case LC_EDIT_SELECT_INVERT:
if (ActiveModel)
ActiveModel->InvertSelection();
ActiveModel->InvertPieceSelection();
break;
case LC_EDIT_SELECT_BY_NAME:
+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();
+6 -5
View File
@@ -323,17 +323,17 @@ public:
void GetModelParts(const lcMatrix44& WorldMatrix, int DefaultColorIndex, std::vector<lcModelPartsEntry>& ModelParts) const;
void GetSelectionInformation(int* Flags, std::vector<lcObject*>& Selection, lcObject** Focus) const;
std::vector<lcObject*> GetSelectionModePieces(const lcPiece* SelectedPiece) const;
void ClearSelection();
void SelectAllPieces();
void InvertPieceSelection();
void FocusOrDeselectObject(const lcObjectSection& ObjectSection);
void ClearSelection(bool UpdateInterface);
void ClearSelectionAndSetFocus(lcObject* Object, quint32 Section, bool EnableSelectionMode);
void ClearSelectionAndSetFocus(const lcObjectSection& ObjectSection, bool EnableSelectionMode);
void SetSelectionAndFocus(const std::vector<lcObject*>& Selection, lcObject* Focus, quint32 Section, bool EnableSelectionMode);
void AddToSelection(const std::vector<lcObject*>& Objects, bool EnableSelectionMode, bool UpdateInterface);
void RemoveFromSelection(const std::vector<lcObject*>& Objects);
void RemoveFromSelection(const lcObjectSection& ObjectSection);
void SelectAllPieces();
void InvertSelection();
void HideSelectedPieces();
void HideUnselectedPieces();
@@ -415,7 +415,7 @@ protected:
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);
void RunActionSequence(const std::vector<std::unique_ptr<lcModelAction>>& ActionSequence, bool Apply);
void BeginActionSequence();
void EndActionSequence(const QString& Description);
void DiscardActionSequence();
@@ -429,6 +429,7 @@ protected:
bool RemoveSelectedObjects();
void RemoveCameraFromViews(lcCamera* Camera);
void DeselectAllObjects();
void SelectGroup(lcGroup* TopGroup, bool Select);
size_t AddPiece(lcPiece* Piece);
+2 -2
View File
@@ -182,8 +182,8 @@ bool lcModelAction::LoadHistoryBuffer(const QByteArray& Buffer, lcModel* Model,
return true;
}
lcModelActionSelection::lcModelActionSelection(lcModelActionSelectionMode Mode)
: mMode(Mode)
lcModelActionSelection::lcModelActionSelection(lcModelActionSelectionMode Mode, lcStep Step)
: mMode(Mode), mStep(Step)
{
}
+12 -4
View File
@@ -20,7 +20,9 @@ protected:
enum class lcModelActionSelectionMode
{
Clear,
ClearSelection,
SelectAllPieces,
InvertPieceSelection,
Set,
Save,
Restore
@@ -29,14 +31,19 @@ enum class lcModelActionSelectionMode
class lcModelActionSelection : public lcModelAction
{
public:
lcModelActionSelection(lcModelActionSelectionMode Mode);
lcModelActionSelection(lcModelActionSelectionMode Mode, lcStep Step);
virtual ~lcModelActionSelection() = default;
lcModelActionSelectionMode GetMode() const
{
return mMode;
}
lcStep GetStep() const
{
return mStep;
}
void SetSelection(const std::vector<std::unique_ptr<lcPiece>>& Pieces, const std::vector<std::unique_ptr<lcCamera>>& Cameras, const std::vector<std::unique_ptr<lcLight>>& Lights);
std::tuple<std::vector<lcObject*>, lcObject*, uint32_t> GetSelection(const std::vector<std::unique_ptr<lcPiece>>& Pieces, const std::vector<std::unique_ptr<lcCamera>>& Cameras, const std::vector<std::unique_ptr<lcLight>>& Lights) const;
@@ -47,7 +54,8 @@ protected:
size_t mFocusIndex = SIZE_MAX;
uint32_t mFocusSection = 0;
lcObjectType mFocusType = (lcObjectType)0;
lcModelActionSelectionMode mMode = lcModelActionSelectionMode::Clear;
lcModelActionSelectionMode mMode;
lcStep mStep;
};
enum class lcModelActionObjectEditMode
+1 -1
View File
@@ -2494,7 +2494,7 @@ void lcView::CancelTrackingOrClearSelection()
{
lcModel* ActiveModel = GetActiveModel();
if (ActiveModel)
ActiveModel->ClearSelection(true);
ActiveModel->ClearSelection();
}
}