1 # @todo Add icons to buttons/rows to indicate that the currently playing track is coming from that
12 import util.misc as misc_utils
19 _moduleLogger = logging.getLogger(__name__)
22 class BasicWindow(gobject.GObject):
26 gobject.SIGNAL_RUN_LAST,
31 gobject.SIGNAL_RUN_LAST,
36 gobject.SIGNAL_RUN_LAST,
38 (gobject.TYPE_BOOLEAN, ),
41 gobject.SIGNAL_RUN_LAST,
43 (gobject.TYPE_BOOLEAN, ),
47 def __init__(self, player, store, index):
48 gobject.GObject.__init__(self)
49 self._isDestroyed = False
55 self._clipboard = gtk.clipboard_get()
56 self._windowInFullscreen = False
58 self._errorBanner = banners.StackingBanner()
60 self._layout = gtk.VBox()
61 self._layout.pack_start(self._errorBanner.toplevel, False, True)
63 self._window = gtk.Window()
64 self._window.add(self._layout)
65 self._window = hildonize.hildonize_window(self, self._window)
67 self._window.set_icon(self._store.get_pixbuf_from_store(self._store.STORE_LOOKUP["icon"]))
68 self._window.connect("key-press-event", self._on_key_press)
69 self._window.connect("window-state-event", self._on_window_state_change)
70 self._window.connect("destroy", self._on_destroy)
77 self._window.show_all()
79 def save_settings(self, config, sectionName):
80 config.add_section(sectionName)
81 config.set(sectionName, "fullscreen", str(self._windowInFullscreen))
83 def load_settings(self, config, sectionName):
85 self._windowInFullscreen = config.getboolean(sectionName, "fullscreen")
86 except ConfigParser.NoSectionError, e:
88 "Settings file %s is missing section %s" % (
89 constants._user_settings_,
94 if self._windowInFullscreen:
95 self._window.fullscreen()
97 self._window.unfullscreen()
99 @misc_utils.log_exception(_moduleLogger)
100 def _on_destroy(self, *args):
101 self._isDestroyed = True
103 @misc_utils.log_exception(_moduleLogger)
104 def _on_window_state_change(self, widget, event, *args):
105 if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
106 self._windowInFullscreen = True
108 self._windowInFullscreen = False
109 self.emit("fullscreen", self._windowInFullscreen)
111 @misc_utils.log_exception(_moduleLogger)
112 def _on_key_press(self, widget, event, *args):
113 RETURN_TYPES = (gtk.keysyms.Return, gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter)
114 isCtrl = bool(event.get_state() & gtk.gdk.CONTROL_MASK)
116 event.keyval == gtk.keysyms.F6 or
117 event.keyval in RETURN_TYPES and isCtrl
119 # The "Full screen" hardware key has been pressed
120 if self._windowInFullscreen:
121 self._window.unfullscreen ()
123 self._window.fullscreen ()
126 event.keyval in (gtk.keysyms.w, ) and
127 event.get_state() & gtk.gdk.CONTROL_MASK
129 self._window.destroy()
131 event.keyval in (gtk.keysyms.q, ) and
132 event.get_state() & gtk.gdk.CONTROL_MASK
135 elif event.keyval == gtk.keysyms.l and event.get_state() & gtk.gdk.CONTROL_MASK:
136 with open(constants._user_logpath_, "r") as f:
137 logLines = f.xreadlines()
138 log = "".join(logLines)
139 self._clipboard.set_text(str(log))
142 @misc_utils.log_exception(_moduleLogger)
143 def _on_home(self, *args):
145 self._window.destroy()
147 @misc_utils.log_exception(_moduleLogger)
148 def _on_quit(self, *args):
150 self._window.destroy()
153 class SourceSelector(BasicWindow):
155 def __init__(self, player, store, index):
158 BasicWindow.__init__(self, player, store, index)
160 self._loadingBanner = banners.GenericBanner()
162 self._radioButton = self._create_button("radio", "Radio")
163 self._radioButton.connect("clicked", self._on_source_selected, RadioWindow)
164 self._radioWrapper = gtk.VBox()
165 self._radioWrapper.pack_start(self._radioButton, False, True)
167 self._conferenceButton = self._create_button("conferences", "Conferences")
168 self._conferenceButton.connect("clicked", self._on_source_selected, ConferencesWindow)
169 self._conferenceWrapper = gtk.VBox()
170 self._conferenceWrapper.pack_start(self._conferenceButton, False, True)
172 self._magazineButton = self._create_button("magazines", "Magazines")
173 #self._magazineButton.connect("clicked", self._on_source_selected)
174 self._magazineWrapper = gtk.VBox()
175 self._magazineWrapper.pack_start(self._magazineButton, False, True)
177 self._scriptureButton = self._create_button("scriptures", "Scriptures")
178 #self._scriptureButton.connect("clicked", self._on_source_selected)
179 self._scriptureWrapper = gtk.VBox()
180 self._scriptureWrapper.pack_start(self._scriptureButton, False, True)
182 self._buttonLayout = gtk.VButtonBox()
183 self._buttonLayout.set_layout(gtk.BUTTONBOX_SPREAD)
184 self._buttonLayout.pack_start(self._radioWrapper, True, True)
185 self._buttonLayout.pack_start(self._conferenceWrapper, True, True)
186 self._buttonLayout.pack_start(self._magazineWrapper, True, True)
187 self._buttonLayout.pack_start(self._scriptureWrapper, True, True)
189 self._playcontrol = playcontrol.PlayControl(player, store)
191 self._layout.pack_start(self._loadingBanner.toplevel, False, False)
192 self._layout.pack_start(self._buttonLayout, True, True)
193 self._layout.pack_start(self._playcontrol.toplevel, False, True)
195 self._window.set_title(constants.__pretty_app_name__)
198 BasicWindow.show(self)
200 self._errorBanner.toplevel.hide()
201 self._playcontrol.toplevel.hide()
205 def _show_loading(self):
206 animationPath = self._store.STORE_LOOKUP["loading"]
207 animation = self._store.get_pixbuf_animation_from_store(animationPath)
208 self._loadingBanner.show(animation, "Loading...")
209 self._buttonLayout.set_sensitive(False)
211 def _hide_loading(self):
212 self._loadingBanner.hide()
213 self._buttonLayout.set_sensitive(True)
217 self._index.download(
223 def _create_button(self, icon, message):
224 image = self._store.get_image_from_store(self._store.STORE_LOOKUP[icon])
227 label.set_text(message)
229 buttonLayout = gtk.HBox(False, 5)
230 buttonLayout.pack_start(image, False, False)
231 buttonLayout.pack_start(label, False, True)
232 button = gtk.Button()
233 button.add(buttonLayout)
237 @misc_utils.log_exception(_moduleLogger)
238 def _on_languages(self, languages):
240 self._languages = list(languages)
242 @misc_utils.log_exception(_moduleLogger)
243 def _on_error(self, exception):
245 self._errorBanner.push_message(exception)
247 @misc_utils.log_exception(_moduleLogger)
248 def _on_source_selected(self, widget, Source):
249 sourceWindow = Source(self._player, self._store, self._index, self._languages[0]["id"])
250 sourceWindow.window.set_modal(True)
251 sourceWindow.window.set_transient_for(self._window)
252 sourceWindow.window.set_default_size(*self._window.get_size())
253 sourceWindow.connect("quit", self._on_quit)
257 gobject.type_register(SourceSelector)
260 class RadioWindow(BasicWindow):
262 def __init__(self, player, store, index, languageId):
263 BasicWindow.__init__(self, player, store, index)
265 self._player.connect("state-change", self._on_player_state_change)
266 self._player.connect("title-change", self._on_player_title_change)
268 self._loadingBanner = banners.GenericBanner()
270 headerPath = self._store.STORE_LOOKUP["radio_header"]
271 self._header = self._store.get_image_from_store(headerPath)
272 self._headerNavigation = presenter.NavigationBox()
273 self._headerNavigation.toplevel.add(self._header)
274 self._headerNavigation.connect("action", self._on_nav_action)
275 self._headerNavigation.connect("navigating", self._on_navigating)
277 self._programmingModel = gtk.ListStore(
282 textrenderer = gtk.CellRendererText()
283 timeColumn = gtk.TreeViewColumn("Time")
284 timeColumn.pack_start(textrenderer, expand=True)
285 timeColumn.add_attribute(textrenderer, "text", 0)
287 textrenderer = gtk.CellRendererText()
288 titleColumn = gtk.TreeViewColumn("Program")
289 titleColumn.pack_start(textrenderer, expand=True)
290 titleColumn.add_attribute(textrenderer, "text", 1)
292 self._treeView = gtk.TreeView()
293 self._treeView.set_headers_visible(False)
294 self._treeView.set_model(self._programmingModel)
295 self._treeView.append_column(timeColumn)
296 self._treeView.append_column(titleColumn)
297 self._treeView.get_selection().connect("changed", self._on_row_changed)
299 self._treeScroller = gtk.ScrolledWindow()
300 self._treeScroller.add(self._treeView)
301 self._treeScroller.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
303 self._presenter = presenter.StreamMiniPresenter(self._store)
304 if self._player.state == "play":
305 self._presenter.set_state(self._store.STORE_LOOKUP["play"])
307 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
308 self._presenterNavigation = presenter.NavigationBox()
309 self._presenterNavigation.toplevel.add(self._presenter.toplevel)
310 self._presenterNavigation.connect("action", self._on_nav_action)
311 self._presenterNavigation.connect("navigating", self._on_navigating)
313 self._radioLayout = gtk.VBox(False)
314 self._radioLayout.pack_start(self._headerNavigation.toplevel, False, False)
315 self._radioLayout.pack_start(self._treeScroller, True, True)
316 self._radioLayout.pack_start(self._presenterNavigation.toplevel, False, True)
318 self._layout.pack_start(self._loadingBanner.toplevel, False, False)
319 self._layout.pack_start(self._radioLayout, True, True)
321 self._window.set_title("Radio")
322 self._dateShown = datetime.datetime.now()
325 BasicWindow.show(self)
327 self._errorBanner.toplevel.hide()
328 self._loadingBanner.toplevel.hide()
332 def _show_loading(self):
333 animationPath = self._store.STORE_LOOKUP["loading"]
334 animation = self._store.get_pixbuf_animation_from_store(animationPath)
335 self._loadingBanner.show(animation, "Loading...")
337 def _hide_loading(self):
338 self._loadingBanner.hide()
342 self._programmingModel.clear()
343 self._index.download(
344 "get_radio_channels",
349 def _get_current_row(self):
350 nowTime = self._dateShown.strftime("%H:%M:%S")
352 for i, row in enumerate(self._programmingModel):
361 @misc_utils.log_exception(_moduleLogger)
362 def _on_player_state_change(self, player, newState):
363 if self._headerNavigation.is_active() or self._presenterNavigation.is_active():
366 if newState == "play":
367 self._presenter.set_state(self._store.STORE_LOOKUP["play"])
368 elif newState == "pause":
369 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
371 _moduleLogger.info("Unhandled player state %s" % newState)
372 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
374 @misc_utils.log_exception(_moduleLogger)
375 def _on_player_title_change(self, player, newState):
376 _moduleLogger.info("Player title magically changed to %s" % player.title)
379 @misc_utils.log_exception(_moduleLogger)
380 def _on_navigating(self, widget, navState):
381 if navState == "clicking":
382 if self._player.state == "play":
386 elif navState == "down":
388 elif navState == "up":
390 elif navState == "left":
392 elif navState == "right":
395 self._presenter.set_state(self._store.STORE_LOOKUP[imageName])
397 @misc_utils.log_exception(_moduleLogger)
398 def _on_nav_action(self, widget, navState):
399 if self._player.state == "play":
400 self._presenter.set_state(self._store.STORE_LOOKUP["play"])
402 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
404 if navState == "clicking":
405 if self._player.state == "play":
409 elif navState == "down":
410 self.window.destroy()
411 elif navState == "up":
413 elif navState == "left":
414 self._dateShown += datetime.timedelta(days=1)
416 elif navState == "right":
417 self._dateShown -= datetime.timedelta(days=1)
420 @misc_utils.log_exception(_moduleLogger)
421 def _on_channels(self, channels):
422 if self._isDestroyed:
423 _moduleLogger.info("Download complete but window destroyed")
426 channels = list(channels)
427 if 1 < len(channels):
428 _moduleLogger.warning("More channels now available!")
429 channel = channels[0]
430 self._index.download(
431 "get_radio_channel_programming",
438 @misc_utils.log_exception(_moduleLogger)
439 def _on_channel(self, programs):
440 if self._isDestroyed:
441 _moduleLogger.info("Download complete but window destroyed")
445 for program in programs:
446 row = program["time"], program["title"]
447 self._programmingModel.append(row)
449 path = (self._get_current_row(), )
450 self._treeView.scroll_to_cell(path)
451 self._treeView.get_selection().select_path(path)
453 @misc_utils.log_exception(_moduleLogger)
454 def _on_load_error(self, exception):
456 self._errorBanner.push_message(exception)
458 @misc_utils.log_exception(_moduleLogger)
459 def _on_row_changed(self, selection):
460 if len(self._programmingModel) == 0:
463 rowIndex = self._get_current_row()
465 if not selection.path_is_selected(path):
466 # Undo the user's changing of the selection
467 selection.select_path(path)
470 gobject.type_register(RadioWindow)
473 class ListWindow(BasicWindow):
475 def __init__(self, player, store, index):
476 BasicWindow.__init__(self, player, store, index)
478 self._loadingBanner = banners.GenericBanner()
480 modelTypes, columns = zip(*self._get_columns())
482 self._model = gtk.ListStore(*modelTypes)
484 self._treeView = gtk.TreeView()
485 self._treeView.connect("row-activated", self._on_row_activated)
486 self._treeView.set_headers_visible(False)
487 self._treeView.set_model(self._model)
488 for column in columns:
489 if column is not None:
490 self._treeView.append_column(column)
492 self._treeScroller = gtk.ScrolledWindow()
493 self._treeScroller.add(self._treeView)
494 self._treeScroller.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
496 self._playcontrol = playcontrol.PlayControl(self._player, self._store)
498 self._contentLayout = gtk.VBox(False)
499 self._contentLayout.pack_start(self._treeScroller, True, True)
500 self._contentLayout.pack_start(self._playcontrol.toplevel, False, True)
502 self._layout.pack_start(self._loadingBanner.toplevel, False, False)
503 self._layout.pack_start(self._contentLayout, True, True)
506 BasicWindow.show(self)
508 self._errorBanner.toplevel.hide()
509 self._loadingBanner.toplevel.hide()
512 self._playcontrol.refresh()
515 def _get_columns(cls):
516 raise NotImplementedError("")
518 def _get_current_row(self):
519 raise NotImplementedError("")
521 @misc_utils.log_exception(_moduleLogger)
522 def _on_row_activated(self, view, path, column):
523 raise NotImplementedError("")
525 def _show_loading(self):
526 animationPath = self._store.STORE_LOOKUP["loading"]
527 animation = self._store.get_pixbuf_animation_from_store(animationPath)
528 self._loadingBanner.show(animation, "Loading...")
530 def _hide_loading(self):
531 self._loadingBanner.hide()
537 def _select_row(self):
538 path = (self._get_current_row(), )
539 self._treeView.scroll_to_cell(path)
540 self._treeView.get_selection().select_path(path)
543 class ConferencesWindow(ListWindow):
545 def __init__(self, player, store, index, languageId):
546 self._languageId = languageId
548 ListWindow.__init__(self, player, store, index)
549 self._window.set_title("Conferences")
552 def _get_columns(cls):
553 yield gobject.TYPE_STRING, None
555 textrenderer = gtk.CellRendererText()
556 column = gtk.TreeViewColumn("Date")
557 column.pack_start(textrenderer, expand=True)
558 column.add_attribute(textrenderer, "text", 1)
559 yield gobject.TYPE_STRING, column
561 textrenderer = gtk.CellRendererText()
562 column = gtk.TreeViewColumn("Conference")
563 column.pack_start(textrenderer, expand=True)
564 column.add_attribute(textrenderer, "text", 2)
565 yield gobject.TYPE_STRING, column
567 def _get_current_row(self):
568 # @todo Not implemented yet
572 ListWindow._refresh(self)
573 self._index.download(
575 self._on_conferences,
580 @misc_utils.log_exception(_moduleLogger)
581 def _on_conferences(self, programs):
582 if self._isDestroyed:
583 _moduleLogger.info("Download complete but window destroyed")
587 for program in programs:
588 row = program["id"], program["title"], program["full_title"]
589 self._model.append(row)
591 path = (self._get_current_row(), )
592 self._treeView.scroll_to_cell(path)
593 self._treeView.get_selection().select_path(path)
595 @misc_utils.log_exception(_moduleLogger)
596 def _on_error(self, exception):
598 self._errorBanner.push_message(exception)
600 @misc_utils.log_exception(_moduleLogger)
601 def _on_row_activated(self, view, path, column):
602 itr = self._model.get_iter(path)
603 conferenceId = self._model.get_value(itr, 0)
605 sessionsWindow = ConferenceSessionsWindow(self._player, self._store, self._index, conferenceId)
606 sessionsWindow.window.set_modal(True)
607 sessionsWindow.window.set_transient_for(self._window)
608 sessionsWindow.window.set_default_size(*self._window.get_size())
609 sessionsWindow.connect("quit", self._on_quit)
610 sessionsWindow.connect("home", self._on_home)
611 sessionsWindow.show()
614 gobject.type_register(ConferencesWindow)
617 class ConferenceSessionsWindow(ListWindow):
619 def __init__(self, player, store, index, conferenceId):
620 self._conferenceId = conferenceId
622 ListWindow.__init__(self, player, store, index)
623 self._window.set_title("Sessions")
626 def _get_columns(cls):
627 yield gobject.TYPE_STRING, None
629 textrenderer = gtk.CellRendererText()
630 column = gtk.TreeViewColumn("Session")
631 column.pack_start(textrenderer, expand=True)
632 column.add_attribute(textrenderer, "text", 1)
633 yield gobject.TYPE_STRING, column
635 def _get_current_row(self):
636 # @todo Not implemented yet
640 ListWindow._refresh(self)
641 self._index.download(
642 "get_conference_sessions",
643 self._on_conference_sessions,
648 @misc_utils.log_exception(_moduleLogger)
649 def _on_conference_sessions(self, programs):
650 if self._isDestroyed:
651 _moduleLogger.info("Download complete but window destroyed")
655 for program in programs:
656 row = program["id"], program["title"]
657 self._model.append(row)
659 path = (self._get_current_row(), )
660 self._treeView.scroll_to_cell(path)
661 self._treeView.get_selection().select_path(path)
663 @misc_utils.log_exception(_moduleLogger)
664 def _on_error(self, exception):
666 self._errorBanner.push_message(exception)
668 @misc_utils.log_exception(_moduleLogger)
669 def _on_row_activated(self, view, path, column):
670 itr = self._model.get_iter(path)
671 sessionId = self._model.get_value(itr, 0)
673 sessionsWindow = ConferenceTalksWindow(self._player, self._store, self._index, sessionId)
674 sessionsWindow.window.set_modal(True)
675 sessionsWindow.window.set_transient_for(self._window)
676 sessionsWindow.window.set_default_size(*self._window.get_size())
677 sessionsWindow.connect("quit", self._on_quit)
678 sessionsWindow.connect("home", self._on_home)
679 sessionsWindow.show()
682 gobject.type_register(ConferenceSessionsWindow)
685 class ConferenceTalksWindow(ListWindow):
687 def __init__(self, player, store, index, sessionId):
688 self._sessionId = sessionId
690 ListWindow.__init__(self, player, store, index)
691 self._window.set_title("Talks")
694 def _get_columns(cls):
695 yield gobject.TYPE_STRING, None
697 textrenderer = gtk.CellRendererText()
698 column = gtk.TreeViewColumn("Talk")
699 column.pack_start(textrenderer, expand=True)
700 column.add_attribute(textrenderer, "text", 1)
701 yield gobject.TYPE_STRING, column
703 def _get_current_row(self):
704 # @todo Not implemented yet
708 ListWindow._refresh(self)
709 self._index.download(
710 "get_conference_talks",
711 self._on_conference_talks,
716 @misc_utils.log_exception(_moduleLogger)
717 def _on_conference_talks(self, programs):
718 if self._isDestroyed:
719 _moduleLogger.info("Download complete but window destroyed")
723 for program in programs:
724 row = program, "%s\n%s" % (program["title"], program["speaker"])
725 self._model.append(row)
727 path = (self._get_current_row(), )
728 self._treeView.scroll_to_cell(path)
729 self._treeView.get_selection().select_path(path)
731 @misc_utils.log_exception(_moduleLogger)
732 def _on_error(self, exception):
734 self._errorBanner.push_message(exception)
736 @misc_utils.log_exception(_moduleLogger)
737 def _on_row_activated(self, view, path, column):
738 itr = self._model.get_iter(path)
739 program = self._model.get_value(itr, 0)
741 sessionsWindow = ConferenceTalkWindow(self._player, self._store, self._index, program)
742 sessionsWindow.window.set_modal(True)
743 sessionsWindow.window.set_transient_for(self._window)
744 sessionsWindow.window.set_default_size(*self._window.get_size())
745 sessionsWindow.connect("quit", self._on_quit)
746 sessionsWindow.connect("home", self._on_home)
747 sessionsWindow.show()
750 gobject.type_register(ConferenceTalksWindow)
753 class ConferenceTalkWindow(BasicWindow):
755 def __init__(self, player, store, index, talkData):
756 BasicWindow.__init__(self, player, store, index)
758 self._player.connect("state-change", self._on_player_state_change)
759 self._player.connect("title-change", self._on_player_title_change)
761 self._loadingBanner = banners.GenericBanner()
763 self._presenter = presenter.StreamPresenter(self._store)
764 self._presenterNavigation = presenter.NavigationBox()
765 self._presenterNavigation.toplevel.add(self._presenter.toplevel)
766 self._presenterNavigation.connect("action", self._on_nav_action)
767 self._presenterNavigation.connect("navigating", self._on_navigating)
769 self._layout.pack_start(self._loadingBanner.toplevel, False, False)
770 self._layout.pack_start(self._presenterNavigation.toplevel, True, True)
772 self._window.set_title("Talk")
775 BasicWindow.show(self)
776 self._window.show_all()
777 self._errorBanner.toplevel.hide()
778 self._loadingBanner.toplevel.hide()
780 self._presenter.set_context(
781 self._store.STORE_LOOKUP[self._player.background],
783 self._player.subtitle,
785 if self._player.state == "play":
786 self._presenter.set_state(self._store.STORE_LOOKUP["play"])
788 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
790 def _show_loading(self):
791 animationPath = self._store.STORE_LOOKUP["loading"]
792 animation = self._store.get_pixbuf_animation_from_store(animationPath)
793 self._loadingBanner.show(animation, "Loading...")
795 def _hide_loading(self):
796 self._loadingBanner.hide()
798 @misc_utils.log_exception(_moduleLogger)
799 def _on_player_state_change(self, player, newState):
800 if self._headerNavigation.is_active() or self._presenterNavigation.is_active():
803 if newState == "play":
804 self._presenter.set_state(self._store.STORE_LOOKUP["play"])
805 elif newState == "pause":
806 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
808 _moduleLogger.info("Unhandled player state %s" % newState)
809 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
811 @misc_utils.log_exception(_moduleLogger)
812 def _on_player_title_change(self, player, newState):
813 self._presenter.set_context(
814 self._store.STORE_LOOKUP[self._player.background],
816 self._player.subtitle,
819 @misc_utils.log_exception(_moduleLogger)
820 def _on_navigating(self, widget, navState):
821 if navState == "clicking":
822 if self._player.state == "play":
826 elif navState == "down":
828 elif navState == "up":
830 elif navState == "left":
832 elif navState == "right":
835 self._presenter.set_state(self._store.STORE_LOOKUP[imageName])
837 @misc_utils.log_exception(_moduleLogger)
838 def _on_nav_action(self, widget, navState):
839 if self._player.state == "play":
840 self._presenter.set_state(self._store.STORE_LOOKUP["play"])
842 self._presenter.set_state(self._store.STORE_LOOKUP["pause"])
844 if navState == "clicking":
845 if self._player.state == "play":
849 elif navState == "down":
851 self._window.destroy()
852 elif navState == "up":
854 elif navState == "left":
856 elif navState == "right":
860 gobject.type_register(ConferenceTalkWindow)