diff --git a/src/Mod/Path/Gui/Resources/Path.qrc b/src/Mod/Path/Gui/Resources/Path.qrc
index a8d0ab5d21..8300eb42ee 100644
--- a/src/Mod/Path/Gui/Resources/Path.qrc
+++ b/src/Mod/Path/Gui/Resources/Path.qrc
@@ -122,6 +122,7 @@
panels/PathEdit.ui
panels/PointEdit.ui
panels/PropertyContainer.ui
+ panels/PropertyCreate.ui
panels/SetupGlobal.ui
panels/SetupOp.ui
panels/ToolBitEditor.ui
diff --git a/src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui b/src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui
new file mode 100644
index 0000000000..32f0bf7ca6
--- /dev/null
+++ b/src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui
@@ -0,0 +1,132 @@
+
+
+ Dialog
+
+
+
+ 0
+ 0
+ 432
+ 300
+
+
+
+ Dialog
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ Type
+
+
+
+ -
+
+
+ Name
+
+
+
+ -
+
+
+ Info
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+ QDialogButtonBox::Cancel|QDialogButtonBox::Ok
+
+
+
+ -
+
+
+ Group
+
+
+
+ -
+
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
+ 0
+
+
-
+
+
+ true
+
+
+
+
+
+
+
+
+
+ propertyName
+ propertyGroup
+ propertyType
+ propertyInfo
+
+
+
+
+ buttonBox
+ accepted()
+ Dialog
+ accept()
+
+
+ 248
+ 254
+
+
+ 157
+ 274
+
+
+
+
+ buttonBox
+ rejected()
+ Dialog
+ reject()
+
+
+ 316
+ 260
+
+
+ 286
+ 274
+
+
+
+
+
diff --git a/src/Mod/Path/PathScripts/PathPropertyContainerGui.py b/src/Mod/Path/PathScripts/PathPropertyContainerGui.py
index 53b79fa517..629bab3b39 100644
--- a/src/Mod/Path/PathScripts/PathPropertyContainerGui.py
+++ b/src/Mod/Path/PathScripts/PathPropertyContainerGui.py
@@ -43,8 +43,20 @@ PathLog.trackModule(PathLog.thisModule())
def translate(context, text, disambig=None):
return QtCore.QCoreApplication.translate(context, text, disambig)
+SupportedPropertyType = {
+ 'Angle' : 'App::PropertyAngle',
+ 'Bool' : 'App::PropertyBool',
+ 'Distance' : 'App::PropertyDistance',
+ # 'Enumeration' : 'App::PropertyEnumeration',
+ 'File' : 'App::PropertyFile',
+ 'Float' : 'App::PropertyFloat',
+ 'Integer' : 'App::PropertyInteger',
+ 'Length' : 'App::PropertyLength',
+ 'Percent' : 'App::PropertyPercent',
+ 'String' : 'App::PropertyString',
+ }
-class ViewProvider:
+class ViewProvider(object):
'''ViewProvider for a PropertyContainer.
It's sole job is to provide an icon and invoke the TaskPanel on edit.'''
@@ -125,7 +137,44 @@ class Delegate(QtGui.QStyledItemDelegate):
# pylint: disable=unused-argument
widget.setGeometry(option.rect)
-class TaskPanel:
+class PropertyCreate(object):
+
+ def __init__(self, obj, parent=None):
+ self.obj = obj
+ self.form = FreeCADGui.PySideUic.loadUi(":panels/PropertyCreate.ui")
+
+ for group in sorted(obj.CustomPropertyGroups):
+ self.form.propertyGroup.addItem(group)
+ for typ in sorted(SupportedPropertyType):
+ self.form.propertyType.addItem(typ)
+ self.form.propertyType.setCurrentText('String')
+
+ self.form.propertyGroup.currentTextChanged.connect(self.updateUI)
+ self.form.propertyGroup.currentIndexChanged.connect(self.updateUI)
+ self.form.propertyName.textChanged.connect(self.updateUI)
+
+ self.updateUI()
+
+ def updateUI(self):
+ ok = self.form.buttonBox.button(QtGui.QDialogButtonBox.Ok)
+ if self.form.propertyName.text() and self.form.propertyGroup.currentText():
+ ok.setEnabled(True)
+ else:
+ ok.setEnabled(False)
+
+ def propertyName(self):
+ return self.form.propertyName.text()
+ def propertyGroup(self):
+ return self.form.propertyGroup.currentText()
+ def propertyType(self):
+ return SupportedPropertyType[self.form.propertyType.currentText()]
+ def propertyInfo(self):
+ return self.form.propertyInfo.toPlainText()
+
+ def exec_(self):
+ return self.form.exec_()
+
+class TaskPanel(object):
ColumnName = 0
ColumnVal = 1
ColumnDesc = 2
@@ -151,6 +200,19 @@ class TaskPanel:
obj = topLeft.data(Delegate.RoleObject)
prop = topLeft.data(Delegate.RoleProperty)
+
+ def _setupProperty(self, i, name):
+ info = self.obj.getDocumentationOfProperty(name)
+ value = self.obj.getPropertyByName(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.item(i, self.ColumnName).setEditable(False)
+
def setupUi(self):
PathLog.track()
@@ -159,15 +221,7 @@ class TaskPanel:
self.model.setHorizontalHeaderLabels(['Property', 'Value', 'Description'])
for i,name in enumerate(self.props):
- info = self.obj.getDocumentationOfProperty(name)
- value = self.obj.getPropertyByName(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.item(i, self.ColumnName).setEditable(False)
+ self._setupProperty(i, name)
self.form.table.setModel(self.model)
self.form.table.setItemDelegateForColumn(self.ColumnVal, self.delegate)
@@ -212,6 +266,21 @@ class TaskPanel:
def propertyAdd(self):
PathLog.track()
+ dialog = PropertyCreate(self.obj)
+ if dialog.exec_():
+ #self.model.blockSignals(True)
+ name = dialog.propertyName()
+ typ = dialog.propertyType()
+ grpe = dialog.propertyGroup()
+ info = dialog.propertyInfo()
+ self.obj.Proxy.addCustomProperty(typ, name, grpe, info)
+ for i in range(self.model.rowCount()):
+ if self.model.item(i, self.ColumnName).data(QtCore.Qt.EditRole) > dialog.propertyName():
+ self.model.insertRows(i, 1)
+ self._setupProperty(i, name)
+ self.form.table.selectionModel().setCurrentIndex(self.model.index(i, 0), QtCore.QItemSelectionModel.Rows)
+ break
+ #self.model.blockSignals(False)
def propertyRemove(self):
PathLog.track()
@@ -219,9 +288,12 @@ class TaskPanel:
for index in self.form.table.selectionModel().selectedIndexes():
if not index.row() in rows:
rows.append(index.row())
+
+ self.model.blockSignals(True)
for row in reversed(sorted(rows)):
self.obj.removeProperty(self.model.item(row).data(QtCore.Qt.EditRole))
self.model.removeRow(row)
+ self.model.blockSignals(False)
def Create(name = 'PropertyContainer'):