| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | import FreeCAD |
| | import Path |
| | import Path.Base.SetupSheetOpPrototype as PathSetupSheetOpPrototype |
| |
|
| | from PySide import QtCore, QtGui |
| |
|
| | __title__ = "CAM Property Editor" |
| | __author__ = "sliptonic (Brad Collette)" |
| | __url__ = "https://www.freecad.org" |
| | __doc__ = "Task panel editor for Properties" |
| |
|
| |
|
| | if False: |
| | Path.Log.setLevel(Path.Log.Level.DEBUG, Path.Log.thisModule()) |
| | Path.Log.trackModule(Path.Log.thisModule()) |
| | else: |
| | Path.Log.setLevel(Path.Log.Level.INFO, Path.Log.thisModule()) |
| |
|
| |
|
| | class _PropertyEditor(object): |
| | """Base class of all property editors - just outlines the TableView delegate interface.""" |
| |
|
| | def __init__(self, obj, prop): |
| | self.obj = obj |
| | self.prop = prop |
| |
|
| | def widget(self, parent): |
| | """widget(parent) ... called by the delegate to get a new editor widget. |
| | Must be implemented by subclasses and return the widget.""" |
| | pass |
| |
|
| | def setEditorData(self, widget): |
| | """setEditorData(widget) ... called by the delegate to initialize the editor. |
| | The widget is the object returned by widget(). |
| | Must be implemented by subclasses.""" |
| | pass |
| |
|
| | def setModelData(self, widget): |
| | """setModelData(widget) ... called by the delegate to store new values. |
| | Must be implemented by subclasses.""" |
| | pass |
| |
|
| | def propertyValue(self): |
| | return self.obj.getPropertyByName(self.prop) |
| |
|
| | def setProperty(self, value): |
| | setattr(self.obj, self.prop, value) |
| |
|
| | def displayString(self): |
| | return self.propertyValue() |
| |
|
| |
|
| | class _PropertyEditorBool(_PropertyEditor): |
| | """Editor for boolean values - uses a combo box.""" |
| |
|
| | def widget(self, parent): |
| | return QtGui.QComboBox(parent) |
| |
|
| | def setEditorData(self, widget): |
| | widget.clear() |
| | widget.addItems([str(False), str(True)]) |
| | index = 1 if self.propertyValue() else 0 |
| | widget.setCurrentIndex(index) |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(widget.currentText() == str(True)) |
| |
|
| |
|
| | class _PropertyEditorString(_PropertyEditor): |
| | """Editor for string values - uses a line edit.""" |
| |
|
| | def widget(self, parent): |
| | return QtGui.QLineEdit(parent) |
| |
|
| | def setEditorData(self, widget): |
| | text = "" if self.propertyValue() is None else self.propertyValue() |
| | widget.setText(text) |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(widget.text()) |
| |
|
| |
|
| | class _PropertyEditorQuantity(_PropertyEditor): |
| | def widget(self, parent): |
| | return QtGui.QLineEdit(parent) |
| |
|
| | def setEditorData(self, widget): |
| | quantity = self.propertyValue() |
| | if quantity is None: |
| | quantity = self.defaultQuantity() |
| | widget.setText(quantity.getUserPreferred()[0]) |
| |
|
| | def defaultQuantity(self): |
| | pass |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(FreeCAD.Units.Quantity(widget.text())) |
| |
|
| | def displayString(self): |
| | if self.propertyValue() is None: |
| | return "" |
| | return self.propertyValue().getUserPreferred()[0] |
| |
|
| |
|
| | class _PropertyEditorAngle(_PropertyEditorQuantity): |
| | """Editor for angle values - uses a line edit""" |
| |
|
| | def defaultQuantity(self): |
| | return FreeCAD.Units.Quantity(0, FreeCAD.Units.Angle) |
| |
|
| |
|
| | class _PropertyEditorLength(_PropertyEditorQuantity): |
| | """Editor for length values - uses a line edit.""" |
| |
|
| | def defaultQuantity(self): |
| | return FreeCAD.Units.Quantity(0, FreeCAD.Units.Length) |
| |
|
| |
|
| | class _PropertyEditorPercent(_PropertyEditor): |
| | """Editor for percent values - uses a spin box.""" |
| |
|
| | def widget(self, parent): |
| | return QtGui.QSpinBox(parent) |
| |
|
| | def setEditorData(self, widget): |
| | widget.setRange(0, 100) |
| | value = self.propertyValue() |
| | if value is None: |
| | value = 0 |
| | widget.setValue(value) |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(widget.value()) |
| |
|
| |
|
| | class _PropertyEditorInteger(_PropertyEditor): |
| | """Editor for integer values - uses a spin box.""" |
| |
|
| | def widget(self, parent): |
| | return QtGui.QSpinBox(parent) |
| |
|
| | def setEditorData(self, widget): |
| | value = self.propertyValue() |
| | if value is None: |
| | value = 0 |
| | widget.setValue(value) |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(widget.value()) |
| |
|
| |
|
| | class _PropertyEditorFloat(_PropertyEditor): |
| | """Editor for float values - uses a double spin box.""" |
| |
|
| | def widget(self, parent): |
| | return QtGui.QDoubleSpinBox(parent) |
| |
|
| | def setEditorData(self, widget): |
| | value = self.propertyValue() |
| | if value is None: |
| | value = 0.0 |
| | widget.setValue(value) |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(widget.value()) |
| |
|
| |
|
| | class _PropertyEditorFile(_PropertyEditor): |
| | def widget(self, parent): |
| | return QtGui.QLineEdit(parent) |
| |
|
| | def setEditorData(self, widget): |
| | text = "" if self.propertyValue() is None else self.propertyValue() |
| | widget.setText(text) |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(widget.text()) |
| |
|
| |
|
| | class _PropertyEditorEnumeration(_PropertyEditor): |
| | def widget(self, parent): |
| | return QtGui.QComboBox(parent) |
| |
|
| | def setEditorData(self, widget): |
| | widget.clear() |
| | widget.addItems(self.obj.getEnumerationsOfProperty(self.prop)) |
| | widget.setCurrentText(self.propertyValue()) |
| |
|
| | def setModelData(self, widget): |
| | self.setProperty(widget.currentText()) |
| |
|
| |
|
| | _EditorFactory = { |
| | "App::PropertyAngle": _PropertyEditorAngle, |
| | "App::PropertyBool": _PropertyEditorBool, |
| | "App::PropertyDistance": _PropertyEditorLength, |
| | "App::PropertyEnumeration": _PropertyEditorEnumeration, |
| | |
| | "App::PropertyFloat": _PropertyEditorFloat, |
| | "App::PropertyInteger": _PropertyEditorInteger, |
| | "App::PropertyLength": _PropertyEditorLength, |
| | "App::PropertyPercent": _PropertyEditorPercent, |
| | "App::PropertyString": _PropertyEditorString, |
| | } |
| |
|
| |
|
| | def Types(): |
| | """Return the types of properties supported.""" |
| | return [t for t in _EditorFactory] |
| |
|
| |
|
| | def Editor(obj, prop): |
| | """Returns an editor class to be used for the given property.""" |
| | factory = _EditorFactory[obj.getTypeIdOfProperty(prop)] |
| | if factory: |
| | return factory(obj, prop) |
| | return None |
| |
|