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