lambdas which reference self prevent GC

This commit is contained in:
Martin 2021-02-21 06:49:07 -08:00
parent 5b1ac7acaa
commit 7f4f677ce1
4 changed files with 64 additions and 19 deletions

View File

@ -446,10 +446,10 @@ class GradientEditorItem(TickSliderItem):
self.rgbAction = QtGui.QAction(translate("GradiantEditorItem", 'RGB'), self) self.rgbAction = QtGui.QAction(translate("GradiantEditorItem", 'RGB'), self)
self.rgbAction.setCheckable(True) self.rgbAction.setCheckable(True)
self.rgbAction.triggered.connect(lambda: self.setColorMode('rgb')) self.rgbAction.triggered.connect(self.setColorModeToRGB)
self.hsvAction = QtGui.QAction(translate("GradiantEditorItem", 'HSV'), self) self.hsvAction = QtGui.QAction(translate("GradiantEditorItem", 'HSV'), self)
self.hsvAction.setCheckable(True) self.hsvAction.setCheckable(True)
self.hsvAction.triggered.connect(lambda: self.setColorMode('hsv')) self.hsvAction.triggered.connect(self.setColorModeToHSV)
self.menu = QtGui.QMenu() self.menu = QtGui.QMenu()
@ -493,7 +493,7 @@ class GradientEditorItem(TickSliderItem):
self.updateGradient() self.updateGradient()
self.linkedGradients = {} self.linkedGradients = {}
self.sigTicksChanged.connect(lambda *args, **kwargs: self.updateGradient()) self.sigTicksChanged.connect(self.updateGradientIgnoreArgs)
self.sigTicksChangeFinished.connect(self.sigGradientChangeFinished.emit) self.sigTicksChangeFinished.connect(self.sigGradientChangeFinished.emit)
def showTicks(self, show=True): def showTicks(self, show=True):
@ -567,6 +567,12 @@ class GradientEditorItem(TickSliderItem):
self.sigTicksChanged.emit(self) self.sigTicksChanged.emit(self)
self.sigGradientChangeFinished.emit(self) self.sigGradientChangeFinished.emit(self)
def setColorModeToRGB(self):
self.setColorMode("rgb")
def setColorModeToHSV(self):
self.setColorMode("hsv")
def colorMap(self): def colorMap(self):
"""Return a ColorMap object representing the current state of the editor.""" """Return a ColorMap object representing the current state of the editor."""
if self.colorMode == 'hsv': if self.colorMode == 'hsv':
@ -585,6 +591,9 @@ class GradientEditorItem(TickSliderItem):
self.gradRect.setBrush(QtGui.QBrush(self.gradient)) self.gradRect.setBrush(QtGui.QBrush(self.gradient))
self.sigGradientChanged.emit(self) self.sigGradientChanged.emit(self)
def updateGradientIgnoreArgs(self, *args, **kwargs):
self.updateGradient()
def setLength(self, newLen): def setLength(self, newLen):
#private (but maybe public) #private (but maybe public)
TickSliderItem.setLength(self, newLen) TickSliderItem.setLength(self, newLen)

View File

@ -110,8 +110,8 @@ class LinearRegionItem(GraphicsObject):
for l in self.lines: for l in self.lines:
l.setParentItem(self) l.setParentItem(self)
l.sigPositionChangeFinished.connect(self.lineMoveFinished) l.sigPositionChangeFinished.connect(self.lineMoveFinished)
self.lines[0].sigPositionChanged.connect(lambda: self.lineMoved(0)) self.lines[0].sigPositionChanged.connect(self.line0Moved)
self.lines[1].sigPositionChanged.connect(lambda: self.lineMoved(1)) self.lines[1].sigPositionChanged.connect(self.line1Moved)
if brush is None: if brush is None:
brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 50)) brush = QtGui.QBrush(QtGui.QColor(0, 0, 255, 50))
@ -242,6 +242,12 @@ class LinearRegionItem(GraphicsObject):
self.prepareGeometryChange() self.prepareGeometryChange()
self.sigRegionChanged.emit(self) self.sigRegionChanged.emit(self)
def line0Moved(self):
self.lineMoved(0)
def line1Moved(self):
self.lineMoved(1)
def lineMoveFinished(self): def lineMoveFinished(self):
self.sigRegionChangeFinished.emit(self) self.sigRegionChangeFinished.emit(self)

