Merge lp:~mblayman/entertainer/translate-events into lp:entertainer

Proposed by Matt Layman
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
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.

To post a comment you must log in.
Revision history for this message
Matt Layman (mblayman) wrote :

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.

Revision history for this message
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.

Revision history for this message
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/frontend/gui/screen_history.py'
--- entertainerlib/frontend/gui/screen_history.py 2009-05-06 03:40:22 +0000
+++ entertainerlib/frontend/gui/screen_history.py 2009-06-02 01:16:03 +0000
@@ -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-

review: Approve
361. By Matt Layman

is_empty is now a property.

362. By Matt Layman

Fixed the EntertainerTest name.

Revision history for this message
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:~/repo/translate-events/entertainerlib/tests$ bzr diff -r -3..-1
=== modified file 'entertainerlib/frontend/gui/screen_history.py'
--- entertainerlib/frontend/gui/screen_history.py 2009-06-02 01:16:03 +0000
+++ entertainerlib/frontend/gui/screen_history.py 2009-06-03 01:54:03 +0000
@@ -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/frontend/gui/user_interface.py'
--- entertainerlib/frontend/gui/user_interface.py 2009-06-02 01:16:03 +0000
+++ entertainerlib/frontend/gui/user_interface.py 2009-06-03 01:54:03 +0000
@@ -351,7 +351,7 @@

     def _handle_navigate_back(self, event):
         '''Handle UserEvent.NAVIGATE_BACK.'''
- if not self.history.is_empty():
+ if not self.history.is_empty:
             self.move_to_previous_screen()

     def _handle_navigate_home(self, event):

=== added file 'entertainerlib/tests/test_screenhistory.py'
--- entertainerlib/tests/test_screenhistory.py 1970-01-01 00:00:00 +0000
+++ entertainerlib/tests/test_screenhistory.py 2009-06-03 01:54:03 +0000
@@ -0,0 +1,26 @@
+# Copyright (c) 2009 Entertainer Developers - See COPYING - GPLv2
+'''Tests ScreenHistory'''
+
+from entertainerlib.frontend.gui.screen_history import ScreenHistory
+from entertainerlib.frontend.gui.screens.screen import Screen
+from entertainerlib.tests import EntertainerTest
+
+class ScreenHistoryTest(EntertainerTest):
+ '''Test for entertainerlib.frontend.gui.screen_history'''
+
+ def setUp(self):
+ EntertainerTest.setUp(self)
+
+ self.screen_history = ScreenHistory(None)
+
+ def test_create(self):
+ '''Test correct ScreenHistory initialization.'''
+ self.assertTrue(isinstance(self.screen_history, ScreenHistory))
+
+ def test_is_empty(self):
+ '''Test the is_empty property.'''
+ self.assertTrue(self.screen_history.is_empty)
+ screen = Screen()
+ self.screen_history.add_screen(screen)
+ self.assertFalse(self.screen_history.is_empty)
+

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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)

Subscribers

People subscribed via source and target branches