Пример #1
0
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()
Пример #3
0
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'])
Пример #4
0
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'])
Пример #5
0
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'])