diff --git a/src/Gui/Document.cpp b/src/Gui/Document.cpp index 3223e1a13a..d75604d5b0 100644 --- a/src/Gui/Document.cpp +++ b/src/Gui/Document.cpp @@ -84,8 +84,12 @@ struct DocumentP bool _isModified; bool _isTransacting; bool _changeViewTouchDocument; + bool _editWantsRestore; + bool _editWantsRestorePrevious; int _editMode; + int _editModePrevious; ViewProvider* _editViewProvider; + ViewProvider* _editViewProviderPrevious; App::DocumentObject* _editingObject; ViewProviderDocumentObject* _editViewProviderParent; std::string _editSubname; @@ -426,10 +430,14 @@ Document::Document(App::Document* pcDocument,Application * app) d->_pcAppWnd = app; d->_pcDocument = pcDocument; d->_editViewProvider = nullptr; + d->_editViewProviderPrevious = nullptr; d->_editingObject = nullptr; d->_editViewProviderParent = nullptr; d->_editingViewer = nullptr; d->_editMode = 0; + d->_editModePrevious = 0; + d->_editWantsRestore = false; + d->_editWantsRestorePrevious = false; //NOLINTBEGIN // Setup the connections @@ -654,7 +662,16 @@ void Document::setEditingTransform(const Base::Matrix4D &mat) { } void Document::resetEdit() { + bool vpIsNotNull = d->_editViewProvider != nullptr; + int modeToRestore = d->_editModePrevious; + Gui::ViewProvider* vpToRestore = d->_editViewProviderPrevious; + bool shouldRestorePrevious = d->_editWantsRestorePrevious; + Application::Instance->setEditDocument(nullptr); + + if (vpIsNotNull && shouldRestorePrevious) { + setEdit(vpToRestore, modeToRestore); + } } void Document::_resetEdit() @@ -669,6 +686,11 @@ void Document::_resetEdit() d->_editViewProvider->finishEditing(); + d->_editViewProviderPrevious = d->_editViewProvider; + d->_editModePrevious = d->_editMode; + d->_editWantsRestorePrevious = d->_editWantsRestore; + d->_editWantsRestore = false; + // Have to check d->_editViewProvider below, because there is a chance // the editing object gets deleted inside the above call to // 'finishEditing()', which will trigger our slotDeletedObject(), which @@ -690,8 +712,9 @@ void Document::_resetEdit() d->_editingViewer = nullptr; d->_editObjs.clear(); d->_editingObject = nullptr; - if(Application::Instance->editDocument() == this) + if (Application::Instance->editDocument() == this) { Application::Instance->setEditDocument(nullptr); + } } ViewProvider *Document::getInEdit(ViewProviderDocumentObject **parentVp, @@ -739,6 +762,11 @@ void Document::setAnnotationViewProvider(const char* name, ViewProvider *pcProvi } } +void Document::setEditRestore(bool askRestore) +{ + d->_editWantsRestore = askRestore; +} + ViewProvider * Document::getAnnotationViewProvider(const char* name) const { std::map::const_iterator it = d->_ViewProviderMapAnnotation.find(name); diff --git a/src/Gui/Document.h b/src/Gui/Document.h index 6b0a1786bc..147412b130 100644 --- a/src/Gui/Document.h +++ b/src/Gui/Document.h @@ -256,6 +256,8 @@ public: void resetEdit(); /// reset edit of this document void _resetEdit(); + /// set if the edit asks for restore or not. + void setEditRestore(bool val); /// get the in edit ViewProvider or NULL ViewProvider *getInEdit(ViewProviderDocumentObject **parentVp=nullptr, std::string *subname=nullptr, int *mode=nullptr, std::string *subElement=nullptr) const; diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp index 5eeae89776..67de217b8c 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp @@ -221,6 +221,9 @@ bool ViewProviderAssembly::canDragObjectToTarget(App::DocumentObject* obj, bool ViewProviderAssembly::setEdit(int mode) { if (mode == ViewProvider::Default) { + // Ask that this edit mode be restored. For example if it is quit to edit a sketch. + getDocument()->setEditRestore(true); + // Set the part as 'Activated' ie bold in the tree. Gui::Command::doCommand(Gui::Command::Gui, "appDoc = App.getDocument('%s')\n"