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
|
""" The 'View' menu """
# Standard library imports.
import logging
# Enthought library imports.
from enthought.pyface.action.api import Group, MenuManager
from enthought.traits.api import Any, Bool, Instance, List, Str, Unicode
from enthought.traits.api import on_trait_change
# Local imports.
from perspective_menu_manager import PerspectiveMenuManager
from show_view_action import ShowViewAction
from toggle_view_visibility_action import ToggleViewVisibilityAction
# Logging.
logger = logging.getLogger(__name__)
class ViewMenuManager(MenuManager):
""" The 'View' menu.
By default, this menu is displayed on the main menu bar.
"""
#### 'ActionManager' interface ############################################
# All of the groups in the manager.
groups = List(Group)
# The manager's unique identifier (if it has one).
id = Str('View')
#### 'MenuManager' interface ##############################################
# The menu manager's name (if the manager is a sub-menu, this is what its
# label will be).
name = Unicode('&View')
#### 'ViewMenuManager' interface ##########################################
# Should the perspective menu be shown?
show_perspective_menu = Bool(True)
# The workbench window that the menu is part of.
window = Instance('enthought.pyface.workbench.api.WorkbenchWindow')
#### 'Private' interface ##################################################
# The group containing the view hide/show actions.
_view_group = Any
###########################################################################
# 'ActionManager' interface.
###########################################################################
def _groups_default(self):
""" Trait initializer. """
groups = []
# Add a group containing the perspective menu (if requested).
if self.show_perspective_menu and len(self.window.perspectives) > 0:
groups.append(Group(PerspectiveMenuManager(window=self.window)))
# Add a group containing a 'toggler' for all visible views.
self._view_group = self._create_view_group(self.window)
groups.append(self._view_group)
# Add a group containing an 'Other...' item that will launch a dialog
# to allow the user to choose a view to show.
groups.append(self._create_other_group(self.window))
return groups
###########################################################################
# 'ViewMenuManager' interface.
###########################################################################
@on_trait_change(
'window.active_perspective,window.active_part,'
'window.views,window.views_items'
)
def refresh(self):
""" Refreshes the checked state of the actions in the menu. """
logger.debug('refreshing view menu')
if self._view_group is not None:
self._clear_group(self._view_group)
self._initialize_view_group(self.window, self._view_group)
self.changed = True
return
###########################################################################
# Private interface.
###########################################################################
def _clear_group(self, group):
""" Remove all items in a group. """
# fixme: Fix this API in PyFace so there is only one call!
group.destroy()
group.clear()
return
def _create_other_group(self, window):
""" Creates a group containing the 'Other...' action. """
group = Group()
group.append(ShowViewAction(name='Other...', window=window))
return group
def _create_view_group(self, window):
""" Creates a group containing the view 'togglers'. """
group = Group()
self._initialize_view_group(window, group)
return group
def _initialize_view_group(self, window, group):
""" Initializes a group containing the view 'togglers'. """
views = window.views[:]
views.sort(None, lambda view: view.name)
for view in views:
# fixme: It seems a little smelly to be reaching in to the window
# layout here. Should the 'contains_view' method be part of the
# window interface?
if window.layout.contains_view(view):
group.append(
ToggleViewVisibilityAction(view=view, window=window)
)
return
#### EOF ######################################################################
|