Fixed empty undo action added when canceling a property widget edit.

This commit is contained in:
Leonardo Zide
2026-03-07 18:38:35 -08:00
parent bc9bc3a1b2
commit ce05e20b39
3 changed files with 29 additions and 6 deletions
+23
View File
@@ -2020,6 +2020,21 @@ void lcModel::SetSaved()
mSavedHistory = GetFirstUndoChange(); mSavedHistory = GetFirstUndoChange();
} }
void lcModel::RemoveFirstUndoIfUnchanged()
{
if (mUndoHistory.empty())
return;
for (const std::unique_ptr<lcModelAction>& 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 const lcModelHistoryEntry* lcModel::GetFirstUndoChange() const
{ {
for (const std::unique_ptr<lcModelHistoryEntry>& UndoEntry : mUndoHistory) for (const std::unique_ptr<lcModelHistoryEntry>& UndoEntry : mUndoHistory)
@@ -3492,6 +3507,8 @@ void lcModel::MoveSelectedObjects(const lcVector3& PieceDistance, const lcVector
{ {
EndObjectEditAction(); EndObjectEditAction();
EndActionSequence(tr("Move")); EndActionSequence(tr("Move"));
RemoveFirstUndoIfUnchanged();
} }
UpdateAllViews(); UpdateAllViews();
@@ -3676,6 +3693,8 @@ void lcModel::RotateSelectedObjects(const lcVector3& Angles, bool Relative, bool
{ {
EndObjectEditAction(); EndObjectEditAction();
EndActionSequence(tr("Rotate")); EndActionSequence(tr("Rotate"));
RemoveFirstUndoIfUnchanged();
} }
UpdateAllViews(); UpdateAllViews();
@@ -3904,6 +3923,8 @@ void lcModel::SetObjectsProperty(const std::vector<lcObject*>& Objects, lcObject
EndObjectEditAction(); EndObjectEditAction();
EndActionSequence(lcObject::GetCheckpointString(PropertyId)); EndActionSequence(lcObject::GetCheckpointString(PropertyId));
RemoveFirstUndoIfUnchanged();
gMainWindow->UpdateSelectedObjects(false); gMainWindow->UpdateSelectedObjects(false);
// todo: fix hacky timeline update // todo: fix hacky timeline update
@@ -3921,6 +3942,8 @@ void lcModel::SetObjectsProperty(const std::vector<lcObject*>& Objects, lcObject
void lcModel::EndPropertyEdit(lcObjectPropertyId PropertyId, bool Accept) void lcModel::EndPropertyEdit(lcObjectPropertyId PropertyId, bool Accept)
{ {
// todo: right clicking or pressing esc while dragging the spinbox doesn't cancel
if (!Accept) if (!Accept)
{ {
RevertActionSequence(); RevertActionSequence();
+1
View File
@@ -410,6 +410,7 @@ protected:
void EndActionSequence(const QString& Description); void EndActionSequence(const QString& Description);
void DiscardActionSequence(); void DiscardActionSequence();
void RevertActionSequence(); void RevertActionSequence();
void RemoveFirstUndoIfUnchanged();
const lcModelHistoryEntry* GetFirstUndoChange() const; const lcModelHistoryEntry* GetFirstUndoChange() const;
void SaveCheckpoint(const QString& Description); void SaveCheckpoint(const QString& Description);
+5 -6
View File
@@ -15,6 +15,7 @@ public:
virtual void SaveEndState(const lcModel* Model) = 0; virtual void SaveEndState(const lcModel* Model) = 0;
virtual void LoadStartState(lcModel* Model) const = 0; virtual void LoadStartState(lcModel* Model) const = 0;
virtual void LoadEndState(lcModel* Model) const = 0; virtual void LoadEndState(lcModel* Model) const = 0;
virtual bool StateChanged() const = 0;
virtual bool CanMergeWith(const lcModelAction* Other) const virtual bool CanMergeWith(const lcModelAction* Other) const
{ {
@@ -55,8 +56,7 @@ public:
void SaveEndState(const lcModel* Model) override; void SaveEndState(const lcModel* Model) override;
void LoadStartState(lcModel* Model) const override; void LoadStartState(lcModel* Model) const override;
void LoadEndState(lcModel* Model) const override; void LoadEndState(lcModel* Model) const override;
bool StateChanged() const override;
bool StateChanged() const;
protected: protected:
static void SaveState(lcModelActionSelectionState& State, const lcModel* Model); static void SaveState(lcModelActionSelectionState& State, const lcModel* Model);
@@ -101,8 +101,8 @@ public:
void SaveEndState(const lcModel* Model) override; void SaveEndState(const lcModel* Model) override;
void LoadStartState(lcModel* Model) const override; void LoadStartState(lcModel* Model) const override;
void LoadEndState(lcModel* Model) const override; void LoadEndState(lcModel* Model) const override;
bool StateChanged() const override;
bool StateChanged() const;
bool CanMergeWith(const lcModelAction* Other) const override; bool CanMergeWith(const lcModelAction* Other) const override;
void MergeWith(lcModelAction* Other) override; void MergeWith(lcModelAction* Other) override;
@@ -125,8 +125,7 @@ public:
void SaveEndState(const lcModel* Model) override; void SaveEndState(const lcModel* Model) override;
void LoadStartState(lcModel* Model) const override; void LoadStartState(lcModel* Model) const override;
void LoadEndState(lcModel* Model) const override; void LoadEndState(lcModel* Model) const override;
bool StateChanged() const override;
bool StateChanged() const;
protected: protected:
static void SaveState(lcModelProperties& State, const lcModel* Model); static void SaveState(lcModelProperties& State, const lcModel* Model);