Related to weird switching of playback on Maemo 5, putting in asserts to confirm...
[watersofshiloah] / src / windows / source.py
1 import logging
2
3 import gobject
4 import gtk
5
6 import constants
7 import util.misc as misc_utils
8 import banners
9 import presenter
10 import stream_index
11
12 import windows
13
14
15 _moduleLogger = logging.getLogger(__name__)
16
17
18 class SourceSelector(windows._base.BasicWindow):
19
20         def __init__(self, app, player, store, index):
21                 windows._base.BasicWindow.__init__(self, app, player, store)
22                 self._languages = []
23                 self._index = index
24
25                 self._loadingBanner = banners.GenericBanner()
26
27                 self._radioButton = self._create_button("radio", "Radio")
28                 self._radioButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_RADIO)
29
30                 self._conferenceButton = self._create_button("conferences", "Conferences")
31                 self._conferenceButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_CONFERENCES)
32
33                 self._magazineButton = self._create_button("magazines", "Magazines")
34                 self._magazineButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_MAGAZINES)
35
36                 self._scriptureButton = self._create_button("scriptures", "Scriptures")
37                 self._scriptureButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_SCRIPTURES)
38
39                 self._buttonLayout = gtk.VButtonBox()
40                 self._buttonLayout.set_layout(gtk.BUTTONBOX_SPREAD)
41                 self._buttonLayout.pack_start(self._radioButton, True, True)
42                 self._buttonLayout.pack_start(self._conferenceButton, True, True)
43                 self._buttonLayout.pack_start(self._magazineButton, True, True)
44                 self._buttonLayout.pack_start(self._scriptureButton, True, True)
45
46                 self._separator = gtk.HSeparator()
47                 self._presenter = presenter.NavControl(player, store)
48                 self._presenter.connect("jump-to", self._on_jump)
49
50                 self._layout.pack_start(self._loadingBanner.toplevel, False, False)
51                 self._layout.pack_start(self._buttonLayout, True, True)
52                 self._layout.pack_start(self._separator, False, True)
53                 self._layout.pack_start(self._presenter.toplevel, False, True)
54
55                 self._window.set_title(constants.__pretty_app_name__)
56
57         def show(self):
58                 windows._base.BasicWindow.show(self)
59
60                 self._errorBanner.toplevel.hide()
61                 self._presenter.toplevel.hide()
62
63                 self._refresh()
64
65         def _show_loading(self):
66                 animationPath = self._store.STORE_LOOKUP["loading"]
67                 animation = self._store.get_pixbuf_animation_from_store(animationPath)
68                 self._loadingBanner.show(animation, "Loading...")
69                 self._buttonLayout.set_sensitive(False)
70
71         def _hide_loading(self):
72                 self._loadingBanner.hide()
73                 self._buttonLayout.set_sensitive(True)
74
75         def _refresh(self):
76                 self._show_loading()
77                 self._index.get_languages(self._on_languages, self._on_error)
78
79         def _create_button(self, icon, message):
80                 image = self._store.get_image_from_store(self._store.STORE_LOOKUP[icon])
81
82                 label = gtk.Label()
83                 label.set_use_markup(True)
84                 label.set_markup("<big>%s</big>" % message)
85
86                 buttonLayout = gtk.HBox(False, 5)
87                 buttonLayout.pack_start(image, False, False)
88                 buttonLayout.pack_start(label, False, True)
89                 button = gtk.Button()
90                 button.add(buttonLayout)
91
92                 return button
93
94         @misc_utils.log_exception(_moduleLogger)
95         def _on_languages(self, languages):
96                 self._hide_loading()
97                 self._languages = list(languages)
98
99         @misc_utils.log_exception(_moduleLogger)
100         def _on_error(self, exception):
101                 self._hide_loading()
102                 self._errorBanner.push_message(str(exception))
103
104         def _window_from_node(self, node):
105                 if node.id == stream_index.SOURCE_RADIO:
106                         Source = windows.radio.RadioWindow
107                 elif node.id == stream_index.SOURCE_CONFERENCES:
108                         Source = windows.conferences.ConferencesWindow
109                 elif node.id == stream_index.SOURCE_MAGAZINES:
110                         Source = windows.magazines.MagazinesWindow
111                 elif node.id == stream_index.SOURCE_SCRIPTURES:
112                         Source = windows.scriptures.ScripturesWindow
113                 sourceWindow = Source(self._app, self._player, self._store, node)
114                 sourceWindow.window.set_modal(True)
115                 sourceWindow.window.set_transient_for(self._window)
116                 sourceWindow.window.set_default_size(*self._window.get_size())
117                 if self._windowInFullscreen:
118                         sourceWindow.window.fullscreen()
119                 else:
120                         sourceWindow.window.unfullscreen()
121                 sourceWindow.connect("quit", self._on_quit)
122                 sourceWindow.connect("jump-to", self._on_jump)
123                 sourceWindow.connect("fullscreen", self._on_child_fullscreen)
124                 sourceWindow.show()
125                 return sourceWindow
126
127         @misc_utils.log_exception(_moduleLogger)
128         def _on_jump(self, source, node):
129                 targetNodePath = list(reversed(list(stream_index.walk_ancestors(node))))
130                 ancestor = targetNodePath[0]
131                 window = self._window_from_node(ancestor)
132                 window.jump_to(node)
133
134         @misc_utils.log_exception(_moduleLogger)
135         def _on_source_selected(self, widget, nodeName):
136                 node = self._index.get_source(nodeName, self._languages[0]["id"])
137                 self._window_from_node(node)
138
139
140 gobject.type_register(SourceSelector)
141