def _load_parameter(self,param_index,param_name, param_type,param_value, param_min, param_max, param_desc): x_check = 160 x ,y ,w ,h = 4,4 + 40 * param_index,150,20 label = QLabel(param_name,self.parameters) label.setGeometry(x,y,w,h) label.setToolTip(param_desc) label.show() if param_type == 'Boolean': checkbox = QCheckBox('',self.parameters) checkbox.setGeometry(x_check,y,w,h) checkbox.setChecked(param_value == '1') checkbox.setToolTip(param_desc) checkbox.stateChanged.connect(partial(self._handle_bool_param_changed,param_name)) checkbox.show() elif param_type == 'Integer': if len(param_min) > 0 and len(param_max) > 0 and int(param_max) < 5: slider = QSlider(Qt.Horizontal,self.parameters) slider.setMinimum(int(param_min)) slider.setMaximum(int(param_max)) slider.setValue(int(param_value)) slider.setTickPosition(QSlider.TicksBelow) slider.setGeometry(x_check,y,w,h) slider.setToolTip(param_desc) slider.setTickInterval(1) slider.setSingleStep(1) slider.setPageStep(1) slider.valueChanged.connect(partial(self._handle_param_changed,param_name)) slider.show() else: spin = QSpinBox(self.parameters) if len(param_min) > 0: spin.setMinimum(int(param_min)) if len(param_max) > 0: spin.setMaximum(int(param_max)) spin.setValue(int(param_value)) spin.setToolTip(param_desc) spin.setGeometry(x_check,y,w,h) spin.valueChanged.connect(partial(self._handle_param_changed,param_name)) spin.show() elif param_type == 'Double': spin = QDoubleSpinBox(self.parameters) if len(param_min) > 0: spin.setMinimum(float(param_min)) if len(param_max) > 0: spin.setMaximum(float(param_max)) spin.setValue(float(param_value)) spin.valueChanged.connect(partial(self._handle_param_changed,param_name)) spin.setGeometry(x_check,y,w,h) spin.show() elif param_type == 'String': lineEdit = QLineEdit(self.parameters) lineEdit.setText(param_value) lineEdit.setToolTip(param_desc) lineEdit.setGeometry(x_check,y,w,h) lineEdit.textChanged.connect(partial(self._handle_param_changed,param_name)) lineEdit.show() self.parameters.update()
def create_label_checkbox_pair(key, value): label = QLabel(key) label.setToolTip(key) label.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) label.setMinimumWidth(400) label.setMaximumHeight(30) label.setWordWrap(True) checkbox = QCheckBox() checkbox.setChecked(value) return label, checkbox
def beginRosLabel(self,obj): pm,lm = self.__get_immediate_parent() fr = QFrame(pm) layout = QGridLayout() nlb = QLabel(obj.label_name + ":",fr) nlb.setToolTip(obj.topic_name) layout.addWidget(nlb,1,1) layout.addWidget(RosLabel(fr,obj.label_name,obj.topic_name,obj.topic_type,obj.topic_field),1,2) fr.setLayout(layout) lm.addWidget(fr)
def beginRosLabel(self, obj): pm, lm = self.__get_immediate_parent() fr = QFrame(pm) layout = QGridLayout() nlb = QLabel(obj.label_name + ":", fr) nlb.setToolTip(obj.topic_name) layout.addWidget(nlb, 1, 1) layout.addWidget( RosLabel(fr, obj.label_name, obj.topic_name, obj.topic_type, obj.topic_field), 1, 2) fr.setLayout(layout) lm.addWidget(fr)
def create_label_textedit_pair(key, value): ''' Probabaly there should be better way to lay out param and remappings ''' name = QLabel(key) name.setToolTip(key) name.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) name.setMinimumWidth(400) name.setMaximumHeight(30) name.setWordWrap(True) textedit = QTextEdit() textedit.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) textedit.setMinimumWidth(320) textedit.setMaximumHeight(30) textedit.append(str(value)) return name, textedit
class CapabilityControlWidget(QFrame): ''' The control widget contains buttons for control a capability. Currently this are C{On} and C{Off} buttons. Additionally, the state of the capability is color coded. ''' start_nodes_signal = Signal(str, str, list) '''@ivar: the signal is emitted to start on host(described by masteruri) the nodes described in the list, Parameter(masteruri, config, nodes).''' stop_nodes_signal = Signal(str, list) '''@ivar: the signal is emitted to stop on masteruri the nodes described in the list.''' def __init__(self, masteruri, cfg, ns, nodes, parent=None): QFrame.__init__(self, parent) self._masteruri = masteruri self._nodes = {cfg: {ns: nodes}} frame_layout = QVBoxLayout(self) frame_layout.setContentsMargins(0, 0, 0, 0) # create frame for warning label self.warning_frame = warning_frame = QFrame(self) warning_layout = QHBoxLayout(warning_frame) warning_layout.setContentsMargins(0, 0, 0, 0) warning_layout.addItem( QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) self.warning_label = QLabel() icon = nm.settings().icon('crystal_clear_warning.png') self.warning_label.setPixmap(icon.pixmap(QSize(40, 40))) self.warning_label.setToolTip( 'Multiple configuration for same node found!\nA first one will be selected for the start a node!' ) warning_layout.addWidget(self.warning_label) warning_layout.addItem( QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) frame_layout.addItem( QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) frame_layout.addWidget(warning_frame) # create frame for start/stop buttons buttons_frame = QFrame() buttons_layout = QHBoxLayout(buttons_frame) buttons_layout.setContentsMargins(0, 0, 0, 0) buttons_layout.addItem(QSpacerItem(20, 20)) self.on_button = QPushButton() self.on_button.setFlat(False) self.on_button.setText("On") self.on_button.clicked.connect(self.on_on_clicked) buttons_layout.addWidget(self.on_button) self.off_button = QPushButton() self.off_button.setFlat(True) self.off_button.setText("Off") self.off_button.clicked.connect(self.on_off_clicked) buttons_layout.addWidget(self.off_button) buttons_layout.addItem(QSpacerItem(20, 20)) frame_layout.addWidget(buttons_frame) frame_layout.addItem( QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) self.warning_frame.setVisible(False) def hasConfigs(self): ''' :return: True, if a configurations for this widget are available. :rtype: bool ''' return len(self._nodes) > 0 def nodes(self, cfg=''): ''' :return: the list with nodes required by this capability. The nodes are defined by ROS full name. :rtype: [str] ''' try: if cfg: return [n for l in self._nodes[cfg].values() for n in l] else: return [ n for c in self._nodes.values() for l in c.values() for n in l ] except Exception: return [] def setNodeState(self, running_nodes, stopped_nodes, error_nodes): ''' Sets the state of this capability. :param running_nodes: a list with running nodes. :type running_nodes: [str] :param stopped_nodes: a list with not running nodes. :type stopped_nodes: [str] :param error_nodes: a list with nodes having a problem. :type error_nodes: [str] ''' self.setAutoFillBackground(True) self.setBackgroundRole(QPalette.Base) palette = QPalette() if error_nodes: brush = QBrush(QColor(255, 100, 0)) elif running_nodes and stopped_nodes: brush = QBrush(QColor(140, 185, 255)) # 30, 50, 255 elif running_nodes: self.on_button.setFlat(True) self.off_button.setFlat(False) brush = QBrush(QColor(59, 223, 18)) # 59, 223, 18 else: brush = QBrush(QColor(255, 255, 255)) self.on_button.setFlat(False) self.off_button.setFlat(True) palette.setBrush(QPalette.Active, QPalette.Base, brush) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Inactive, QPalette.Base, brush) self.setPalette(palette) def removeCfg(self, cfg): try: del self._nodes[cfg] except Exception: pass def updateNodes(self, cfg, ns, nodes): self._nodes[cfg] = {ns: nodes} test_nodes = self.nodes() self.warning_frame.setVisible(len(test_nodes) != len(set(test_nodes))) def on_on_clicked(self): started = set() # do not start nodes multiple times for c in self._nodes.keys(): node2start = set(self.nodes(c)) - started self.start_nodes_signal.emit(self._masteruri, c, list(node2start)) started.update(node2start) self.on_button.setFlat(True) self.off_button.setFlat(False) def on_off_clicked(self): self.stop_nodes_signal.emit(self._masteruri, self.nodes()) self.on_button.setFlat(False) self.off_button.setFlat(True)
class CapabilityControlWidget(QFrame): ''' The control widget contains buttons for control a capability. Currently this are C{On} and C{Off} buttons. Additionally, the state of the capability is color coded. ''' start_nodes_signal = Signal(str, str, list) '''@ivar: the signal is emitted to start on host(described by masteruri) the nodes described in the list, Parameter(masteruri, config, nodes).''' stop_nodes_signal = Signal(str, list) '''@ivar: the signal is emitted to stop on masteruri the nodes described in the list.''' def __init__(self, masteruri, cfg, ns, nodes, parent=None): QFrame.__init__(self, parent) self._masteruri = masteruri self._nodes = {cfg: {ns: nodes}} frame_layout = QVBoxLayout(self) frame_layout.setContentsMargins(0, 0, 0, 0) # create frame for warning label self.warning_frame = warning_frame = QFrame(self) warning_layout = QHBoxLayout(warning_frame) warning_layout.setContentsMargins(0, 0, 0, 0) warning_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) self.warning_label = QLabel() icon = QIcon(':/icons/crystal_clear_warning.png') self.warning_label.setPixmap(icon.pixmap(QSize(40, 40))) self.warning_label.setToolTip('Multiple configuration for same node found!\nA first one will be selected for the start a node!') warning_layout.addWidget(self.warning_label) warning_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) frame_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) frame_layout.addWidget(warning_frame) # create frame for start/stop buttons buttons_frame = QFrame() buttons_layout = QHBoxLayout(buttons_frame) buttons_layout.setContentsMargins(0, 0, 0, 0) buttons_layout.addItem(QSpacerItem(20, 20)) self.on_button = QPushButton() self.on_button.setFlat(False) self.on_button.setText("On") self.on_button.clicked.connect(self.on_on_clicked) buttons_layout.addWidget(self.on_button) self.off_button = QPushButton() self.off_button.setFlat(True) self.off_button.setText("Off") self.off_button.clicked.connect(self.on_off_clicked) buttons_layout.addWidget(self.off_button) buttons_layout.addItem(QSpacerItem(20, 20)) frame_layout.addWidget(buttons_frame) frame_layout.addItem(QSpacerItem(0, 0, QSizePolicy.Expanding, QSizePolicy.Expanding)) self.warning_frame.setVisible(False) def hasConfigs(self): ''' @return: True, if a configurations for this widget are available. @rtype: bool ''' return len(self._nodes) > 0 def nodes(self, cfg=''): ''' @return: the list with nodes required by this capability. The nodes are defined by ROS full name. @rtype: C{[str]} ''' try: if cfg: return [n for l in self._nodes[cfg].itervalues() for n in l] else: return [n for c in self._nodes.itervalues() for l in c.itervalues() for n in l] except: return [] def setNodeState(self, running_nodes, stopped_nodes, error_nodes): ''' Sets the state of this capability. @param running_nodes: a list with running nodes. @type running_nodes: C{[str]} @param stopped_nodes: a list with not running nodes. @type stopped_nodes: C{[str]} @param error_nodes: a list with nodes having a problem. @type error_nodes: C{[str]} ''' self.setAutoFillBackground(True) self.setBackgroundRole(QPalette.Base) palette = QPalette() if error_nodes: brush = QBrush(QColor(255, 100, 0)) elif running_nodes and stopped_nodes: brush = QBrush(QColor(140, 185, 255)) # 30, 50, 255 elif running_nodes: self.on_button.setFlat(True) self.off_button.setFlat(False) brush = QBrush(QColor(59, 223, 18)) # 59, 223, 18 else: brush = QBrush(QColor(255, 255, 255)) self.on_button.setFlat(False) self.off_button.setFlat(True) palette.setBrush(QPalette.Active, QPalette.Base, brush) brush.setStyle(Qt.SolidPattern) palette.setBrush(QPalette.Inactive, QPalette.Base, brush) self.setPalette(palette) def removeCfg(self, cfg): try: del self._nodes[cfg] except: pass def updateNodes(self, cfg, ns, nodes): self._nodes[cfg] = {ns: nodes} test_nodes = self.nodes() self.warning_frame.setVisible(len(test_nodes) != len(set(test_nodes))) def on_on_clicked(self): started = set() # do not start nodes multiple times for c in self._nodes.iterkeys(): node2start = set(self.nodes(c)) - started self.start_nodes_signal.emit(self._masteruri, c, list(node2start)) started.update(node2start) self.on_button.setFlat(True) self.off_button.setFlat(False) def on_off_clicked(self): self.stop_nodes_signal.emit(self._masteruri, self.nodes()) self.on_button.setFlat(False) self.off_button.setFlat(True)