Merge branch 'master' of https://github.com/FreeCAD/FreeCAD into toolbit-gui

This commit is contained in:
Patrick F
2020-04-09 21:55:28 +02:00
80 changed files with 7157 additions and 4022 deletions

View File

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

View File

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