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