mirror of
https://github.com/leozide/leocad.git
synced 2026-07-27 19:56:49 +00:00
Undo some selection actions.
This commit is contained in:
+104
-46
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user