1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
|
# (C) Copyright 2007-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
# Enthought library imports.
from traits.api import Callable, Instance, List
from envisage.api import ExtensionPoint, Plugin, ServiceOffer
# Local imports.
from .preferences_category import PreferencesCategory
# Constants.
PKG = ".".join(__name__.split(".")[:-1])
class TasksPlugin(Plugin):
"""The Envisage Tasks plugin.
The Tasks plugin uses Pyface Tasks to provide an extensible framework for
building user interfaces. For more information, see the Tasks User Manual.
"""
# The IDs of the extension point that this plugin offers.
PREFERENCES_CATEGORIES = PKG + ".preferences_categories"
PREFERENCES_PANES = PKG + ".preferences_panes"
TASKS = PKG + ".tasks"
TASK_EXTENSIONS = PKG + ".task_extensions"
# The IDs of the extension points that this plugin contributes to.
SERVICE_OFFERS = "envisage.service_offers"
#### 'IPlugin' interface ##################################################
#: The plugin's unique identifier.
id = "envisage.ui.tasks"
#: The plugin's name (suitable for displaying to the user).
name = "Tasks"
#### Extension points offered by this plugin ##############################
#: Contributed preference categories. Contributions to this extension
#: point must have type ``PreferencesCategory``. Preference categories
#: will be created automatically if necessary; this extension point is
#: useful when ensuring that a category is inserted at a specific location.
preferences_categories = ExtensionPoint(
List(PreferencesCategory),
id=PREFERENCES_CATEGORIES,
desc="""
This extension point makes preference categories available to the
application. Note that preference categories will be created
automatically if necessary; this extension point is useful when one
wants to ensure that a category is inserted at a specific location.
""",
)
#: Contributed preference pane factories. Each contribution to this
#: extension point must be a callable with the signature
#: ``callable(**traits) -> PreferencePane``.
preferences_panes = ExtensionPoint(
List(Callable),
id=PREFERENCES_PANES,
desc="""
A preferences pane appears in the preferences dialog to allow the user
manipulate certain preference values.
Each contribution to this extension point must be a factory that
creates a preferences pane, where 'factory' means any callable with the
following signature::
callable(**traits) -> PreferencesPane
The easiest way to contribute such a factory is to create a class
that derives from 'envisage.ui.tasks.api.PreferencesPane'.
""",
)
#: Contributed task factories. Contributions to this extension point
#: must have type ``TaskFactory``.
tasks = ExtensionPoint(
List(Instance("envisage.ui.tasks.task_factory.TaskFactory")),
id=TASKS,
desc="""
This extension point makes tasks avaiable to the application.
Each contribution to the extension point must be an instance of
'envisage.tasks.api.TaskFactory.
""",
)
#: Contributed task extensions. Contributions to this extension point
#: must have type ``TaskExtension``.
task_extensions = ExtensionPoint(
List(Instance("envisage.ui.tasks.task_extension.TaskExtension")),
id=TASK_EXTENSIONS,
desc="""
This extension point permits the contribution of new actions and panes
to existing tasks (without creating a new task).
Each contribution to the extension point must be an instance of
'envisage.tasks.api.TaskExtension'.
""",
)
#### Contributions to extension points made by this plugin ################
my_service_offers = List(contributes_to=SERVICE_OFFERS)
def _my_service_offers_default(self):
preferences_dialog_service_offer = ServiceOffer(
protocol="envisage.ui.tasks.preferences_dialog.PreferencesDialog",
factory=self._create_preferences_dialog_service,
)
return [preferences_dialog_service_offer]
my_task_extensions = List(contributes_to=TASK_EXTENSIONS)
def _my_task_extensions_default(self):
from pyface.tasks.action.api import DockPaneToggleGroup, SchemaAddition
from .action.exit_action import ExitAction
from .action.preferences_action import PreferencesGroup
from .task_extension import TaskExtension
actions = [
SchemaAddition(id="Exit", factory=ExitAction, path="MenuBar/File"),
SchemaAddition(
id="Preferences", factory=PreferencesGroup, path="MenuBar/Edit"
),
SchemaAddition(
id="DockPaneToggleGroup",
factory=DockPaneToggleGroup,
path="MenuBar/View",
),
]
return [TaskExtension(actions=actions)]
###########################################################################
# Private interface.
###########################################################################
def _create_preferences_dialog_service(self):
"""Factory method for preferences dialog service."""
from .preferences_dialog import PreferencesDialog
dialog = PreferencesDialog(application=self.application)
dialog.trait_set(
categories=self.preferences_categories,
panes=[
factory(dialog=dialog) for factory in self.preferences_panes
],
)
return dialog
|