Merge lp:~mblayman/entertainer/translate-events into lp:entertainer
- translate-events
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Samuel Buffet |
Approved revision: | 362 |
Merged at revision: | not available |
Proposed branch: | lp:~mblayman/entertainer/translate-events |
Merge into: | lp:entertainer |
Diff against target: | None lines |
To merge this branch: | bzr merge lp:~mblayman/entertainer/translate-events |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Samuel Buffet (community) | Approve | ||
Review via email: mp+6953@code.launchpad.net |
Commit message
Screen can now use an callback to return to their previous screen.
Description of the change
Matt Layman (mblayman) wrote : | # |
Matt Layman (mblayman) wrote : | # |
I should add that the name of this branch is a complete misnomer. I was planning to do something else with this branch and the refactoring that I started out with was just something I did during my initial analysis.
Samuel Buffet (samuel-buffet) wrote : | # |
Matt,
I'm okay with the 2 goals of this branch.
This branch will lead me to change my callback variable name in "back_button" but there's no compatibility issues.
In "back_button" it's just handled on the Screen Class and wrapped in a "screen_back" method because I need that on every screen.
Bellow some minor comments :
=== modified file 'entertainerlib
--- entertainerlib/
+++ entertainerlib/
@@ -1,69 +1,35 @@
# Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2
'''Stack container for screen objects'''
> def is_empty(self):
>- """
>- Is screen history empty.
>- @return boolean value. True if history is empty, otherwise False.
>- """
>+ '''Is screen history empty'''
> if len(self.screens) == 0:
> return True
> else:
> return False
>
Maybe a @property makes sense here instead of a method call to fit with the recent changes we've made.
The docstring needs a full stop.
Thanks,
Samuel-
- 361. By Matt Layman
-
is_empty is now a property.
- 362. By Matt Layman
-
Fixed the EntertainerTest name.
Matt Layman (mblayman) wrote : | # |
Samuel,
> > def is_empty(self):
> >- """
> >- Is screen history empty.
> >- @return boolean value. True if history is empty, otherwise False.
> >- """
> >+ '''Is screen history empty'''
> > if len(self.screens) == 0:
> > return True
> > else:
> > return False
> >
>
> Maybe a @property makes sense here instead of a method call to fit with the
> recent changes we've made.
> The docstring needs a full stop.
is_empty is now a property (and I threw in a new test case to boot). Here is the partial diff:
matt@eden:
=== modified file 'entertainerlib
--- entertainerlib/
+++ entertainerlib/
@@ -26,8 +26,9 @@
return None
return self.screens.pop()
+ @property
def is_empty(self):
- '''Is screen history empty'''
+ '''Return a boolean indicating if the screen history is empty.'''
if len(self.screens) == 0:
return True
else:
=== modified file 'entertainerlib
--- entertainerlib/
+++ entertainerlib/
@@ -351,7 +351,7 @@
def _handle_
'''Handle UserEvent.
- if not self.history.
+ if not self.history.
def _handle_
=== added file 'entertainerlib
--- entertainerlib/
+++ entertainerlib/
@@ -0,0 +1,26 @@
+# Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2
+'''Tests ScreenHistory'''
+
+from entertainerlib.
+from entertainerlib.
+from entertainerlib.
+
+class ScreenHistoryTe
+ '''Test for entertainerlib.
+
+ def setUp(self):
+ EntertainerTest
+
+ self.screen_history = ScreenHistory(None)
+
+ def test_create(self):
+ '''Test correct ScreenHistory initialization.'''
+ self.assertTrue
+
+ def test_is_
+ '''Test the is_empty property.'''
+ self.assertTrue
+ screen = Screen()
+ self.screen_
+ self.assertFals
+
Preview Diff
1 | === modified file 'entertainerlib/frontend/gui/screen_history.py' |
2 | --- entertainerlib/frontend/gui/screen_history.py 2009-05-06 03:40:22 +0000 |
3 | +++ entertainerlib/frontend/gui/screen_history.py 2009-06-02 01:16:03 +0000 |
4 | @@ -1,69 +1,35 @@ |
5 | # Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2 |
6 | '''Stack container for screen objects''' |
7 | |
8 | -class ScreenHistory: |
9 | - """ |
10 | - ScreenHistory contains latest screens. History is a stack container. |
11 | - |
12 | - This class is a simple container for Screen objects. It contains all |
13 | - recently used screens and allows user to get previous screen from the |
14 | - stack. |
15 | - """ |
16 | - |
17 | - def __init__(self, stage, size): |
18 | - """ |
19 | - Initialize screen history. |
20 | - @param stage: Stage object |
21 | - """ |
22 | - self.size = size # How many screens we keep in memory |
23 | - self.screens = [] # Screen stack (contains Screen objects) |
24 | - self.stage = stage |
25 | - |
26 | - def __len__(self): |
27 | - return len(self.screens) |
28 | +from entertainerlib.utils.configuration import Configuration |
29 | + |
30 | +class ScreenHistory(object): |
31 | + '''ScreenHistory contains the latest screens in is a stack.''' |
32 | + |
33 | + def __init__(self, remove_from_stage_callback): |
34 | + self.config = Configuration() |
35 | + self.screens = [] |
36 | + self.remove_from_stage_callback = remove_from_stage_callback |
37 | |
38 | def add_screen(self, screen): |
39 | - """ |
40 | - Add screen to the history. Push screen into screen stack. |
41 | - @param screen: Screen object that is added to the history stack |
42 | - """ |
43 | - if len(self.screens) < self.size: |
44 | + '''Push the provided screen onto the history stack.''' |
45 | + if len(self.screens) < self.config.history_size(): |
46 | self.screens.append(screen) |
47 | else: |
48 | - self.stage.remove(self.screens[0]) # Remove from stage |
49 | + self.remove_from_stage_callback(self.screens[0]) |
50 | del self.screens[0] # Drop the oldest screen from the history |
51 | self.screens.append(screen) |
52 | |
53 | def get_screen(self): |
54 | - """ |
55 | - Get most recent screen from the history. Pops screen from screen stack |
56 | - @return Screen object from history stack |
57 | - """ |
58 | + '''Get the latest screen and pop it from the stack.''' |
59 | if len(self.screens) == 0: |
60 | return None |
61 | return self.screens.pop() |
62 | |
63 | def is_empty(self): |
64 | - """ |
65 | - Is screen history empty. |
66 | - @return boolean value. True if history is empty, otherwise False. |
67 | - """ |
68 | + '''Is screen history empty''' |
69 | if len(self.screens) == 0: |
70 | return True |
71 | else: |
72 | return False |
73 | |
74 | - def get_number_of_screens(self): |
75 | - """ |
76 | - Get number of screens in history. |
77 | - @return integer - Number of screens |
78 | - """ |
79 | - return len(self.screens) |
80 | - |
81 | - def get_all_screens(self): |
82 | - """ |
83 | - Get all screens from the history. Latest screen is the last one. |
84 | - @return List of Screen objects |
85 | - """ |
86 | - return self.screens |
87 | - |
88 | |
89 | === modified file 'entertainerlib/frontend/gui/screens/factory.py' |
90 | --- entertainerlib/frontend/gui/screens/factory.py 2009-04-28 22:30:06 +0000 |
91 | +++ entertainerlib/frontend/gui/screens/factory.py 2009-06-02 01:16:03 +0000 |
92 | @@ -25,8 +25,8 @@ |
93 | '''Generate a screen based on the type provided.''' |
94 | |
95 | def __init__(self, feed_library, image_library, music_library, |
96 | - video_library, media_player, screen_history, |
97 | - move_to_new_screen_callback, change_screen_callback): |
98 | + video_library, media_player, move_to_new_screen_callback, |
99 | + move_to_previous_screen_callback): |
100 | '''All the possible common things that a screen could use to initialize |
101 | are factory instance variables. Any additional specific information |
102 | needed for a screen will be provided in a dictionary that is received |
103 | @@ -37,9 +37,8 @@ |
104 | self.music_library = music_library |
105 | self.video_library = video_library |
106 | self.media_player = media_player |
107 | - self.screen_history = screen_history |
108 | self.move_to_new_screen_callback = move_to_new_screen_callback |
109 | - self.change_screen_callback = change_screen_callback |
110 | + self.move_to_previous_screen_callback = move_to_previous_screen_callback |
111 | |
112 | def generate_screen(self, screen_type, kwargs=None): |
113 | '''Generate the proper screen by delegating to the proper generator.''' |
114 | @@ -145,8 +144,8 @@ |
115 | |
116 | def _generate_question(self, kwargs): |
117 | '''Generate a Question screen.''' |
118 | - kwargs['change_screen_callback'] = self.change_screen_callback |
119 | - kwargs['screen_history'] = self.screen_history |
120 | + kwargs['move_to_previous_screen_callback'] = \ |
121 | + self.move_to_previous_screen_callback |
122 | return Question(**kwargs) |
123 | |
124 | def _generate_rss(self, kwargs): |
125 | |
126 | === modified file 'entertainerlib/frontend/gui/screens/question.py' |
127 | --- entertainerlib/frontend/gui/screens/question.py 2009-05-06 01:35:19 +0000 |
128 | +++ entertainerlib/frontend/gui/screens/question.py 2009-06-02 01:16:03 +0000 |
129 | @@ -2,7 +2,6 @@ |
130 | '''Question - Screen displays a question label and specified buttons.''' |
131 | |
132 | from entertainerlib.frontend.gui.screens.screen import Screen |
133 | -from entertainerlib.frontend.gui.transitions.transition import Transition |
134 | from entertainerlib.frontend.gui.widgets.label import Label |
135 | from entertainerlib.frontend.gui.widgets.text_menu import TextMenu |
136 | from entertainerlib.frontend.gui.widgets.text_menu_item import TextMenuItem |
137 | @@ -11,14 +10,11 @@ |
138 | '''Screen is displayed when the application needs to ask a close ended |
139 | question to the user.''' |
140 | |
141 | - def __init__(self, screen_history, change_screen_callback, question, |
142 | + def __init__(self, move_to_previous_screen_callback, question, |
143 | answers, callbacks=None): |
144 | Screen.__init__(self, 'Question') |
145 | |
146 | - self.theme = self.config.theme |
147 | - |
148 | - self.screen_history = screen_history |
149 | - self.change_screen_callback = change_screen_callback |
150 | + self.move_to_previous_screen_callback = move_to_previous_screen_callback |
151 | self.answers = answers |
152 | |
153 | if callbacks is None: |
154 | @@ -36,7 +32,7 @@ |
155 | |
156 | def display_answers(self): |
157 | '''Display a menu with answers on the screen.''' |
158 | - self.menu = TextMenu(self.theme, self.config.show_effects()) |
159 | + self.menu = TextMenu(self.config.theme, self.config.show_effects()) |
160 | self.menu.set_name("questionmenu") |
161 | self.menu.set_row_count(1) |
162 | self.menu.set_visible_column_count(7) |
163 | @@ -65,9 +61,7 @@ |
164 | |
165 | def go_back(self): |
166 | '''Go back to previous screen''' |
167 | - screen = self.screen_history.get_screen() |
168 | - screen.update() |
169 | - self.change_screen_callback(screen, Transition.BACKWARD) |
170 | + self.move_to_previous_screen_callback() |
171 | |
172 | def _move_menu(self, menu_direction): |
173 | '''Move the menu in the given direction.''' |
174 | |
175 | === modified file 'entertainerlib/frontend/gui/user_interface.py' |
176 | --- entertainerlib/frontend/gui/user_interface.py 2009-05-09 17:03:51 +0000 |
177 | +++ entertainerlib/frontend/gui/user_interface.py 2009-06-02 01:16:03 +0000 |
178 | @@ -88,7 +88,7 @@ |
179 | self.is_fullscreen = False |
180 | |
181 | # Initialize Screen history (allows user to navigate "back") |
182 | - self.history = ScreenHistory(self.stage, self.config.history_size()) |
183 | + self.history = ScreenHistory(self._remove_from_stage) |
184 | |
185 | self.player = MediaPlayer(self.stage, |
186 | self.config.get_stage_width(), self.config.get_stage_height()) |
187 | @@ -109,8 +109,7 @@ |
188 | # Screen factory to create new screens |
189 | self.screen_factory = ScreenFactory( |
190 | feed_library, image_library, music_library, video_library, |
191 | - self.player, self.history, |
192 | - self.move_to_new_screen, self.change_screen) |
193 | + self.player, self.move_to_new_screen, self.move_to_previous_screen) |
194 | |
195 | def default_key_to_user_event(): |
196 | '''Return the default user event provided by an unmapped keyboard |
197 | @@ -235,6 +234,12 @@ |
198 | screen = self.create_screen(screen_type, kwargs) |
199 | self.change_screen(screen, transition) |
200 | |
201 | + def move_to_previous_screen(self): |
202 | + '''Callback method to return to the previous screen in history.''' |
203 | + screen = self.history.get_screen() |
204 | + screen.update() |
205 | + self.change_screen(screen, Transition.BACKWARD) |
206 | + |
207 | def show(self): |
208 | '''Show the user interface.''' |
209 | self.window.show_all() |
210 | @@ -347,9 +352,7 @@ |
211 | def _handle_navigate_back(self, event): |
212 | '''Handle UserEvent.NAVIGATE_BACK.''' |
213 | if not self.history.is_empty(): |
214 | - screen = self.history.get_screen() |
215 | - screen.update() |
216 | - self.change_screen(screen, Transition.BACKWARD) |
217 | + self.move_to_previous_screen() |
218 | |
219 | def _handle_navigate_home(self, event): |
220 | '''Handle UserEvent.NAVIGATE_HOME.''' |
221 | |
222 | === modified file 'entertainerlib/tests/test_screenfactory.py' |
223 | --- entertainerlib/tests/test_screenfactory.py 2009-04-28 22:30:06 +0000 |
224 | +++ entertainerlib/tests/test_screenfactory.py 2009-06-02 01:16:03 +0000 |
225 | @@ -51,7 +51,7 @@ |
226 | media_player = MockMediaPlayer() |
227 | video_library = MockVideoLibrary() |
228 | self.factory = ScreenFactory(feed_library, image_libary, music_library, |
229 | - video_library, media_player, None, None, None) |
230 | + video_library, media_player, None, None) |
231 | |
232 | self.kwargs = {} |
233 | |
234 | |
235 | === modified file 'entertainerlib/tests/test_userinterface.py' |
236 | --- entertainerlib/tests/test_userinterface.py 2009-05-06 01:35:19 +0000 |
237 | +++ entertainerlib/tests/test_userinterface.py 2009-06-02 01:16:03 +0000 |
238 | @@ -4,10 +4,12 @@ |
239 | import clutter |
240 | |
241 | from entertainerlib.frontend.gui.screens.question import Question |
242 | +from entertainerlib.frontend.gui.transitions.transition import Transition |
243 | from entertainerlib.frontend.gui.user_event import UserEvent |
244 | from entertainerlib.frontend.gui.user_interface import UserInterface |
245 | from entertainerlib.tests import EntertainerTest |
246 | from entertainerlib.tests.mock import MockClutterKeyboardEvent |
247 | +from entertainerlib.tests.mock import MockFeedLibrary |
248 | |
249 | class UserInterfaceTest(EntertainerTest): |
250 | '''Test for entertainerlib.frontend.gui.user_interface''' |
251 | @@ -15,7 +17,8 @@ |
252 | def setUp(self): |
253 | EntertainerTest.setUp(self) |
254 | |
255 | - self.ui = UserInterface(None, None, None, None, None) |
256 | + feed_library = MockFeedLibrary() |
257 | + self.ui = UserInterface(feed_library, None, None, None, None) |
258 | |
259 | def test_create(self): |
260 | '''Test correct UserInterface initialization''' |
261 | @@ -36,9 +39,19 @@ |
262 | bad_event = MockClutterKeyboardEvent(-1) |
263 | self.ui.handle_keyboard_event(None, bad_event, mock_event_handler) |
264 | |
265 | + def test_move_to_previous_screen(self): |
266 | + '''Test the ability to return to a previous screen.''' |
267 | + self.ui.current = self.ui.create_screen('main') |
268 | + old_screen = self.ui.current |
269 | + screen = self.ui.create_screen('weather') |
270 | + self.ui.change_screen(screen, Transition.FORWARD) |
271 | + |
272 | + self.ui.move_to_previous_screen() |
273 | + self.assertEquals(self.ui.current, old_screen) |
274 | + |
275 | def test_confirm_exit(self): |
276 | '''Test confirm exit stays on Question screen if it's already there.''' |
277 | - question = Question(None, None, None, []) |
278 | + question = Question(None, None, []) |
279 | self.ui.current = question |
280 | # Current will be the same if the screen didn't move. |
281 | self.assertEqual(self.ui.current, question) |
I probably should have proposed this a long time ago. I did some refactoring a while back to remove the stage usage from the ScreenHistory and create the corresponding callback to match up with "move_to_ new_screen" .
In light of the fact that Samuel has now also created a screen_back callback in the back_button branch, I'm proposing this so we could do a comparison of the two implementations.