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 import QtCore
34 from python_qt_binding import QtGui
37
38 ITEM_TYPE = QtGui.QStandardItem.UserType + 80
39
44
47
48 - def data(self, role):
49 '''
50 The view asks us for all sorts of information about our data...
51 @param role: the art of the data
52 @type role: L{QtCore.Qt.DisplayRole}
53 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
54 '''
55 if role == QtCore.Qt.DisplayRole:
56
57 return self.name
58 elif role == QtCore.Qt.ToolTipRole:
59
60 return self.tooltip
61 else:
62
63 return QtGui.QStandardItem.data(self, role)
64
67
68 ITEM_TYPE = QtGui.QStandardItem.UserType + 81
69
70 EDIT_TYPE_AUTODETECT = 0
71 EDIT_TYPE_FOLDER = 1
72
73 - def __init__(self, value, (settings, attrname)=(None, None),
74 edit_type=0,
75 value_default=None, value_min=None, value_max=None):
76 '''
77 :param value: the current value
78 :type value: any std types
79 :param settings: the object, which contains `attrname` as property and
80 provide the parameter changes
81 :type settings: object (Settings)
82 :param attrname: the parameter name, which is available as property in
83 `settings` object.
84 :type attrname: str
85 :param edit_type: the editor type will be detected automatically by default.
86 For different editors you can set manually the `EDIT_TYPE_*`
87 :type edit_type: int (`EDIT_TYPE_*`)
88 :param value_default: the default value, is needed for reset functionality
89 :param value_min: the maximum value (used by int or float)
90 :param value_max: the minimum value (used by int or float)
91 '''
92 QtGui.QStandardItem.__init__(self, '%s'%value)
93 self._attrname = attrname
94 self._value = value
95 self._value_default = value_default
96 self._value_min = value_min
97 self._value_max = value_max
98 self._settings = settings
99 self._edit_type = edit_type
100
103
105 return self._attrname
106
109
111 return self._value_default
112
114 return self._value_min
115
117 return self._value_max
118
120 return self._edit_type
121
122 - def data(self, role):
123 '''
124 The view asks us for all sorts of information about our data...
125 @param role: the art of the data
126 @type role: L{QtCore.Qt.DisplayRole}
127 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
128 '''
129 if role == QtCore.Qt.DisplayRole:
130
131 return '%s'%self._value
132
133
134 elif role == QtCore.Qt.EditRole:
135 return self._value
136 else:
137
138 return QtGui.QStandardItem.data(self, role)
139
140 - def setData(self, value, role=QtCore.Qt.EditRole):
141 if role == QtCore.Qt.EditRole:
142 self._value = value
143 if hasattr(self._settings, self._attrname):
144 setattr(self._settings, self._attrname, value)
145 return QtGui.QStandardItem.setData(self, value, role)
146
149
150 ITEM_TYPE = QtGui.QStandardItem.UserType + 82
151
155
158
159 - def data(self, role):
160 '''
161 The view asks us for all sorts of information about our data...
162 @param index: parent of the list
163 @type index: L{QtCore.QModelIndex}
164 @param role: the art of the data
165 @type role: L{QtCore.Qt.DisplayRole}
166 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
167 '''
168 if role == QtCore.Qt.DisplayRole:
169
170 return self.name
171
172
173 else:
174
175 return QtGui.QStandardItem.data(self, role)
176
177 @classmethod
179 '''
180 Creates the list of the items . This list is used for the
181 visualization of settings group data as a table row.
182 @param name: the group name
183 @type name: C{str}
184 @rtype: C{[L{SettingsGroupItem} and L{PySide.QtGui.QStandardItem}]}
185 '''
186 items = []
187 item = SettingsGroupItem(name)
188 items.append(item)
189
190
191 return items
192
193 @classmethod
194 - def getSettingsItemList(self, name, value, (settings, attrname)=(None, None),
195 tooltip='', edit_type=SettingsValueItem.EDIT_TYPE_AUTODETECT,
196 value_default=None, value_min=None, value_max=None):
210
213 '''
214 The model to manage the settings.
215 '''
216 header = [('Parameter', 160), ('Value', -1)]
217 '''@ivar: the list with columns C{[(name, width), ...]}'''
218
220 '''
221 Creates a new list model.
222 '''
223 QtGui.QStandardItemModel.__init__(self)
224 self.setColumnCount(len(SettingsModel.header))
225 self.setHorizontalHeaderLabels([label for label, _ in SettingsModel.header])
226 self.pyqt_workaround = dict()
227
228
229
230
231
233 '''
234 @param index: parent of the list
235 @type index: L{PySide.QtCore.QModelIndex}
236 @return: Flag or the requested item
237 @rtype: L{PySide.QtCore.Qt.ItemFlag}
238 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
239 '''
240 if not index.isValid():
241 return QtCore.Qt.NoItemFlags
242 try:
243 item = self.itemFromIndex(index)
244 result = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
245 if item.type() in [SettingsValueItem.ITEM_TYPE]:
246 result = result | QtCore.Qt.ItemIsEditable
247 return result
248 except:
249 import traceback
250 print traceback.format_exc(1)
251 return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
252
253
254
255
256
258 '''
259 Updates the model data.
260 @param settings: a dictionary with settings name and values.
261 @type settings: C{dict(str:L{(.. parameter of SettingsGroupItem.getSettingsItemList())}, ...)}
262 '''
263
264 root = self.invisibleRootItem()
265 while root.rowCount():
266 root.removeRow(0)
267 self.pyqt_workaround.clear()
268
269 try:
270 for name, value in settings.items():
271 self._add_item(root, name, value)
272 except:
273 import traceback
274 print traceback.format_exc(1)
275
277 if isinstance(value, dict):
278 new_item_row = SettingsGroupItem.getGroupItemList(name)
279 root.appendRow(new_item_row)
280 self.pyqt_workaround['group_%s'%name] = new_item_row[0]
281 for name, value in value.items():
282 self._add_item(new_item_row[0], name, value)
283 else:
284 new_item_row = SettingsGroupItem.getSettingsItemList(name,
285 self._get_settings_param(value, 'value'),
286 (self._get_settings_param(value, 'settings'),
287 self._get_settings_param(value, 'attrname')),
288 self._get_settings_param(value, 'tooltip', ''),
289 self._get_settings_param(value, 'edit_type',
290 SettingsValueItem.EDIT_TYPE_AUTODETECT),
291 self._get_settings_param(value, 'value_default'),
292 self._get_settings_param(value, 'value_min'),
293 self._get_settings_param(value, 'value_max')
294 )
295 root.appendRow(new_item_row)
296 self.pyqt_workaround[name] = new_item_row[0]
297
299 try:
300 return entry[0][param]
301 except:
302 return default
303