1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 from python_qt_binding.QtCore import Qt
34 from python_qt_binding.QtGui import QStandardItem, QStandardItemModel
38
39 ITEM_TYPE = QStandardItem.UserType + 80
40
45
48
49 - def data(self, role):
50 '''
51 The view asks us for all sorts of information about our data...
52 @param role: the art of the data
53 @type role: U{QtCore.Qt.DisplayRole<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
54 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
55 '''
56 if role == Qt.DisplayRole:
57
58 return self.name
59 elif role == Qt.ToolTipRole:
60
61 return self.tooltip
62 else:
63
64 return QStandardItem.data(self, role)
65
68
69 ITEM_TYPE = QStandardItem.UserType + 81
70
71 EDIT_TYPE_AUTODETECT = 0
72 EDIT_TYPE_FOLDER = 1
73 EDIT_TYPE_LIST = 2
74
75 - def __init__(self, value, (settings, attrname)=(None, None),
76 edit_type=0,
77 value_default=None, value_min=None, value_max=None, value_list=[], value_step=None):
78 '''
79 :param value: the current value
80 :type value: any std types
81 :param settings: the object, which contains `attrname` as property and
82 provide the parameter changes
83 :type settings: object (Settings)
84 :param attrname: the parameter name, which is available as property in
85 `settings` object.
86 :type attrname: str
87 :param edit_type: the editor type will be detected automatically by default.
88 For different editors you can set manually the `EDIT_TYPE_*`
89 :type edit_type: int (`EDIT_TYPE_*`)
90 :param value_default: the default value, is needed for reset functionality
91 :param value_min: the maximum value (used by int or float)
92 :param value_max: the minimum value (used by int or float)
93 :param value_list: the list of values used for comboboxes
94 '''
95 QStandardItem.__init__(self, '%s' % value)
96 self._attrname = attrname
97 self._value = value
98 self._value_default = value_default
99 self._value_min = value_min
100 self._value_max = value_max
101 self._settings = settings
102 self._edit_type = edit_type
103 self._value_list = value_list
104 self._value_step = value_step
105
108
110 return self._attrname
111
114
116 return self._value_default
117
119 return self._value_min
120
122 return self._value_max
123
125 return self._value_step
126
128 return self._edit_type
129
131 return self._value_list
132
133 - def data(self, role):
134 '''
135 The view asks us for all sorts of information about our data...
136 @param role: the art of the data
137 @type role: U{QtCore.Qt.DisplayRole<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
138 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
139 '''
140 if role == Qt.DisplayRole:
141
142 return '%s' % self._value
143
144
145 elif role == Qt.EditRole:
146 return self._value
147 else:
148
149 return QStandardItem.data(self, role)
150
151 - def setData(self, value, role=Qt.EditRole):
152 if role == Qt.EditRole:
153 self._value = value
154 if hasattr(self._settings, self._attrname):
155 setattr(self._settings, self._attrname, value)
156 return QStandardItem.setData(self, value, role)
157
160
161 ITEM_TYPE = QStandardItem.UserType + 82
162
166
169
170 - def data(self, role):
171 '''
172 The view asks us for all sorts of information about our data...
173 @param role: the art of the data
174 @type role: U{QtCore.Qt.DisplayRole<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
175 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
176 '''
177 if role == Qt.DisplayRole:
178
179 return self.name
180
181
182 else:
183
184 return QStandardItem.data(self, role)
185
186 @classmethod
188 '''
189 Creates the list of the items . This list is used for the
190 visualization of settings group data as a table row.
191 @param name: the group name
192 @type name: C{str}
193 @rtype: C{[L{SettingsGroupItem} and U{QtGui.QStandardItem<https://srinikom.github.io/pyside-docs/PySide/QtGui/QStandardItem.html>}]}
194 '''
195 items = []
196 item = SettingsGroupItem(name)
197 items.append(item)
198
199
200 return items
201
202 @classmethod
203 - def getSettingsItemList(self, name, value, (settings, attrname)=(None, None),
204 tooltip='', edit_type=SettingsValueItem.EDIT_TYPE_AUTODETECT,
205 value_default=None, value_min=None, value_max=None, value_list=[], value_step=None):
219
222 '''
223 The model to manage the settings.
224 '''
225 header = [('Parameter', 160), ('Value', -1)]
226 '''@ivar: the list with columns C{[(name, width), ...]}'''
227
229 '''
230 Creates a new list model.
231 '''
232 QStandardItemModel.__init__(self)
233 self.setColumnCount(len(SettingsModel.header))
234 self.setHorizontalHeaderLabels([label for label, _ in SettingsModel.header])
235 self.pyqt_workaround = dict()
236
237
238
239
240
242 '''
243 @param index: parent of the list
244 @type index: U{QtCore.QModelIndex<https://srinikom.github.io/pyside-docs/PySide/QtCore/QModelIndex.html>}
245 @return: Flag or the requested item
246 @rtype: U{QtCore.Qt.ItemFlag<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
247 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
248 '''
249 if not index.isValid():
250 return Qt.NoItemFlags
251 try:
252 item = self.itemFromIndex(index)
253 result = Qt.ItemIsSelectable | Qt.ItemIsEnabled
254 if item.type() in [SettingsValueItem.ITEM_TYPE]:
255 result = result | Qt.ItemIsEditable
256 return result
257 except:
258 import traceback
259 print traceback.format_exc(1)
260 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
261
262
263
264
265
267 '''
268 Updates the model data.
269 @param settings: a dictionary with settings name and values.
270 @type settings: C{dict(str: parameter of L{SettingsGroupItem.getSettingsItemList()}, ...)}
271 '''
272
273 root = self.invisibleRootItem()
274 while root.rowCount():
275 root.removeRow(0)
276 self.pyqt_workaround.clear()
277
278 try:
279 for name, value in settings.items():
280 self._add_item(root, name, value)
281 except:
282 import traceback
283 print traceback.format_exc(1)
284
286 if isinstance(value, dict):
287 new_item_row = SettingsGroupItem.getGroupItemList(name)
288 root.appendRow(new_item_row)
289 self.pyqt_workaround['group_%s' % name] = new_item_row[0]
290 for name, value in value.items():
291 self._add_item(new_item_row[0], name, value)
292 else:
293 args = (name,
294 self._get_settings_param(value, 'value'),
295 (self._get_settings_param(value, 'settings'), self._get_settings_param(value, 'attrname')),
296 self._get_settings_param(value, 'tooltip', ''),
297 self._get_settings_param(value, 'edit_type', SettingsValueItem.EDIT_TYPE_AUTODETECT),
298 self._get_settings_param(value, 'value_default'),
299 self._get_settings_param(value, 'value_min'),
300 self._get_settings_param(value, 'value_max'),
301 self._get_settings_param(value, 'value_list'),
302 self._get_settings_param(value, 'value_step')
303 )
304 new_item_row = SettingsGroupItem.getSettingsItemList(*args)
305 root.appendRow(new_item_row)
306 self.pyqt_workaround[name] = new_item_row[0]
307
309 try:
310 return entry[0][param]
311 except:
312 return default
313