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 import QtCore 
 34  from python_qt_binding import QtGui 
35 36 -class SettingsNameItem(QtGui.QStandardItem):
37 38 ITEM_TYPE = QtGui.QStandardItem.UserType + 80 39
40 - def __init__(self, name, tooltip=''):
41 QtGui.QStandardItem.__init__(self, name) 42 self.name = name 43 self.tooltip = tooltip
44
45 - def type(self):
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 # return the displayed item name 57 return self.name 58 elif role == QtCore.Qt.ToolTipRole: 59 # return the tooltip of the item 60 return self.tooltip 61 else: 62 # We don't care about anything else, so return None 63 return QtGui.QStandardItem.data(self, role)
64
65 66 -class SettingsValueItem(QtGui.QStandardItem):
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
101 - def type(self):
103
104 - def attrname(self):
105 return self._attrname
106
107 - def value(self):
108 return self._value
109
110 - def value_default(self):
111 return self._value_default
112
113 - def value_min(self):
114 return self._value_min
115
116 - def value_max(self):
117 return self._value_max
118
119 - def edit_type(self):
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 # return the displayed item name 131 return '%s'%self._value 132 # elif role == QtCore.Qt.DecorationRole: 133 # pass 134 elif role == QtCore.Qt.EditRole: 135 return self._value 136 else: 137 # We don't care about anything else, so return None 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
147 148 -class SettingsGroupItem(QtGui.QStandardItem):
149 150 ITEM_TYPE = QtGui.QStandardItem.UserType + 82 151
152 - def __init__(self, name):
153 QtGui.QStandardItem.__init__(self, name) 154 self.name = name
155
156 - def type(self):
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 # return the displayed item name 170 return self.name 171 # elif role == QtCore.Qt.DecorationRole: 172 # pass 173 else: 174 # We don't care about anything else, so return None 175 return QtGui.QStandardItem.data(self, role)
176 177 @classmethod
178 - def getGroupItemList(self, name):
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 # item = QtGui.QStandardItem('') 190 # items.append(item) 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):
197 ''' 198 Creates the list of the items . This list is used for the 199 visualization of settings group data as a table row. 200 For paramters see `SettingsValueItem()` 201 @rtype: C{[L{SettingsGroupItem} and L{PySide.QtGui.QStandardItem}]} 202 ''' 203 items = [] 204 item = SettingsNameItem(name, tooltip) 205 items.append(item) 206 item = SettingsValueItem(value, (settings, attrname), edit_type, 207 value_default, value_min, value_max) 208 items.append(item) 209 return items
210
211 212 -class SettingsModel(QtGui.QStandardItemModel):
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
219 - def __init__(self):
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() # workaround for using with PyQt: store the python object to keep the defined attributes in the TopicItem subclass
227 228 #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 229 #%%%%%%%%%%%%% Overloaded methods %%%%%%%% 230 #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 231
232 - def flags(self, index):
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 #%%%%%%%%%%%%% External usage %%%%%%%% 255 #%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 256
257 - def init_settings(self, settings):
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 # remove all current items 264 root = self.invisibleRootItem() 265 while root.rowCount(): 266 root.removeRow(0) 267 self.pyqt_workaround.clear() 268 # add new items 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
276 - def _add_item(self, root, name, value):
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
298 - def _get_settings_param(self, entry, param, default=None):
299 try: 300 return entry[0][param] 301 except: 302 return default
303