Skip to content

Commit

Permalink
Cleaned up property-bag task panel and added support for editing the …
Browse files Browse the repository at this point in the history
…definition.
  • Loading branch information
mlampert committed Jan 27, 2021
1 parent ac1e863 commit eee8d12
Show file tree
Hide file tree
Showing 4 changed files with 131 additions and 68 deletions.
15 changes: 14 additions & 1 deletion src/Mod/Path/Gui/Resources/panels/PropertyBag.ui
Expand Up @@ -32,6 +32,12 @@
</item>
<item>
<widget class="QWidget" name="widget" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="remove">
Expand All @@ -40,10 +46,17 @@
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="modify">
<property name="text">
<string>Modify...</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="add">
<property name="text">
<string>Add</string>
<string>Add...</string>
</property>
</widget>
</item>
Expand Down
46 changes: 21 additions & 25 deletions src/Mod/Path/Gui/Resources/panels/PropertyCreate.ui
Expand Up @@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>484</width>
<height>362</height>
<width>480</width>
<height>468</height>
</rect>
</property>
<property name="windowTitle">
Expand Down Expand Up @@ -77,14 +77,24 @@
</property>
</widget>
</item>
<item row="5" column="0">
<item row="3" column="0">
<widget class="QLabel" name="enumLabel">
<property name="text">
<string>Enums</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="enumValues"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>ToolTip</string>
</property>
</widget>
</item>
<item row="5" column="1">
<item row="4" column="1">
<widget class="QTextEdit" name="propertyInfo">
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;ToolTip to be displayed when user hovers mouse over property.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
Expand All @@ -94,8 +104,14 @@
</property>
</widget>
</item>
<item row="6" column="1">
<item row="5" column="1">
<widget class="QWidget" name="widget_2" native="true">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>0</number>
Expand Down Expand Up @@ -132,26 +148,6 @@
</layout>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="enumLabel">
<property name="enabled">
<bool>false</bool>
</property>
<property name="text">
<string>Values</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="enumValues">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Comma separated list of enumeration values.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
</widget>
</item>
</layout>
</widget>
<tabstops>
Expand Down
16 changes: 5 additions & 11 deletions src/Mod/Path/PathScripts/PathPropertyBag.py
Expand Up @@ -45,17 +45,11 @@ def translate(context, text, disambig=None):
'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.'''
Expand Down
122 changes: 91 additions & 31 deletions src/Mod/Path/PathScripts/PathPropertyBagGui.py
Expand Up @@ -151,8 +151,6 @@ def __init__(self, obj, grp, typ, another):
self.form.propertyType.currentIndexChanged.connect(self.updateUI)
self.form.enumValues.textChanged.connect(self.updateUI)

self.updateUI()

def updateUI(self):
typeSet = True
if self.propertyIsEnumeration():
Expand Down Expand Up @@ -187,52 +185,76 @@ def propertyEnumerations(self):
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.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), 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), 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)
Expand All @@ -245,6 +267,7 @@ def setupUi(self):
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):
Expand All @@ -261,27 +284,33 @@ def reject(self):
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
grp = None
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
Expand All @@ -297,6 +326,37 @@ def propertyAdd(self):
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
Expand Down

0 comments on commit eee8d12

Please sign in to comment.