From: Ed Page Date: Mon, 3 May 2010 23:56:16 +0000 (-0500) Subject: Creation of window content with subwindow work X-Git-Url: http://git.maemo.org/git/?p=watersofshiloah;a=commitdiff_plain;h=4fe668385d73efc85dc6a61dda036a2bbb906986 Creation of window content with subwindow work --- diff --git a/src/mormonchannel_gtk.py b/src/mormonchannel_gtk.py index 1b020b3..0ddff73 100755 --- a/src/mormonchannel_gtk.py +++ b/src/mormonchannel_gtk.py @@ -26,7 +26,7 @@ except ImportError: import constants import hildonize -import gtk_toolbox +import util.misc as misc_utils import imagestore import player @@ -41,72 +41,9 @@ class MormonChannelProgram(hildonize.get_app_class()): def __init__(self): super(MormonChannelProgram, self).__init__() - self._clipboard = gtk.clipboard_get() self._player = player.Player() self._store = imagestore.ImageStore("../data", "../data") - self._window_in_fullscreen = False #The window isn't in full screen mode initially. - - #Create GUI main vbox - vbox = gtk.VBox(homogeneous = False, spacing = 0) - - if hildonize.GTK_MENU_USED: - #Create Menu and apply it for hildon - filemenu = gtk.Menu() - - menu_items = gtk.MenuItem("Quit") - filemenu.append(menu_items) - menu_items.connect("activate", self._on_destroy, None) - - file_menu = gtk.MenuItem("File") - file_menu.show() - file_menu.set_submenu(filemenu) - - categorymenu = gtk.Menu() - - menu_items = gtk.MenuItem("Search") - categorymenu.append(menu_items) - menu_items.connect("activate", self._on_toggle_search) - - helpmenu = gtk.Menu() - - menu_items = gtk.MenuItem("About") - helpmenu.append(menu_items) - menu_items.connect("activate", self._on_show_about, None) - - help_menu = gtk.MenuItem("Help") - help_menu.show() - help_menu.set_submenu(helpmenu) - - menuBar = gtk.MenuBar() - menuBar.show() - menuBar.append (file_menu) - menuBar.append (help_menu) - - vbox.pack_start(menuBar, False, False, 0) - else: - menuBar = gtk.MenuBar() - menuBar.show() - vbox.pack_start(menuBar, False, False, 0) - - #Get the Main Window, and connect the "destroy" event - self._window = gtk.Window() - self._window.add(vbox) - - self._window = hildonize.hildonize_window(self, self._window) - hildonize.set_application_title(self._window, "%s" % constants.__pretty_app_name__) - self._window.set_icon(self._store.get_pixbuf_from_store(self._store.STORE_LOOKUP["icon"])) - menuBar = hildonize.hildonize_menu( - self._window, - menuBar, - ) - if hildonize.IS_FREMANTLE_SUPPORTED: - searchButton= gtk.Button("Search") - searchButton.connect("clicked", self._on_toggle_search) - menuBar.append(searchButton) - - menuBar.show_all() - if not hildonize.IS_HILDON_SUPPORTED: _moduleLogger.info("No hildonization support") @@ -119,56 +56,25 @@ class MormonChannelProgram(hildonize.get_app_class()): self._osso_c = None self._deviceState = None - self._window.connect("delete-event", self._on_delete_event) - self._window.connect("destroy", self._on_destroy) - self._window.connect("key-press-event", self._on_key_press) - self._window.connect("window-state-event", self._on_window_state_change) - - self._window.show_all() - - self._windowStack = [windows.SourceSelector(self._player, self._store)] - vbox.pack_start(self._windowStack[0].toplevel, True, True) - + self._sourceSelector = windows.SourceSelector(self._player, self._store) + self._sourceSelector.window.connect("destroy", self._on_destroy) self._load_settings() def _save_settings(self): config = ConfigParser.SafeConfigParser() - self.save_settings(config) + + self._sourceSelector.save_settings(config, "Windows") + with open(constants._user_settings_, "wb") as configFile: config.write(configFile) - def save_settings(self, config): - config.add_section(constants.__pretty_app_name__) - config.set(constants.__pretty_app_name__, "fullscreen", str(self._window_in_fullscreen)) - def _load_settings(self): config = ConfigParser.SafeConfigParser() config.read(constants._user_settings_) - self.load_settings(config) - - def load_settings(self, config): - try: - self._window_in_fullscreen = config.getboolean(constants.__pretty_app_name__, "fullscreen") - except ConfigParser.NoSectionError, e: - _moduleLogger.info( - "Settings file %s is missing section %s" % ( - constants._user_settings_, - e.section, - ) - ) - if self._window_in_fullscreen: - self._window.fullscreen() - else: - self._window.unfullscreen() - - def _toggle_search(self): - if self._search.get_property("visible"): - self._search.hide() - else: - self._search.show() + self._sourceSelector.load_settings(config, "Windows") - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def _on_device_state_change(self, shutdown, save_unsaved_data, memory_low, system_inactivity, message, userData): """ For system_inactivity, we have no background tasks to pause @@ -181,51 +87,7 @@ class MormonChannelProgram(hildonize.get_app_class()): if save_unsaved_data or shutdown: self._save_settings() - @gtk_toolbox.log_exception(_moduleLogger) - def _on_window_state_change(self, widget, event, *args): - if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: - self._window_in_fullscreen = True - else: - self._window_in_fullscreen = False - - @gtk_toolbox.log_exception(_moduleLogger) - def _on_key_press(self, widget, event, *args): - RETURN_TYPES = (gtk.keysyms.Return, gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter) - isCtrl = bool(event.get_state() & gtk.gdk.CONTROL_MASK) - if ( - event.keyval == gtk.keysyms.F6 or - event.keyval in RETURN_TYPES and isCtrl - ): - # The "Full screen" hardware key has been pressed - if self._window_in_fullscreen: - self._window.unfullscreen () - else: - self._window.fullscreen () - return True - elif event.keyval == gtk.keysyms.f and isCtrl: - self._toggle_search() - return True - elif ( - event.keyval in (gtk.keysyms.w, gtk.keysyms.q) and - event.get_state() & gtk.gdk.CONTROL_MASK - ): - self._window.destroy() - elif event.keyval == gtk.keysyms.l and event.get_state() & gtk.gdk.CONTROL_MASK: - with open(constants._user_logpath_, "r") as f: - logLines = f.xreadlines() - log = "".join(logLines) - self._clipboard.set_text(str(log)) - return True - - @gtk_toolbox.log_exception(_moduleLogger) - def _on_toggle_search(self, *args): - self._toggle_search() - - @gtk_toolbox.log_exception(_moduleLogger) - def _on_delete_event(self, widget, event, data = None): - return False - - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def _on_destroy(self, widget = None, data = None): try: self._save_settings() @@ -241,7 +103,7 @@ class MormonChannelProgram(hildonize.get_app_class()): finally: gtk.main_quit() - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def _on_show_about(self, widget = None, data = None): dialog = gtk.AboutDialog() dialog.set_position(gtk.WIN_POS_CENTER) diff --git a/src/windows.py b/src/windows.py index 6ad1192..cbe1fcf 100644 --- a/src/windows.py +++ b/src/windows.py @@ -1,27 +1,145 @@ +import ConfigParser +import logging + +import gobject import gtk +import constants +import hildonize +import gtk_toolbox +import util.misc as misc_utils + import banners import playcontrol -class SourceSelector(object): +_moduleLogger = logging.getLogger(__name__) + + +class BasicWindow(gobject.GObject): + + __gsignals__ = { + 'quit' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (), + ), + 'fullscreen' : ( + gobject.SIGNAL_RUN_LAST, + gobject.TYPE_NONE, + (gobject.TYPE_PYOBJECT, ), + ), + } def __init__(self, player, store): + gobject.GObject.__init__(self) + self._player = player self._store = store + self._clipboard = gtk.clipboard_get() + self._windowInFullscreen = False + self._errorBanner = banners.StackingBanner() + self._layout = gtk.VBox() + self._layout.pack_start(self._errorBanner.toplevel, False, True) + + self._window = gtk.Window() + self._window.add(self._layout) + self._window = hildonize.hildonize_window(self, self._window) + + hildonize.set_application_title(self._window, "%s" % constants.__pretty_app_name__) + self._window.set_icon(self._store.get_pixbuf_from_store(self._store.STORE_LOOKUP["icon"])) + self._window.connect("key-press-event", self._on_key_press) + self._window.connect("window-state-event", self._on_window_state_change) + + @property + def window(self): + return self._window + + def save_settings(self, config, sectionName): + config.add_section(sectionName) + config.set(sectionName, "fullscreen", str(self._windowInFullscreen)) + + def load_settings(self, config, sectionName): + try: + self._windowInFullscreen = config.getboolean(sectionName, "fullscreen") + except ConfigParser.NoSectionError, e: + _moduleLogger.info( + "Settings file %s is missing section %s" % ( + constants._user_settings_, + e.section, + ) + ) + + if self._windowInFullscreen: + self._window.fullscreen() + else: + self._window.unfullscreen() + + @misc_utils.log_exception(_moduleLogger) + def _on_window_state_change(self, widget, event, *args): + if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN: + self._windowInFullscreen = True + else: + self._windowInFullscreen = False + self.emit("fullscreen", self._windowInFullscreen) + + @misc_utils.log_exception(_moduleLogger) + def _on_key_press(self, widget, event, *args): + RETURN_TYPES = (gtk.keysyms.Return, gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter) + isCtrl = bool(event.get_state() & gtk.gdk.CONTROL_MASK) + if ( + event.keyval == gtk.keysyms.F6 or + event.keyval in RETURN_TYPES and isCtrl + ): + # The "Full screen" hardware key has been pressed + if self._windowInFullscreen: + self._window.unfullscreen () + else: + self._window.fullscreen () + return True + elif ( + event.keyval in (gtk.keysyms.w, ) and + event.get_state() & gtk.gdk.CONTROL_MASK + ): + self._window.destroy() + elif ( + event.keyval in (gtk.keysyms.q, ) and + event.get_state() & gtk.gdk.CONTROL_MASK + ): + self.emit("quit") + elif event.keyval == gtk.keysyms.l and event.get_state() & gtk.gdk.CONTROL_MASK: + with open(constants._user_logpath_, "r") as f: + logLines = f.xreadlines() + log = "".join(logLines) + self._clipboard.set_text(str(log)) + return True + + +class SourceSelector(BasicWindow): + + def __init__(self, player, store): + BasicWindow.__init__(self, player, store) + self._radioButton = self._create_button("radio", "Radio") + self._radioButton.connect("clicked", self._on_radio_selected) self._radioWrapper = gtk.VBox() self._radioWrapper.pack_start(self._radioButton, False, True) + self._conferenceButton = self._create_button("conferences", "Conferences") + #self._conferenceButton.connect("clicked", self._on_conference_selected) self._conferenceWrapper = gtk.VBox() self._conferenceWrapper.pack_start(self._conferenceButton, False, True) + self._magazineButton = self._create_button("magazines", "Magazines") + #self._magazineButton.connect("clicked", self._on_magazine_selected) self._magazineWrapper = gtk.VBox() self._magazineWrapper.pack_start(self._magazineButton, False, True) + self._scriptureButton = self._create_button("scriptures", "Scriptures") + #self._scriptureButton.connect("clicked", self._on_scripture_selected) self._scriptureWrapper = gtk.VBox() self._scriptureWrapper.pack_start(self._scriptureButton, False, True) @@ -34,19 +152,13 @@ class SourceSelector(object): self._playcontrol = playcontrol.PlayControl(player, store) - self._layout = gtk.VBox() - self._layout.pack_start(self._errorBanner.toplevel, False, True) self._layout.pack_start(self._buttonLayout, True, True) self._layout.pack_start(self._playcontrol.toplevel, False, True) - self._layout.show_all() + self._window.show_all() self._errorBanner.toplevel.hide() self._playcontrol.toplevel.hide() - @property - def toplevel(self): - return self._layout - def _create_button(self, icon, message): image = self._store.get_image_from_store(self._store.STORE_LOOKUP[icon]) @@ -60,3 +172,40 @@ class SourceSelector(object): button.add(buttonLayout) return button + + @misc_utils.log_exception(_moduleLogger) + def _on_radio_selected(self, *args): + radioView = RadioView(self._player, self._store) + radioView.window.set_modal(True) + radioView.window.set_transient_for(self._window) + radioView.window.set_default_size(*self._window.get_size()) + + +class RadioView(BasicWindow): + + def __init__(self, player, store): + BasicWindow.__init__(self, player, store) + + self._loadingBanner = banners.GenericBanner() + + headerPath = self._store.STORE_LOOKUP["radio_header"] + self._header = self._store.get_image_from_store(headerPath) + + self._radioLayout = gtk.VBox(True, 5) + self._radioLayout.set_property("border-width", 5) + self._radioLayout.pack_start(self._header, False, False) + + self._layout.pack_start(self._loadingBanner.toplevel, False, False) + self._layout.pack_start(self._radioLayout, True, True) + + self._window.show_all() + self._errorBanner.toplevel.hide() + self._loadingBanner.toplevel.hide() + + def _show_loading(self): + animationPath = self._store.STORE_LOOKUP["loading"] + animation = self._store.get_pixbuf_animation_from_store(animationPath) + self._loadingBanner.show(animation, "Loading...") + + def _hide_loading(self): + self._loadingBanner.hide()