Revert "App: fix property ordering problem when undo/redo (#3255)"

This reverts commit 24d30636e4fb990fdbd67538360846ff09456dfc.
This commit is contained in:
Uwe
2022-02-22 01:21:49 +01:00
parent 17e6ebf120
commit 16467d9067
14 changed files with 68 additions and 250 deletions

View File

@@ -957,7 +957,6 @@ bool Document::undo(int id)
if(it == mUndoMap.end())
return false;
if(it->second != d->activeUndoTransaction) {
TransactionGuard guard(true);
while(mUndoTransactions.size() && mUndoTransactions.back()!=it->second)
undo(0);
}
@@ -967,13 +966,11 @@ bool Document::undo(int id)
_commitTransaction(true);
if (mUndoTransactions.empty())
return false;
TransactionGuard guard(true);
// redo
d->activeUndoTransaction = new Transaction(mUndoTransactions.back()->getID());
d->activeUndoTransaction->Name = mUndoTransactions.back()->Name;
{
Base::FlagToggler<bool> flag(d->undoing);
// applying the undo
mUndoTransactions.back()->apply(*this,false);
@@ -986,6 +983,18 @@ bool Document::undo(int id)
mUndoMap.erase(mUndoTransactions.back()->getID());
delete mUndoTransactions.back();
mUndoTransactions.pop_back();
}
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;
}
@@ -999,11 +1008,8 @@ bool Document::redo(int id)
auto it = mRedoMap.find(id);
if(it == mRedoMap.end())
return false;
{
TransactionGuard guard(false);
while(mRedoTransactions.size() && mRedoTransactions.back()!=it->second)
redo(0);
}
while(mRedoTransactions.size() && mRedoTransactions.back()!=it->second)
redo(0);
}
if (d->activeUndoTransaction)
@@ -1011,13 +1017,12 @@ bool Document::redo(int id)
assert(mRedoTransactions.size()!=0);
TransactionGuard guard(false);
// undo
d->activeUndoTransaction = new Transaction(mRedoTransactions.back()->getID());
d->activeUndoTransaction->Name = mRedoTransactions.back()->Name;
// do the redo
{
Base::FlagToggler<bool> flag(d->undoing);
mRedoTransactions.back()->apply(*this,true);
@@ -1028,6 +1033,16 @@ 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;
}
@@ -1052,7 +1067,7 @@ void Document::addOrRemovePropertyOfObject(TransactionalObject* obj, Property *p
bool Document::isPerformingTransaction() const
{
return d->undoing || d->rollback || Transaction::isApplying();
return d->undoing || d->rollback;
}
std::vector<std::string> Document::getAvailableUndoNames() const
@@ -1207,12 +1222,17 @@ void Document::commitTransaction() {
void Document::_commitTransaction(bool notify)
{
if (isPerformingTransaction()) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG))
FC_WARN("Cannot commit transaction while transacting");
return;
}
else if (d->committing) {
// for a recursive call return without printing a warning
return;
}
if (d->activeUndoTransaction) {
if(d->undoing || d->rollback || d->committing) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG))
FC_WARN("Cannot commit transaction while transacting");
return;
}
Base::FlagToggler<> flag(d->committing);
Application::TransactionSignaller signaller(false,true);
int id = d->activeUndoTransaction->getID();
@@ -1244,13 +1264,12 @@ void Document::abortTransaction() {
void Document::_abortTransaction()
{
if (d->activeUndoTransaction) {
if(d->undoing || d->rollback || d->committing) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG))
FC_WARN("Cannot abort transaction while transacting");
return;
}
if(isPerformingTransaction() || d->committing) {
if (FC_LOG_INSTANCE.isEnabled(FC_LOGLEVEL_LOG))
FC_WARN("Cannot abort transaction while transacting");
}
if (d->activeUndoTransaction) {
Base::FlagToggler<bool> flag(d->rollback);
Application::TransactionSignaller signaller(true,true);
@@ -2918,10 +2937,6 @@ std::string Document::getFullName() const {
return myName;
}
App::Document *Document::getOwnerDocument() const {
return const_cast<App::Document*>(this);
}
const char* Document::getProgramVersion() const
{
return d->programVersion.c_str();