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.QtWidgets 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(
00113 self._dynreconf_clients.values(),
00114 [self.palette().window().color().lighter(125),
00115 self.palette().window().color().darker(125)])
00116
00117 def close(self):
00118 for dc in self._dynreconf_clients:
00119
00120 dc.close()
00121 dc = None
00122
00123 self._paramedit_scrollarea.deleteLater()
00124
00125 def filter_param(self, filter_key):
00126 """
00127 :type filter_key:
00128 """
00129
00130
00131
00132
00133
00134
00135 pass
00136
00137 def _remove_node(self, node_grn):
00138 try:
00139 i = self._dynreconf_clients.keys().index(node_grn)
00140 except ValueError:
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 return
00151
00152 item = self.vlayout.itemAt(i)
00153 if isinstance(item, QWidgetItem):
00154 item.widget().close()
00155 w = self._dynreconf_clients.pop(node_grn)
00156
00157 rospy.logdebug('popped={} Len of left clients={}'.format(
00158 w, len(self._dynreconf_clients)))
00159
00160 def _node_disabled(self, node_grn):
00161 rospy.logdebug('paramedit_w _node_disabled grn={}'.format(node_grn))
00162
00163
00164
00165 self.sig_node_disabled_selected.emit(node_grn)
00166
00167
00168 self._remove_node(node_grn)