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
35
36 from node_manager_fkie.detailed_msg_box import MessageBox
40
41 ITEM_TYPE = QStandardItem.UserType + 80
42
47
50
51 - def data(self, role):
52 '''
53 The view asks us for all sorts of information about our data...
54 @param role: the art of the data
55 @type role: U{QtCore.Qt.DisplayRole<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
56 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
57 '''
58 if role == Qt.DisplayRole:
59
60 return self.name
61 elif role == Qt.ToolTipRole:
62
63 return self.tooltip
64 else:
65
66 return QStandardItem.data(self, role)
67
70
71 ITEM_TYPE = QStandardItem.UserType + 81
72
73 EDIT_TYPE_AUTODETECT = 0
74 EDIT_TYPE_FOLDER = 1
75 EDIT_TYPE_LIST = 2
76
77 - def __init__(self, value, (settings, attrname)=(None, None),
78 edit_type=0,
79 value_default=None, value_min=None, value_max=None, value_list=[], value_step=None, need_restart=False):
80 '''
81 :param value: the current value
82 :type value: any std types
83 :param settings: the object, which contains `attrname` as property and
84 provide the parameter changes
85 :type settings: object (Settings)
86 :param attrname: the parameter name, which is available as property in
87 `settings` object.
88 :type attrname: str
89 :param edit_type: the editor type will be detected automatically by default.
90 For different editors you can set manually the `EDIT_TYPE_*`
91 :type edit_type: int (`EDIT_TYPE_*`)
92 :param value_default: the default value, is needed for reset functionality
93 :param value_min: the maximum value (used by int or float)
94 :param value_max: the minimum value (used by int or float)
95 :param value_list: the list of values used for comboboxes
96 '''
97 QStandardItem.__init__(self, '%s' % value)
98 self._attrname = attrname
99 self._value = value
100 self._value_default = value_default
101 self._value_min = value_min
102 self._value_max = value_max
103 self._settings = settings
104 self._edit_type = edit_type
105 self._value_list = value_list
106 self._value_step = value_step
107 self._need_restart = need_restart
108
111
113 return self._attrname
114
117
119 return self._value_default
120
122 return self._value_min
123
125 return self._value_max
126
128 return self._value_step
129
131 return self._edit_type
132
134 return self._value_list
135
136 - def data(self, role):
137 '''
138 The view asks us for all sorts of information about our data...
139 @param role: the art of the data
140 @type role: U{QtCore.Qt.DisplayRole<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
141 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
142 '''
143 if role == Qt.DisplayRole:
144
145 return '%s' % self._value
146
147
148 elif role == Qt.EditRole:
149 return self._value
150 else:
151
152 return QStandardItem.data(self, role)
153
154 - def setData(self, value, role=Qt.EditRole):
155 if role == Qt.EditRole:
156 self._value = value
157 if hasattr(self._settings, self._attrname):
158 setattr(self._settings, self._attrname, value)
159 if self._need_restart:
160 MessageBox.information(None, "restart Node Manager", "This parameter change is only valid after restart!")
161 return QStandardItem.setData(self, value, role)
162
165
166 ITEM_TYPE = QStandardItem.UserType + 82
167
171
174
175 - def data(self, role):
176 '''
177 The view asks us for all sorts of information about our data...
178 @param role: the art of the data
179 @type role: U{QtCore.Qt.DisplayRole<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
180 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
181 '''
182 if role == Qt.DisplayRole:
183
184 return self.name
185
186
187 else:
188
189 return QStandardItem.data(self, role)
190
191 @classmethod
193 '''
194 Creates the list of the items . This list is used for the
195 visualization of settings group data as a table row.
196 @param name: the group name
197 @type name: C{str}
198 @rtype: C{[L{SettingsGroupItem} and U{QtGui.QStandardItem<https://srinikom.github.io/pyside-docs/PySide/QtGui/QStandardItem.html>}]}
199 '''
200 items = []
201 item = SettingsGroupItem(name)
202 items.append(item)
203
204
205 return items
206
207 @classmethod
208 - def getSettingsItemList(self, name, value, (settings, attrname)=(None, None),
209 tooltip='', edit_type=SettingsValueItem.EDIT_TYPE_AUTODETECT,
210 value_default=None, value_min=None, value_max=None, value_list=[],
211 value_step=None, need_restart=False):
212 '''
213 Creates the list of the items . This list is used for the
214 visualization of settings group data as a table row.
215 For paramters see `SettingsValueItem()`
216 @rtype: C{[L{SettingsGroupItem} and U{QtGui.QStandardItem<https://srinikom.github.io/pyside-docs/PySide/QtGui/QStandardItem.html>}]}
217 '''
218 items = []
219 item = SettingsNameItem(name, tooltip)
220 items.append(item)
221 item = SettingsValueItem(value, (settings, attrname), edit_type,
222 value_default, value_min, value_max, value_list, value_step, need_restart)
223 items.append(item)
224 return items
225
228 '''
229 The model to manage the settings.
230 '''
231 header = [('Parameter', 160), ('Value', -1)]
232 '''@ivar: the list with columns C{[(name, width), ...]}'''
233
235 '''
236 Creates a new list model.
237 '''
238 QStandardItemModel.__init__(self)
239 self.setColumnCount(len(SettingsModel.header))
240 self.setHorizontalHeaderLabels([label for label, _ in SettingsModel.header])
241 self.pyqt_workaround = dict()
242
243
244
245
246
248 '''
249 @param index: parent of the list
250 @type index: U{QtCore.QModelIndex<https://srinikom.github.io/pyside-docs/PySide/QtCore/QModelIndex.html>}
251 @return: Flag or the requested item
252 @rtype: U{QtCore.Qt.ItemFlag<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>}
253 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html}
254 '''
255 if not index.isValid():
256 return Qt.NoItemFlags
257 try:
258 item = self.itemFromIndex(index)
259 result = Qt.ItemIsSelectable | Qt.ItemIsEnabled
260 if item.type() in [SettingsValueItem.ITEM_TYPE]:
261 result = result | Qt.ItemIsEditable
262 return result
263 except:
264 import traceback
265 print traceback.format_exc(1)
266 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
267
268
269
270
271
273 '''
274 Updates the model data.
275 @param settings: a dictionary with settings name and values.
276 @type settings: C{dict(str: parameter of L{SettingsGroupItem.getSettingsItemList()}, ...)}
277 '''
278
279 root = self.invisibleRootItem()
280 while root.rowCount():
281 root.removeRow(0)
282 self.pyqt_workaround.clear()
283
284 try:
285 for name, value in settings.items():
286 self._add_item(root, name, value)
287 except:
288 import traceback
289 print traceback.format_exc(1)
290
292 if isinstance(value, dict):
293 new_item_row = SettingsGroupItem.getGroupItemList(name)
294 root.appendRow(new_item_row)
295 self.pyqt_workaround['group_%s' % name] = new_item_row[0]
296 for name, value in value.items():
297 self._add_item(new_item_row[0], name, value)
298 else:
299 args = (name,
300 self._get_settings_param(value, 'value'),
301 (self._get_settings_param(value, 'settings'), self._get_settings_param(value, 'attrname')),
302 self._get_settings_param(value, 'tooltip', ''),
303 self._get_settings_param(value, 'edit_type', SettingsValueItem.EDIT_TYPE_AUTODETECT),
304 self._get_settings_param(value, 'value_default'),
305 self._get_settings_param(value, 'value_min'),
306 self._get_settings_param(value, 'value_max'),
307 self._get_settings_param(value, 'value_list'),
308 self._get_settings_param(value, 'value_step'),
309 self._get_settings_param(value, 'need_restart', False)
310 )
311 new_item_row = SettingsGroupItem.getSettingsItemList(*args)
312 root.appendRow(new_item_row)
313 self.pyqt_workaround[name] = new_item_row[0]
314
316 try:
317 return entry[0][param]
318 except:
319 return default
320