diff --git a/src/Mod/Path/PathScripts/PathFeatureExtensionsGui.py b/src/Mod/Path/PathScripts/PathFeatureExtensionsGui.py index bc8f88d865..b133c80aff 100644 --- a/src/Mod/Path/PathScripts/PathFeatureExtensionsGui.py +++ b/src/Mod/Path/PathScripts/PathFeatureExtensionsGui.py @@ -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() # set last DL value self.fieldsSet = True # flag to identify initial values set def _initializeExtensions(self, obj): @@ -299,13 +301,13 @@ class TaskPanelExtensionPage(PathOpGui.TaskPanelPage): self.form.extensionEdit.setDisabled(True) self.setExtensions(self.extensions) - def updateQuantitySpinBoxes(self, index=None): - prevValue = self.form.defaultLength.text() + 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() - postValue = self.form.defaultLength.text() - - if postValue != prevValue: - PathLog.debug("updateQuantitySpinBoxes() post != prev value") + 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 @@ -490,7 +492,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,8 +627,8 @@ 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) + self.form.defaultLength.editingFinished.connect(self._applyDefaultLengthChange) self.model.itemChanged.connect(self.updateItemEnabled) diff --git a/src/Mod/Path/PathScripts/PathGui.py b/src/Mod/Path/PathScripts/PathGui.py index a39f506c4f..bc825bc2ce 100644 --- a/src/Mod/Path/PathScripts/PathGui.py +++ b/src/Mod/Path/PathScripts/PathGui.py @@ -125,14 +125,29 @@ class QuantitySpinBox(QtCore.QObject): self.onBeforeChange = onBeforeChange self.prop = None self.obj = obj + self.lastWidgetText = self.widget.text() self.attachTo(obj, prop) self.widget.installEventFilter(self) + # Connect local class method as slot + self.widget.textChanged.connect(self.onWidgetValueChanged) def eventFilter(self, obj, event): if event.type() == QtCore.QEvent.Type.FocusIn: self.updateSpinBox() return False + def onWidgetValueChanged(self): + """onWidgetValueChanged()... Slot method for determining if a change + in widget value is a result of an expression edit, or a simple spinbox change. + If the former, emit a manual `editingFinished` signal because the Formula Editor + window returned a value to the base widget, leaving it in read-only mode, + and finishing the editing of the value. Otherwise, due nothing if the value + has not changed, or there is no active expression for the property. + If the user closes the Formula Editor to cancel the edit, the value will not + be changed, and this manual signal will not be emitted.""" + if self._hasExpression() and self.widget.text() != self.lastWidgetText: + self.widget.editingFinished.emit() + def attachTo(self, obj, prop=None): """attachTo(obj, prop=None) ... use an existing editor for the given object and property""" PathLog.track(self.prop, prop) @@ -180,6 +195,7 @@ class QuantitySpinBox(QtCore.QObject): quantity = PathUtil.getProperty(self.obj, self.prop) value = quantity.Value if hasattr(quantity, "Value") else quantity self.widget.setProperty("rawValue", value) + self.lastWidgetText = self.widget.text() # update last widget value if expr: self.widget.setReadOnly(True) self.widget.setStyleSheet("color: gray")