Path: Fix delayed extension length updates

These changes allow for the extensions to be updated immediately upon changing either the Default Length expression or spinbox value, without having to click outside the spinbox.
This commit is contained in:
Russell Johnson
2022-04-03 22:57:49 -05:00
parent 531b354229
commit e96778d3fe

View File

@@ -194,6 +194,7 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
self.extensionsCache = dict()
self.extensionsReady = False
self.enabled = True
self.lastDefaultLength = ""
self.extensions = list()
@@ -284,6 +285,7 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
self._initializeExtensions(obj) # Efficiently initialize Extensions
self.defaultLength.updateSpinBox()
self._getUseOutlineState() # Find `useOutline` checkbox and get its boolean value
self.lastDefaultLength = self.form.defaultLength.text()
self.fieldsSet = True # flag to identify initial values set
def _initializeExtensions(self, obj):
@@ -299,16 +301,33 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
self.form.extensionEdit.setDisabled(True)
self.setExtensions(self.extensions)
def updateQuantitySpinBoxes(self, index=None):
prevValue = self.form.defaultLength.text()
self.defaultLength.updateSpinBox()
postValue = self.form.defaultLength.text()
def _isDefaultLengthExpression(self):
"""_isDefaultLengthExpression()... Return True if Default Length is determined by an expression."""
for prop, __ in self.obj.ExpressionEngine:
if prop == "ExtensionLengthDefault":
return True
return False
if postValue != prevValue:
PathLog.debug("updateQuantitySpinBoxes() post != prev value")
def _applyDefaultLengthChange(self, index=None):
"""_applyDefaultLengthChange(index=None)...
Helper method to update Default Length spinbox, and update extensions due to change in Default Length."""
self.defaultLength.updateSpinBox()
if self.form.defaultLength.text() != self.lastDefaultLength:
self.lastDefaultLength = self.form.defaultLength.text()
self._resetCachedExtensions() # Reset extension cache because extension dimensions likely changed
self._enableExtensions() # Recalculate extensions
def _defaultLengthChanged(self):
"""_defaultLengthChanged()... Slot method for determining if a change in Default Length
value is determined from an expression edit, or a simple spinbox change. If the former,
emit a `editingFinished` signal manually because the Formula Editor window returned
a value to the base SpinBox."""
if (
self._isDefaultLengthExpression()
and self.form.defaultLength.text() != self.lastDefaultLength
):
self.form.defaultLength.editingFinished.emit()
def createItemForBaseModel(self, base, sub, edges, extensions):
PathLog.track(
base.Label, sub, "+", len(edges), len(base.Shape.getElement(sub).Edges)
@@ -490,7 +509,7 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
if self.fieldsSet:
if self.form.enableExtensions.isChecked():
if prop == "ExtensionLengthDefault":
self.updateQuantitySpinBoxes()
self._applyDefaultLengthChange()
elif prop == "Base":
self.extensionsReady = False
self.setExtensions(FeatureExtensions.getExtensions(obj))
@@ -625,9 +644,12 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage):
self.form.buttonClear.clicked.connect(self.extensionsClear)
self.form.buttonDisable.clicked.connect(self.extensionsDisable)
self.form.buttonEnable.clicked.connect(self.extensionsEnable)
self.form.defaultLength.editingFinished.connect(self.updateQuantitySpinBoxes)
self.form.enableExtensions.toggled.connect(self._enableExtensions)
# These two handlers are needed to provide immediate updates to extension length
self.form.defaultLength.editingFinished.connect(self._applyDefaultLengthChange)
self.form.defaultLength.textChanged.connect(self._defaultLengthChanged)
self.model.itemChanged.connect(self.updateItemEnabled)
self.selectionModel = self.form.extensionTree.selectionModel()