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.
This commit is contained in:
David Vierra 2015-11-18 19:41:08 -10:00
parent d6049cabd5
commit ac5c61a37c
3 changed files with 13 additions and 11 deletions

View File

@ -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)

View File

@ -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:

View File

@ -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: