Exemple #1
0
 def _requestPW(self, user, host):
     '''
     Open the dialog to input the user name and password to open an SSH connection.
     '''
     from python_qt_binding.QtCore import Qt
     from python_qt_binding import loadUi
     try:
         from python_qt_binding.QtGui import QDialog
     except:
         from python_qt_binding.QtWidgets import QDialog
     result = False
     pw = None
     pwInput = QDialog()
     ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                            'PasswordInput.ui')
     loadUi(ui_file, pwInput)
     pwInput.setWindowTitle(''.join(
         ['Enter the password for user ', user, ' on ', host]))
     pwInput.userLine.setText(str(user))
     pwInput.pwLine.setText("")
     pwInput.pwLine.setFocus(Qt.OtherFocusReason)
     if pwInput.exec_():
         result = True
         user = pwInput.userLine.text()
         pw = pwInput.pwLine.text()
     return result, user, pw
Exemple #2
0
 def _create_warning_dialog(self):
     diag = QDialog(self._widget)
     ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                            'warning_info.ui')
     loadUi(ui_file, diag)
     diag.resize(600, 250)
     diag.setWindowTitle("Warning for %s[%d]" %
                         (self.name, self.subsystem_id))
     diag.setWindowIcon(QIcon.fromTheme("dialog-warning"))
     return diag
Exemple #3
0
 def _create_detailed_dialog(self):
     diag = QDialog(self._widget)
     ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)),
                            'system_info.ui')
     loadUi(ui_file, diag)
     diag.treewidget_components.setHeaderLabel(
         "%s [%d]" % (self.name, self.subsystem_id))
     diag.resize(500, 300)
     diag.setWindowTitle("subsystem %s[%d]" %
                         (self.name, self.subsystem_id))
     diag.setWindowIcon(QIcon.fromTheme("help-about"))
     return diag
Exemple #4
0
 def _requestPW(self, user, host):
     '''
     Open the dialog to input the user name and password to open an SSH connection.
     '''
     from python_qt_binding.QtCore import Qt
     from python_qt_binding import loadUi
     try:
         from python_qt_binding.QtGui import QDialog
     except:
         from python_qt_binding.QtWidgets import QDialog
     result = False
     pw = None
     pwInput = QDialog()
     ui_file = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'PasswordInput.ui')
     loadUi(ui_file, pwInput)
     pwInput.setWindowTitle(''.join(['Enter the password for user ', user, ' on ', host]))
     pwInput.userLine.setText(str(user))
     pwInput.pwLine.setText("")
     pwInput.pwLine.setFocus(Qt.OtherFocusReason)
     if pwInput.exec_():
         result = True
         user = pwInput.userLine.text()
         pw = pwInput.pwLine.text()
     return result, user, pw
Exemple #5
0
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
Exemple #6
0
    def _create_add_rocon_master_dialog(self):
        # dialog
        connect_dlg = QDialog(self._widget_main)
        connect_dlg.setWindowTitle("Add Ros Master")
        connect_dlg.setSizePolicy(QSizePolicy.MinimumExpanding,
                                  QSizePolicy.Ignored)
        connect_dlg.setMinimumSize(350, 0)
        # dlg_rect = self._connect_dlg.geometry()

        # dialog layout
        ver_layout = QVBoxLayout(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

        # button
        btn_call = QPushButton("Add")
        btn_cancel = QPushButton("Cancel")

        btn_call.clicked.connect(lambda: 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: 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)

        return connect_dlg
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))