def _create_context_menu_for_tag(self): if isinstance(self.hl, XmlHighlighter): tag = self.hl.get_tag_of_current_block(self.textCursor().block(), self.textCursor().positionInBlock()) if tag: try: menu = QMenu("ROS <%s>" % tag, self) menu.triggered.connect(self._context_activated) # create a menu with attributes menu_attr = QMenu("attributes", menu) attributes = sorted(list(set(XmlHighlighter.LAUNCH_ATTR[tag]))) for attr in attributes: action = menu_attr.addAction(attr.rstrip('=')) action.setData('%s""' % attr) menu.addMenu(menu_attr) # create a menu with tags tags = sorted(XmlHighlighter.LAUNCH_CHILDS[tag]) if tags: menu_tags = QMenu("tags", menu) for tag in tags: data = '<%s></%s>' % (tag, tag) if XmlHighlighter.LAUNCH_CHILDS[tag] else '<%s/>' % tag action = menu_tags.addAction(tag) action.setData(data) menu.addMenu(menu_tags) return menu except: import traceback print traceback.format_exc(1) return None return None
def _create_context_menu_for_tag(self): if isinstance(self.hl, XmlHighlighter): tag = self.hl.get_tag_of_current_block( self.textCursor().block(), self.textCursor().positionInBlock()) if tag: try: menu = QMenu("ROS <%s>" % tag, self) menu.triggered.connect(self._context_activated) # create a menu with attributes menu_attr = QMenu("attributes", menu) attributes = sorted( list(set(XmlHighlighter.LAUNCH_ATTR[tag]))) for attr in attributes: action = menu_attr.addAction(attr.rstrip('=')) action.setData('%s""' % attr) menu.addMenu(menu_attr) # create a menu with tags tags = sorted(XmlHighlighter.LAUNCH_CHILDS[tag]) if tags: menu_tags = QMenu("tags", menu) for tag in tags: data = '<%s></%s>' % ( tag, tag) if XmlHighlighter.LAUNCH_CHILDS[ tag] else '<%s/>' % tag action = menu_tags.addAction(tag) action.setData(data) menu.addMenu(menu_tags) return menu except: import traceback print traceback.format_exc(1) return None return None
def __init__(self, timeline, event): super(TimelinePopupMenu, self).__init__() self.parent = timeline self.timeline = timeline self._reset_timeline = self.addAction('Reset Timeline') self._play_all = self.addAction('Play All Messages') self._play_all.setCheckable(True) self._play_all.setChecked(self.timeline.play_all) self.addSeparator() submenu = self.addMenu('Thumbnails...') self._thumbnail_show_action = submenu.addAction('Show All') self._thumbnail_hide_action = submenu.addAction('Hide All') submenu.addSeparator() self._renderers = self.timeline._timeline_frame.get_renderers() self._thumbnail_actions = [] for topic, renderer in self._renderers: self._thumbnail_actions.append(submenu.addAction(topic)) self._thumbnail_actions[-1].setCheckable(True) self._thumbnail_actions[-1].setChecked( self.timeline._timeline_frame.is_renderer_active(topic)) self._topics = self.timeline._timeline_frame.topics view_topics_menu = self.addMenu('View (by Topic)') self._topic_actions = [] for topic in self._topics: datatype = self.timeline.get_datatype(topic) # View... / topic topic_menu = QMenu(topic, self) viewer_types = self.timeline._timeline_frame.get_viewer_types( datatype) # View... / topic / Viewer for viewer_type in viewer_types: tempaction = topic_menu.addAction(viewer_type.name) tempaction.setData(viewer_type) self._topic_actions.append(tempaction) view_topics_menu.addMenu(topic_menu) view_type_menu = self.addMenu('View (by Type)') self._topics_by_type = self.timeline._timeline_frame._topics_by_datatype self._type_actions = [] for datatype in self._topics_by_type: # View... / datatype datatype_menu = QMenu(datatype, self) datatype_topics = self._topics_by_type[datatype] viewer_types = self.timeline._timeline_frame.get_viewer_types( datatype) for topic in [t for t in self._topics if t in datatype_topics]: # use timeline ordering topic_menu = QMenu(topic, datatype_menu) # View... / datatype / topic / Viewer for viewer_type in viewer_types: tempaction = topic_menu.addAction(viewer_type.name) tempaction.setData(viewer_type) self._topic_actions.append(tempaction) datatype_menu.addMenu(topic_menu) view_type_menu.addMenu(datatype_menu) self.addSeparator() submenu = self.addMenu('Publish...') self._publish_all = submenu.addAction('Publish All') self._publish_none = submenu.addAction('Publish None') submenu.addSeparator() self._publish_actions = [] for topic in self._topics: self._publish_actions.append(submenu.addAction(topic)) self._publish_actions[-1].setCheckable(True) self._publish_actions[-1].setChecked( self.timeline.is_publishing(topic)) action = self.exec_(event.globalPos()) if action is not None and action != 0: self.process(action)
def _rightclick_menu(self, event): """ Dynamically builds the rightclick menu based on the unique column data from the passed in datamodel and then launches it modally :param event: the mouse event object, ''QMouseEvent'' """ severities = {} for severity, label in Message.SEVERITY_LABELS.items(): if severity in self._model.get_unique_severities(): severities[severity] = label nodes = sorted(self._model.get_unique_nodes()) topics = sorted(self._model.get_unique_topics()) # menutext entries turned into menutext = [] menutext.append([ self.tr('Exclude'), [[self.tr('Severity'), severities], [self.tr('Node'), nodes], [self.tr('Topic'), topics], [self.tr('Selected Message(s)')]] ]) menutext.append([ self.tr('Highlight'), [[self.tr('Severity'), severities], [self.tr('Node'), nodes], [self.tr('Topic'), topics], [self.tr('Selected Message(s)')]] ]) menutext.append([self.tr('Copy Selected')]) menutext.append([self.tr('Browse Selected')]) menu = QMenu() submenus = [] subsubmenus = [] for item in menutext: if len(item) > 1: submenus.append(QMenu(item[0], menu)) for subitem in item[1]: if len(subitem) > 1: subsubmenus.append(QMenu(subitem[0], submenus[-1])) if isinstance(subitem[1], dict): for key in sorted(subitem[1].keys()): action = subsubmenus[-1].addAction( subitem[1][key]) action.setData(key) else: for subsubitem in subitem[1]: subsubmenus[-1].addAction(subsubitem) submenus[-1].addMenu(subsubmenus[-1]) else: submenus[-1].addAction(subitem[0]) menu.addMenu(submenus[-1]) else: menu.addAction(item[0]) action = menu.exec_(event.globalPos()) if action is None or action == 0: return elif action.text() == self.tr('Browse Selected'): self._show_browsers() elif action.text() == self.tr('Copy Selected'): rowlist = [] for current in self.table_view.selectionModel().selectedIndexes(): rowlist.append(self._proxy_model.mapToSource(current).row()) copytext = self._model.get_selected_text(rowlist) if copytext is not None: clipboard = QApplication.clipboard() clipboard.setText(copytext) elif action.text() == self.tr('Selected Message(s)'): if action.parentWidget().title() == self.tr('Highlight'): self._process_highlight_exclude_filter(action.text(), 'Message', False) elif action.parentWidget().title() == self.tr('Exclude'): self._process_highlight_exclude_filter(action.text(), 'Message', True) else: raise RuntimeError( "Menu format corruption in ConsoleWidget._rightclick_menu()" ) else: # This processes the dynamic list entries (severity, node and topic) try: roottitle = action.parentWidget().parentWidget().title() except: raise RuntimeError( "Menu format corruption in ConsoleWidget._rightclick_menu()" ) if roottitle == self.tr('Highlight'): self._process_highlight_exclude_filter( action.text(), action.parentWidget().title(), False) elif roottitle == self.tr('Exclude'): self._process_highlight_exclude_filter( action.text(), action.parentWidget().title(), True) else: raise RuntimeError( "Unknown Root Action %s selected in ConsoleWidget._rightclick_menu()" % roottitle)
def __init__(self, timeline, event, menu_topic): super(TimelinePopupMenu, self).__init__() self.parent = timeline self.timeline = timeline if menu_topic is not None: self.setTitle(menu_topic) self._menu_topic = menu_topic else: self._menu_topic = None self._reset_timeline = self.addAction('Reset Timeline') self._play_all = self.addAction('Play All Messages') self._play_all.setCheckable(True) self._play_all.setChecked(self.timeline.play_all) self.addSeparator() self._renderers = self.timeline._timeline_frame.get_renderers() self._thumbnail_actions = [] # create thumbnail menu items if menu_topic is None: submenu = self.addMenu('Thumbnails...') self._thumbnail_show_action = submenu.addAction('Show All') self._thumbnail_hide_action = submenu.addAction('Hide All') submenu.addSeparator() for topic, renderer in self._renderers: self._thumbnail_actions.append(submenu.addAction(topic)) self._thumbnail_actions[-1].setCheckable(True) self._thumbnail_actions[-1].setChecked(self.timeline._timeline_frame.is_renderer_active(topic)) else: self._thumbnail_show_action = None self._thumbnail_hide_action = None for topic, renderer in self._renderers: if menu_topic == topic: self._thumbnail_actions.append(self.addAction("Thumbnail")) self._thumbnail_actions[-1].setCheckable(True) self._thumbnail_actions[-1].setChecked(self.timeline._timeline_frame.is_renderer_active(topic)) # create view menu items self._topic_actions = [] self._type_actions = [] if menu_topic is None: self._topics = self.timeline._timeline_frame.topics view_topics_menu = self.addMenu('View (by Topic)') for topic in self._topics: datatype = self.timeline.get_datatype(topic) # View... / topic topic_menu = QMenu(topic, self) viewer_types = self.timeline._timeline_frame.get_viewer_types(datatype) # View... / topic / Viewer for viewer_type in viewer_types: tempaction = topic_menu.addAction(viewer_type.name) tempaction.setData(viewer_type) self._topic_actions.append(tempaction) view_topics_menu.addMenu(topic_menu) view_type_menu = self.addMenu('View (by Type)') self._topics_by_type = self.timeline._timeline_frame._topics_by_datatype for datatype in self._topics_by_type: # View... / datatype datatype_menu = QMenu(datatype, self) datatype_topics = self._topics_by_type[datatype] viewer_types = self.timeline._timeline_frame.get_viewer_types(datatype) for topic in [t for t in self._topics if t in datatype_topics]: # use timeline ordering topic_menu = QMenu(topic, datatype_menu) # View... / datatype / topic / Viewer for viewer_type in viewer_types: tempaction = topic_menu.addAction(viewer_type.name) tempaction.setData(viewer_type) self._topic_actions.append(tempaction) datatype_menu.addMenu(topic_menu) view_type_menu.addMenu(datatype_menu) else: view_menu = self.addMenu("View") datatype = self.timeline.get_datatype(menu_topic) viewer_types = self.timeline._timeline_frame.get_viewer_types(datatype) for viewer_type in viewer_types: tempaction = view_menu.addAction(viewer_type.name) tempaction.setData(viewer_type) self._topic_actions.append(tempaction) self.addSeparator() # create publish menu items self._publish_actions = [] if menu_topic is None: submenu = self.addMenu('Publish...') self._publish_all = submenu.addAction('Publish All') self._publish_none = submenu.addAction('Publish None') submenu.addSeparator() for topic in self._topics: self._publish_actions.append(submenu.addAction(topic)) self._publish_actions[-1].setCheckable(True) self._publish_actions[-1].setChecked(self.timeline.is_publishing(topic)) else: self._publish_actions.append(self.addAction("Publish")) self._publish_actions[-1].setCheckable(True) self._publish_actions[-1].setChecked(self.timeline.is_publishing(menu_topic)) self._publish_all = None self._publish_none = None action = self.exec_(event.globalPos()) if action is not None and action != 0: self.process(action)
def _rightclick_menu(self, event): """ Dynamically builds the rightclick menu based on the unique column data from the passed in datamodel and then launches it modally :param event: the mouse event object, ''QMouseEvent'' """ severities = self._datamodel.get_unique_col_data(1) nodes = self._datamodel.get_unique_col_data(2) topics = self._datamodel.get_unique_col_data(4) temp = [] for topic in topics: if topic.find(', ') == -1: temp.append(topic) else: temp = temp + topic.split(', ') topics = list(set(temp)) columns = list(self._datamodel.message_members()) for index in range(len(columns)): columns[index] = [columns[index][1:].capitalize()] # menutext entries turned into menutext = [] menutext.append([self.tr('Exclude'), [[self.tr('Severity'), severities], [self.tr('Node'), nodes], [self.tr('Topic'), topics], [self.tr('Selected Message(s)')]]]) menutext.append([self.tr('Highlight'), [[self.tr('Severity'), severities], [self.tr('Node'), nodes], [self.tr('Topic'), topics], [self.tr('Selected Message(s)')]]]) menutext.append([self.tr('Copy Selected')]) menutext.append([self.tr('Browse Selected')]) menu = QMenu() submenus = [] subsubmenus = [] for item in menutext: if len(item) > 1: submenus.append(QMenu(item[0], menu)) for subitem in item[1]: if len(subitem) > 1: subsubmenus.append(QMenu(subitem[0], submenus[-1])) for subsubitem in subitem[1]: subsubmenus[-1].addAction(subsubitem) submenus[-1].addMenu(subsubmenus[-1]) else: submenus[-1].addAction(subitem[0]) menu.addMenu(submenus[-1]) else: menu.addAction(item[0]) action = menu.exec_(event.globalPos()) if action is None or action == 0: return elif action.text() == self.tr('Browse Selected'): self._show_browsers() elif action.text() == self.tr('Copy Selected'): rowlist = [] for current in self.table_view.selectionModel().selectedIndexes(): rowlist.append(self._proxymodel.mapToSource(current).row()) copytext = self._datamodel.get_selected_text(rowlist) if copytext is not None: clipboard = QApplication.clipboard() clipboard.setText(copytext) elif action.text() == self.tr('Selected Message(s)'): if action.parentWidget().title() == self.tr('Highlight'): self._process_highlight_exclude_filter(action.text(), 'Message', False) elif action.parentWidget().title() == self.tr('Exclude'): self._process_highlight_exclude_filter(action.text(), 'Message', True) else: raise RuntimeError("Menu format corruption in ConsoleWidget._rightclick_menu()") else: # This processes the dynamic list entries (severity, node and topic) try: roottitle = action.parentWidget().parentWidget().title() except: raise RuntimeError("Menu format corruption in ConsoleWidget._rightclick_menu()") if roottitle == self.tr('Highlight'): self._process_highlight_exclude_filter(action.text(), action.parentWidget().title(), False) elif roottitle == self.tr('Exclude'): self._process_highlight_exclude_filter(action.text(), action.parentWidget().title(), True) else: raise RuntimeError("Unknown Root Action %s selected in ConsoleWidget._rightclick_menu()" % roottitle) self.update_status()
def _rightclick_menu(self, event): """ Dynamically builds the rightclick menu based on the unique column data from the passed in datamodel and then launches it modally :param event: the mouse event object, ''QMouseEvent'' """ severities = {} for severity, label in Message.SEVERITY_LABELS.items(): if severity in self._model.get_unique_severities(): severities[severity] = label nodes = sorted(self._model.get_unique_nodes()) topics = sorted(self._model.get_unique_topics()) # menutext entries turned into menutext = [] menutext.append([self.tr('Exclude'), [[self.tr('Severity'), severities], [self.tr('Node'), nodes], [self.tr('Topic'), topics], [self.tr('Selected Message(s)')]]]) menutext.append([self.tr('Highlight'), [[self.tr('Severity'), severities], [self.tr('Node'), nodes], [self.tr('Topic'), topics], [self.tr('Selected Message(s)')]]]) menutext.append([self.tr('Copy Selected')]) menutext.append([self.tr('Browse Selected')]) menu = QMenu() submenus = [] subsubmenus = [] for item in menutext: if len(item) > 1: submenus.append(QMenu(item[0], menu)) for subitem in item[1]: if len(subitem) > 1: subsubmenus.append(QMenu(subitem[0], submenus[-1])) if isinstance(subitem[1], dict): for key in sorted(subitem[1].keys()): action = subsubmenus[-1].addAction(subitem[1][key]) action.setData(key) else: for subsubitem in subitem[1]: subsubmenus[-1].addAction(subsubitem) submenus[-1].addMenu(subsubmenus[-1]) else: submenus[-1].addAction(subitem[0]) menu.addMenu(submenus[-1]) else: menu.addAction(item[0]) action = menu.exec_(event.globalPos()) if action is None or action == 0: return elif action.text() == self.tr('Browse Selected'): self._show_browsers() elif action.text() == self.tr('Copy Selected'): rowlist = [] for current in self.table_view.selectionModel().selectedIndexes(): rowlist.append(self._proxy_model.mapToSource(current).row()) copytext = self._model.get_selected_text(rowlist) if copytext is not None: clipboard = QApplication.clipboard() clipboard.setText(copytext) elif action.text() == self.tr('Selected Message(s)'): if action.parentWidget().title() == self.tr('Highlight'): self._process_highlight_exclude_filter(action.text(), 'Message', False) elif action.parentWidget().title() == self.tr('Exclude'): self._process_highlight_exclude_filter(action.text(), 'Message', True) else: raise RuntimeError("Menu format corruption in ConsoleWidget._rightclick_menu()") else: # This processes the dynamic list entries (severity, node and topic) try: roottitle = action.parentWidget().parentWidget().title() except: raise RuntimeError("Menu format corruption in ConsoleWidget._rightclick_menu()") if roottitle == self.tr('Highlight'): self._process_highlight_exclude_filter(action.text(), action.parentWidget().title(), False) elif roottitle == self.tr('Exclude'): self._process_highlight_exclude_filter(action.text(), action.parentWidget().title(), True) else: raise RuntimeError("Unknown Root Action %s selected in ConsoleWidget._rightclick_menu()" % roottitle)
def _create_tag_menu(self, parent=None): # creates a tag menu tag_menu = QMenu("ROS Tags", parent) # group tag add_group_tag_action = QAction("<group>", self, statusTip="", triggered=self._on_add_group_tag) add_group_tag_action.setShortcuts(QKeySequence("Ctrl+Shift+g")) tag_menu.addAction(add_group_tag_action) # node tag add_node_tag_action = QAction("<node>", self, statusTip="", triggered=self._on_add_node_tag) add_node_tag_action.setShortcuts(QKeySequence("Ctrl+Shift+n")) tag_menu.addAction(add_node_tag_action) # node tag with all attributes add_node_tag_all_action = QAction("<node all>", self, statusTip="", triggered=self._on_add_node_tag_all) tag_menu.addAction(add_node_tag_all_action) # include tag with all attributes add_include_tag_all_action = QAction("<include>", self, statusTip="", triggered=self._on_add_include_tag_all) add_include_tag_all_action.setShortcuts(QKeySequence("Ctrl+Shift+i")) tag_menu.addAction(add_include_tag_all_action) # remap add_remap_tag_action = QAction("<remap>", self, statusTip="", triggered=self._on_add_remap_tag) add_remap_tag_action.setShortcuts(QKeySequence("Ctrl+Shift+r")) tag_menu.addAction(add_remap_tag_action) # env tag add_env_tag_action = QAction("<env>", self, statusTip="", triggered=self._on_add_env_tag) tag_menu.addAction(add_env_tag_action) # param tag add_param_clipboard_tag_action = QAction("<param value>", self, statusTip="add value from clipboard", triggered=self._on_add_param_clipboard_tag) add_param_clipboard_tag_action.setShortcuts(QKeySequence("Ctrl+Shift+p")) tag_menu.addAction(add_param_clipboard_tag_action) add_param_tag_action = QAction("<param>", self, statusTip="", triggered=self._on_add_param_tag) add_param_tag_action.setShortcuts(QKeySequence("Ctrl+Shift+Alt+p")) tag_menu.addAction(add_param_tag_action) # param tag with all attributes add_param_tag_all_action = QAction("<param all>", self, statusTip="", triggered=self._on_add_param_tag_all) tag_menu.addAction(add_param_tag_all_action) # rosparam tag with all attributes add_rosparam_tag_all_action = QAction("<rosparam>", self, statusTip="", triggered=self._on_add_rosparam_tag_all) tag_menu.addAction(add_rosparam_tag_all_action) # arg tag with default definition add_arg_tag_default_action = QAction("<arg default>", self, statusTip="", triggered=self._on_add_arg_tag_default) add_arg_tag_default_action.setShortcuts(QKeySequence("Ctrl+Shift+a")) tag_menu.addAction(add_arg_tag_default_action) # arg tag with value definition add_arg_tag_value_action = QAction("<arg value>", self, statusTip="", triggered=self._on_add_arg_tag_value) add_arg_tag_value_action.setShortcuts(QKeySequence("Ctrl+Alt+a")) tag_menu.addAction(add_arg_tag_value_action) # test tag add_test_tag_action = QAction("<test>", self, statusTip="", triggered=self._on_add_test_tag) add_test_tag_action.setShortcuts(QKeySequence("Ctrl+Alt+t")) tag_menu.addAction(add_test_tag_action) # test tag with all attributes add_test_tag_all_action = QAction("<test all>", self, statusTip="", triggered=self._on_add_test_tag_all) tag_menu.addAction(add_test_tag_all_action) sub_cp_menu = QMenu("Custom parameters", parent) show_cp_dialog_action = QAction("Show Dialog", self, statusTip="", triggered=self._show_custom_parameter_dialog) show_cp_dialog_action.setShortcuts(QKeySequence("Ctrl+Shift+d")) sub_cp_menu.addAction(show_cp_dialog_action) add_cp_associations_action = QAction("nm/associations", self, statusTip="", triggered=self._on_add_cp_associations) add_cp_associations_action.setShortcuts(QKeySequence("Ctrl+Alt+a")) sub_cp_menu.addAction(add_cp_associations_action) sub_cp_as_menu = QMenu("Autostart", parent) add_cp_as_delay_action = QAction("delay", self, statusTip="", triggered=self._on_add_cp_as_delay) sub_cp_as_menu.addAction(add_cp_as_delay_action) add_cp_as_exclude_action = QAction("exclude", self, statusTip="", triggered=self._on_add_cp_as_exclude) sub_cp_as_menu.addAction(add_cp_as_exclude_action) add_cp_as_req_publisher_action = QAction("required publisher", self, statusTip="", triggered=self._on_add_cp_as_req_publisher) sub_cp_as_menu.addAction(add_cp_as_req_publisher_action) sub_cp_menu.addMenu(sub_cp_as_menu) sub_cp_r_menu = QMenu("Respawn", parent) add_cp_r_max_action = QAction("max", self, statusTip="", triggered=self._on_add_cp_r_max) sub_cp_r_menu.addAction(add_cp_r_max_action) add_cp_r_min_runtime_action = QAction("min_runtime", self, statusTip="", triggered=self._on_add_cp_r_min_runtime) sub_cp_r_menu.addAction(add_cp_r_min_runtime_action) add_cp_r_delay_action = QAction("delay", self, statusTip="", triggered=self._on_add_cp_r_delay) sub_cp_r_menu.addAction(add_cp_r_delay_action) sub_cp_menu.addMenu(sub_cp_r_menu) add_cp_capability_group_action = QAction("capability_group", self, statusTip="", triggered=self._on_add_cp_capability_group) add_cp_capability_group_action.setShortcuts(QKeySequence("Ctrl+Alt+p")) sub_cp_menu.addAction(add_cp_capability_group_action) add_cp_kill_on_stop_action = QAction("nm/kill_on_stop", self, statusTip="True or time to wait in ms", triggered=self._on_add_cp_kill_on_stop) add_cp_kill_on_stop_action.setShortcuts(QKeySequence("Ctrl+Shift+k")) sub_cp_menu.addAction(add_cp_kill_on_stop_action) tag_menu.addMenu(sub_cp_menu) return tag_menu