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  import os 
 34  import sys 
 35  import shutil 
 36   
 37  from python_qt_binding import QtCore 
 38  from python_qt_binding import QtGui 
 39   
 40  import node_manager_fkie as nm 
 41  from common import is_package, package_name 
 42  from packages_thread import PackagesThread 
 43  from .detailed_msg_box import WarningMessageBox 
44 45 -class SettingsNameItem(QtGui.QStandardItem):
46 47 ITEM_TYPE = QtGui.QStandardItem.UserType + 80 48
49 - def __init__(self, name, tooltip=''):
50 QtGui.QStandardItem.__init__(self, name) 51 self.name = name 52 self.tooltip = tooltip
53
54 - def type(self):
56
57 - def data(self, role):
58 ''' 59 The view asks us for all sorts of information about our data... 60 @param role: the art of the data 61 @type role: L{QtCore.Qt.DisplayRole} 62 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html} 63 ''' 64 if role == QtCore.Qt.DisplayRole: 65 # return the displayed item name 66 return self.name 67 elif role == QtCore.Qt.ToolTipRole: 68 # return the tooltip of the item 69 return self.tooltip 70 else: 71 # We don't care about anything else, so return None 72 return QtGui.QStandardItem.data(self, role)
73
74 75 -class SettingsValueItem(QtGui.QStandardItem):
76 77 ITEM_TYPE = QtGui.QStandardItem.UserType + 81 78 79 EDIT_TYPE_AUTODETECT = 0 80 EDIT_TYPE_FOLDER = 1 81
82 - def __init__(self, value, (settings, attrname)=(None, None), 83 edit_type=0, 84 value_default=None, value_min=None, value_max=None):
85 ''' 86 :param value: the current value 87 :type value: any std types 88 :param settings: the object, which contains `attrname` as property and 89 provide the parameter changes 90 :type settings: object (Settings) 91 :param attrname: the parameter name, which is available as property in 92 `settings` object. 93 :type attrname: str 94 :param edit_type: the editor type will be detected automatically by default. 95 For different editors you can set manually the `EDIT_TYPE_*` 96 :type edit_type: int (`EDIT_TYPE_*`) 97 :param value_default: the default value, is needed for reset functionality 98 :param value_min: the maximum value (used by int or float) 99 :param value_max: the minimum value (used by int or float) 100 ''' 101 QtGui.QStandardItem.__init__(self, '%s'%value) 102 self._attrname = attrname 103 self._value = value 104 self._value_default = value_default 105 self._value_min = value_min 106 self._value_max = value_max 107 self._settings = settings 108 self._edit_type = edit_type
109
110 - def type(self):
112
113 - def attrname(self):
114 return self._attrname
115
116 - def value(self):
117 return self._value
118
119 - def value_default(self):
120 return self._value_default
121
122 - def value_min(self):
123 return self._value_min
124
125 - def value_max(self):
126 return self._value_max
127
128 - def edit_type(self):
129 return self._edit_type
130
131 - def data(self, role):
132 ''' 133 The view asks us for all sorts of information about our data... 134 @param role: the art of the data 135 @type role: L{QtCore.Qt.DisplayRole} 136 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html} 137 ''' 138 if role == QtCore.Qt.DisplayRole: 139 # return the displayed item name 140 return '%s'%self._value 141 # elif role == QtCore.Qt.DecorationRole: 142 # pass 143 elif role == QtCore.Qt.EditRole: 144 return self._value 145 else: 146 # We don't care about anything else, so return None 147 return QtGui.QStandardItem.data(self, role)
148
149 - def setData(self, value, role=QtCore.Qt.EditRole):
150 if role == QtCore.Qt.EditRole: 151 self._value = value 152 if hasattr(self._settings, self._attrname): 153 setattr(self._settings, self._attrname, value) 154 return QtGui.QStandardItem.setData(self, value, role)
155
156 157 -class SettingsGroupItem(QtGui.QStandardItem):
158 159 ITEM_TYPE = QtGui.QStandardItem.UserType + 82 160
161 - def __init__(self, name):
162 QtGui.QStandardItem.__init__(self, name) 163 self.name = name
164
165 - def type(self):
167
168 - def data(self, role):
169 ''' 170 The view asks us for all sorts of information about our data... 171 @param index: parent of the list 172 @type index: L{QtCore.QModelIndex} 173 @param role: the art of the data 174 @type role: L{QtCore.Qt.DisplayRole} 175 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html} 176 ''' 177 if role == QtCore.Qt.DisplayRole: 178 # return the displayed item name 179 return self.name 180 # elif role == QtCore.Qt.DecorationRole: 181 # pass 182 else: 183 # We don't care about anything else, so return None 184 return QtGui.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 L{PySide.QtGui.QStandardItem}]} 194 ''' 195 items = [] 196 item = SettingsGroupItem(name) 197 items.append(item) 198 # item = QtGui.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):
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 L{PySide.QtGui.QStandardItem}]} 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) 217 items.append(item) 218 return items
219
220 221 -class SettingsModel(QtGui.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 QtGui.QStandardItemModel.__init__(self) 233 self.setColumnCount(len(SettingsModel.header)) 234 self.setHorizontalHeaderLabels([label for label, width 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: L{PySide.QtCore.QModelIndex} 245 @return: Flag or the requested item 246 @rtype: L{PySide.QtCore.Qt.ItemFlag} 247 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html} 248 ''' 249 if not index.isValid(): 250 return QtCore.Qt.NoItemFlags 251 try: 252 item = self.itemFromIndex(index) 253 result = QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled 254 if item.type() in [SettingsValueItem.ITEM_TYPE]: 255 result = result | QtCore.Qt.ItemIsEditable 256 return result 257 except: 258 import traceback 259 print traceback.format_exc() 260 return QtCore.Qt.ItemIsEnabled | QtCore.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:L{(.. parameter of SettingsGroupItem.getSettingsItemList())}, ...)} 271 ''' 272 # remove all current items 273 root = self.invisibleRootItem() 274 while root.rowCount(): 275 print "remove" 276 root.removeRow(0) 277 self.pyqt_workaround.clear() 278 # add new items 279 try: 280 for name, value in settings.items(): 281 self._add_item(root, name, value) 282 except: 283 import traceback 284 print traceback.format_exc()
285
286 - def _add_item(self, root, name, value):
287 if isinstance(value, dict): 288 new_item_row = SettingsGroupItem.getGroupItemList(name) 289 root.appendRow(new_item_row) 290 self.pyqt_workaround['group_%s'%name] = new_item_row[0] 291 for name, value in value.items(): 292 self._add_item(new_item_row[0], name, value) 293 else: 294 new_item_row = SettingsGroupItem.getSettingsItemList(name, 295 self._get_settings_param(value, 'value'), 296 (self._get_settings_param(value, 'settings'), 297 self._get_settings_param(value, 'attrname')), 298 self._get_settings_param(value, 'tooltip', ''), 299 self._get_settings_param(value, 'edit_type', 300 SettingsValueItem.EDIT_TYPE_AUTODETECT), 301 self._get_settings_param(value, 'value_default'), 302 self._get_settings_param(value, 'value_min'), 303 self._get_settings_param(value, 'value_max') 304 ) 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