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 PySide import QtCore 
 34  from PySide import QtGui 
 35   
 36  import roslib 
37 38 -class ParameterValueItem(QtGui.QStandardItem):
39 ''' 40 The parameter item is stored in the parameter model. This class stores the name 41 and value of a parameter of ROS parameter server and shows the value. 42 ''' 43 44 ITEM_TYPE = QtGui.QStandardItem.UserType + 39 45
46 - def __init__(self, name, value, parent=None):
47 ''' 48 Initialize the item object. 49 @param name: the name of the parameter 50 @type name: C{str} 51 @param value: the value of the parameter 52 @type value: C{str} 53 ''' 54 QtGui.QStandardItem.__init__(self, unicode(value)) 55 self._name = name 56 '''@ivar: the name of parameter ''' 57 self._value = value 58 '''@ivar: the value of the parameter ''' 59 if isinstance(value, (str, unicode)) and value.find('\n') > -1: 60 self.setSizeHint(QtCore.QSize(-1, 45))
61 62 @property
63 - def name(self):
64 return self._name
65 66 @property
67 - def value(self):
68 return self._value
69 70 @value.setter
71 - def value(self, value):
72 self._value = value 73 self.setText(unicode(value)) 74 if isinstance(value, (str, unicode)) and value.find('\n') > -1: 75 self.setSizeHint(QtCore.QSize(-1, 45))
76
77 - def type(self):
79 80
81 - def __eq__(self, item):
82 ''' 83 Compares the value of parameter. 84 ''' 85 if isinstance(item, str) or isinstance(item, unicode): 86 return unicode(self.value) == item 87 elif not (item is None): 88 return unicode(self.value) == unicode(item.value) 89 return False
90
91 - def __gt__(self, item):
92 ''' 93 Compares the value of parameter. 94 ''' 95 if isinstance(item, str) or isinstance(item, unicode): 96 return unicode(self.value) > item 97 elif not (item is None): 98 return unicode(self.value) > unicode(item.value) 99 return False
100
101 -class ParameterNameItem(QtGui.QStandardItem):
102 ''' 103 The parameter item is stored in the parameter model. This class stores the name 104 and value of a parameter of ROS parameter server and shows the name. 105 ''' 106 107 ITEM_TYPE = QtGui.QStandardItem.UserType + 38 108
109 - def __init__(self, name, value, parent=None):
110 ''' 111 Initialize the item object. 112 @param name: the name of the parameter 113 @type name: C{str} 114 @param value: the value of the parameter 115 @type value: C{str} 116 ''' 117 QtGui.QStandardItem.__init__(self, self.toHTML(name)) 118 self._name = name 119 '''@ivar: the name of parameter ''' 120 self._value = value 121 '''@ivar: the value of the parameter '''
122 123 @property
124 - def name(self):
125 return self._name
126 127 @property
128 - def value(self):
129 return self._value
130 131 @value.setter
132 - def value(self, value):
133 self._value = value 134 self.setText(str(value))
135
136 - def type(self):
138 139 @classmethod
140 - def toHTML(cls, key):
141 ''' 142 Creates a HTML representation of the parameter name. 143 @param key: the parameter name 144 @type key: C{str} 145 @return: the HTML representation of the parameter name 146 @rtype: C{str} 147 ''' 148 ns, sep, name = key.rpartition('/') 149 result = '' 150 if sep: 151 result = ''.join(['<html><body>', '<span style="color:gray;">', str(ns), sep, '</span><b>', name, '</b></body></html>']) 152 else: 153 result = name 154 return result
155
156 - def __eq__(self, item):
157 ''' 158 Compares the name of parameter. 159 ''' 160 if isinstance(item, str) or isinstance(item, unicode): 161 return self.name.lower() == item.lower() 162 elif not (item is None): 163 return self.name.lower() == item.name.lower() 164 return False
165
166 - def __gt__(self, item):
167 ''' 168 Compares the name of parameter. 169 ''' 170 if isinstance(item, str) or isinstance(item, unicode): 171 return self.name.lower() > item.lower() 172 elif not (item is None): 173 return self.name.lower() > item.name.lower() 174 return False
175
176 177 178 -class ParameterModel(QtGui.QStandardItemModel):
179 ''' 180 The model to manage the list with parameter in ROS network. 181 ''' 182 header = [('Parameter', 300), 183 ('Value', -1)] 184 '''@ivar: the list with columns C{[(name, width), ...]}''' 185
186 - def __init__(self):
187 ''' 188 Creates a new list model. 189 ''' 190 QtGui.QStandardItemModel.__init__(self) 191 self.setColumnCount(len(ParameterModel.header)) 192 self.setHorizontalHeaderLabels([label for label, width in ParameterModel.header])
193
194 - def flags(self, index):
195 ''' 196 @param index: parent of the list 197 @type index: L{PySide.QtCore.QModelIndex} 198 @return: Flag or the requestet item 199 @rtype: L{PySide.QtCore.Qt.ItemFlag} 200 @see: U{http://www.pyside.org/docs/pyside-1.0.1/PySide/QtCore/Qt.html} 201 ''' 202 if not index.isValid(): 203 return QtCore.Qt.NoItemFlags 204 if index.column() == 1: 205 return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable 206 return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
207
208 - def updateModelData(self, parameters):
209 ''' 210 Updates the parameter list model. New parameter will be inserted in sorting 211 order. Not available parameter removed from the model. 212 @param parameters: The dictionary with parameter 213 @type parameters: C{dict(parameter name : value)} 214 ''' 215 parameter_names = parameters.keys() 216 root = self.invisibleRootItem() 217 # remove not available items 218 for i in reversed(range(root.rowCount())): 219 parameterItem = root.child(i) 220 if not parameterItem.name in parameter_names: 221 root.removeRow(i) 222 # add new items 223 for (name, value) in parameters.items(): 224 doAddItem = True 225 for i in range(root.rowCount()): 226 parameterItem = root.child(i) 227 if (parameterItem == name): 228 # update item 229 parameterValueItem = root.child(i, 1) 230 parameterValueItem.value = value 231 doAddItem = False 232 break 233 elif (parameterItem > name): 234 root.insertRow(i, self.createParameter(name, value)) 235 doAddItem = False 236 break 237 if doAddItem: 238 root.appendRow(self.createParameter(name, value))
239
240 - def createParameter(self, name, value):
241 ''' 242 Creates the list of the items. This list is used for the 243 visualization of the parameter as a table row. 244 @param name: the parameter name 245 @type name: C{str} 246 @param value: the value of the parameter 247 @type value: each value, that can be converted to C{str} using L{str()} 248 @return: the list for the representation as a row 249 @rtype: C{[L{ParameterNameItem}, L{ParameterValueItem}]} 250 ''' 251 items = [] 252 item = ParameterNameItem(name, value) 253 item.setEditable(False) 254 items.append(item) 255 itemValue = ParameterValueItem(name, value) 256 itemValue.setEditable(True) 257 items.append(itemValue) 258 return items
259