Package node_manager_fkie :: Module settings_model
[frames] | no frames]

Source Code for Module node_manager_fkie.settings_model

  1  # Software License Agreement (BSD License) 
  2  # 
  3  # Copyright (c) 2012, Fraunhofer FKIE/US, Alexander Tiderko 
  4  # All rights reserved. 
  5  # 
  6  # Redistribution and use in source and binary forms, with or without 
  7  # modification, are permitted provided that the following conditions 
  8  # are met: 
  9  # 
 10  #  * Redistributions of source code must retain the above copyright 
 11  #    notice, this list of conditions and the following disclaimer. 
 12  #  * Redistributions in binary form must reproduce the above 
 13  #    copyright notice, this list of conditions and the following 
 14  #    disclaimer in the documentation and/or other materials provided 
 15  #    with the distribution. 
 16  #  * Neither the name of Fraunhofer nor the names of its 
 17  #    contributors may be used to endorse or promote products derived 
 18  #    from this software without specific prior written permission. 
 19  # 
 20  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
 21  # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
 22  # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 
 23  # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 
 24  # COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 
 25  # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
 26  # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
 27  # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
 28  # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 
 29  # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
 30  # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 31  # POSSIBILITY OF SUCH DAMAGE. 
 32   
 33  from python_qt_binding.QtCore import Qt 
 34  from python_qt_binding.QtGui import QStandardItem, QStandardItemModel 
35 36 37 -class SettingsNameItem(QStandardItem):
38 39 ITEM_TYPE = QStandardItem.UserType + 80 40
41 - def __init__(self, name, tooltip=''):
42 QStandardItem.__init__(self, name) 43 self.name = name 44 self.tooltip = tooltip
45
46 - def type(self):
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 # return the displayed item name 58 return self.name 59 elif role == Qt.ToolTipRole: 60 # return the tooltip of the item 61 return self.tooltip 62 else: 63 # We don't care about anything else, so return None 64 return QStandardItem.data(self, role)
65
66 67 -class SettingsValueItem(QStandardItem):
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
106 - def type(self):
108
109 - def attrname(self):
110 return self._attrname
111
112 - def value(self):
113 return self._value
114
115 - def value_default(self):
116 return self._value_default
117
118 - def value_min(self):
119 return self._value_min
120
121 - def value_max(self):
122 return self._value_max
123
124 - def value_step(self):
125 return self._value_step
126
127 - def edit_type(self):
128 return self._edit_type
129
130 - def value_list(self):
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 # return the displayed item name 142 return '%s' % self._value 143 # elif role == Qt.DecorationRole: 144 # pass 145 elif role == Qt.EditRole: 146 return self._value 147 else: 148 # We don't care about anything else, so return None 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
158 159 -class SettingsGroupItem(QStandardItem):
160 161 ITEM_TYPE = QStandardItem.UserType + 82 162
163 - def __init__(self, name):
164 QStandardItem.__init__(self, name) 165 self.name = name
166
167 - def type(self):
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 # return the displayed item name 179 return self.name 180 # elif role == Qt.DecorationRole: 181 # pass 182 else: 183 # We don't care about anything else, so return None 184 return QStandardItem.data(self, role)
185 186 @classmethod
187 - def getGroupItemList(self, name):
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 # item = QStandardItem('') 199 # items.append(item) 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):
206 ''' 207 Creates the list of the items . This list is used for the 208 visualization of settings group data as a table row. 209 For paramters see `SettingsValueItem()` 210 @rtype: C{[L{SettingsGroupItem} and U{QtGui.QStandardItem<https://srinikom.github.io/pyside-docs/PySide/QtGui/QStandardItem.html>}]} 211 ''' 212 items = [] 213 item = SettingsNameItem(name, tooltip) 214 items.append(item) 215 item = SettingsValueItem(value, (settings, attrname), edit_type, 216 value_default, value_min, value_max, value_list, value_step) 217 items.append(item) 218 return items
219
220 221 -class SettingsModel(QStandardItemModel):
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
228 - def __init__(self):
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() # workaround for using with PyQt: store the python object to keep the defined attributes in the TopicItem subclass
236 237 # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 238 # %%%%%%%%%%%%% Overloaded methods %%%%%%%% 239 # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 240
241 - def flags(self, index):
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 # %%%%%%%%%%%%% External usage %%%%%%%% 264 # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 265
266 - def init_settings(self, settings):
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 # remove all current items 273 root = self.invisibleRootItem() 274 while root.rowCount(): 275 root.removeRow(0) 276 self.pyqt_workaround.clear() 277 # add new items 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
285 - def _add_item(self, root, name, value):
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
308 - def _get_settings_param(self, entry, param, default=None):
309 try: 310 return entry[0][param] 311 except: 312 return default
313