Fix crash on RevertDocument

- MDIViewPage was not being deleted when document
  was closed. On reload, stale MDIViewPage was using
  old object pointers.
This commit is contained in:
wandererfan
2018-10-21 14:00:48 -04:00
committed by Yorik van Havre
parent fc78df5416
commit 1ca15ecab4
2 changed files with 16 additions and 9 deletions

View File

@@ -83,6 +83,7 @@ ViewProviderPage::ViewProviderPage()
ViewProviderPage::~ViewProviderPage()
{
removeMDIView(); //if the MDIViewPage is still in MainWindow, remove it.
}
void ViewProviderPage::attach(App::DocumentObject *pcFeat)
@@ -115,13 +116,18 @@ std::vector<std::string> ViewProviderPage::getDisplayModes(void) const
void ViewProviderPage::show(void)
{
Visibility.setValue(true);
showMDIViewPage();
}
//this "hide" is only used for Visibility property toggle
//not when Page tab is closed.
//WF: is this right? same behaviour either way.
void ViewProviderPage::hide(void)
{
Visibility.setValue(false);
removeMDIView();
ViewProviderDocumentObject::hide();
}
void ViewProviderPage::removeMDIView(void)
{
if (!m_mdiView.isNull()) { //m_mdiView is a QPointer
// https://forum.freecadweb.org/viewtopic.php?f=3&t=22797&p=182614#p182614
@@ -136,7 +142,6 @@ void ViewProviderPage::hide(void)
}
}
}
ViewProviderDocumentObject::hide();
}
void ViewProviderPage::updateData(const App::Property* prop)
@@ -166,9 +171,7 @@ void ViewProviderPage::updateData(const App::Property* prop)
bool ViewProviderPage::onDelete(const std::vector<std::string> &items)
{
bool rc = ViewProviderDocumentObject::onDelete(items);
if (!m_mdiView.isNull()) {
m_mdiView->deleteSelf();
}
removeMDIView();
return rc;
}
@@ -211,8 +214,11 @@ bool ViewProviderPage::doubleClicked(void)
bool ViewProviderPage::showMDIViewPage()
{
if (isRestoring()) {
return true;
}
return true;
}
if (!Visibility.getValue()) {
return true;
}
if (m_mdiView.isNull()){
Gui::Document* doc = Gui::Application::Instance->getDocument

View File

@@ -80,6 +80,7 @@ public:
void unsetEdit(int ModNum);
MDIViewPage* getMDIViewPage();
bool showMDIViewPage();
void removeMDIView(void);
protected:
bool setEdit(int ModNum);