class AdminApp(Plugin): _refresh_service_list_signal = Signal() def __init__(self, context): self._context = context super(AdminApp, self).__init__(context) self.initialised = False self.setObjectName('Admin App') self.is_setting_dlg_live = False self._widget = QWidget() rospack = rospkg.RosPack() ui_file = os.path.join(rospack.get_path('rocon_admin_app'), 'ui', 'admin_app.ui') self._widget.setObjectName('AdminApphUi') loadUi(ui_file, self._widget, {}) if context.serial_number() > 1: self._widget.setWindowTitle(self._widget.windowTitle() + (' (%d)' % context.serial_number())) self._widget.enable_btn.pressed.connect(self._enable_service) self._widget.disable_btn.pressed.connect(self._disable_service) self._widget.setting_btn.pressed.connect(self._setting_service) self._widget.refresh_btn.pressed.connect(self._refresh_service) self._widget.clear_btn.pressed.connect(self._clear_service_list) self._widget.service_tree_widget.itemClicked.connect( self._select_service_tree_item) #concert item click event self._refresh_service_list_signal.connect(self._update_service_list) #Not implementation self._widget.clear_btn.setDisabled(True) self._widget.setting_btn.setDisabled(True) self._widget.setting_btn.setToolTip("Not yet") self._widget.clear_btn.setToolTip("Not yet") context.add_widget(self._widget) #init self.admin_app_info = AdminAppInfo() self.admin_app_info._reg_event_callback(self._refresh_service) self.current_service = "" self._widget.client_tab_widget.clear() self._update_service_list() def _refresh_service(self): self._refresh_service_list_signal.emit() pass def _clear_service_list(self): print "[_clear_service_list]: widget clear start" self._widget.service_tree_widget.clear() pass def _update_service_list(self): self._widget.service_tree_widget.clear() self._widget.service_info_text.clear() self._widgetitem_service_pair = {} service_list = self.admin_app_info.service_list for k in service_list.values(): #Top service service_item = QTreeWidgetItem(self._widget.service_tree_widget) #service_item=QTreeWidgetItem() service_item.setText(0, k['name']) #set Top Level Font font = service_item.font(0) font.setPointSize(20) font.setBold(True) service_item.setFont(0, font) #set client item for l in k["client_list"]: client_item = QTreeWidgetItem() client_item.setText(0, l) font = client_item.font(0) font.setPointSize(15) client_item.setFont(0, font) service_item.addChild(client_item) self._widgetitem_service_pair[service_item] = k #self._widget.service_tree_widget.addTopLevelItem(service_item) pass def _update_client_list(self, service_name): service_list = self.admin_app_info.service_list client_list = service_list[service_name]["client_list"] self._widget.client_tab_widget.clear() for k in client_list.values(): client_name = k["name"] k["index"] = self._widget.client_tab_widget.count() main_widget = QWidget() ver_layout = QVBoxLayout(main_widget) ver_layout.setContentsMargins(9, 9, 9, 9) ver_layout.setSizeConstraint(ver_layout.SetDefaultConstraint) sub_widget = QWidget() sub_widget.setAccessibleName('sub_widget') ver_layout.addWidget(sub_widget) client_context_widget = QPlainTextEdit() client_context_widget.setObjectName(client_name + '_' + 'app_context_widget') client_context_widget.setAccessibleName('app_context_widget') client_context_widget.appendPlainText("client name is " + client_name) #ap><b>uuidp_context_widget.appendHtml(k["app_context"]) ver_layout.addWidget(client_context_widget) #add tab self._widget.client_tab_widget.addTab(main_widget, client_name) pass def _set_service_info(self, service_name): service_list = self.admin_app_info.service_list self._widget.service_info_text.clear() self._widget.service_info_text.appendHtml( service_list[service_name]['context']) pass def _set_client_info(self, client_name): #self._widget.service_info_text.clear() #self._widget.service_info_text.appendPlainText(client_name) pass def _select_service_tree_item(self, item): if item.parent() == None: selected_service = self._widgetitem_service_pair[item] print '_select_service: ' + selected_service['name'] self._set_service_info(selected_service['name']) self.current_service = selected_service self._update_client_list(self.current_service['name']) else: selected_service = self._widgetitem_service_pair[item.parent()] print '_select_service: ' + selected_service['name'] print '_select_client: ' + item.text(0) self._set_service_info(selected_service['name']) self._set_client_info(item.text(0)) for k in range(self._widget.client_tab_widget.count()): tab_text = self._widget.client_tab_widget.tabText(k) if tab_text == Item.text(0): self._widget.client_tab_widget.setCurrentIndex(k) break pass def _get_client_list(self, service_name): ##function call client_list = [] ##function call if service_name == "Delivery Service": client_list.append("client1") client_list.append("client2") client_list.append("client3") elif service_name == "Clean Service": client_list.append("client4") client_list.append("client5") client_list.append("client6") return client_list pass def _get_client_info(self): pass def _setting_service(self): if self.is_setting_dlg_live: print "Dialog is live!!" self._setting_dlg.done(0) #dialog self._setting_dlg = QDialog(self._widget) self._setting_dlg.setWindowTitle("Seting Configuration") self._setting_dlg.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Ignored) self._setting_dlg.setMinimumSize(500, 0) dlg_rect = self._setting_dlg.geometry() #dialog layout ver_layout = QVBoxLayout(self._setting_dlg) ver_layout.setContentsMargins(9, 9, 9, 9) #param layout text_grid_sub_widget = QWidget() text_grid_layout = QGridLayout(text_grid_sub_widget) text_grid_layout.setColumnStretch(1, 0) text_grid_layout.setRowStretch(2, 0) #param 1 name = u"" title_widget1 = QLabel("Param1: ") context_widget1 = QTextEdit() context_widget1.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Ignored) context_widget1.setMinimumSize(0, 30) context_widget1.append("") #param 2 cancel = False title_widget2 = QLabel("Param2: ") context_widget2 = QTextEdit() context_widget2.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Ignored) context_widget2.setMinimumSize(0, 30) context_widget2.append("") #param 3 cancel = False title_widget3 = QLabel("Param2: ") context_widget3 = QTextEdit() context_widget3.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Ignored) context_widget3.setMinimumSize(0, 30) context_widget3.append("") #add param text_grid_layout.addWidget(title_widget1) text_grid_layout.addWidget(context_widget1) text_grid_layout.addWidget(title_widget2) text_grid_layout.addWidget(context_widget2) text_grid_layout.addWidget(title_widget3) text_grid_layout.addWidget(context_widget3) #add param layout ver_layout.addWidget(text_grid_sub_widget) #button layout button_hor_sub_widget = QWidget() button_hor_layout = QHBoxLayout(button_hor_sub_widget) params = {} params['param1'] = context_widget1 params['param2'] = context_widget2 params['param3'] = context_widget3 #button btn_call = QPushButton("Set") btn_cancel = QPushButton("Cancel") btn_call.clicked.connect(lambda: self._setting_dlg.done(0)) btn_call.clicked.connect(lambda: self._set_configuration(params)) btn_cancel.clicked.connect(lambda: self._setting_dlg.done(0)) #add button button_hor_layout.addWidget(btn_call) button_hor_layout.addWidget(btn_cancel) #add button layout ver_layout.addWidget(button_hor_sub_widget) self._setting_dlg.setVisible(True) self._setting_dlg.finished.connect(self._destroy_setting_dlg) self.is_setting_dlg_live = True pass def _enable_service(self): print "Enable Service: %s" % self.current_service['name'] service = "/concert/services/enable" service_handle = rospy.ServiceProxy(service, EnableService) call_result = service_handle(self.current_service['name'], True) print call_result pass def _disable_service(self): print "Disable Service: %s" % self.current_service['name'] service = "/concert/services/enable" service_handle = rospy.ServiceProxy(service, EnableService) call_result = service_handle(self.current_service['name'], False) print call_result pass def _destroy_setting_dlg(self): print "Distory!!!" self.is_setting_dlg_live = False pass def _set_configuration(self, params): print self.current_service['name'] + " set param: " print "param1: " + params['param1'].toPlainText() print "param2: " + params['param2'].toPlainText() print "param3: " + params['param3'].toPlainText() pass
class QMasterChooser(QMainWindow): rocon_remocon_script = utils.find_rocon_remocon_script('rocon_remocon') rocon_remocon_sub_script = utils.find_rocon_remocon_script( 'rocon_remocon_sub') def __init__(self, parent, title, application): self._context = parent super(QMasterChooser, self).__init__() self.initialised = False self.setObjectName('Remocon') self.host_name = "localhost" self.master_uri = "http://%s:11311" % (self.host_name) self.env_host_name = os.getenv("ROS_HOSTNAME") self.env_master_uri = os.getenv("ROS_MASTER_URI") if self.env_host_name == None: self.env_host_name = 'localhost' if self.env_master_uri == None: self.env_master_uri = "http://%s:11311" % (self.env_host_name) self.application = application self._widget_main = QWidget() self.rocon_masters = RoconMasters() self.cur_selected_rocon_master = None self.is_init = False path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "../../ui/remocon.ui") loadUi(path, self._widget_main) utils.setup_home_dirs() self.icon_paths = {} try: self.icon_paths[ 'unknown'] = rocon_python_utils.ros.find_resource_from_string( 'rocon_icons/unknown', extension='png') except (rospkg.ResourceNotFound, ValueError): console.logerror( "Remocon : couldn't find icons on the ros package path (install rocon_icons and rocon_bubble_icons" ) sys.exit(1) #main widget self._widget_main.list_widget.setIconSize(QSize(50, 50)) self._widget_main.list_widget.itemDoubleClicked.connect( self._connect_rocon_master) # list item double click event self._widget_main.list_widget.itemClicked.connect( self._select_rocon_master) # list item double click event self._widget_main.add_concert_btn.pressed.connect( self._set_add_rocon_master) # add button event self._widget_main.delete_btn.pressed.connect( self._delete_rocon_master) # delete button event self._widget_main.delete_all_btn.pressed.connect( self._delete_all_rocon_masters) # delete all button event self._widget_main.refresh_btn.pressed.connect( self._refresh_all_rocon_master_list) # refresh all button event #init self._init() self._widget_main.show() self._widget_main.activateWindow() # give it the focus self._widget_main.raise_() # make sure it is on top def __del__(self): console.loginfo("RemoconMain: Destroy") def _init(self): self._connect_dlg_isValid = False self.cur_selected_rocon_master = None self._refresh_all_rocon_master_list() self.is_init = True def _delete_all_rocon_masters(self): self.rocon_masters.clear() self._update_rocon_master_list() self._widget_main.list_info_widget.clear() def _delete_rocon_master(self): if self.cur_selected_rocon_master in self.rocon_masters.keys(): self.rocon_masters.delete(self.cur_selected_rocon_master) self._update_rocon_master_list() self._widget_main.list_info_widget.clear() def _add_rocon_master(self, uri_text_widget, host_name_text_widget): rocon_master = self.rocon_masters.add( uri_text_widget.toPlainText(), host_name_text_widget.toPlainText()) self._refresh_rocon_master(rocon_master) def _set_add_rocon_master(self): if self._connect_dlg_isValid: console.logdebug("Dialog is live!!") self._connect_dlg.done(0) #dialog self._connect_dlg = QDialog(self._widget_main) self._connect_dlg.setWindowTitle("Add Ros Master") self._connect_dlg.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Ignored) self._connect_dlg.setMinimumSize(350, 0) # dlg_rect = self._connect_dlg.geometry() #dialog layout ver_layout = QVBoxLayout(self._connect_dlg) ver_layout.setContentsMargins(9, 9, 9, 9) #param layout text_grid_sub_widget = QWidget() text_grid_layout = QGridLayout(text_grid_sub_widget) text_grid_layout.setColumnStretch(1, 0) text_grid_layout.setRowStretch(2, 0) #param 1 title_widget1 = QLabel("MASTER_URI: ") context_widget1 = QTextEdit() context_widget1.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Ignored) context_widget1.setMinimumSize(0, 30) context_widget1.append(self.master_uri) #param 2 title_widget2 = QLabel("HOST_NAME: ") context_widget2 = QTextEdit() context_widget2.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Ignored) context_widget2.setMinimumSize(0, 30) context_widget2.append(self.host_name) #add param text_grid_layout.addWidget(title_widget1) text_grid_layout.addWidget(context_widget1) text_grid_layout.addWidget(title_widget2) text_grid_layout.addWidget(context_widget2) #add param layout ver_layout.addWidget(text_grid_sub_widget) #button layout button_hor_sub_widget = QWidget() button_hor_layout = QHBoxLayout(button_hor_sub_widget) uri_text_widget = context_widget1 host_name_text_widget = context_widget2 #check box use_env_var_check = QCheckBox("Use environment variables") use_env_var_check.setCheckState(Qt.Unchecked) def set_use_env_var(data, text_widget1, text_widget2): if data == Qt.Unchecked: text_widget1.setText(self.master_uri) text_widget2.setText(self.host_name) elif data == Qt.Checked: self.master_uri = str(text_widget1.toPlainText()) self.host_name = str(text_widget2.toPlainText()) text_widget1.setText(self.env_master_uri) text_widget2.setText(self.env_host_name) def check_event(data): set_use_env_var(data, context_widget1, context_widget2) use_env_var_check.stateChanged.connect(check_event) ver_layout.addWidget(use_env_var_check) #button btn_call = QPushButton("Add") btn_cancel = QPushButton("Cancel") btn_call.clicked.connect(lambda: self._connect_dlg.done(0)) btn_call.clicked.connect(lambda: self._add_rocon_master( uri_text_widget, host_name_text_widget)) btn_cancel.clicked.connect(lambda: self._connect_dlg.done(0)) #add button button_hor_layout.addWidget(btn_call) button_hor_layout.addWidget(btn_cancel) #add button layout ver_layout.addWidget(button_hor_sub_widget) self._connect_dlg.setVisible(True) self._connect_dlg.finished.connect(self._destroy_connect_dlg) self._connect_dlg_isValid = True def _refresh_rocon_master(self, rocon_master): rocon_master.check() self._widget_main.list_info_widget.clear() self._update_rocon_master_list() def _refresh_all_rocon_master_list(self): if self.is_init: self.rocon_masters.check() self._widget_main.list_info_widget.clear() self._update_rocon_master_list() def _update_rocon_master_list(self): self._widget_main.list_widget.clear() for rocon_master in self.rocon_masters.values(): self._add_rocon_master_list_item(rocon_master) self.rocon_masters.dump() def _add_rocon_master_list_item(self, rocon_master): rocon_master.current_row = str(self._widget_main.list_widget.count()) display_name = str(rocon_master.name) + "\n" + "[" + str( rocon_master.uri) + "]" self._widget_main.list_widget.insertItem( self._widget_main.list_widget.count(), display_name) #setting the list font font = self._widget_main.list_widget.item( self._widget_main.list_widget.count() - 1).font() font.setPointSize(13) self._widget_main.list_widget.item( self._widget_main.list_widget.count() - 1).setFont(font) #setToolTip rocon_master_info = "" rocon_master_info += "rocon_master_index: " + str( rocon_master.index) + "\n" rocon_master_info += "rocon_master_name: " + str( rocon_master.name) + "\n" rocon_master_info += "master_uri: " + str(rocon_master.uri) + "\n" rocon_master_info += "host_name: " + str( rocon_master.host_name) + "\n" rocon_master_info += "description: " + str(rocon_master.description) self._widget_main.list_widget.item( self._widget_main.list_widget.count() - 1).setToolTip(rocon_master_info) #set icon if rocon_master.icon == "unknown.png": icon = QIcon(self.icon_paths['unknown']) self._widget_main.list_widget.item( self._widget_main.list_widget.count() - 1).setIcon(icon) elif len(rocon_master.icon): icon = QIcon( os.path.join(utils.get_icon_cache_home(), rocon_master.icon)) self._widget_main.list_widget.item( self._widget_main.list_widget.count() - 1).setIcon(icon) else: console.logdebug("%s : No icon" % rocon_master.name) pass def _select_rocon_master(self, Item): list_widget = Item.listWidget() for k in self.rocon_masters.values(): if k.current_row == str(list_widget.currentRow()): self.cur_selected_rocon_master = k.index break self._widget_main.list_info_widget.clear() info_text = "<html>" info_text += "<p>-------------------------------------------</p>" info_text += "<p><b>name: </b>" + str( self.rocon_masters[self.cur_selected_rocon_master].name) + "</p>" info_text += "<p><b>master_uri: </b>" + str( self.rocon_masters[self.cur_selected_rocon_master].uri) + "</p>" info_text += "<p><b>host_name: </b>" + str(self.rocon_masters[ self.cur_selected_rocon_master].host_name) + "</p>" info_text += "<p><b>description: </b>" + str(self.rocon_masters[ self.cur_selected_rocon_master].description) + "</p>" info_text += "<p>-------------------------------------------</p>" info_text += "</html>" self._widget_main.list_info_widget.appendHtml(info_text) def _destroy_connect_dlg(self): self._connect_dlg_isValid = False def _connect_rocon_master(self): rocon_master_name = str( self.rocon_masters[self.cur_selected_rocon_master].name) rocon_master_uri = str( self.rocon_masters[self.cur_selected_rocon_master].uri) rocon_master_host_name = str( self.rocon_masters[self.cur_selected_rocon_master].host_name) rocon_master_index = str(self.cur_selected_rocon_master) self.rocon_masters[rocon_master_index].check() # Todo this use of flags is spanky if self.rocon_masters[rocon_master_index].flag == '0': QMessageBox.warning( self, 'Rocon Master Connection Error', "Could not find a rocon master at %s" % self.rocon_masters[rocon_master_index].uri, QMessageBox.Ok) return if self.rocon_masters[rocon_master_index].flag == '1': QMessageBox.warning( self, 'Rocon Master Communication Error', "Found a rocon master at %s but cannot communicate with it (are ROS_IP/ROS_MASTER_URI correctly configured locally and remotely?)" % self.rocon_masters[rocon_master_index].uri, QMessageBox.Ok) return self._widget_main.hide() arguments = [ "", rocon_master_index, rocon_master_name, rocon_master_uri, rocon_master_host_name ] os.execv(QMasterChooser.rocon_remocon_sub_script, arguments) console.logdebug("Spawning: %s with args %s" % (QMasterChooser.rocon_remocon_sub_script, arguments))