From ac5c61a37c0ff7cdc7a042286c344561cdaec818 Mon Sep 17 00:00:00 2001 From: David Vierra Date: Wed, 18 Nov 2015 19:41:08 -1000 Subject: [PATCH] Fix AttributeError when moving mouse over worldview after closing tab There is probably something wrong with overloading QWidget.destroy like this. I should rewrite the entire thing in C++ and regain control over object destruction. --- src/mcedit2/editorapp.py | 2 +- src/mcedit2/editorsession.py | 18 ++++++++++-------- src/mcedit2/worldview/worldview.py | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/mcedit2/editorapp.py b/src/mcedit2/editorapp.py index f0e2c73..dda6a42 100644 --- a/src/mcedit2/editorapp.py +++ b/src/mcedit2/editorapp.py @@ -638,12 +638,12 @@ class MCEditApp(QtGui.QApplication): if session.closeTab(): log.info("Closed session %s", str(session)) self.tabWidget.removeTab(index) - # IMPORTANT: Even after removeTab is called, the tab widget must be unparented tab.setParent(None) self.removeSessionDockWidgets() self.undoGroup.removeStack(session.undoStack) self.sessions.remove(session) + session.destroy() gc.collect() else: self.tabWidget.removeTab(index) diff --git a/src/mcedit2/editorsession.py b/src/mcedit2/editorsession.py index 2f53f27..c3cfee6 100644 --- a/src/mcedit2/editorsession.py +++ b/src/mcedit2/editorsession.py @@ -488,6 +488,13 @@ class EditorSession(QtCore.QObject): if hasattr(progress, 'progressCount') and progress.progressCount != progressMax: log.info("Update progressMax to %d, please.", progress.progressCount) + def destroy(self): + self.worldEditor.close() + self.worldEditor = None + self.editorTab.destroy() + + # Break all reference cycles just to be absolutely sure. + self.__dict__.clear() def _updateVersionsAndResourcePacks(self): self.mcVersionMapper = QtCore.QSignalMapper() @@ -1165,14 +1172,9 @@ class EditorSession(QtCore.QObject): self.panels = None self.editorTab.saveState() - self.worldEditor.close() - self.worldEditor = None - # Break all reference cycles just to be absolutely sure. - d = {'menus': self.menus, 'undoStack': self.undoStack} - self.__dict__.clear() - self.__dict__.update(d) return True + # --- Inspector --- def inspectBlock(self, pos): @@ -1314,12 +1316,12 @@ class EditorTab(QtGui.QWidget): spacer.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) self.viewButtonToolbar.addWidget(spacer) - def destroy(self): + def destroy(self, *a, **kw): self.editorSession = None for view in self.views: view.destroy() - super(EditorTab, self).destroy() + super(EditorTab, self).destroy(*a, **kw) def setDayTime(self, value): if self.editorSession.textureAtlas: diff --git a/src/mcedit2/worldview/worldview.py b/src/mcedit2/worldview/worldview.py index fc8cd63..f0211ee 100644 --- a/src/mcedit2/worldview/worldview.py +++ b/src/mcedit2/worldview/worldview.py @@ -188,11 +188,11 @@ class WorldView(QGLWidget): self.setDimension(dimension) - def destroy(self): + def destroy(self, *a, **kw): self.makeCurrent() self.renderGraph.destroy() self.bufferSwapThread.quit() - super(WorldView, self).destroy() + super(WorldView, self).destroy(*a, **kw) def __str__(self): try: