diff --git a/src/Mod/Path/PathScripts/PathGui.py b/src/Mod/Path/PathScripts/PathGui.py index 98cf988106..b3ea83ccd8 100644 --- a/src/Mod/Path/PathScripts/PathGui.py +++ b/src/Mod/Path/PathScripts/PathGui.py @@ -45,41 +45,68 @@ if LOGLEVEL: else: PathLog.setLevel(PathLog.Level.INFO, PathLog.thisModule()) + def updateInputField(obj, prop, widget, onBeforeChange=None): '''updateInputField(obj, prop, widget) ... update obj's property prop with the value of widget. -The property's value is only assigned if the new value differs from the current value. -This prevents onChanged notifications where the value didn't actually change. -Gui::InputField and Gui::QuantitySpinBox widgets are supported - and the property can -be of type Quantity or Float. -If onBeforeChange is specified it is called before a new value is assigned to the property. -Returns True if a new value was assigned, False otherwise (new value is the same as the current). -''' + The property's value is only assigned if the new value differs from the current value. + This prevents onChanged notifications where the value didn't actually change. + Gui::InputField and Gui::QuantitySpinBox widgets are supported - and the property can + be of type Quantity or Float. + If onBeforeChange is specified it is called before a new value is assigned to the property. + Returns True if a new value was assigned, False otherwise (new value is the same as the current). + ''' value = FreeCAD.Units.Quantity(widget.text()).Value attr = PathUtil.getProperty(obj, prop) attrValue = attr.Value if hasattr(attr, 'Value') else attr + + isDiff = False if not PathGeom.isRoughly(attrValue, value): + isDiff = True + else: + if hasattr(obj, 'ExpressionEngine'): + noExpr = True + for (prp, expr) in obj.ExpressionEngine: + if prp == prop: + noExpr = False + PathLog.debug('prop = "expression": {} = "{}"'.format(prp, expr)) + value = FreeCAD.Units.Quantity(obj.evalExpression(expr)).Value + if not PathGeom.isRoughly(attrValue, value): + isDiff = True + break + if noExpr: + widget.setReadOnly(False) + widget.setStyleSheet("color: black") + else: + widget.setReadOnly(True) + widget.setStyleSheet("color: gray") + widget.update() + + if isDiff: PathLog.debug("updateInputField(%s, %s): %.2f -> %.2f" % (obj.Label, prop, attr, value)) if onBeforeChange: onBeforeChange(obj) PathUtil.setProperty(obj, prop, value) return True + return False + class QuantitySpinBox: '''Controller class to interface a Gui::QuantitySpinBox. -The spin box gets bound to a given property and supports update in both directions. - QuatitySpinBox(widget, obj, prop, onBeforeChange=None) - widget ... expected to be reference to a Gui::QuantitySpinBox - obj ... document object - prop ... canonical name of the (sub-) property - onBeforeChange ... an optional callback being executed before the value of the property is changed -''' + The spin box gets bound to a given property and supports update in both directions. + QuatitySpinBox(widget, obj, prop, onBeforeChange=None) + widget ... expected to be reference to a Gui::QuantitySpinBox + obj ... document object + prop ... canonical name of the (sub-) property + onBeforeChange ... an optional callback being executed before the value of the property is changed + ''' def __init__(self, widget, obj, prop, onBeforeChange=None): self.obj = obj self.widget = widget self.prop = prop self.onBeforeChange = onBeforeChange + attr = PathUtil.getProperty(self.obj, self.prop) if attr is not None: if hasattr(attr, 'Value'): @@ -95,7 +122,7 @@ The spin box gets bound to a given property and supports update in both directio if self.valid: return self.widget.property('expression') return '' - + def setMinimum(self, quantity): if self.valid: value = quantity.Value if hasattr(quantity, 'Value') else quantity @@ -103,8 +130,8 @@ The spin box gets bound to a given property and supports update in both directio def updateSpinBox(self, quantity=None): '''updateSpinBox(quantity=None) ... update the display value of the spin box. -If no value is provided the value of the bound property is used. -quantity can be of type Quantity or Float.''' + If no value is provided the value of the bound property is used. + quantity can be of type Quantity or Float.''' if self.valid: if quantity is None: quantity = PathUtil.getProperty(self.obj, self.prop) @@ -116,4 +143,3 @@ quantity can be of type Quantity or Float.''' if self.valid: return updateInputField(self.obj, self.prop, self.widget, self.onBeforeChange) return None - diff --git a/src/Mod/Path/PathScripts/PathOpGui.py b/src/Mod/Path/PathScripts/PathOpGui.py index 4a792322d3..9a8a100810 100644 --- a/src/Mod/Path/PathScripts/PathOpGui.py +++ b/src/Mod/Path/PathScripts/PathOpGui.py @@ -157,8 +157,6 @@ class ViewProvider(object): else: return ":/icons/Path-OpActive.svg" - #return self.OpIcon - def getTaskPanelOpPage(self, obj): '''getTaskPanelOpPage(obj) ... use the stored information to instantiate the receiver op's page controller.''' mod = importlib.import_module(self.OpPageModule) @@ -190,6 +188,7 @@ class ViewProvider(object): action.triggered.connect(self.setEdit) menu.addAction(action) + class TaskPanelPage(object): '''Base class for all task panel pages.''' @@ -377,7 +376,7 @@ class TaskPanelPage(object): combo.clear() combo.addItems(options) combo.blockSignals(False) - + if hasattr(obj, 'CoolantMode'): self.selectInComboBox(obj.CoolantMode, combo) @@ -704,10 +703,13 @@ class TaskPanelDepthsPage(TaskPanelPage): def haveStartDepth(self): return PathOp.FeatureDepths & self.features + def haveFinalDepth(self): return PathOp.FeatureDepths & self.features and not PathOp.FeatureNoFinalDepth & self.features + def haveFinishDepth(self): return PathOp.FeatureDepths & self.features and PathOp.FeatureFinishDepth & self.features + def haveStepDown(self): return PathOp.FeatureStepDown & self. features