diff --git a/src/Mod/Path/Gui/Resources/panels/PropertyBag.ui b/src/Mod/Path/Gui/Resources/panels/PropertyBag.ui index 9240477417..45ae39f764 100644 --- a/src/Mod/Path/Gui/Resources/panels/PropertyBag.ui +++ b/src/Mod/Path/Gui/Resources/panels/PropertyBag.ui @@ -32,6 +32,12 @@ + + + 0 + 0 + + @@ -40,10 +46,17 @@ + + + + Modify... + + + - Add + Add... diff --git a/src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui b/src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui index e50a671cca..f06eea2054 100644 --- a/src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui +++ b/src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui @@ -6,8 +6,8 @@ 0 0 - 484 - 362 + 480 + 468 @@ -77,14 +77,24 @@ - + + + + Enums + + + + + + + ToolTip - + <html><head/><body><p>ToolTip to be displayed when user hovers mouse over property.</p></body></html> @@ -94,8 +104,14 @@ - + + + + 0 + 0 + + 0 @@ -132,26 +148,6 @@ - - - - false - - - Values - - - - - - - false - - - <html><head/><body><p>Comma separated list of enumeration values.</p></body></html> - - - diff --git a/src/Mod/Path/PathScripts/PathPropertyBag.py b/src/Mod/Path/PathScripts/PathPropertyBag.py index a9cc8d4c00..4bbb35ba19 100644 --- a/src/Mod/Path/PathScripts/PathPropertyBag.py +++ b/src/Mod/Path/PathScripts/PathPropertyBag.py @@ -45,17 +45,11 @@ SupportedPropertyType = { 'String' : 'App::PropertyString', } -def getPropertyType(o): - if type(o) == str: - return SupportedPropertyType['String'] - if type(o) == bool: - return SupportedPropertyType['Bool'] - if type(o) == int: - return SupportedPropertyType['Integer'] - if type(o) == float: - return SupportedPropertyType['Float'] - if type(o) == FreeCAD.Units.Quantity: - return SupportedPropertyType[o.Unit.Type] +def getPropertyTypeName(o): + for typ in SupportedPropertyType: + if SupportedPropertyType[typ] == o: + return typ + raise IndexError() class PropertyBag(object): '''Property container object.''' diff --git a/src/Mod/Path/PathScripts/PathPropertyBagGui.py b/src/Mod/Path/PathScripts/PathPropertyBagGui.py index 948f41d14f..ca98d94caa 100644 --- a/src/Mod/Path/PathScripts/PathPropertyBagGui.py +++ b/src/Mod/Path/PathScripts/PathPropertyBagGui.py @@ -151,8 +151,6 @@ class PropertyCreate(object): self.form.propertyType.currentIndexChanged.connect(self.updateUI) self.form.enumValues.textChanged.connect(self.updateUI) - self.updateUI() - def updateUI(self): typeSet = True if self.propertyIsEnumeration(): @@ -187,52 +185,76 @@ class PropertyCreate(object): def propertyIsEnumeration(self): return self.propertyType() == 'App::PropertyEnumeration' - def exec_(self): - self.form.propertyName.setText('') - self.form.propertyInfo.setText('') - self.form.enumValues.setText('') - #self.form.propertyName.setFocus() + def exec_(self, name): + if name: + # property exists - this is an edit operation + self.form.propertyName.setText(name) + if self.propertyIsEnumeration(): + self.form.enumValues.setText(','.join(self.obj.getEnumerationsOfProperty(name))) + self.form.propertyInfo.setText(self.obj.getDocumentationOfProperty(name)) + + self.form.propertyName.setEnabled(False) + self.form.propertyType.setEnabled(False) + self.form.createAnother.setEnabled(False) + + else: + self.form.propertyName.setText('') + self.form.propertyInfo.setText('') + self.form.enumValues.setText('') + #self.form.propertyName.setFocus() + + self.updateUI() + return self.form.exec_() +Panel = [] + class TaskPanel(object): ColumnName = 0 + #ColumnType = 1 ColumnVal = 1 - ColumnDesc = 2 + #TableHeaders = ['Property', 'Type', 'Value'] + TableHeaders = ['Property', 'Value'] def __init__(self, vobj): - self.obj = vobj.Object + self.obj = vobj.Object self.props = sorted(self.obj.Proxy.getCustomProperties()) - self.form = FreeCADGui.PySideUic.loadUi(":panels/PropertyBag.ui") + self.form = FreeCADGui.PySideUic.loadUi(":panels/PropertyBag.ui") # initialized later + self.model = None self.delegate = None - self.model = None FreeCAD.ActiveDocument.openTransaction(translate("PathPropertyBag", "Edit PropertyBag")) + Panel.append(self) def updateData(self, topLeft, bottomRight): - if topLeft.column() == self.ColumnDesc: - obj = topLeft.data(Delegate.RoleObject) - prop = topLeft.data(Delegate.RoleProperty) + pass def _setupProperty(self, i, name): - info = self.obj.getDocumentationOfProperty(name) - value = self.obj.getPropertyByName(name) + typ = PathPropertyBag.getPropertyTypeName(self.obj.getTypeIdOfProperty(name)) + val = PathUtil.getPropertyValueString(self.obj, name) + info = self.obj.getDocumentationOfProperty(name) - self.model.setData(self.model.index(i, self.ColumnName), name, QtCore.Qt.EditRole) - self.model.setData(self.model.index(i, self.ColumnVal), self.obj, Delegate.RoleObject) - self.model.setData(self.model.index(i, self.ColumnVal), name, Delegate.RoleProperty) - self.model.setData(self.model.index(i, self.ColumnVal), str(value), QtCore.Qt.DisplayRole) - self.model.setData(self.model.index(i, self.ColumnDesc), info, QtCore.Qt.EditRole) + self.model.setData(self.model.index(i, self.ColumnName), name, QtCore.Qt.EditRole) + #self.model.setData(self.model.index(i, self.ColumnType), typ, QtCore.Qt.EditRole) + self.model.setData(self.model.index(i, self.ColumnVal), self.obj, Delegate.RoleObject) + self.model.setData(self.model.index(i, self.ColumnVal), name, Delegate.RoleProperty) + self.model.setData(self.model.index(i, self.ColumnVal), val, QtCore.Qt.DisplayRole) + + self.model.setData(self.model.index(i, self.ColumnName), typ, QtCore.Qt.ToolTipRole) + #self.model.setData(self.model.index(i, self.ColumnType), info, QtCore.Qt.ToolTipRole) + self.model.setData(self.model.index(i, self.ColumnVal), info, QtCore.Qt.ToolTipRole) self.model.item(i, self.ColumnName).setEditable(False) + #self.model.item(i, self.ColumnType).setEditable(False) def setupUi(self): PathLog.track() self.delegate = Delegate(self.form) - self.model = QtGui.QStandardItemModel(len(self.props), 3, self.form) - self.model.setHorizontalHeaderLabels(['Property', 'Value', 'Description']) + self.model = QtGui.QStandardItemModel(len(self.props), len(self.TableHeaders), self.form) + self.model.setHorizontalHeaderLabels(self.TableHeaders) for i,name in enumerate(self.props): self._setupProperty(i, name) @@ -245,6 +267,7 @@ class TaskPanel(object): self.form.table.selectionModel().selectionChanged.connect(self.propertySelected) self.form.add.clicked.connect(self.propertyAdd) self.form.remove.clicked.connect(self.propertyRemove) + self.form.modify.clicked.connect(self.propertyModify) self.propertySelected([]) def accept(self): @@ -261,10 +284,22 @@ class TaskPanel(object): def propertySelected(self, selection): PathLog.track() if selection: + self.form.modify.setEnabled(True) self.form.remove.setEnabled(True) else: + self.form.modify.setEnabled(False) self.form.remove.setEnabled(False) + def addCustomProperty(self, obj, dialog): + name = dialog.propertyName() + typ = dialog.propertyType() + grp = dialog.propertyGroup() + info = dialog.propertyInfo() + self.obj.Proxy.addCustomProperty(typ, name, grp, info) + if dialog.propertyIsEnumeration(): + setattr(self.obj, name, dialog.propertyEnumerations()) + return (name, info) + def propertyAdd(self): PathLog.track() more = False @@ -272,16 +307,10 @@ class TaskPanel(object): typ = None while True: dialog = PropertyCreate(self.obj, grp, typ, more) - if dialog.exec_(): + if dialog.exec_(None): # if we block signals the view doesn't get updated, surprise, surprise #self.model.blockSignals(True) - name = dialog.propertyName() - typ = dialog.propertyType() - grp = dialog.propertyGroup() - info = dialog.propertyInfo() - self.obj.Proxy.addCustomProperty(typ, name, grp, info) - if dialog.propertyIsEnumeration(): - setattr(self.obj, name, dialog.propertyEnumerations()) + name, info = self.addCustomProperty(self.obj, dialog) index = 0 for i in range(self.model.rowCount()): index = i @@ -297,6 +326,37 @@ class TaskPanel(object): if not more: break + def propertyModify(self): + PathLog.track() + rows = [] + for index in self.form.table.selectionModel().selectedIndexes(): + row = index.row() + if row in rows: + continue + rows.append(row) + + obj = self.model.item(row, self.ColumnVal).data(Delegate.RoleObject) + nam = self.model.item(row, self.ColumnVal).data(Delegate.RoleProperty) + grp = obj.getGroupOfProperty(nam) + typ = obj.getTypeIdOfProperty(nam) + + dialog = PropertyCreate(self.obj, grp, typ, False) + if dialog.exec_(nam): + val = getattr(obj, nam) + obj.removeProperty(nam) + name, info = self.addCustomProperty(self.obj, dialog) + try: + setattr(obj, nam, val) + except: + # this can happen if the old enumeration value doesn't exist anymore + pass + newVal = PathUtil.getPropertyValueString(obj, nam) + self.model.setData(self.model.index(row, self.ColumnVal), newVal, QtCore.Qt.DisplayRole) + + #self.model.setData(self.model.index(row, self.ColumnType), info, QtCore.Qt.ToolTipRole) + self.model.setData(self.model.index(row, self.ColumnVal), info, QtCore.Qt.ToolTipRole) + + def propertyRemove(self): PathLog.track() # first find all rows which need to be removed