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
|
# (C) Copyright 2005-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!
from pyface.action.api import Action, Group
from traits.api import Any, List, Instance, Property, Str, observe
from pyface.tasks.task import Task
class TaskToggleAction(Action):
""" An action for activating a task.
"""
# 'Action' interface ---------------------------------------------------
#: The user-visible name of the action, matches the task name.
name = Property(Str, observe="task.name")
#: The action is a toggle menu item.
style = "toggle"
#: The tooltip to display for the menu item.
tooltip = Property(Str, observe="name")
# 'TaskToggleAction' interface -----------------------------------------
#: The Task with which the action is associated.
task = Instance(Task)
# ------------------------------------------------------------------------
# 'Action' interface.
# ------------------------------------------------------------------------
def destroy(self):
# Make sure that we are not listening to changes in the task anymore
# In traits style, we will set the basic object to None and have the
# listener check that if it is still there.
self.task = None
super().destroy()
def perform(self, event=None):
window = self.task.window
window.activate_task(self.task)
# ------------------------------------------------------------------------
# Private interface.
# ------------------------------------------------------------------------
def _get_name(self):
if self.task is None:
return "UNDEFINED"
return self.task.name
def _get_tooltip(self):
return "Switch to the %s task." % self.name
@observe("task.window.active_task")
def _update_checked(self, event):
if self.task:
window = self.task.window
self.checked = (
window is not None and window.active_task == self.task
)
class TaskToggleGroup(Group):
""" A menu for changing the active task in a task window.
"""
# 'ActionManager' interface --------------------------------------------
id = "TaskToggleGroup"
items = List()
# 'TaskToggleGroup' interface ------------------------------------------
#: The ActionManager to which the group belongs.
manager = Any()
#: The window that contains the group.
window = Instance("pyface.tasks.task_window.TaskWindow")
# ------------------------------------------------------------------------
# Private interface.
# ------------------------------------------------------------------------
def _get_items(self):
from pyface.action.api import ActionItem
items = []
if len(self.window.tasks) > 1:
# at least two tasks, so something to toggle
items = [
ActionItem(action=TaskToggleAction(task=task))
for task in self.window.tasks
]
return items
def _rebuild(self, event):
# Clear out the old group, then build the new one.
self.destroy()
self.items = self._get_items()
# Inform our manager that it needs to be rebuilt.
self.manager.changed = True
# Trait initializers ---------------------------------------------------
def _items_default(self):
self.window.observe(self._rebuild, "tasks.items")
return self._get_items()
def _manager_default(self):
manager = self
while isinstance(manager, Group):
manager = manager.parent
return manager
def _window_default(self):
return self.manager.controller.task.window
|