diff --git a/common/lc_model.cpp b/common/lc_model.cpp index 25e002d5..f9437642 100644 --- a/common/lc_model.cpp +++ b/common/lc_model.cpp @@ -2020,6 +2020,21 @@ void lcModel::SetSaved() mSavedHistory = GetFirstUndoChange(); } +void lcModel::RemoveFirstUndoIfUnchanged() +{ + if (mUndoHistory.empty()) + return; + + for (const std::unique_ptr& ModelAction : mUndoHistory.front()->ModelActions) + if (ModelAction->StateChanged()) + return; + + mUndoHistory.erase(mUndoHistory.begin()); + + gMainWindow->UpdateModified(IsModified()); + gMainWindow->UpdateUndoRedo(!mUndoHistory.empty() ? mUndoHistory.front()->Description : nullptr, !mRedoHistory.empty() ? mRedoHistory.front()->Description : nullptr); +} + const lcModelHistoryEntry* lcModel::GetFirstUndoChange() const { for (const std::unique_ptr& UndoEntry : mUndoHistory) @@ -3492,6 +3507,8 @@ void lcModel::MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector { EndObjectEditAction(); EndActionSequence(tr("Move")); + + RemoveFirstUndoIfUnchanged(); } UpdateAllViews(); @@ -3676,6 +3693,8 @@ void lcModel::RotateSelectedObjects(const lcVector3& Angles, bool Relative, bool { EndObjectEditAction(); EndActionSequence(tr("Rotate")); + + RemoveFirstUndoIfUnchanged(); } UpdateAllViews(); @@ -3904,6 +3923,8 @@ void lcModel::SetObjectsProperty(const std::vector& Objects, lcObject EndObjectEditAction(); EndActionSequence(lcObject::GetCheckpointString(PropertyId)); + RemoveFirstUndoIfUnchanged(); + gMainWindow->UpdateSelectedObjects(false); // todo: fix hacky timeline update @@ -3921,6 +3942,8 @@ void lcModel::SetObjectsProperty(const std::vector& Objects, lcObject void lcModel::EndPropertyEdit(lcObjectPropertyId PropertyId, bool Accept) { + // todo: right clicking or pressing esc while dragging the spinbox doesn't cancel + if (!Accept) { RevertActionSequence(); diff --git a/common/lc_model.h b/common/lc_model.h index 151a9f61..03773979 100644 --- a/common/lc_model.h +++ b/common/lc_model.h @@ -410,6 +410,7 @@ protected: void EndActionSequence(const QString& Description); void DiscardActionSequence(); void RevertActionSequence(); + void RemoveFirstUndoIfUnchanged(); const lcModelHistoryEntry* GetFirstUndoChange() const; void SaveCheckpoint(const QString& Description); diff --git a/common/lc_modelaction.h b/common/lc_modelaction.h index 9cf10ca8..3c4eb54d 100644 --- a/common/lc_modelaction.h +++ b/common/lc_modelaction.h @@ -15,6 +15,7 @@ public: virtual void SaveEndState(const lcModel* Model) = 0; virtual void LoadStartState(lcModel* Model) const = 0; virtual void LoadEndState(lcModel* Model) const = 0; + virtual bool StateChanged() const = 0; virtual bool CanMergeWith(const lcModelAction* Other) const { @@ -55,8 +56,7 @@ public: void SaveEndState(const lcModel* Model) override; void LoadStartState(lcModel* Model) const override; void LoadEndState(lcModel* Model) const override; - - bool StateChanged() const; + bool StateChanged() const override; protected: static void SaveState(lcModelActionSelectionState& State, const lcModel* Model); @@ -101,8 +101,8 @@ public: void SaveEndState(const lcModel* Model) override; void LoadStartState(lcModel* Model) const override; void LoadEndState(lcModel* Model) const override; - - bool StateChanged() const; + bool StateChanged() const override; + bool CanMergeWith(const lcModelAction* Other) const override; void MergeWith(lcModelAction* Other) override; @@ -125,8 +125,7 @@ public: void SaveEndState(const lcModel* Model) override; void LoadStartState(lcModel* Model) const override; void LoadEndState(lcModel* Model) const override; - - bool StateChanged() const; + bool StateChanged() const override; protected: static void SaveState(lcModelProperties& State, const lcModel* Model);