Go to the documentation of this file.00001
00002
00003 import rospy
00004 import actionlib
00005 import std_msgs.msg
00006 import vigir_footstep_planning_msgs.msg
00007
00008 from python_qt_binding.QtCore import Qt, QSize, Signal, Slot
00009 from python_qt_binding.QtGui import QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QComboBox, QIcon
00010
00011 from vigir_generic_params.msg import GetParameterSetNamesAction, GetParameterSetNamesGoal, GetParameterSetNamesResult
00012 from vigir_footstep_planning_lib.logging import *
00013 from vigir_footstep_planning_lib.topic_widget import *
00014
00015
00016
00017 class QParameterSetWidget(QWidgetWithLogger):
00018
00019 topic_changed_signal = Signal(str)
00020 param_cleared_signal = Signal()
00021 param_changed_signal = Signal(str)
00022
00023 def __init__(self, parent=None, logger=Logger()):
00024 QWidgetWithLogger.__init__(self, parent, logger)
00025
00026
00027 vbox = QVBoxLayout()
00028 vbox.setMargin(0)
00029 vbox.setContentsMargins(0, 0, 0, 0)
00030
00031
00032 topic_widget = QTopicWidget(self, 'vigir_generic_params/GetParameterSetNamesAction', True)
00033 vbox.addWidget(topic_widget)
00034
00035
00036 self.parameter_set_selection_widget = QParameterSetSelectionWidget(self, logger)
00037 self.parameter_set_selection_widget.param_cleared_signal.connect(self.param_cleared)
00038 self.parameter_set_selection_widget.param_changed_signal.connect(self.param_changed)
00039 topic_widget.topic_changed_signal.connect(self.topic_changed)
00040 topic_widget.topic_changed_signal.connect(self.parameter_set_selection_widget.set_topic_name)
00041 vbox.addWidget(self.parameter_set_selection_widget)
00042
00043
00044 self.setLayout(vbox)
00045
00046
00047 topic_widget.emit_topic_name()
00048
00049 def current_parameter_set_name(self):
00050 return self.parameter_set_selection_widget.current_parameter_set_name()
00051
00052 @Slot(str)
00053 def topic_changed(self, name):
00054 self.topic_changed_signal.emit(name)
00055
00056 @Slot()
00057 def param_cleared(self):
00058 self.param_cleared_signal.emit()
00059
00060 @Slot(str)
00061 def param_changed(self, name):
00062 self.param_changed_signal.emit(name)
00063
00064
00065
00066 class QParameterSetSelectionWidget(QWidgetWithLogger):
00067
00068 NO_PARAM_SET_TEXT = "No parameters available!"
00069 SELECT_TEXT = "<Select>"
00070
00071 param_cleared_signal = Signal()
00072 param_changed_signal = Signal(str)
00073
00074 def __init__(self, parent=None, logger=Logger()):
00075 QWidgetWithLogger.__init__(self, parent, logger)
00076
00077
00078 hbox = QHBoxLayout()
00079 hbox.setMargin(0)
00080 hbox.setContentsMargins(0, 0, 0, 0)
00081
00082
00083 icon = QIcon.fromTheme("view-refresh")
00084 size = icon.actualSize(QSize(32, 32))
00085
00086
00087 self.parameter_set_names_combo_box = QComboBox()
00088 self.parameter_set_names_combo_box.currentIndexChanged[str].connect(self.param_changed)
00089 hbox.addWidget(self.parameter_set_names_combo_box)
00090
00091
00092 self.get_all_parameter_set_names_button = QPushButton()
00093 self.get_all_parameter_set_names_button.clicked.connect(self._get_all_parameter_set_names)
00094
00095 self.get_all_parameter_set_names_button.setIcon(icon)
00096 self.get_all_parameter_set_names_button.setFixedSize(size.width()+2, size.height()+2)
00097
00098 hbox.addWidget(self.get_all_parameter_set_names_button)
00099
00100
00101 self.setLayout(hbox)
00102
00103
00104 self.reset_parameter_set_selection()
00105
00106 def _init_action_client(self, topic_name):
00107 self.get_parameter_set_names_client = actionlib.SimpleActionClient(topic_name, GetParameterSetNamesAction)
00108 print "Parameter set topic changed: " + topic_name
00109
00110 @Slot(str)
00111 def set_topic_name(self, topic_name):
00112 if len(topic_name) > 0:
00113 self._init_action_client(topic_name)
00114 self._get_all_parameter_set_names()
00115 else:
00116 self.reset_parameter_set_selection()
00117
00118 def reset_parameter_set_selection(self):
00119 self.parameter_set_names_combo_box.setEnabled(False)
00120 self.parameter_set_names_combo_box.blockSignals(True)
00121 self.parameter_set_names_combo_box.clear()
00122 self.parameter_set_names_combo_box.addItem(self.NO_PARAM_SET_TEXT)
00123 self.get_all_parameter_set_names_button.setEnabled(False)
00124 self.param_cleared_signal.emit()
00125
00126 def current_parameter_set_name(self):
00127 if self.parameter_set_names_combo_box.currentText() == self.NO_PARAM_SET_TEXT:
00128 return str()
00129 else:
00130 return self.parameter_set_names_combo_box.currentText()
00131
00132 @Slot(str)
00133 def param_changed(self, name):
00134 self.param_changed_signal.emit(name)
00135
00136
00137 def _get_all_parameter_set_names(self):
00138 if self.get_parameter_set_names_client.wait_for_server(rospy.Duration(0.5)):
00139 self.logger.log_info("Requesting current list of parameter set names.")
00140 goal = GetParameterSetNamesGoal()
00141 self.get_parameter_set_names_client.send_goal(goal)
00142
00143
00144 if self.get_parameter_set_names_client.wait_for_result(rospy.Duration(1.0)):
00145 result = self.get_parameter_set_names_client.get_result()
00146
00147 self.logger.log_info("Received " + str(len(result.names)) + " parameter set names.")
00148
00149 self.parameter_set_names_combo_box.blockSignals(True)
00150 self.parameter_set_names_combo_box.clear()
00151 self.parameter_set_names_combo_box.addItem(self.SELECT_TEXT)
00152 self.parameter_set_names_combo_box.setItemData(0, 0, Qt.UserRole-1)
00153 self.param_cleared_signal.emit()
00154
00155 for name in result.names:
00156 self.parameter_set_names_combo_box.addItem(name.data)
00157
00158 self.parameter_set_names_combo_box.setEnabled(True)
00159 self.parameter_set_names_combo_box.blockSignals(False)
00160 self.get_all_parameter_set_names_button.setEnabled(True)
00161 else:
00162 self.logger.log_error("Didn't received any results. Check communcation!")
00163 self.reset_parameter_set_selection()
00164 else:
00165 self.logger.log_error("Can't connect to footstep planner parameter action server!")
00166 self.reset_parameter_set_selection()