Adding weak rotation support and banners for navigation
[watersofshiloah] / src / playcontrol.py
1 import logging
2
3 import gtk
4
5 import gtk_toolbox
6 import hildonize
7 import util.misc as misc_utils
8
9
10 _moduleLogger = logging.getLogger(__name__)
11
12
13 class PlayControl(object):
14
15         def __init__(self, player, store):
16                 self._isPortrait = True
17
18                 self._store = store
19
20                 self._player = player
21                 self._player.connect("state-change", self._on_player_state_change)
22                 self._player.connect("navigate-change", self._on_player_nav_change)
23
24                 img = store.get_image_from_store("prev.png")
25                 self._back = gtk.Button()
26                 self._back.set_image(img)
27                 self._back.connect("clicked", self._on_back_clicked)
28
29                 img = store.get_image_from_store("stop.png")
30                 self._stop = gtk.Button()
31                 self._stop.set_image(img)
32                 self._stop.connect("clicked", self._on_stop_clicked)
33
34                 img = store.get_image_from_store("pause.png")
35                 self._pause = gtk.Button()
36                 self._pause.set_image(img)
37                 self._pause.connect("clicked", self._on_pause_clicked)
38
39                 img = store.get_image_from_store("play.png")
40                 self._play = gtk.Button()
41                 self._play.set_image(img)
42                 self._play.connect("clicked", self._on_play_clicked)
43
44                 img = store.get_image_from_store("next.png")
45                 self._next = gtk.Button()
46                 self._next.set_image(img)
47                 self._next.connect("clicked", self._on_next_clicked)
48
49                 self._controls = gtk.HBox()
50                 self._controls.pack_start(self._back)
51                 self._controls.pack_start(self._stop)
52                 self._controls.pack_start(self._pause)
53                 self._controls.pack_start(self._play)
54                 self._controls.pack_start(self._next)
55
56                 self._layout = gtk.VBox()
57                 self._layout.pack_start(self._controls)
58
59         @property
60         def toplevel(self):
61                 return self._layout
62
63         def set_orientation(self, orientation):
64                 if orientation == gtk.ORIENTATION_VERTICAL:
65                         if self._isPortrait:
66                                 return
67                         self._isPortrait = True
68
69                         self._controls.remove(self._back)
70                         self._controls.remove(self._stop)
71                         self._controls.remove(self._pause)
72                         self._controls.remove(self._play)
73                         self._controls.remove(self._next)
74                         self._layout.remove(self._controls)
75
76                         self._controls = gtk.HBox()
77                         self._controls.pack_start(self._back)
78                         self._controls.pack_start(self._stop)
79                         self._controls.pack_start(self._pause)
80                         self._controls.pack_start(self._play)
81                         self._controls.pack_start(self._next)
82                         self._layout.pack_start(self._controls)
83                 elif orientation == gtk.ORIENTATION_HORIZONTAL:
84                         if not self._isPortrait:
85                                 return
86                         self._isPortrait = False
87
88                         self._controls.remove(self._back)
89                         self._controls.remove(self._stop)
90                         self._controls.remove(self._pause)
91                         self._controls.remove(self._play)
92                         self._controls.remove(self._next)
93                         self._layout.remove(self._controls)
94
95                         self._controls = gtk.VBox()
96                         self._controls.pack_start(self._back)
97                         self._controls.pack_start(self._stop)
98                         self._controls.pack_start(self._pause)
99                         self._controls.pack_start(self._play)
100                         self._controls.pack_start(self._next)
101                         self._layout.pack_start(self._controls)
102                 else:
103                         raise NotImplementedError(orientation)
104
105         @misc_utils.log_exception(_moduleLogger)
106         def _on_player_state_change(self, player, newState):
107                 if newState == "play":
108                         self._pause.show()
109                         self._play.hide()
110                 elif newState == "pause":
111                         self._pause.hide()
112                         self._play.show()
113                 elif newState == "stop":
114                         self._pause.hide()
115                         self._play.show()
116
117                 if self._player.can_navigate:
118                         self._back.show()
119                         self._next.show()
120                 else:
121                         self._back.hide()
122                         self._next.hide()
123
124         @misc_utils.log_exception(_moduleLogger)
125         def _on_player_nav_change(self, player, canNavigate):
126                 if canNavigate:
127                         self._back.show()
128                         self._next.show()
129                 else:
130                         self._back.hide()
131                         self._next.hide()
132
133         @misc_utils.log_exception(_moduleLogger)
134         def _on_back_clicked(self, *args):
135                 self._player.back()
136
137                 parent = gtk_toolbox.find_parent_window(self._layout)
138                 hildonize.show_information_banner(parent, self._player.title)
139
140         @misc_utils.log_exception(_moduleLogger)
141         def _on_stop_clicked(self, *args):
142                 self._pause.hide()
143                 self._play.show()
144                 self._player.stop()
145
146         @misc_utils.log_exception(_moduleLogger)
147         def _on_pause_clicked(self, *args):
148                 self._pause.show()
149                 self._play.hide()
150                 self._player.pause()
151
152         @misc_utils.log_exception(_moduleLogger)
153         def _on_play_clicked(self, *args):
154                 self._pause.hide()
155                 self._play.show()
156                 self._player.play()
157
158         @misc_utils.log_exception(_moduleLogger)
159         def _on_next_clicked(self, *args):
160                 self._player.next()
161
162                 parent = gtk_toolbox.find_parent_window(self._layout)
163                 hildonize.show_information_banner(parent, self._player.title)