Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 import os
00036 from collections import OrderedDict
00037
00038 import dynamic_reconfigure.client
00039 from python_qt_binding import loadUi
00040 from python_qt_binding.QtCore import Qt, Signal
00041 from python_qt_binding.QtGui import QVBoxLayout, QWidget, QWidgetItem
00042 from rqt_py_common.layout_util import LayoutUtil
00043 import rospy
00044
00045 from .dynreconf_client_widget import DynreconfClientWidget
00046
00047
00048 class ParameditWidget(QWidget):
00049 """
00050 This class represents a pane where parameter editor widgets of multiple
00051 nodes are shown. In rqt_reconfigure, this pane occupies right half of the
00052 entire visible area.
00053 """
00054
00055
00056 sig_node_disabled_selected = Signal(str)
00057
00058 def __init__(self, rospack):
00059 """"""
00060 super(ParameditWidget, self).__init__()
00061
00062 ui_file = os.path.join(rospack.get_path('rqt_reconfigure'),
00063 'resource', 'paramedit_pane.ui')
00064 loadUi(ui_file, self, {'ParameditWidget': ParameditWidget})
00065
00066 self._dynreconf_clients = OrderedDict()
00067
00068
00069 self.vlayout = QVBoxLayout(self.scrollarea_holder_widget)
00070
00071
00072 self.destroyed.connect(self.close)
00073
00074 def _set_index_widgets(self, view, paramitems_dict):
00075 """
00076 @deprecated: Causes error
00077 """
00078 i = 0
00079 for p in paramitems_dict:
00080 view.setIndexWidget(i, p)
00081 i += 1
00082
00083 def show_reconf(self, dynreconf_widget):
00084 """
00085 Callback when user chooses a node.
00086
00087 @param dynreconf_widget:
00088 """
00089 node_grn = dynreconf_widget.get_node_grn()
00090 rospy.logdebug('ParameditWidget.show str(node_grn)=%s', str(node_grn))
00091
00092 if not node_grn in self._dynreconf_clients.keys():
00093
00094
00095
00096
00097 self._dynreconf_clients.__setitem__(node_grn, dynreconf_widget)
00098 self.vlayout.addWidget(dynreconf_widget)
00099 dynreconf_widget.sig_node_disabled_selected.connect(
00100 self._node_disabled)
00101
00102 else:
00103 self._remove_node(node_grn)
00104
00105
00106
00107
00108
00109
00110
00111
00112 LayoutUtil.alternate_color(self._dynreconf_clients.itervalues(),
00113 [Qt.white, Qt.lightGray])
00114
00115 def close(self):
00116 for dc in self._dynreconf_clients:
00117
00118 dc.close()
00119 dc = None
00120
00121 self._paramedit_scrollarea.deleteLater()
00122
00123 def filter_param(self, filter_key):
00124 """
00125 :type filter_key:
00126 """
00127
00128
00129
00130
00131
00132
00133 pass
00134
00135 def _remove_node(self, node_grn):
00136 try:
00137 i = self._dynreconf_clients.keys().index(node_grn)
00138 except ValueError:
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 return
00149
00150 item = self.vlayout.itemAt(i)
00151 if isinstance(item, QWidgetItem):
00152 item.widget().close()
00153 w = self._dynreconf_clients.pop(node_grn)
00154
00155 rospy.logdebug('popped={} Len of left clients={}'.format(
00156 w, len(self._dynreconf_clients)))
00157
00158 def _node_disabled(self, node_grn):
00159 rospy.logdebug('paramedit_w _node_disabled grn={}'.format(node_grn))
00160
00161
00162
00163 self.sig_node_disabled_selected.emit(node_grn)
00164
00165
00166 self._remove_node(node_grn)