class MinimizedDockWidgetsToolbar(QToolBar): max_label_length = 15 def __init__(self, container_manager, parent=None): super(MinimizedDockWidgetsToolbar, self).__init__(parent=parent) self.setWindowTitle(self.tr('Minimized dock widgets')) self.setObjectName('MinimizedDockWidgetsToolbar') self.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self._container_manager = container_manager self._signal_mapper = QSignalMapper(self) self._signal_mapper.mapped[QWidget].connect(self._on_action_triggered) self._dock_widgets = {} self.hide() def addDockWidget(self, dock_widget): # remove action for same dock widget if exists self.removeDockWidget(dock_widget) icon = dock_widget.windowIcon() if icon.isNull(): icon = QIcon.fromTheme('folder') title = dock_widget.windowTitle() action = QAction(icon, title, self) # truncate label if necessary if len(title) > MinimizedDockWidgetsToolbar.max_label_length: action.setToolTip(title) action.setIconText( title[0:MinimizedDockWidgetsToolbar.max_label_length] + '...') self._signal_mapper.setMapping(action, dock_widget) action.triggered.connect(self._signal_mapper.map) self._dock_widgets[dock_widget] = action self.addAction(action) self.show() def removeDockWidget(self, dock_widget): if dock_widget in self._dock_widgets: action = self._dock_widgets[dock_widget] self.removeAction(action) del self._dock_widgets[dock_widget] self._signal_mapper.removeMappings(action) if not self._dock_widgets: self.hide() def _on_action_triggered(self, dock_widget): # if the dock widget is nested inside a container also show the container # do this recursively for nested containers while True: parent = self._container_manager.get_container_of_dock_widget( dock_widget) if parent is None: break dock_widget.show() dock_widget = parent dock_widget.show()
class MinimizedDockWidgetsToolbar(QToolBar): max_label_length = 15 def __init__(self, container_manager, parent=None): super(MinimizedDockWidgetsToolbar, self).__init__(parent=parent) self.setWindowTitle(self.tr('Minimized dock widgets')) self.setObjectName('MinimizedDockWidgetsToolbar') self.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) self._container_manager = container_manager self._signal_mapper = QSignalMapper(self) self._signal_mapper.mapped[QWidget].connect(self._on_action_triggered) self._dock_widgets = {} self.hide() def addDockWidget(self, dock_widget): # remove action for same dock widget if exists self.removeDockWidget(dock_widget) icon = dock_widget.windowIcon() if icon.isNull(): icon = QIcon.fromTheme('folder') title = dock_widget.windowTitle() action = QAction(icon, title, self) # truncate label if necessary if len(title) > MinimizedDockWidgetsToolbar.max_label_length: action.setToolTip(title) action.setIconText(title[0:MinimizedDockWidgetsToolbar.max_label_length] + '...') self._signal_mapper.setMapping(action, dock_widget) action.triggered.connect(self._signal_mapper.map) self._dock_widgets[dock_widget] = action self.addAction(action) self.show() def removeDockWidget(self, dock_widget): if dock_widget in self._dock_widgets: action = self._dock_widgets[dock_widget] self.removeAction(action) del self._dock_widgets[dock_widget] self._signal_mapper.removeMappings(action) if not self._dock_widgets: self.hide() def _on_action_triggered(self, dock_widget): # if the dock widget is nested inside a container also show the container # do this recursively for nested containers while True: parent = self._container_manager.get_container_of_dock_widget(dock_widget) if parent is None: break dock_widget.show() dock_widget = parent dock_widget.show()
class PluginMenu(QObject): """Menu of available plugins to load and running plugin instances to unload.""" load_plugin_signal = Signal(str) unload_plugin_signal = Signal(str) def __init__(self, menu_bar, plugin_manager): super(PluginMenu, self).__init__() self.setObjectName('PluginMenu') plugin_menu = menu_bar.addMenu(menu_bar.tr('&Plugins')) running_menu = menu_bar.addMenu(menu_bar.tr('&Running')) self._plugin_menu_manager = MenuManager(plugin_menu) self._plugin_mapper = QSignalMapper(plugin_menu) self._plugin_mapper.mapped[str].connect(self.load_plugin_signal) self._running_menu_manager = MenuManager(running_menu) self._running_mapper = QSignalMapper(running_menu) self._running_mapper.mapped[str].connect(self.unload_plugin_signal) self._instances = {} def add_plugin(self, plugin_descriptor): base_path = plugin_descriptor.attributes().get('plugin_path') menu_manager = self._plugin_menu_manager # create submenus for group in plugin_descriptor.groups(): label = group['label'] if menu_manager.contains_menu(label): submenu = menu_manager.get_menu(label) else: submenu = QMenu(label, menu_manager.menu) menu_action = submenu.menuAction() self._enrich_action(menu_action, group, base_path) menu_manager.add_item(submenu) menu_manager = MenuManager(submenu) # create action action_attributes = plugin_descriptor.action_attributes() action = QAction(action_attributes['label'], menu_manager.menu) self._enrich_action(action, action_attributes, base_path) self._plugin_mapper.setMapping(action, plugin_descriptor.plugin_id()) action.triggered.connect(self._plugin_mapper.map) not_available = plugin_descriptor.attributes().get('not_available') if not_available: action.setEnabled(False) action.setStatusTip(self.tr('Plugin is not available: %s') % not_available) # add action to menu menu_manager.add_item(action) def add_plugin_prefix(self, plugin_descriptor): action_attributes = plugin_descriptor.action_attributes() action = QAction(action_attributes['label'], self._plugin_menu_manager.menu) self._enrich_action(action, action_attributes) self._plugin_mapper.setMapping(action, plugin_descriptor.plugin_id()) action.triggered.connect(self._plugin_mapper.map) self._plugin_menu_manager.add_prefix(action) def add_instance(self, plugin_descriptor, instance_id): action_attributes = plugin_descriptor.action_attributes() action = QAction(self._get_instance_label(str(instance_id)), self._running_menu_manager.menu) base_path = plugin_descriptor.attributes().get('plugin_path') self._enrich_action(action, action_attributes, base_path) self._running_mapper.setMapping(action, str(instance_id)) action.triggered.connect(self._running_mapper.map) self._running_menu_manager.add_item(action) self._instances[instance_id] = action def remove_instance(self, instance_id): action = self._instances[instance_id] self._running_mapper.removeMappings(action) self._running_menu_manager.remove_item(action) @Slot(str, str) def update_plugin_instance_label(self, instance_id_str, label): instance_id = PluginInstanceId(instance_id=instance_id_str) action = self._instances[instance_id] action.setText(self._get_instance_label(label)) def _get_instance_label(self, label): return self.tr('Close:') + ' ' + label def _enrich_action(self, action, action_attributes, base_path=None): if 'icon' in action_attributes and action_attributes['icon'] is not None: icon = get_icon(action_attributes['icon'], action_attributes.get('icontype', None), base_path) action.setIcon(icon) if 'statustip' in action_attributes: action.setStatusTip(action_attributes['statustip'])
class PluginMenu(QObject): """Menu of available plugins to load and running plugin instances to unload.""" load_plugin_signal = Signal(str) unload_plugin_signal = Signal(str) def __init__(self, menu_bar, plugin_manager): super(PluginMenu, self).__init__() self.setObjectName('PluginMenu') plugin_menu = menu_bar.addMenu(menu_bar.tr('Plugins')) running_menu = menu_bar.addMenu(menu_bar.tr('Running')) self._plugin_menu_manager = MenuManager(plugin_menu) self._plugin_mapper = QSignalMapper(plugin_menu) self._plugin_mapper.mapped[str].connect(self.load_plugin_signal) self._running_menu_manager = MenuManager(running_menu) self._running_mapper = QSignalMapper(running_menu) self._running_mapper.mapped[str].connect(self.unload_plugin_signal) self._instances = {} def add_plugin(self, plugin_descriptor): base_path = plugin_descriptor.attributes().get('plugin_path') menu_manager = self._plugin_menu_manager # create submenus for group in plugin_descriptor.groups(): label = group['label'] if menu_manager.contains_menu(label): submenu = menu_manager.get_menu(label) else: submenu = QMenu(label, menu_manager.menu) menu_action = submenu.menuAction() self._enrich_action(menu_action, group, base_path) menu_manager.add_item(submenu) menu_manager = MenuManager(submenu) # create action action_attributes = plugin_descriptor.action_attributes() action = QAction(action_attributes['label'], menu_manager.menu) self._enrich_action(action, action_attributes, base_path) self._plugin_mapper.setMapping(action, plugin_descriptor.plugin_id()) action.triggered.connect(self._plugin_mapper.map) not_available = plugin_descriptor.attributes().get('not_available') if not_available: action.setEnabled(False) action.setStatusTip( self.tr('Plugin is not available: %s') % not_available) # add action to menu menu_manager.add_item(action) def add_plugin_prefix(self, plugin_descriptor): action_attributes = plugin_descriptor.action_attributes() action = QAction(action_attributes['label'], self._plugin_menu_manager.menu) self._enrich_action(action, action_attributes) self._plugin_mapper.setMapping(action, plugin_descriptor.plugin_id()) action.triggered.connect(self._plugin_mapper.map) self._plugin_menu_manager.add_prefix(action) def add_instance(self, plugin_descriptor, instance_id): action_attributes = plugin_descriptor.action_attributes() # create action label = self.tr('Close:') + ' ' + action_attributes['label'] if instance_id.serial_number != 1: label = label + ' (%s)' % str(instance_id.serial_number) action = QAction(label, self._running_menu_manager.menu) base_path = plugin_descriptor.attributes().get('plugin_path') self._enrich_action(action, action_attributes, base_path) self._running_mapper.setMapping(action, str(instance_id)) action.triggered.connect(self._running_mapper.map) self._running_menu_manager.add_item(action) self._instances[instance_id] = action def remove_instance(self, instance_id): action = self._instances[instance_id] self._running_mapper.removeMappings(action) self._running_menu_manager.remove_item(action) def _enrich_action(self, action, action_attributes, base_path=None): icontype = action_attributes.get('icontype', 'file') if 'icon' in action_attributes and action_attributes[ 'icon'] is not None: if icontype == 'file': path = action_attributes['icon'] if base_path is not None: path = os.path.join(base_path, path) icon = QIcon(path) if len(icon.availableSizes()) == 0: raise UserWarning('icon "%s" not found' % str(path)) elif icontype == 'resource': icon = QIcon(action_attributes['icon']) if len(icon.availableSizes()) == 0: raise UserWarning('icon "%s" not found' % str(path)) elif icontype == 'theme': # see http://standards.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html icon = QIcon.fromTheme(action_attributes['icon']) else: raise UserWarning('unknown icon type "%s"' % str(icontype)) action.setIcon(icon) if 'statustip' in action_attributes: action.setStatusTip(action_attributes['statustip'])
class PluginMenu(QObject): """Menu of available plugins to load and running plugin instances to unload.""" load_plugin_signal = Signal(str) unload_plugin_signal = Signal(str) def __init__(self, menu_bar, plugin_manager): super(PluginMenu, self).__init__() self.setObjectName('PluginMenu') plugin_menu = menu_bar.addMenu(menu_bar.tr('&Plugins')) running_menu = menu_bar.addMenu(menu_bar.tr('&Running')) self._plugin_menu_manager = MenuManager(plugin_menu) self._plugin_mapper = QSignalMapper(plugin_menu) self._plugin_mapper.mapped[str].connect(self.load_plugin_signal) self._running_menu_manager = MenuManager(running_menu) self._running_mapper = QSignalMapper(running_menu) self._running_mapper.mapped[str].connect(self.unload_plugin_signal) self._instances = {} def add_plugin(self, plugin_descriptor): base_path = plugin_descriptor.attributes().get('plugin_path') menu_manager = self._plugin_menu_manager # create submenus for group in plugin_descriptor.groups(): label = group['label'] if menu_manager.contains_menu(label): submenu = menu_manager.get_menu(label) else: submenu = QMenu(label, menu_manager.menu) menu_action = submenu.menuAction() self._enrich_action(menu_action, group, base_path) menu_manager.add_item(submenu) menu_manager = MenuManager(submenu) # create action action_attributes = plugin_descriptor.action_attributes() action = QAction(action_attributes['label'], menu_manager.menu) self._enrich_action(action, action_attributes, base_path) self._plugin_mapper.setMapping(action, plugin_descriptor.plugin_id()) action.triggered.connect(self._plugin_mapper.map) not_available = plugin_descriptor.attributes().get('not_available') if not_available: action.setEnabled(False) action.setStatusTip( self.tr('Plugin is not available: %s') % not_available) # add action to menu menu_manager.add_item(action) def add_plugin_prefix(self, plugin_descriptor): action_attributes = plugin_descriptor.action_attributes() action = QAction(action_attributes['label'], self._plugin_menu_manager.menu) self._enrich_action(action, action_attributes) self._plugin_mapper.setMapping(action, plugin_descriptor.plugin_id()) action.triggered.connect(self._plugin_mapper.map) self._plugin_menu_manager.add_prefix(action) def add_instance(self, plugin_descriptor, instance_id): action_attributes = plugin_descriptor.action_attributes() # create action label = self.tr('Close:') + ' ' + action_attributes['label'] if instance_id.serial_number != 1: label = label + ' (%s)' % str(instance_id.serial_number) action = QAction(label, self._running_menu_manager.menu) base_path = plugin_descriptor.attributes().get('plugin_path') self._enrich_action(action, action_attributes, base_path) self._running_mapper.setMapping(action, str(instance_id)) action.triggered.connect(self._running_mapper.map) self._running_menu_manager.add_item(action) self._instances[instance_id] = action def remove_instance(self, instance_id): action = self._instances[instance_id] self._running_mapper.removeMappings(action) self._running_menu_manager.remove_item(action) def _enrich_action(self, action, action_attributes, base_path=None): if 'icon' in action_attributes and action_attributes[ 'icon'] is not None: icon = get_icon(action_attributes['icon'], action_attributes.get('icontype', None), base_path) action.setIcon(icon) if 'statustip' in action_attributes: action.setStatusTip(action_attributes['statustip'])