def __init__(self, parent=None): QtGui.QSyntaxHighlighter.__init__(self, parent) self.rules = [] self.commentStart = QtCore.QRegExp("#") self.commentEnd = QtCore.QRegExp("\n|\r") self.default_format = QtGui.QTextCharFormat() self.default_format.setForeground(QtGui.QColor(24, 24, 24)) self.commentFormat = QtGui.QTextCharFormat() self.commentFormat.setFontItalic(True) self.commentFormat.setForeground(QtCore.Qt.darkGray) f = QtGui.QTextCharFormat() r = QtCore.QRegExp() r.setMinimal(True) f.setFontWeight(QtGui.QFont.Normal) f.setForeground(QtCore.Qt.blue) tagList = ["\\btrue\\b", "\\bfalse\\b"] for tag in tagList: r.setPattern(tag) self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setForeground(QtGui.QColor(127, 64, 127)) r.setPattern("\\d+") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setForeground(QtCore.Qt.darkBlue) r.setPattern("^\s*[_.\w]*\s*:") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setForeground(QtCore.Qt.darkBlue) r.setPattern(":\s*:[_\.\w]*$|:\s*\@[_\.\w]*$") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setFontWeight(QtGui.QFont.Bold) f.setForeground(QtCore.Qt.darkRed) r.setPattern("^\s*-") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setForeground(QtCore.Qt.darkRed) r.setPattern("^---$") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setForeground(QtCore.Qt.darkGreen) r.setPattern("[\[\]\{\}\,]") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setFontWeight(QtGui.QFont.Normal) f.setForeground(QtCore.Qt.magenta) r.setPattern("\".*\"|\'.*\'") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setForeground(QtGui.QColor(127, 64, 127)) r.setPattern("\\$\\(.*\\)") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) f.setForeground(QtCore.Qt.lightGray) r.setPattern("<!DOCTYPE.*>") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) r.setPattern("<\\?xml.*\\?>") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f)))
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(QtGui.QPalette.Base) palette = QtGui.QPalette() if error_nodes: brush = QtGui.QBrush(QtGui.QColor(255, 100, 0)) elif running_nodes and stopped_nodes: brush = QtGui.QBrush(QtGui.QColor(140, 185, 255)) #30, 50, 255 elif running_nodes: self.on_button.setFlat(True) self.off_button.setFlat(False) brush = QtGui.QBrush(QtGui.QColor(59, 223, 18)) # 59, 223, 18 else: brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) self.on_button.setFlat(False) self.off_button.setFlat(True) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) self.setPalette(palette)
def __init__(self, parent=None): QtGui.QSyntaxHighlighter.__init__(self, parent) self.rules = [] self.commentStart = QtCore.QRegExp("<!--") self.commentEnd = QtCore.QRegExp("-->") self.default_format = QtGui.QTextCharFormat() self.default_format.setForeground(QtGui.QColor(24, 24, 24)) self.mark_background = QtGui.QBrush(QtGui.QColor(251, 247, 222)) self.commentFormat = QtGui.QTextCharFormat() f = QtGui.QTextCharFormat() r = QtCore.QRegExp() r.setMinimal(True) f.setFontWeight(QtGui.QFont.Normal) f.setForeground(QtCore.Qt.darkBlue) # create patterns for TAG tagList = ["\\b%s\\b" % t for t in self.LAUNCH_CHILDS.keys()] for tag in tagList: r.setPattern(tag) self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) # create patterns for ATTRIBUTES f.setForeground(QtCore.Qt.darkGreen) attrList = set([ "\\b%s" % attr for v in self.LAUNCH_ATTR.values() for attr in v.keys() ]) for attr in attrList: r.setPattern(attr) self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) # create patterns for strings f.setForeground(QtCore.Qt.magenta) r.setPattern("\".*\"") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) # create patterns for substitutions f.setForeground(QtGui.QColor(127, 64, 127)) r.setPattern("\\$\\(.*\\)") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) # create patterns for DOCTYPE f.setForeground(QtCore.Qt.lightGray) r.setPattern("<!DOCTYPE.*>") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) r.setPattern("<\\?xml.*\\?>") self.rules.append((QtCore.QRegExp(r), QtGui.QTextCharFormat(f))) self.commentFormat.setFontItalic(True) self.commentFormat.setForeground(QtCore.Qt.darkGray) # part to select an XML block self._current_mark_range = (-1, -1) # absolute (start, end) positions
def __init__(self, color=None, parent=None): super(ColorButton, self).__init__(parent) self.setMinimumWidth(50) if color is None: color = QtGui.QColor('gray') self.color = color self.clicked.connect(self.choose_color)
def paintEvent(self, event): super(ColorButton, self).paintEvent(event) padding = 5 rect = event.rect() painter = QtGui.QPainter(self) painter.setBrush(QtGui.QBrush(self.color)) painter.setPen(QtGui.QColor("#CECECE")) rect.adjust( padding, padding, -1-padding, -1-padding) painter.drawRect(rect)
def __init__(self, params=dict(), buttons=QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok, sidebar_var='', parent=None): ''' Creates an input dialog. @param params: a dictionary with parameter names and (type, values). The C{value}, can be a primitive value, a list with values or parameter dictionary to create groups. In this case the type is the name of the group. @type params: C{dict(str:(str, {value, [..], dict()}))} ''' QtGui.QDialog.__init__(self, parent=parent) self.setObjectName('ParameterDialog - %s'%str(params)) self.__current_path = nm.settings().current_dialog_path self.horizontalLayout = QtGui.QHBoxLayout(self) self.horizontalLayout.setObjectName("horizontalLayout") self.horizontalLayout.setContentsMargins(1, 1, 1, 1) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName("verticalLayout") self.verticalLayout.setContentsMargins(1, 1, 1, 1) # add filter row self.filter_frame = QtGui.QFrame(self) filterLayout = QtGui.QHBoxLayout(self.filter_frame) filterLayout.setContentsMargins(1, 1, 1, 1) label = QtGui.QLabel("Filter:", self.filter_frame) self.filter_field = QtGui.QLineEdit(self.filter_frame) filterLayout.addWidget(label) filterLayout.addWidget(self.filter_field) self.filter_field.textChanged.connect(self._on_filter_changed) self.filter_visible = True self.verticalLayout.addWidget(self.filter_frame) # create area for the parameter self.scrollArea = scrollArea = ScrollArea(self); scrollArea.setObjectName("scrollArea") scrollArea.setWidgetResizable(True) self.content = MainBox('/', 'str', False, self) scrollArea.setWidget(self.content) self.verticalLayout.addWidget(scrollArea) # add info text field self.info_field = QtGui.QTextEdit(self) self.info_field.setVisible(False) palette = QtGui.QPalette() brush = QtGui.QBrush(QtGui.QColor(255, 254, 242)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(255, 254, 242)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) brush = QtGui.QBrush(QtGui.QColor(244, 244, 244)) brush.setStyle(QtCore.Qt.SolidPattern) palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) self.info_field.setPalette(palette) self.info_field.setFrameShadow(QtGui.QFrame.Plain) self.info_field.setReadOnly(True) self.info_field.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByKeyboard|QtCore.Qt.LinksAccessibleByMouse|QtCore.Qt.TextBrowserInteraction|QtCore.Qt.TextSelectableByKeyboard|QtCore.Qt.TextSelectableByMouse) self.info_field.setObjectName("dialog_info_field") self.verticalLayout.addWidget(self.info_field) # create buttons self.buttonBox = QtGui.QDialogButtonBox(self) self.buttonBox.setObjectName("buttonBox") self.buttonBox.setOrientation(QtCore.Qt.Horizontal) self.buttonBox.setStandardButtons(buttons) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.verticalLayout.addWidget(self.buttonBox) self.horizontalLayout.addLayout(self.verticalLayout) # add side bar for checklist values = nm.history().cachedParamValues('/%s'%sidebar_var) self.sidebar_frame = QtGui.QFrame() self.sidebar_frame.setObjectName(sidebar_var) sidebarframe_verticalLayout = QtGui.QVBoxLayout(self.sidebar_frame) sidebarframe_verticalLayout.setObjectName("sidebarframe_verticalLayout") sidebarframe_verticalLayout.setContentsMargins(1, 1, 1, 1) self._sidebar_selected = 0 if len(values) > 1 and sidebar_var in params: self.horizontalLayout.addWidget(self.sidebar_frame) try: self.sidebar_default_val = params[sidebar_var][1] except: self.sidebar_default_val = '' values.sort() for v in values: checkbox = QtGui.QCheckBox(v) checkbox.stateChanged.connect(self._on_sidebar_stateChanged) self.sidebar_frame.layout().addWidget(checkbox) self.sidebar_frame.layout().addItem(QtGui.QSpacerItem(100, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)) # set the input fields if params: self.content.createFieldFromValue(params) self.setInfoActive(False) if self.filter_frame.isVisible(): self.filter_field.setFocus() self.setMinimumSize(350,200)
import logging from qt_gui.plugin import Plugin from python_qt_binding import loadUi import python_qt_binding.QtGui as QtGui import python_qt_binding.QtCore as QtCore import check_resource_usage import rqt_grounding_and_analysis_logging analysis_multirobot_logger = logging.getLogger("analysis_multirobot_logger") HIGHLIGHT_COLOR = QtGui.QColor(255, 204, 204) #QtCore.Qt.red class ExtensionAnalysisMultiRobot(Plugin): def __init__(self, context): super(ExtensionAnalysisMultiRobot, self).__init__(context) def setup_extension(self): # enable switch tab self._stackedWidget_analysis = self._widget.findChild( QtGui.QStackedWidget, name="stackedWidget_analysis") self._stackedWidget_analysis.setCurrentIndex(0) # connect callback for pushButton switch to multiple self._pushButton_switch_to_multiple = self._widget.findChild( QtGui.QPushButton, name="pushButton_switch_to_multiple") self._pushButton_switch_to_multiple.clicked.connect( self.on_pushButton_switch_to_multiple_clicked)
class AlarmPlugin(Plugin): _severity_mapping = { 0: qtg.QColor(255, 0, 0), 1: qtg.QColor(240, 100, 0), 2: qtg.QColor(220, 200, 0), 3: qtg.QColor(30, 255, 30), } _column_headers = ["Name", "Status", "Description", "Time Recieved"] def __init__(self, context): super(AlarmPlugin, self).__init__(context) self.setObjectName('AlarmPlugin') # Things seem to misbehave when this is missing # Process standalone plugin command-line arguments from argparse import ArgumentParser parser = ArgumentParser() # Add argument(s) to the parser. parser.add_argument("-q", "--quiet", action="store_true", dest="quiet", help="Put plugin in silent mode") args, unknowns = parser.parse_known_args(context.argv()) self._widget = QWidget() # Get path to UI file which should be in the "resource" folder of this package ui_file = os.path.join(rospkg.RosPack().get_path('sub8_rqt'), 'resource', 'sub8_rqt_alarms.ui') # Extend the widget with all attributes and children from UI file self.ui = loadUi(ui_file, self._widget) self._widget.setObjectName('AlarmPlugin') self.alarm_tree = self._widget.findChild(qtg.QTreeWidget, 'alarm_tree') self.alarm_table = self._widget.findChild(qtg.QTableWidget, 'alarm_table') # Alarm parameter cache stores some additional information about the alarm # (for use when an alarm is clicked) self.alarm_parameter_cache = {} # Default row-count to 0 self.alarm_table.setRowCount(0) self.alarm_table.setColumnCount(len(self._column_headers)) self.alarm_table.setHorizontalHeaderLabels(self._column_headers) self.alarm_table.clicked.connect(self.open_alarm) # ---- ROS ---- self.alarm_sub = rospy.Subscriber('alarm', Alarm, self.new_alarm_callback) if context.serial_number() > 1: self._widget.setWindowTitle(self._widget.windowTitle() + (' (%d)' % context.serial_number())) # Add widget to the user interface context.add_widget(self._widget) def new_alarm_callback(self, msg): '''React to a new alarm''' columns = ['alarm_name', 'severity', 'problem_description'] row_elements = map(functools.partial(getattr, msg), columns) # Get pub time alarm_epoch = msg.header.stamp.to_time() formatted_time = datetime.datetime.fromtimestamp(alarm_epoch).strftime( '%I:%M:%S.%f') row_elements.append(formatted_time) color = self._severity_mapping[msg.severity] self.alarm_table.insertRow(0) first_col = self.set_row(0, row_elements, color) self.alarm_parameter_cache[first_col] = msg.parameters def set_row(self, row, data, color): '''Set a whole row in the alarm table''' assert isinstance(data, list), "data must be a list" to_return = None for col, element in enumerate(data): table_item = newTableWidgetItem(element) table_item.setBackground(color) self.alarm_table.setItem(row, col, table_item) if col == 0: to_return = table_item return to_return def open_alarm(self, event): '''React when an alarm has been clicked 1. Use event to determine which cell has been clicked 2. Select that cell's whole row 3. Use the cached json_descriptions of each alarm to get that row's json data When an alarm has been clicked, we'll display its json parameters in the box on the right ''' items_selected = self.alarm_table.selectedItems() if len(items_selected) == 0: return row_selected = items_selected[0].row() self.alarm_table.selectRow(row_selected) key_item = self.alarm_table.itemAt(row_selected, 0) try: json_parameters = json.loads(self.alarm_parameter_cache[key_item]) except ValueError: rospy.logwarn("Could not decode alarm message") return self.alarm_tree.clear() try: build_tree_from_json(self.alarm_tree, json_parameters) except AssertionError: rospy.logwarn( "Could not draw json tree for alarm (Is it a dictionary?)") def shutdown_plugin(self): '''Unregister our subsribers''' self.alarm_sub.unregister() def save_settings(self, plugin_settings, instance_settings): rospy.logwarn('Saving does not currently do anything') pass def restore_settings(self, plugin_settings, instance_settings): rospy.logwarn('Restoring does not currently do anything') pass