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 from __future__ import division
00034 import os
00035
00036 from python_qt_binding import loadUi
00037 from python_qt_binding.QtCore import Signal, Slot
00038 from python_qt_binding.QtGui import QIcon, QWidget
00039
00040 import roslib
00041 import rosmsg
00042 import rospkg
00043 import rospy
00044
00045 from qt_gui_py_common.worker_thread import WorkerThread
00046 from rqt_py_common.extended_combo_box import ExtendedComboBox
00047 from .publisher_tree_widget import PublisherTreeWidget
00048
00049
00050
00051 class PublisherWidget(QWidget):
00052 add_publisher = Signal(str, str, float, bool)
00053 change_publisher = Signal(int, str, str, str, object)
00054 publish_once = Signal(int)
00055 remove_publisher = Signal(int)
00056 clean_up_publishers = Signal()
00057
00058 def __init__(self, parent=None):
00059 super(PublisherWidget, self).__init__(parent)
00060 self._topic_dict = {}
00061 self._update_thread = WorkerThread(self._update_thread_run, self._update_finished)
00062
00063 self._rospack = rospkg.RosPack()
00064 ui_file = os.path.join(self._rospack.get_path('rqt_publisher'), 'resource', 'Publisher.ui')
00065 loadUi(ui_file, self, {'ExtendedComboBox': ExtendedComboBox, 'PublisherTreeWidget': PublisherTreeWidget})
00066 self.refresh_button.setIcon(QIcon.fromTheme('view-refresh'))
00067 self.refresh_button.clicked.connect(self.refresh_combo_boxes)
00068 self.add_publisher_button.setIcon(QIcon.fromTheme('list-add'))
00069 self.remove_publisher_button.setIcon(QIcon.fromTheme('list-remove'))
00070 self.clear_button.setIcon(QIcon.fromTheme('edit-clear'))
00071
00072 self.refresh_combo_boxes()
00073
00074 self.publisher_tree_widget.model().item_value_changed.connect(self.change_publisher)
00075 self.publisher_tree_widget.remove_publisher.connect(self.remove_publisher)
00076 self.publisher_tree_widget.publish_once.connect(self.publish_once)
00077 self.remove_publisher_button.clicked.connect(self.publisher_tree_widget.remove_selected_publishers)
00078 self.clear_button.clicked.connect(self.clean_up_publishers)
00079
00080 def shutdown_plugin(self):
00081 self._update_thread.kill()
00082
00083 @Slot()
00084 def refresh_combo_boxes(self):
00085 self._update_thread.kill()
00086 self.type_combo_box.setEnabled(False)
00087 self.topic_combo_box.setEnabled(False)
00088 self.type_combo_box.setEditText('updating...')
00089 self.topic_combo_box.setEditText('updating...')
00090 self._update_thread.start()
00091
00092
00093 def _update_thread_run(self):
00094
00095 message_type_names = []
00096 try:
00097
00098 packages = sorted([pkg_tuple[0] for pkg_tuple in rosmsg.iterate_packages(self._rospack, rosmsg.MODE_MSG)])
00099 except:
00100
00101 packages = sorted(rosmsg.list_packages())
00102 for package in packages:
00103 for base_type_str in rosmsg.list_msgs(package, rospack=self._rospack):
00104 message_class = roslib.message.get_message_class(base_type_str)
00105 if message_class is not None:
00106 message_type_names.append(base_type_str)
00107
00108 self.type_combo_box.setItems.emit(sorted(message_type_names))
00109
00110
00111 _, _, topic_types = rospy.get_master().getTopicTypes()
00112 self._topic_dict = dict(topic_types)
00113 self.topic_combo_box.setItems.emit(sorted(self._topic_dict.keys()))
00114
00115 @Slot()
00116 def _update_finished(self):
00117 self.type_combo_box.setEnabled(True)
00118 self.topic_combo_box.setEnabled(True)
00119
00120 @Slot(str)
00121 def on_topic_combo_box_currentIndexChanged(self, topic_name):
00122 if topic_name in self._topic_dict:
00123 self.type_combo_box.setEditText(self._topic_dict[topic_name])
00124
00125 @Slot()
00126 def on_add_publisher_button_clicked(self):
00127 topic_name = str(self.topic_combo_box.currentText())
00128 type_name = str(self.type_combo_box.currentText())
00129 rate = float(self.frequency_combo_box.currentText())
00130 enabled = False
00131 self.add_publisher.emit(topic_name, type_name, rate, enabled)