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

Source Code for Module node_manager_fkie.parameter_list_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 QSize, Qt 
 34  from python_qt_binding.QtGui import QStandardItem, QStandardItemModel 
 35  from xmlrpclib import Binary 
 36   
 37  from node_manager_fkie.common import utf8 
38 39 40 -class ParameterValueItem(QStandardItem):
41 ''' 42 The parameter item is stored in the parameter model. This class stores the name 43 and value of a parameter of ROS parameter server and shows the value. 44 ''' 45 46 ITEM_TYPE = QStandardItem.UserType + 39 47 NAME_ROLE = Qt.UserRole + 1 48 VALUE_ROLE = Qt.UserRole + 2 49 TYPE_ROLE = Qt.UserRole + 3 50
51 - def __init__(self, name, value, parent=None):
52 ''' 53 Initialize the item object. 54 @param name: the name of the parameter 55 @type name: C{str} 56 @param value: the value of the parameter 57 @type value: C{str} 58 ''' 59 QStandardItem.__init__(self, utf8(value) if not isinstance(value, Binary) else utf8(value)) 60 self._name = name 61 '''@ivar: the name of parameter ''' 62 self._value = value 63 '''@ivar: the value of the parameter ''' 64 if isinstance(value, (str, unicode)) and value.find('\n') > -1: 65 self.setSizeHint(QSize(-1, 45))
66 67 @property
68 - def name(self):
69 return self._name
70 71 @property
72 - def value(self):
73 return self._value
74 75 @value.setter
76 - def value(self, value):
77 self._value = value 78 self.setText(utf8(value) if not isinstance(value, Binary) else utf8(value)) 79 if isinstance(value, (str, unicode)) and value.find('\n') > -1: 80 self.setSizeHint(QSize(-1, 45))
81
82 - def type(self):
84
85 - def data(self, role):
86 if role == self.NAME_ROLE: 87 return self.name 88 elif role == self.VALUE_ROLE: 89 return utf8(self.value) 90 elif role == self.TYPE_ROLE: 91 return utf8(type(self.value).replace('<type \'').replace('\'>')) 92 else: 93 return QStandardItem.data(self, role)
94
95 - def __eq__(self, item):
96 ''' 97 Compares the value of parameter. 98 ''' 99 if isinstance(item, str) or isinstance(item, unicode): 100 return utf8(self.value) == utf8(item) 101 elif not (item is None): 102 return utf8(self.value) == utf8(item.value) 103 return False
104
105 - def __gt__(self, item):
106 ''' 107 Compares the value of parameter. 108 ''' 109 if isinstance(item, str) or isinstance(item, unicode): 110 return utf8(self.value) > utf8(item) 111 elif not (item is None): 112 return utf8(self.value) > utf8(item.value) 113 return False
114
115 116 -class ParameterNameItem(QStandardItem):
117 ''' 118 The parameter item is stored in the parameter model. This class stores the name 119 and value of a parameter of ROS parameter server and shows the name. 120 ''' 121 122 ITEM_TYPE = QStandardItem.UserType + 38 123 NAME_ROLE = Qt.UserRole + 1 124 VALUE_ROLE = Qt.UserRole + 2 125 TYPE_ROLE = Qt.UserRole + 3 126
127 - def __init__(self, name, value, parent=None):
128 ''' 129 Initialize the item object. 130 @param name: the name of the parameter 131 @type name: C{str} 132 @param value: the value of the parameter 133 @type value: C{str} 134 ''' 135 QStandardItem.__init__(self, name) 136 self._name = name 137 '''@ivar: the name of parameter ''' 138 self._value = value 139 '''@ivar: the value of the parameter '''
140 141 @property
142 - def name(self):
143 return self._name
144 145 @property
146 - def value(self):
147 return self._value
148 149 @value.setter
150 - def value(self, value):
151 self._value = value 152 self.setText(utf8(value))
153
154 - def type(self):
156
157 - def data(self, role):
158 if role == self.NAME_ROLE: 159 return self.name 160 elif role == self.VALUE_ROLE: 161 return utf8(self.value) 162 elif role == self.TYPE_ROLE: 163 return utf8(type(self.value).replace('<type \'').replace('\'>')) 164 else: 165 return QStandardItem.data(self, role)
166
167 - def __eq__(self, item):
168 ''' 169 Compares the name of parameter. 170 ''' 171 if isinstance(item, str) or isinstance(item, unicode): 172 return self.name.lower() == item.lower() 173 elif not (item is None): 174 return self.name.lower() == item.name.lower() 175 return False
176
177 - def __gt__(self, item):
178 ''' 179 Compares the name of parameter. 180 ''' 181 if isinstance(item, str) or isinstance(item, unicode): 182 return self.name.lower() > item.lower() 183 elif not (item is None): 184 return self.name.lower() > item.name.lower() 185 return False
186
187 188 -class ParameterTypeItem(QStandardItem):
189 ''' 190 The parameter item is stored in the parameter model. This class stores the name 191 and value of a parameter of ROS parameter server and shows the name. 192 ''' 193 194 ITEM_TYPE = QStandardItem.UserType + 40 195 NAME_ROLE = Qt.UserRole + 1 196 VALUE_ROLE = Qt.UserRole + 2 197 TYPE_ROLE = Qt.UserRole + 3 198
199 - def __init__(self, name, value, parent=None):
200 ''' 201 Initialize the item object. 202 @param name: the name of the parameter 203 @type name: C{str} 204 @param value: the value of the parameter 205 @type value: C{str} 206 ''' 207 QStandardItem.__init__(self, utf8(type(value)).replace("<type '", '').replace("'>", '')) 208 self._name = name 209 '''@ivar: the name of parameter ''' 210 self._value = value 211 '''@ivar: the value of the parameter '''
212 213 @property
214 - def name(self):
215 return self._name
216 217 @property
218 - def value(self):
219 return self._value
220 221 @value.setter
222 - def value(self, value):
223 self._value = value 224 self.setText(utf8(value))
225
226 - def type(self):
228
229 - def data(self, role):
230 if role == self.NAME_ROLE: 231 return self.name 232 elif role == self.VALUE_ROLE: 233 return utf8(self.value) 234 elif role == self.TYPE_ROLE: 235 return utf8(type(self.value).replace('<type \'').replace('\'>')) 236 else: 237 return QStandardItem.data(self, role)
238
239 - def __eq__(self, item):
240 ''' 241 Compares the name of parameter. 242 ''' 243 if isinstance(item, str) or isinstance(item, unicode): 244 return self.name.lower() == item.lower() 245 elif not (item is None): 246 return self.name.lower() == item.name.lower() 247 return False
248
249 - def __gt__(self, item):
250 ''' 251 Compares the name of parameter. 252 ''' 253 if isinstance(item, str) or isinstance(item, unicode): 254 return self.name.lower() > item.lower() 255 elif not (item is None): 256 return self.name.lower() > item.name.lower() 257 return False
258
259 260 -class ParameterModel(QStandardItemModel):
261 ''' 262 The model to manage the list with parameter in ROS network. 263 ''' 264 header = [('Parameter', 300), 265 ('Type', 50), 266 ('Value', -1)] 267 '''@ivar: the list with columns C{[(name, width), ...]}''' 268
269 - def __init__(self):
270 ''' 271 Creates a new list model. 272 ''' 273 QStandardItemModel.__init__(self) 274 self.setColumnCount(len(ParameterModel.header)) 275 self.setHorizontalHeaderLabels([label for label, _ in ParameterModel.header])
276
277 - def flags(self, index):
278 ''' 279 @param index: parent of the list 280 @type index: U{QtCore.QModelIndex<https://srinikom.github.io/pyside-docs/PySide/QtCore/QModelIndex.html>} 281 @return: Flag or the requestet item 282 @rtype: U{QtCore.Qt.ItemFlag<https://srinikom.github.io/pyside-docs/PySide/QtCore/Qt.html>} 283 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html} 284 ''' 285 if not index.isValid(): 286 return Qt.NoItemFlags 287 if index.column() == 2: 288 return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable 289 return Qt.ItemIsEnabled | Qt.ItemIsSelectable
290
291 - def updateModelData(self, parameters):
292 ''' 293 Updates the parameter list model. New parameter will be inserted in sorting 294 order. Not available parameter removed from the model. 295 @param parameters: The dictionary with parameter 296 @type parameters: C{dict(parameter name : value)} 297 ''' 298 parameter_names = parameters.keys() 299 root = self.invisibleRootItem() 300 # remove not available items 301 for i in reversed(range(root.rowCount())): 302 parameterItem = root.child(i) 303 if parameterItem.name not in parameter_names: 304 root.removeRow(i) 305 # add new items 306 for (name, value) in parameters.items(): 307 doAddItem = True 308 for i in range(root.rowCount()): 309 parameterItem = root.child(i) 310 if (parameterItem == name): 311 # update item 312 parameterValueItem = root.child(i, 2) 313 parameterValueItem.value = value 314 doAddItem = False 315 break 316 elif (parameterItem > name): 317 root.insertRow(i, self.createParameter(name, value)) 318 doAddItem = False 319 break 320 if doAddItem: 321 root.appendRow(self.createParameter(name, value))
322
323 - def createParameter(self, name, value):
324 ''' 325 Creates the list of the items. This list is used for the 326 visualization of the parameter as a table row. 327 @param name: the parameter name 328 @type name: C{str} 329 @param value: the value of the parameter 330 @type value: each value, that can be converted to C{str} using L{str()} 331 @return: the list for the representation as a row 332 @rtype: C{[L{ParameterNameItem}, L{ParameterValueItem}]} 333 ''' 334 items = [] 335 item = ParameterNameItem(name, value) 336 item.setEditable(False) 337 items.append(item) 338 item = ParameterTypeItem(name, value) 339 item.setEditable(False) 340 items.append(item) 341 itemValue = ParameterValueItem(name, value) 342 itemValue.setEditable(True) 343 items.append(itemValue) 344 return items
345