From 0e115be0ecf201b9777d8fc9e45d9f5da081e063 Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Wed, 21 Aug 2019 10:01:51 +0800 Subject: [PATCH] App: make recompute aborting optional --- src/App/Document.cpp | 24 +++++++++++++++++++----- src/Gui/DlgSettingsDocument.ui | 28 ++++++++++++++++++++++++++-- src/Gui/DlgSettingsDocumentImp.cpp | 8 +++++--- 3 files changed, 50 insertions(+), 10 deletions(-) diff --git a/src/App/Document.cpp b/src/App/Document.cpp index 1d96a603cf..e4fb9e1502 100644 --- a/src/App/Document.cpp +++ b/src/App/Document.cpp @@ -3068,9 +3068,7 @@ int Document::recompute(const std::vector &objs, bool forc // delete recompute log d->clearRecomputeLog(); - //do we have anything to do? - if(d->objectMap.empty()) - return 0; + FC_TIME_INIT(t); Base::ObjectStatusLocker exe(Document::Recomputing, this); signalBeforeRecompute(*this); @@ -3099,14 +3097,23 @@ int Document::recompute(const std::vector &objs, bool forc for(auto obj : topoSortedObjects) obj->setStatus(ObjectStatus::PendingRecompute,true); + ParameterGrp::handle hGrp = GetApplication().GetParameterGroupByPath( + "User parameter:BaseApp/Preferences/Document"); + bool canAbort = hGrp->GetBool("CanAbortRecompute",true); + std::set filter; size_t idx = 0; + + FC_TIME_INIT(t2); + try { // maximum two passes to allow some form of dependency inversion for(int passes=0; passes<2 && idx seq; + if(canAbort) + seq.reset(new Base::SequencerLauncher("Recompute...", topoSortedObjects.size())); FC_LOG("Recompute pass " << passes); - for (;idxnext(true):true),++idx) { auto obj = topoSortedObjects[idx]; if(!obj->getNameInDocument() || filter.find(obj)!=filter.end()) continue; @@ -3160,6 +3167,8 @@ int Document::recompute(const std::vector &objs, bool forc e.ReportException(); } + FC_TIME_LOG(t2, "Recompute"); + for(auto obj : topoSortedObjects) { if(!obj->getNameInDocument()) continue; @@ -3171,6 +3180,11 @@ int Document::recompute(const std::vector &objs, bool forc signalRecomputed(*this,topoSortedObjects); + FC_TIME_LOG(t,"Recompute total"); + + if(d->_RecomputeLog.size()) + Base::Console().Error("Recompute failed! Please check report view.\n"); + return objectCount; } diff --git a/src/Gui/DlgSettingsDocument.ui b/src/Gui/DlgSettingsDocument.ui index 5d0a2e34e9..80d213df80 100644 --- a/src/Gui/DlgSettingsDocument.ui +++ b/src/Gui/DlgSettingsDocument.ui @@ -6,8 +6,8 @@ 0 0 - 500 - 685 + 607 + 720 @@ -170,6 +170,30 @@ + + + + Qt::Horizontal + + + + + + + Allow user aborting document recomputation by pressing ESC. +This feature may slightly increase recomputation time. + + + Allow aborting recomputation + + + CanAbortRecompute + + + Document + + + diff --git a/src/Gui/DlgSettingsDocumentImp.cpp b/src/Gui/DlgSettingsDocumentImp.cpp index 93103e0e9e..45c597448b 100644 --- a/src/Gui/DlgSettingsDocumentImp.cpp +++ b/src/Gui/DlgSettingsDocumentImp.cpp @@ -67,7 +67,7 @@ void DlgSettingsDocumentImp::saveSettings() prefUndoRedo->onSave(); prefUndoRedoSize->onSave(); prefSaveTransaction->onSave(); - prefDiscardTransaction->onSave(); + prefDiscardTransaction->onSave(); prefSaveThumbnail->onSave(); prefAddLogo->onSave(); prefSaveBackupFiles->onSave(); @@ -82,6 +82,7 @@ void DlgSettingsDocumentImp::saveSettings() prefRecovery->onSave(); prefAutoSaveEnabled->onSave(); prefAutoSaveTimeout->onSave(); + prefCanAbortRecompute->onSave(); int timeout = prefAutoSaveTimeout->value(); if (!prefAutoSaveEnabled->isChecked()) @@ -97,7 +98,7 @@ void DlgSettingsDocumentImp::loadSettings() prefUndoRedo->onRestore(); prefUndoRedoSize->onRestore(); prefSaveTransaction->onRestore(); - prefDiscardTransaction->onRestore(); + prefDiscardTransaction->onRestore(); prefSaveThumbnail->onRestore(); prefAddLogo->onRestore(); prefSaveBackupFiles->onRestore(); @@ -112,6 +113,7 @@ void DlgSettingsDocumentImp::loadSettings() prefRecovery->onRestore(); prefAutoSaveEnabled->onRestore(); prefAutoSaveTimeout->onRestore(); + prefCanAbortRecompute->onRestore(); } /** @@ -121,7 +123,7 @@ void DlgSettingsDocumentImp::changeEvent(QEvent *e) { if (e->type() == QEvent::LanguageChange) { retranslateUi(this); - } + } else { QWidget::changeEvent(e); }