diff --git a/src/App/Document.cpp b/src/App/Document.cpp index e3a6ae1eeef5..7b0bca9af91a 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -963,6 +963,7 @@ bool Document::undo(int id) d->activeUndoTransaction = new Transaction(mUndoTransactions.back()->getID()); d->activeUndoTransaction->Name = mUndoTransactions.back()->Name; + { Base::FlagToggler flag(d->undoing); // applying the undo mUndoTransactions.back()->apply(*this,false); @@ -976,7 +977,17 @@ bool Document::undo(int id) delete mUndoTransactions.back(); mUndoTransactions.pop_back(); - signalUndo(*this); + } + + for(auto & obj:d->objectArray) { + if(obj->testStatus(ObjectStatus::PendingTransactionUpdate)) { + obj->onUndoRedoFinished(); + obj->setStatus(ObjectStatus::PendingTransactionUpdate,false); + } + } + + signalUndo(*this); // now signal the undo + return true; } @@ -1004,6 +1015,7 @@ bool Document::redo(int id) d->activeUndoTransaction->Name = mRedoTransactions.back()->Name; // do the redo + { Base::FlagToggler flag(d->undoing); mRedoTransactions.back()->apply(*this,true); @@ -1014,6 +1026,14 @@ bool Document::redo(int id) mRedoMap.erase(mRedoTransactions.back()->getID()); delete mRedoTransactions.back(); mRedoTransactions.pop_back(); + } + + for(auto & obj:d->objectArray) { + if(obj->testStatus(ObjectStatus::PendingTransactionUpdate)) { + obj->onUndoRedoFinished(); + obj->setStatus(ObjectStatus::PendingTransactionUpdate,false); + } + } signalRedo(*this); return true; diff --git a/src/App/DocumentObject.cpp b/src/App/DocumentObject.cpp index ed51e299c2c6..262633cc0043 100644 --- a/src/App/DocumentObject.cpp +++ b/src/App/DocumentObject.cpp @@ -936,6 +936,11 @@ void DocumentObject::onDocumentRestored() Visibility.setStatus(Property::NoModify,true); } +void DocumentObject::onUndoRedoFinished() +{ + +} + void DocumentObject::onSettingDocument() { //call all extensions diff --git a/src/App/DocumentObject.h b/src/App/DocumentObject.h index f4202f6eb89a..ae50454fc644 100644 --- a/src/App/DocumentObject.h +++ b/src/App/DocumentObject.h @@ -64,6 +64,7 @@ enum ObjectStatus { GeoExcluded = 15, // mark as a member but not claimed by GeoFeatureGroup Expand = 16, // indicate the object's tree item expansion status NoAutoExpand = 17, // disable tree item auto expand on selection for this object + PendingTransactionUpdate = 18, // mark that the object expects a call to onUndoRedoFinished() after transaction is finished. }; /** Return object for feature execution @@ -592,6 +593,8 @@ class AppExport DocumentObject: public App::TransactionalObject virtual void onChanged(const Property* prop) override; /// get called after a document has been fully restored virtual void onDocumentRestored(); + /// get called after an undo/redo transaction is finished + virtual void onUndoRedoFinished(); /// get called after setting the document virtual void onSettingDocument(); /// get called after a brand new object was created