2 # -*- coding: utf-8 -*-
4 from __future__ import with_statement
27 _moduleLogger = logging.getLogger(__name__)
28 PROFILE_STARTUP = False
31 class MormonChannelProgram(hildonize.get_app_class()):
34 super(MormonChannelProgram, self).__init__()
35 self._clipboard = gtk.clipboard_get()
37 self._window_in_fullscreen = False #The window isn't in full screen mode initially.
40 vbox = gtk.VBox(homogeneous = False, spacing = 0)
42 if hildonize.GTK_MENU_USED:
43 #Create Menu and apply it for hildon
46 menu_items = gtk.MenuItem("Quit")
47 filemenu.append(menu_items)
48 menu_items.connect("activate", self._on_destroy, None)
50 file_menu = gtk.MenuItem("File")
52 file_menu.set_submenu(filemenu)
54 categorymenu = gtk.Menu()
56 menu_items = gtk.MenuItem("Search")
57 categorymenu.append(menu_items)
58 menu_items.connect("activate", self._on_toggle_search)
62 menu_items = gtk.MenuItem("About")
63 helpmenu.append(menu_items)
64 menu_items.connect("activate", self._on_show_about, None)
66 help_menu = gtk.MenuItem("Help")
68 help_menu.set_submenu(helpmenu)
70 menuBar = gtk.MenuBar()
72 menuBar.append (file_menu)
73 menuBar.append (help_menu)
75 vbox.pack_start(menuBar, False, False, 0)
77 menuBar = gtk.MenuBar()
79 vbox.pack_start(menuBar, False, False, 0)
81 #Get the Main Window, and connect the "destroy" event
82 self._window = gtk.Window()
83 self._window.add(vbox)
85 self._window = hildonize.hildonize_window(self, self._window)
86 hildonize.set_application_title(self._window, "%s" % constants.__pretty_app_name__)
87 menuBar = hildonize.hildonize_menu(
91 if hildonize.IS_FREMANTLE_SUPPORTED:
92 searchButton= gtk.Button("Search")
93 searchButton.connect("clicked", self._on_toggle_search)
94 menuBar.append(searchButton)
98 if not hildonize.IS_HILDON_SUPPORTED:
99 _moduleLogger.info("No hildonization support")
102 self._osso_c = osso.Context(constants.__app_name__, constants.__version__, False)
103 self._deviceState = osso.DeviceState(self._osso_c)
104 self._deviceState.set_device_state_callback(self._on_device_state_change, 0)
106 _moduleLogger.info("No osso support")
108 self._deviceState = None
110 self._window.connect("delete-event", self._on_delete_event)
111 self._window.connect("destroy", self._on_destroy)
112 self._window.connect("key-press-event", self._on_key_press)
113 self._window.connect("window-state-event", self._on_window_state_change)
115 self._window.show_all()
116 self._load_settings()
118 def _save_settings(self):
119 config = ConfigParser.SafeConfigParser()
120 self.save_settings(config)
121 with open(constants._user_settings_, "wb") as configFile:
122 config.write(configFile)
124 def save_settings(self, config):
125 config.add_section(constants.__pretty_app_name__)
126 config.set(constants.__pretty_app_name__, "fullscreen", str(self._window_in_fullscreen))
128 def _load_settings(self):
129 config = ConfigParser.SafeConfigParser()
130 config.read(constants._user_settings_)
131 self.load_settings(config)
133 def load_settings(self, config):
135 self._window_in_fullscreen = config.getboolean(constants.__pretty_app_name__, "fullscreen")
136 except ConfigParser.NoSectionError, e:
138 "Settings file %s is missing section %s" % (
139 constants._user_settings_,
144 if self._window_in_fullscreen:
145 self._window.fullscreen()
147 self._window.unfullscreen()
149 def _toggle_search(self):
150 if self._search.get_property("visible"):
155 @gtk_toolbox.log_exception(_moduleLogger)
156 def _on_device_state_change(self, shutdown, save_unsaved_data, memory_low, system_inactivity, message, userData):
158 For system_inactivity, we have no background tasks to pause
160 @note Hildon specific
165 if save_unsaved_data or shutdown:
166 self._save_settings()
168 @gtk_toolbox.log_exception(_moduleLogger)
169 def _on_window_state_change(self, widget, event, *args):
170 if event.new_window_state & gtk.gdk.WINDOW_STATE_FULLSCREEN:
171 self._window_in_fullscreen = True
173 self._window_in_fullscreen = False
175 @gtk_toolbox.log_exception(_moduleLogger)
176 def _on_key_press(self, widget, event, *args):
177 RETURN_TYPES = (gtk.keysyms.Return, gtk.keysyms.ISO_Enter, gtk.keysyms.KP_Enter)
178 isCtrl = bool(event.get_state() & gtk.gdk.CONTROL_MASK)
180 event.keyval == gtk.keysyms.F6 or
181 event.keyval in RETURN_TYPES and isCtrl
183 # The "Full screen" hardware key has been pressed
184 if self._window_in_fullscreen:
185 self._window.unfullscreen ()
187 self._window.fullscreen ()
189 elif event.keyval == gtk.keysyms.f and isCtrl:
190 self._toggle_search()
193 event.keyval in (gtk.keysyms.w, gtk.keysyms.q) and
194 event.get_state() & gtk.gdk.CONTROL_MASK
196 self._window.destroy()
197 elif event.keyval == gtk.keysyms.l and event.get_state() & gtk.gdk.CONTROL_MASK:
198 with open(constants._user_logpath_, "r") as f:
199 logLines = f.xreadlines()
200 log = "".join(logLines)
201 self._clipboard.set_text(str(log))
204 @gtk_toolbox.log_exception(_moduleLogger)
205 def _on_toggle_search(self, *args):
206 self._toggle_search()
208 @gtk_toolbox.log_exception(_moduleLogger)
209 def _on_delete_event(self, widget, event, data = None):
212 @gtk_toolbox.log_exception(_moduleLogger)
213 def _on_destroy(self, widget = None, data = None):
215 self._save_settings()
218 self._deviceState.close()
219 except AttributeError:
220 pass # Either None or close was removed (in Fremantle)
223 except AttributeError:
224 pass # Either None or close was removed (in Fremantle)
228 @gtk_toolbox.log_exception(_moduleLogger)
229 def _on_show_about(self, widget = None, data = None):
230 dialog = gtk.AboutDialog()
231 dialog.set_position(gtk.WIN_POS_CENTER)
232 dialog.set_name(constants.__pretty_app_name__)
233 dialog.set_version(constants.__version__)
234 dialog.set_copyright("")
235 dialog.set_website("")
236 comments = "Mormon Radio and Audiobook Player"
237 dialog.set_comments(comments)
238 dialog.set_authors(["Ed Page <eopage@byu.net>"])
244 if hildonize.IS_HILDON_SUPPORTED:
245 gtk.set_application_name(constants.__pretty_app_name__)
246 app = MormonChannelProgram()
247 if not PROFILE_STARTUP:
251 if __name__ == "__main__":
252 logging.basicConfig(level=logging.DEBUG)