From 28ffe3be35a6efe552be7557086aa6ac36605baf Mon Sep 17 00:00:00 2001 From: Leonardo Zide Date: Sat, 21 Feb 2026 19:54:00 -0800 Subject: [PATCH] Added model properties action. --- common/lc_model.cpp | 47 +++++++++++++++++++++++++++++++------ common/lc_model.h | 9 +++++++ common/lc_modelaction.cpp | 35 +++++++++++++++++++++++++++ common/lc_modelaction.h | 23 ++++++++++++++++++ qt/lc_qeditgroupsdialog.cpp | 2 +- 5 files changed, 108 insertions(+), 8 deletions(-) diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 246d5a71..91501a13 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -1898,6 +1898,38 @@ void lcModel::RunObjectEditAction(const lcModelActionObjectEdit* ModelActionObje SetCurrentStep(mCurrentStep); } +void lcModel::SetModelProperties(const lcModelProperties& ModelProperties) +{ + mProperties = ModelProperties; + + if (gMainWindow) + gMainWindow->GetPreviewWidget()->UpdatePreview(); +} + +void lcModel::RecordModelPropertiesAction(const lcModelProperties& ModelProperties) +{ + std::unique_ptr ModelActionProperties = std::make_unique(); + ModelActionProperties->SaveStartState(this); + + SetModelProperties(ModelProperties); + + ModelActionProperties->SaveEndState(this); + + if (ModelActionProperties->StateChanged()) + mActionSequence.emplace_back(std::move(ModelActionProperties)); +} + +void lcModel::RunModelPropertiesAction(const lcModelActionProperties* ModelActionProperties, bool Apply) +{ + if (!ModelActionProperties) + return; + + if (Apply) + ModelActionProperties->LoadEndState(this); + else + ModelActionProperties->LoadStartState(this); +} + void lcModel::RunActionSequence(const std::vector>& ActionSequence, bool Apply) { bool SelectionChanged = false; @@ -1912,6 +1944,8 @@ void lcModel::RunActionSequence(const std::vector } else if (const lcModelActionObjectEdit* ModelActionObjectEdit = dynamic_cast(ModelAction)) RunObjectEditAction(ModelActionObjectEdit, Apply); + else if (const lcModelActionProperties* ModelActionProperties = dynamic_cast(ModelAction)) + RunModelPropertiesAction(ModelActionProperties, Apply); }; if (Apply) @@ -3286,6 +3320,7 @@ void lcModel::InlineSelectedModels() EndActionSequence(tr("Inline Model")); gMainWindow->UpdateTimeline(false, false); + gMainWindow->UpdateInUseCategory(); } void lcModel::RemoveCameraFromViews(lcCamera* Camera) @@ -4667,8 +4702,8 @@ void lcModel::UnhideSelectedPieces() DiscardActionSequence(); return; - } - + } + EndObjectEditAction(); EndActionSequence(tr("Unhide Pieces")); @@ -5443,11 +5478,9 @@ void lcModel::ShowPropertiesDialog() if (mProperties == Options.Properties) return; - mProperties = Options.Properties; - - gMainWindow->GetPreviewWidget()->UpdatePreview(); - - SaveCheckpoint(tr("Changing Properties")); + BeginActionSequence(); + RecordModelPropertiesAction(Options.Properties); + EndActionSequence(tr("Change Model Properties")); } void lcModel::ShowSelectByNameDialog() diff --git a/common/lc_model.h b/common/lc_model.h index cc8b360a..c68e7829 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -9,6 +9,7 @@ struct lcModelHistoryState; class lcModelAction; class lcModelActionSelection; class lcModelActionObjectEdit; +class lcModelActionProperties; #define LC_SEL_NO_PIECES 0x0001 // No pieces in model #define LC_SEL_PIECE 0x0002 // At least 1 piece selected @@ -70,6 +71,11 @@ public: return true; } + bool operator!=(const lcModelProperties& Properties) const + { + return !(*this == Properties); + } + void SaveLDraw(QTextStream& Stream) const; bool ParseLDrawHeader(QString Line, bool FirstLine); void ParseLDrawLine(QTextStream& Stream); @@ -228,6 +234,7 @@ public: template void LoadObjectHistoryState(const std::vector& ObjectStates, std::vector>& Objects); void LoadHistoryState(const lcModelHistoryState& HistoryState); + void SetModelProperties(const lcModelProperties& ModelProperties); lcPiece* AddPiece(PieceInfo* Info, quint32 Section); void AddPiece(std::unique_ptr Piece, size_t PieceIndex); @@ -410,6 +417,8 @@ protected: void BeginObjectEditAction(); void EndObjectEditAction(); void RunObjectEditAction(const lcModelActionObjectEdit* ModelActionObjectEdit, bool Apply); + void RecordModelPropertiesAction(const lcModelProperties& ModelProperties); + void RunModelPropertiesAction(const lcModelActionProperties* ModelActionProperties, bool Apply); void RunActionSequence(const std::vector>& ActionSequence, bool Apply); void BeginActionSequence(); diff --git a/common/lc_modelaction.cpp b/common/lc_modelaction.cpp index b176c066..38de364a 100644 --- a/common/lc_modelaction.cpp +++ b/common/lc_modelaction.cpp @@ -194,3 +194,38 @@ bool lcModelActionObjectEdit::StateChanged() const { return mStartState != mEndState; } + +void lcModelActionProperties::SaveStartState(const lcModel* Model) +{ + SaveState(mStartState, Model); +} + +void lcModelActionProperties::SaveEndState(const lcModel* Model) +{ + SaveState(mEndState, Model); +} + +void lcModelActionProperties::LoadStartState(lcModel* Model) const +{ + LoadState(mStartState, Model); +} + +void lcModelActionProperties::LoadEndState(lcModel* Model) const +{ + LoadState(mEndState, Model); +} + +bool lcModelActionProperties::StateChanged() const +{ + return mStartState != mEndState; +} + +void lcModelActionProperties::SaveState(lcModelProperties& State, const lcModel* Model) +{ + State = Model->GetProperties(); +} + +void lcModelActionProperties::LoadState(const lcModelProperties& State, lcModel* Model) +{ + Model->SetModelProperties(State); +} diff --git a/common/lc_modelaction.h b/common/lc_modelaction.h index a865133d..ca34d574 100644 --- a/common/lc_modelaction.h +++ b/common/lc_modelaction.h @@ -1,5 +1,7 @@ #pragma once +#include "lc_model.h" + enum class lcObjectType; enum class lcSelectionMode; @@ -85,3 +87,24 @@ protected: lcModelHistoryState mStartState; lcModelHistoryState mEndState; }; + +class lcModelActionProperties : public lcModelAction +{ +public: + lcModelActionProperties() = default; + virtual ~lcModelActionProperties() = default; + + void SaveStartState(const lcModel* Model); + void SaveEndState(const lcModel* Model); + void LoadStartState(lcModel* Model) const; + void LoadEndState(lcModel* Model) const; + + bool StateChanged() const; + +protected: + static void SaveState(lcModelProperties& State, const lcModel* Model); + static void LoadState(const lcModelProperties& State, lcModel* Model); + + lcModelProperties mStartState; + lcModelProperties mEndState; +}; diff --git a/qt/lc_qeditgroupsdialog.cpp b/qt/lc_qeditgroupsdialog.cpp index 6ddd289f..3a4f2a5d 100644 --- a/qt/lc_qeditgroupsdialog.cpp +++ b/qt/lc_qeditgroupsdialog.cpp @@ -5,7 +5,7 @@ #include "piece.h" #include "group.h" -constexpr uintptr_t LC_GROUPDIALOG_NEW_GROUP = ~0; +constexpr uintptr_t LC_GROUPDIALOG_NEW_GROUP = ~0U; class lcEditGroupsDialogDelegate : public QItemDelegate {