Creation of window content with subwindow work
authorEd Page <eopage@byu.net>
Mon, 3 May 2010 23:56:16 +0000 (18:56 -0500)
committerEd Page <eopage@byu.net>
Wed, 5 May 2010 03:31:17 +0000 (22:31 -0500)
src/mormonchannel_gtk.py
src/windows.py

index 1b020b3..0ddff73 100755 (executable)
@@ -26,7 +26,7 @@ except ImportError:
 
 import constants
 import hildonize
 
 import constants
 import hildonize
-import gtk_toolbox
+import util.misc as misc_utils
 
 import imagestore
 import player
 
 import imagestore
 import player
@@ -41,72 +41,9 @@ class MormonChannelProgram(hildonize.get_app_class()):
 
        def __init__(self):
                super(MormonChannelProgram, self).__init__()
 
        def __init__(self):
                super(MormonChannelProgram, self).__init__()
-               self._clipboard = gtk.clipboard_get()
                self._player = player.Player()
                self._store = imagestore.ImageStore("../data", "../data")
 
                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")
 
                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._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._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)
 
                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_)
        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
        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()
 
                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()
        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()
 
                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)
        def _on_show_about(self, widget = None, data = None):
                dialog = gtk.AboutDialog()
                dialog.set_position(gtk.WIN_POS_CENTER)
index 6ad1192..cbe1fcf 100644 (file)
+import ConfigParser
+import logging
+
+import gobject
 import gtk
 
 import gtk
 
+import constants
+import hildonize
+import gtk_toolbox
+import util.misc as misc_utils
+
 import banners
 import playcontrol
 
 
 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):
 
        def __init__(self, player, store):
+               gobject.GObject.__init__(self)
+
                self._player = player
                self._store = store
 
                self._player = player
                self._store = store
 
+               self._clipboard = gtk.clipboard_get()
+               self._windowInFullscreen = False
+
                self._errorBanner = banners.StackingBanner()
 
                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 = 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._radioWrapper = gtk.VBox()
                self._radioWrapper.pack_start(self._radioButton, False, True)
+
                self._conferenceButton = self._create_button("conferences", "Conferences")
                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._conferenceWrapper = gtk.VBox()
                self._conferenceWrapper.pack_start(self._conferenceButton, False, True)
+
                self._magazineButton = self._create_button("magazines", "Magazines")
                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._magazineWrapper = gtk.VBox()
                self._magazineWrapper.pack_start(self._magazineButton, False, True)
+
                self._scriptureButton = self._create_button("scriptures", "Scriptures")
                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)
 
                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._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.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()
 
                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])
 
        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
                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()