annotate bGrease/mode.py @ 120:adbcdb900fa9

Modified InventoryGrid to set a name for each slot containing the index. Added getSlot method to InventoryGrid. Renamed InventoryGUI class to CharacterGUI. Added InventoryGUI class which handles the inventory part of the CharacterGUI. An InventoryGUI instance is now created in CharacterGUI.
author KarstenBock@gmx.net
date Wed, 05 Oct 2011 12:59:22 +0200
parents ff3e395abf91
children a6bbb732b27b
rev   line source
5
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
1 #############################################################################
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
2 #
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
3 # Copyright (c) 2010 by Casey Duncan and contributors
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
4 # All Rights Reserved.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
5 #
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
6 # This software is subject to the provisions of the MIT License
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
7 # A copy of the license should accompany this distribution.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
8 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
9 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
10 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
11 #
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
12 #############################################################################
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
13 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
14 Modes manage the state and transition between different application modes.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
15 Typically such modes are presented as different screens that the user can
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
16 navigate between, similar to the way a browser navigates web pages. Individual
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
17 modes may be things like:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
18
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
19 - Title screen
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
20 - Options dialog
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
21 - About screen
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
22 - In-progress game
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
23 - Inventory interface
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
24
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
25 The modal framework provides a simple mechanism to ensure that modes are
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
26 activated and deactivated properly. An activated mode is running and receives
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
27 events. A deactivated mode is paused and does not receive events.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
28
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
29 Modes may be managed as a *last-in-first-out* stack, or as a list, or ring
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
30 of modes in sequence, or some combination of all.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
31
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
32 For example usage see: :ref:`the mode section of the tutorial <tut-mode-section>`.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
33 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
34
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
35 __version__ = '$Id$'
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
36
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
37 import abc
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
38
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
39
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
40 class BaseManager(object):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
41 """Mode manager abstract base class.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
42
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
43 The mode manager keeps a stack of modes where a single mode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
44 is active at one time. As modes are pushed on and popped from
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
45 the stack, the mode at the top is always active. The current
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
46 active mode receives events from the manager's event dispatcher.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
47 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
48
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
49 modes = ()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
50 """The mode stack sequence. The last mode in the stack is
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
51 the current active mode. Read-only.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
52 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
53
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
54 @property
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
55 def current_mode(self):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
56 """The current active mode or ``None``. Read-only"""
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
57 try:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
58 return self.modes[-1]
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
59 except IndexError:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
60 return None
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
61
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
62 def on_last_mode_pop(self, mode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
63 """Hook executed when the last mode is popped from the manager.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
64 Implementing this method is optional for subclasses.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
65
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
66 :param mode: The :class:`Mode` object just popped from the manager
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
67 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
68
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
69 def activate_mode(self, mode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
70 """Perform actions to activate a node
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
71
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
72 :param mode: The :class: 'Mode' object to activate
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
73 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
74 mode.activate(self)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
75
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
76 def deactivate_mode(self, mode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
77 """Perform actions to deactivate a node
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
78
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
79 :param mode: The :class: 'Mode' object to deactivate
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
80 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
81 mode.deactivate(self)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
82
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
83
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
84 def push_mode(self, mode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
85 """Push a mode to the top of the mode stack and make it active
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
86
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
87 :param mode: The :class:`Mode` object to make active
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
88 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
89 current = self.current_mode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
90 if current is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
91 self.deactivate_mode(current)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
92 self.modes.append(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
93 self.activate_mode(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
94
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
95 def pop_mode(self):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
96 """Pop the current mode off the top of the stack and deactivate it.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
97 The mode now at the top of the stack, if any is then activated.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
98
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
99 :param mode: The :class:`Mode` object popped from the stack
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
100 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
101 mode = self.modes.pop()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
102 mode.deactivate(self)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
103 current = self.current_mode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
104 if current is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
105 self.activate_mode(current)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
106 else:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
107 self.on_last_mode_pop(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
108 return mode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
109
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
110 def swap_modes(self, mode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
111 """Exchange the specified mode with the mode at the top of the stack.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
112 This is similar to popping the current mode and pushing the specified
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
113 one, but without activating the previous mode on the stack or
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
114 executing :meth:`on_last_mode_pop()` if there is no previous mode.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
115
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
116 :param mode: The :class:`Mode` object that was deactivated and replaced.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
117 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
118 old_mode = self.modes.pop()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
119 self.deactivate_mode(old_mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
120 self.modes.append(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
121 self.activate_mode(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
122 return old_mode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
123
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
124 def remove_mode(self, mode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
125 """Remove the specified mode. If the mode is at the top of the stack,
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
126 this is equivilent to :meth:`pop_mode()`. If not, no other modes
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
127 are affected. If the mode is not in the manager, do nothing.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
128
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
129 :param mode: The :class:`Mode` object to remove from the manager.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
130 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
131 if self.current_mode is mode:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
132 self.pop_mode()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
133 else:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
134 try:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
135 self.modes.remove(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
136 except ValueError:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
137 pass
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
138
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
139 class BaseMode(object):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
140 """Application mode very abstract base class
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
141 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
142 __metaclass__ = abc.ABCMeta
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
143
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
144 manager = None
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
145 """The :class:`BaseManager` that manages this mode"""
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
146
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
147 def __init__(self):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
148 self.active = False
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
149
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
150 def on_activate(self):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
151 """Being called when the Mode is activated"""
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
152 pass
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
153
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
154 def activate(self, mode_manager):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
155 """Activate the mode for the given mode manager, if the mode is already active,
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
156 do nothing
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
157
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
158 The default implementation schedules time steps at :attr:`step_rate` per
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
159 second, sets the :attr:`manager` and sets the :attr:`active` flag to True.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
160 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
161 if not self.active:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
162 self.on_activate()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
163 self.manager = mode_manager
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
164 self.active = True
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
165
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
166 def on_deactivate(self):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
167 """Being called when the Mode is deactivated"""
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
168 pass
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
169
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
170 def deactivate(self, mode_manager):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
171 """Deactivate the mode, if the mode is not active, do nothing
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
172
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
173 The default implementation unschedules time steps for the mode and
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
174 sets the :attr:`active` flag to False.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
175 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
176 self.on_deactivate()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
177 self.active = False
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
178
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
179
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
180 class BaseMulti(BaseMode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
181 """A mode with multiple submodes. One submode is active at one time.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
182 Submodes can be switched to directly or switched in sequence. If
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
183 the Multi is active, then one submode is always active.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
184
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
185 Multis are useful when modes can switch in an order other than
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
186 a LIFO stack, such as in "hotseat" multiplayer games, a
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
187 "wizard" style ui, or a sequence of slides.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
188
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
189 Note unlike a normal :class:`Mode`, a :class:`Multi` doesn't have it's own
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
190 :attr:`clock` and :attr:`step_rate`. The active submode's are used
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
191 instead.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
192 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
193 active_submode = None
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
194 """The currently active submode"""
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
195
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
196 def __init__(self, *submodes):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
197 # We do not invoke the superclass __init__ intentionally
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
198 self.active = False
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
199 self.submodes = list(submodes)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
200
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
201 def add_submode(self, mode, before=None, index=None):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
202 """Add the submode, but do not make it active.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
203
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
204 :param mode: The :class:`Mode` object to add.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
205
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
206 :param before: The existing mode to insert the mode before.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
207 If the mode specified is not a submode, raise
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
208 ValueError.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
209
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
210 :param index: The place to insert the mode in the mode list.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
211 Only one of ``before`` or ``index`` may be specified.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
212
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
213 If neither ``before`` or ``index`` are specified, the
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
214 mode is appended to the end of the list.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
215 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
216 assert before is None or index is None, (
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
217 "Cannot specify both 'before' and 'index' arguments")
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
218 if before is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
219 index = self.submodes.index(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
220 if index is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
221 self.submodes.insert(index, mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
222 else:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
223 self.submodes.append(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
224
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
225 def remove_submode(self, mode=None):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
226 """Remove the submode.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
227
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
228 :param mode: The submode to remove, if omitted the active submode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
229 is removed. If the mode is not present, do nothing. If the
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
230 mode is active, it is deactivated, and the next mode, if any
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
231 is activated. If the last mode is removed, the :class:`Multi`
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
232 is removed from its manager.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
233 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
234 # TODO handle multiple instances of the same subnode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
235 if mode is None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
236 mode = self.active_submode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
237 elif mode not in self.submodes:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
238 return
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
239 next_mode = self.activate_next()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
240 self.submodes.remove(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
241 if next_mode is mode:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
242 if self.manager is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
243 self.manager.remove_mode(self)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
244 self._deactivate_submode()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
245
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
246 def activate_subnode(self, mode, before=None, index=None):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
247 """Activate the specified mode, adding it as a subnode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
248 if it is not already. If the mode is already the active
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
249 submode, do nothing.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
250
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
251 :param mode: The mode to activate, and add as necesary.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
252
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
253 :param before: The existing mode to insert the mode before
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
254 if it is not already a submode. If the mode specified is not
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
255 a submode, raise ValueError.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
256
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
257 :param index: The place to insert the mode in the mode list
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
258 if it is not already a submode. Only one of ``before`` or
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
259 ``index`` may be specified.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
260
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
261 If the mode is already a submode, the ``before`` and ``index``
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
262 arguments are ignored.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
263 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
264 if mode not in self.submodes:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
265 self.add_submode(mode, before, index)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
266 if self.active_submode is not mode:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
267 self._activate_submode(mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
268
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
269 def activate_next(self, loop=True):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
270 """Activate the submode after the current submode in order. If there
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
271 is no current submode, the first submode is activated.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
272
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
273 Note if there is only one submode, it's active, and `loop` is True
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
274 (the default), then this method does nothing and the subnode remains
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
275 active.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
276
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
277 :param loop: When :meth:`activate_next` is called
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
278 when the last submode is active, a True value for ``loop`` will
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
279 cause the first submode to be activated. Otherwise the
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
280 :class:`Multi` is removed from its manager.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
281 :type loop: bool
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
282
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
283 :return:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
284 The submode that was activated or None if there is no
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
285 other submode to activate.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
286 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
287 assert self.submodes, "No submode to activate"
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
288 next_mode = None
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
289 if self.active_submode is None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
290 next_mode = self.submodes[0]
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
291 else:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
292 last_mode = self.active_submode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
293 index = self.submodes.index(last_mode) + 1
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
294 if index < len(self.submodes):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
295 next_mode = self.submodes[index]
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
296 elif loop:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
297 next_mode = self.submodes[0]
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
298 self._activate_submode(next_mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
299 return next_mode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
300
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
301 def activate_previous(self, loop=True):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
302 """Activate the submode before the current submode in order. If there
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
303 is no current submode, the last submode is activated.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
304
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
305 Note if there is only one submode, it's active, and `loop` is True
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
306 (the default), then this method does nothing and the subnode remains
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
307 active.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
308
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
309 :param loop: When :meth:`activate_previous` is called
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
310 when the first submode is active, a True value for ``loop`` will
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
311 cause the last submode to be activated. Otherwise the
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
312 :class:`Multi` is removed from its manager.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
313 :type loop: bool
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
314
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
315 :return:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
316 The submode that was activated or None if there is no
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
317 other submode to activate.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
318 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
319 assert self.submodes, "No submode to activate"
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
320 prev_mode = None
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
321 if self.active_submode is None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
322 prev_mode = self.submodes[-1]
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
323 else:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
324 last_mode = self.active_submode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
325 index = self.submodes.index(last_mode) - 1
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
326 if loop or index >= 0:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
327 prev_mode = self.submodes[index]
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
328 self._activate_submode(prev_mode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
329 return prev_mode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
330
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
331 def _set_active_submode(self, submode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
332 self.active_submode = submode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
333 self.step_rate = submode.step_rate
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
334
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
335 def _activate_submode(self, submode):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
336 """Activate a submode deactivating any current submode. If the Multi
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
337 itself is active, this happens immediately, otherwise the actual
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
338 activation is deferred until the Multi is activated. If the submode
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
339 is None, the Mulitmode is removed from its manager.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
340
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
341 If submode is already the active submode, do nothing.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
342 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
343 if self.active_submode is submode:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
344 return
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
345 assert submode in self.submodes, "Unknown submode"
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
346 self._deactivate_submode()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
347 self._set_active_submode(submode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
348 if submode is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
349 if self.active:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
350 self.manager.activate_mode(submode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
351 else:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
352 if self.manager is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
353 self.manager.remove_mode(self)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
354
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
355 def clear_subnode(self):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
356 """Clear any subnmode data"""
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
357 self.active_submode = None
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
358 self.step_rate = None
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
359
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
360 def _deactivate_submode(self, clear_subnode=True):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
361 """Deactivate the current submode, if any. if `clear_subnode` is
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
362 True, `active_submode` is always None when this method returns
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
363 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
364 if self.active_submode is not None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
365 if self.active:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
366 self.manager.deactivate_mode(self.active_submode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
367 if clear_subnode:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
368 self.clear_subnode()
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
369
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
370 def activate(self, mode_manager):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
371 """Activate the :class:`Multi` for the specified manager. The
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
372 previously active submode of the :class:`Multi` is activated. If there
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
373 is no previously active submode, then the first submode is made active.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
374 A :class:`Multi` with no submodes cannot be activated
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
375 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
376 assert self.submodes, "No submode to activate"
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
377 self.manager = mode_manager
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
378 if self.active_submode is None:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
379 self._set_active_submode(self.submodes[0])
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
380 else:
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
381 self._set_active_submode(self.active_submode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
382 self.manager.activate_mode(self.active_submode)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
383 super(BaseMulti, self).activate(mode_manager)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
384
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
385 def deactivate(self, mode_manager):
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
386 """Deactivate the :class:`Multi` for the specified manager.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
387 The `active_submode`, if any, is deactivated.
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
388 """
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
389 self._deactivate_submode(clear_subnode=False)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
390 super(BaseMulti, self).deactivate(mode_manager)
bc88f7d5ca8b Added base files for grease
KarstenBock@gmx.net
parents:
diff changeset
391