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  from node_manager_fkie.detailed_msg_box import MessageBox 
37 38 39 -class SettingsNameItem(QStandardItem):
40 41 ITEM_TYPE = QStandardItem.UserType + 80 42
43 - def __init__(self, name, tooltip=''):
44 QStandardItem.__init__(self, name) 45 self.name = name 46 self.tooltip = tooltip
47
48 - def type(self):
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 # return the displayed item name 60 return self.name 61 elif role == Qt.ToolTipRole: 62 # return the tooltip of the item 63 return self.tooltip 64 else: 65 # We don't care about anything else, so return None 66 return QStandardItem.data(self, role)
67
68 69 -class SettingsValueItem(QStandardItem):
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
109 - def type(self):
111
112 - def attrname(self):
113 return self._attrname
114
115 - def value(self):
116 return self._value
117
118 - def value_default(self):
119 return self._value_default
120
121 - def value_min(self):
122 return self._value_min
123
124 - def value_max(self):
125 return self._value_max
126
127 - def value_step(self):
128 return self._value_step
129
130 - def edit_type(self):
131 return self._edit_type
132
133 - def value_list(self):
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 # return the displayed item name 145 return '%s' % self._value 146 # elif role == Qt.DecorationRole: 147 # pass 148 elif role == Qt.EditRole: 149 return self._value 150 else: 151 # We don't care about anything else, so return None 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
163 164 -class SettingsGroupItem(QStandardItem):
165 166 ITEM_TYPE = QStandardItem.UserType + 82 167
168 - def __init__(self, name):
169 QStandardItem.__init__(self, name) 170 self.name = name
171
172 - def type(self):
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 # return the displayed item name 184 return self.name 185 # elif role == Qt.DecorationRole: 186 # pass 187 else: 188 # We don't care about anything else, so return None 189 return QStandardItem.data(self, role)
190 191 @classmethod
192 - def getGroupItemList(self, name):
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 # item = QStandardItem('') 204 # items.append(item) 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
226 227 -class SettingsModel(QStandardItemModel):
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
234 - def __init__(self):
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() # workaround for using with PyQt: store the python object to keep the defined attributes in the TopicItem subclass
242 243 # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 244 # %%%%%%%%%%%%% Overloaded methods %%%%%%%% 245 # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 246
247 - def flags(self, index):
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 # %%%%%%%%%%%%% External usage %%%%%%%% 270 # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 271
272 - def init_settings(self, settings):
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 # remove all current items 279 root = self.invisibleRootItem() 280 while root.rowCount(): 281 root.removeRow(0) 282 self.pyqt_workaround.clear() 283 # add new items 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
291 - def _add_item(self, root, name, value):
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
315 - def _get_settings_param(self, entry, param, default=None):
316 try: 317 return entry[0][param] 318 except: 319 return default
320