7 import util.misc as misc_utils
15 _moduleLogger = logging.getLogger(__name__)
18 class SourceSelector(windows._base.BasicWindow):
20 def __init__(self, player, store, index):
21 windows._base.BasicWindow.__init__(self, player, store)
25 self._loadingBanner = banners.GenericBanner()
27 self._radioButton = self._create_button("radio", "Radio")
28 self._radioButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_RADIO)
29 self._radioWrapper = gtk.VBox()
30 self._radioWrapper.pack_start(self._radioButton, False, True)
32 self._conferenceButton = self._create_button("conferences", "Conferences")
33 self._conferenceButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_CONFERENCES)
34 self._conferenceWrapper = gtk.VBox()
35 self._conferenceWrapper.pack_start(self._conferenceButton, False, True)
37 self._magazineButton = self._create_button("magazines", "Magazines")
38 self._magazineButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_MAGAZINES)
39 self._magazineWrapper = gtk.VBox()
40 self._magazineWrapper.pack_start(self._magazineButton, False, True)
42 self._scriptureButton = self._create_button("scriptures", "Scriptures")
43 self._scriptureButton.connect("clicked", self._on_source_selected, stream_index.SOURCE_SCRIPTURES)
44 self._scriptureWrapper = gtk.VBox()
45 self._scriptureWrapper.pack_start(self._scriptureButton, False, True)
47 self._buttonLayout = gtk.VButtonBox()
48 self._buttonLayout.set_layout(gtk.BUTTONBOX_SPREAD)
49 self._buttonLayout.pack_start(self._radioWrapper, True, True)
50 self._buttonLayout.pack_start(self._conferenceWrapper, True, True)
51 self._buttonLayout.pack_start(self._magazineWrapper, True, True)
52 self._buttonLayout.pack_start(self._scriptureWrapper, True, True)
54 self._separator = gtk.HSeparator()
55 self._playcontrol = playcontrol.NavControl(player, store)
56 self._playcontrol.connect("jump-to", self._on_jump)
58 self._layout.pack_start(self._loadingBanner.toplevel, False, False)
59 self._layout.pack_start(self._buttonLayout, True, True)
60 self._layout.pack_start(self._separator, False, True)
61 self._layout.pack_start(self._playcontrol.toplevel, False, True)
63 self._window.set_title(constants.__pretty_app_name__)
66 windows._base.BasicWindow.show(self)
68 self._errorBanner.toplevel.hide()
69 self._playcontrol.toplevel.hide()
73 def _show_loading(self):
74 animationPath = self._store.STORE_LOOKUP["loading"]
75 animation = self._store.get_pixbuf_animation_from_store(animationPath)
76 self._loadingBanner.show(animation, "Loading...")
77 self._buttonLayout.set_sensitive(False)
79 def _hide_loading(self):
80 self._loadingBanner.hide()
81 self._buttonLayout.set_sensitive(True)
85 self._index.get_languages(self._on_languages, self._on_error)
87 def _create_button(self, icon, message):
88 image = self._store.get_image_from_store(self._store.STORE_LOOKUP[icon])
91 label.set_text(message)
93 buttonLayout = gtk.HBox(False, 5)
94 buttonLayout.pack_start(image, False, False)
95 buttonLayout.pack_start(label, False, True)
97 button.add(buttonLayout)
101 @misc_utils.log_exception(_moduleLogger)
102 def _on_languages(self, languages):
104 self._languages = list(languages)
106 @misc_utils.log_exception(_moduleLogger)
107 def _on_error(self, exception):
109 self._errorBanner.push_message(str(exception))
111 def _window_from_node(self, node):
112 if node.id == stream_index.SOURCE_RADIO:
113 Source = windows.radio.RadioWindow
114 elif node.id == stream_index.SOURCE_CONFERENCES:
115 Source = windows.conferences.ConferencesWindow
116 elif node.id == stream_index.SOURCE_MAGAZINES:
117 Source = windows.magazines.MagazinesWindow
118 elif node.id == stream_index.SOURCE_SCRIPTURES:
119 Source = windows.scriptures.ScripturesWindow
120 sourceWindow = Source(self._player, self._store, node)
121 sourceWindow.window.set_modal(True)
122 sourceWindow.window.set_transient_for(self._window)
123 sourceWindow.window.set_default_size(*self._window.get_size())
124 sourceWindow.connect("quit", self._on_quit)
125 sourceWindow.connect("jump-to", self._on_jump)
129 @misc_utils.log_exception(_moduleLogger)
130 def _on_jump(self, source, node):
131 targetNodePath = list(reversed(list(stream_index.walk_ancestors(node))))
132 ancestor = targetNodePath[0]
133 window = self._window_from_node(ancestor)
136 @misc_utils.log_exception(_moduleLogger)
137 def _on_source_selected(self, widget, nodeName):
138 node = self._index.get_source(nodeName, self._languages[0]["id"])
139 self._window_from_node(node)
142 gobject.type_register(SourceSelector)