7 import util.misc as misc_utils
16 _moduleLogger = logging.getLogger(__name__)
19 class SourceSelector(windows._base.BasicWindow):
21 def __init__(self, app, player, store, index):
22 windows._base.BasicWindow.__init__(self, app, player, store)
25 self._selectedNode = ""
27 self._loadingBanner = banners.GenericBanner()
29 self._radioButton = self._create_button("radio", "Radio")
30 self._radioButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_RADIO)
32 self._conferenceButton = self._create_button("conferences", "Conferences")
33 self._conferenceButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_CONFERENCES)
35 self._magazineButton = self._create_button("magazines", "Magazines")
36 self._magazineButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_MAGAZINES)
38 self._scriptureButton = self._create_button("scriptures", "Scriptures")
39 self._scriptureButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_SCRIPTURES)
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)
48 self._separator = gtk.HSeparator()
49 self._presenter = presenter.NavControl(player, store)
50 self._presenter.connect("jump-to", self._on_jump)
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)
57 self._window.set_title(constants.__pretty_app_name__)
60 windows._base.BasicWindow.show(self)
62 self._errorBanner.toplevel.hide()
63 self._presenter.toplevel.hide()
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)
73 def _hide_loading(self):
74 self._loadingBanner.hide()
75 self._buttonLayout.set_sensitive(True)
79 self._index.get_languages(self._on_languages, self._on_error)
81 def _create_button(self, icon, message):
82 image = self._store.get_image_from_store(self._store.STORE_LOOKUP[icon])
85 label.set_use_markup(True)
86 label.set_markup("<big>%s</big>" % message)
88 buttonLayout = gtk.HBox(False, 5)
89 buttonLayout.pack_start(image, False, False)
90 buttonLayout.pack_start(label, False, True)
92 button.add(buttonLayout)
96 @misc_utils.log_exception(_moduleLogger)
97 def _on_languages(self, languages):
99 self._languages = list(languages)
100 if self._selectedNode:
101 self._show_window_by_node_name(self._selectedNode)
102 self._selectedNode = ""
104 @misc_utils.log_exception(_moduleLogger)
105 def _on_error(self, exception):
107 _moduleLogger.info(exception)
108 self._errorBanner.push_message("Error loading information")
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)
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)
131 @misc_utils.log_exception(_moduleLogger)
132 def _on_home(self, *args):
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)
142 @misc_utils.log_exception(_moduleLogger)
143 def _on_source_selected(self, widget, nodeName):
145 self._show_window_by_node_name(nodeName)
147 self._selectedNode = nodeName
151 gobject.type_register(SourceSelector)