View File

@ -785,7 +785,10 @@ class ROI(GraphicsObject):
def removeClicked(self): def removeClicked(self):
## Send remove event only after we have exited the menu event handler ## Send remove event only after we have exited the menu event handler
QtCore.QTimer.singleShot(0, lambda: self.sigRemoveRequested.emit(self)) QtCore.QTimer.singleShot(0, self.emitRemoveRequest)
def emitRemoveRequest(self):
self.sigRemoveRequested.emit(self)
def mouseDragEvent(self, ev): def mouseDragEvent(self, ev):
self.mouseDragHandler.mouseDragEvent(ev) self.mouseDragHandler.mouseDragEvent(ev)

View File

@ -203,15 +203,15 @@ class Parameter(QtCore.QObject):
self.opts['default'] = None self.opts['default'] = None
## Connect all state changed signals to the general sigStateChanged ## Connect all state changed signals to the general sigStateChanged
self.sigValueChanged.connect(lambda param, data: self.emitStateChanged('value', data)) self.sigValueChanged.connect(self.emitValueChanged)
self.sigChildAdded.connect(lambda param, *data: self.emitStateChanged('childAdded', data)) self.sigChildAdded.connect(self.emitChildAddedChanged)
self.sigChildRemoved.connect(lambda param, data: self.emitStateChanged('childRemoved', data)) self.sigChildRemoved.connect(self.emitChildRemovedChanged)
self.sigParentChanged.connect(lambda param, data: self.emitStateChanged('parent', data)) self.sigParentChanged.connect(self.emitParentChanged)
self.sigLimitsChanged.connect(lambda param, data: self.emitStateChanged('limits', data)) self.sigLimitsChanged.connect(self.emitLimitsChanged)
self.sigDefaultChanged.connect(lambda param, data: self.emitStateChanged('default', data)) self.sigDefaultChanged.connect(self.emitDefaultChanged)
self.sigNameChanged.connect(lambda param, data: self.emitStateChanged('name', data)) self.sigNameChanged.connect(self.emitNameChanged)
self.sigOptionsChanged.connect(lambda param, data: self.emitStateChanged('options', data)) self.sigOptionsChanged.connect(self.emitOptionsChanged)
self.sigContextMenu.connect(lambda param, data: self.emitStateChanged('contextMenu', data)) self.sigContextMenu.connect(self.emitContextMenuChanged)
#self.watchParam(self) ## emit treechange signals if our own state changes #self.watchParam(self) ## emit treechange signals if our own state changes
@ -511,6 +511,33 @@ class Parameter(QtCore.QObject):
self.treeStateChanges.append((self, changeDesc, data)) self.treeStateChanges.append((self, changeDesc, data))
self.emitTreeChanges() self.emitTreeChanges()
def emitValueChanged(self, param, data):
self.emitStateChanged("value", data)
def emitChildAddedChanged(self, param, *data):
self.emitStateChanged("childAdded", data)
def emitchildRemovedChanged(self, param, data):
self.emitStateChanged("childRemoved", data)
def emitParentChanged(self, param, data):
self.emitStateChanged("parent", data)
def emitLimitsChanged(self, param, data):
self.emitStateChanged("limits", data)
def emitDefaultChanged(self, param, data):
self.emitStateChanged("default", data)
def emitNameChanged(self, param, data):
self.emitStateChanged("name", data)
def emitOptionsChanged(self, param, data):
self.emitStateChanged("options", data)
def emitContextMenuChanged(self, param, data):
self.emitStateChanged("contextMenu", data)
def makeTreeItem(self, depth): def makeTreeItem(self, depth):
""" """
Return a TreeWidgetItem suitable for displaying/controlling the content of Return a TreeWidgetItem suitable for displaying/controlling the content of