The mess of things to get this to work for Fremantle
authorepage <eopage@byu.net>
Wed, 11 Nov 2009 01:46:07 +0000 (01:46 +0000)
committerepage <eopage@byu.net>
Wed, 11 Nov 2009 01:46:07 +0000 (01:46 +0000)
git-svn-id: file:///svnroot/quicknote/trunk@72 bb7704e3-badb-4cfa-9ab3-9374dc87eaa2

src/gtk_toolbox.py
src/notizen.py
src/quicknote_gtk.py
src/simple_list.py

index a2a2e2a..b81d444 100644 (file)
@@ -284,6 +284,22 @@ def threaded_stage(target, thread_factory = threading.Thread):
        return queue_sink(messages)
 
 
+def log_exception(logger):
+
+       def log_exception_decorator(func):
+
+               @functools.wraps(func)
+               def wrapper(*args, **kwds):
+                       try:
+                               return func(*args, **kwds)
+                       except Exception:
+                               logger.exception(func.__name__)
+
+               return wrapper
+
+       return log_exception_decorator
+
+
 class LoginWindow(object):
 
        def __init__(self, widgetTree):
index ccac21a..57b0b3d 100644 (file)
@@ -7,6 +7,9 @@
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License version 2 as
 published by the Free Software Foundation.
+
+@todo It would be nice to move the category selector to the category list's column and search below everything.
+@todo Search would be activated by menu or CTRL+F rather than zoom
 """
 
 import time
@@ -21,6 +24,7 @@ except ImportError:
        gtkspell = None
 
 import hildonize
+import gtk_toolbox
 import simple_list
 
 
@@ -51,9 +55,6 @@ class Notizen(gtk.HBox):
                self._noteslist.set_eventfunction_cursor_changed(self._update_noteslist)
                self._noteslist.widget.set_size_request(250, -1)
 
-               frame = gtk.Frame(_("Titles"))
-               frame.add(self._noteslist.widget)
-
                buttonHBox = gtk.HBox()
 
                button = gtk.Button(stock = gtk.STOCK_ADD)
@@ -65,7 +66,7 @@ class Notizen(gtk.HBox):
                buttonHBox.pack_start(button, expand = True, fill = True, padding = 3)
 
                listVbox = gtk.VBox(homogeneous = False, spacing = 0)
-               listVbox.pack_start(frame, expand = True, fill = True, padding = 3)
+               listVbox.pack_start(self._noteslist.widget, expand = True, fill = True, padding = 3)
                listVbox.pack_start(buttonHBox, expand = False, fill = True, padding = 3)
                self.pack_start(listVbox, expand = False, fill = True, padding = 3)
 
@@ -85,9 +86,6 @@ class Notizen(gtk.HBox):
                self._noteScrollWindow.add(self._noteBodyView)
                hildonize.hildonize_scrollwindow_with_viewport(self._noteScrollWindow)
 
-               frame = gtk.Frame(_("Note"))
-               frame.add(self._noteScrollWindow)
-
                # History
                self._historyBox = gtk.HBox(homogeneous = False, spacing = 0)
 
@@ -101,7 +99,7 @@ class Notizen(gtk.HBox):
 
                # Note and history stuff in same column
                noteVbox = gtk.VBox(homogeneous = False, spacing = 0)
-               noteVbox.pack_start(frame, expand = True, fill = True, padding = 3)
+               noteVbox.pack_start(self._noteScrollWindow, expand = True, fill = True, padding = 3)
                noteVbox.pack_start(self._historyBox, expand = False, fill = True, padding = 3)
                self.pack_start(noteVbox, expand = True, fill = True, padding = 3)
 
@@ -177,10 +175,15 @@ class Notizen(gtk.HBox):
                self._noteBodyView.grab_focus()
                return False
 
-       def _update_noteslist(self, data = None, data2 = None):
+       def _update_noteslist(self, *args):
                if self._pos != -1:
                        self.save_note()
 
+               if args:
+                       data = args[0]
+               else:
+                       data = None
+
                try:
                        (pos, key, value) = self._noteslist.get_selection_data()
                        if (pos == -1):
@@ -207,6 +210,7 @@ class Notizen(gtk.HBox):
 
                gobject.timeout_add(200, self._set_focus)
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_note_changed(self, widget = None, data = None):
                if self._pos == -1 or self.noteId == -1:
                        return
@@ -219,9 +223,11 @@ class Notizen(gtk.HBox):
                if value != title:
                        self._noteslist.change_item(self._pos, title, self.noteId)
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_add_note(self, widget = None, data = None):
                self._update_noteslist("new")
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_delete_note(self, widget = None, data = None):
                if (self.noteId == -1):
                        return
@@ -236,6 +242,7 @@ class Notizen(gtk.HBox):
                        self._pos = -1
                        self._noteBodyView.get_buffer().set_text("")
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_show_history(self, widget = None, data = None, label = None):
                if self.noteId == -1:
                        mbox =  gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, _("No note selected."))
index b03209e..4b71552 100644 (file)
@@ -35,6 +35,7 @@ except ImportError:
 
 import constants
 import hildonize
+import gtk_toolbox
 
 import speichern
 import kopfzeile
@@ -48,7 +49,7 @@ except NameError:
        _ = lambda x: x
 
 
-_moduleLogger = logging.getLogger("quick")
+_moduleLogger = logging.getLogger("quicknote_gtk")
 
 
 class QuicknoteProgram(hildonize.get_app_class()):
@@ -152,12 +153,8 @@ class QuicknoteProgram(hildonize.get_app_class()):
                self._window = gtk.Window()
                self._window.add(vbox)
 
-               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._on_toggle_word_wrap()
+               self.enable_zoom(True)
 
                try:
                        os.makedirs(self._user_data)
@@ -188,6 +185,11 @@ class QuicknoteProgram(hildonize.get_app_class()):
 
                self._prepare_sync_dialog()
 
+               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._load_settings()
 
@@ -269,6 +271,7 @@ class QuicknoteProgram(hildonize.get_app_class()):
                        self._topBox.show()
                        self._notizen.show_history_area(True)
 
+       @gtk_toolbox.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
@@ -281,30 +284,40 @@ class QuicknoteProgram(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 event.get_state() & gtk.gdk.CONTROL_MASK
+                       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 ()
-               elif event.keyval == gtk.keysyms.F7:
+               elif (
+                       event.keyval == gtk.keysyms.F7 or
+                       event.keyval == gtk.keysyms.i and isCtrl
+               ):
                        # Zoom In
                        self.enable_zoom(True)
-               elif event.keyval == gtk.keysyms.F8:
+               elif (
+                       event.keyval == gtk.keysyms.F8 or
+                       event.keyval == gtk.keysyms.o and isCtrl
+               ):
                        # Zoom Out
                        self.enable_zoom(False)
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_view_sql_history(self, widget = None, data = None, data2 = None):
                import sqldialog
                sqldiag = sqldialog.SqlDialog(self._db)
@@ -323,6 +336,7 @@ class QuicknoteProgram(hildonize.get_app_class()):
 
                sqldiag.destroy()
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_move_category(self, widget = None, data = None):
                dialog = gtk.Dialog(_("Choose category"), self._window, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
 
@@ -361,6 +375,7 @@ class QuicknoteProgram(hildonize.get_app_class()):
 
                dialog.destroy()
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_delete_category(self, widget = None, data = None):
                if self._topBox.get_category() == "%" or self._topBox.get_category() == "undefined":
                        mbox = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, _("This category can not be deleted"))
@@ -384,21 +399,26 @@ class QuicknoteProgram(hildonize.get_app_class()):
                                self._topBox.categoryCombo.remove_text(pos)
                                self._topBox.categoryCombo.set_active(0)
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_sync_finished(self, data = None, data2 = None):
                self._topBox.load_categories()
                self._notizen.load_notes()
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_sync_notes(self, widget = None, data = None):
                self._syncDialog.run()
                self._syncDialog.hide()
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_toggle_word_wrap(self, *args):
                self._wordWrapEnabled = not self._wordWrapEnabled
                self._notizen.set_wordwrap(self._wordWrapEnabled)
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_delete_event(self, widget, event, data = None):
                return False
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_destroy(self, widget = None, data = None):
                try:
                        self._save_settings()
@@ -408,6 +428,7 @@ class QuicknoteProgram(hildonize.get_app_class()):
                finally:
                        gtk.main_quit()
 
+       @gtk_toolbox.log_exception(_moduleLogger)
        def _on_show_about(self, widget = None, data = None):
                dialog = gtk.AboutDialog()
                dialog.set_position(gtk.WIN_POS_CENTER)
index 04bedf8..5858e70 100644 (file)
@@ -9,11 +9,13 @@ it under the terms of the GNU General Public License version 2 as
 published by the Free Software Foundation.\r
 """\r
 \r
+import logging\r
 \r
 import pango\r
 import gtk\r
 \r
 import hildonize\r
+import gtk_toolbox\r
 \r
 \r
 try:\r
@@ -22,6 +24,9 @@ except NameError:
        _ = lambda x: x\r
 \r
 \r
+_moduleLogger = logging.getLogger("simple_list")\r
+\r
+\r
 class SimpleList(object):\r
        """\r
        Stellt eine einfache Liste mit Laufbalken dar. Das wird mit\r
@@ -41,7 +46,7 @@ class SimpleList(object):
                self._itemlist = gtk.ListStore(str, str)\r
                self._itemView = gtk.TreeView(self._itemlist)\r
                self._itemView.set_headers_visible(False)\r
-               self._itemView.get_selection().set_mode(gtk.SELECTION_BROWSE)\r
+               self._itemView.get_selection().set_mode(gtk.SELECTION_SINGLE)\r
                self._itemView.connect("cursor-changed", self._on_cursor_changed)\r
                self._itemView.connect("row-activated", self._on_row_activated)\r
                self._itemView.show()\r
@@ -121,11 +126,13 @@ class SimpleList(object):
                """\r
 \r
                self._itemView.connect("cursor-changed", function)\r
+               self._itemView.connect("row-activated", function)\r
 \r
+       @gtk_toolbox.log_exception(_moduleLogger)\r
        def _on_row_activated(self, treeview, path, view_column, data = None):\r
                """\r
-               Setzt den Wert von self._selectedItems. Dieser Wert kann\r
-               mit der Methode "get_selection_data" abgerufen werden.\r
+               Sets the value of self._selectedItems. This value can\r
+               be retrieved using the method "get_selection_data.\r
                """\r
 \r
                iter = self._itemlist.get_iter(path)\r
@@ -138,10 +145,11 @@ class SimpleList(object):
                        self._itemlist.get_value(iter, self.VALUE_IDX) # Value\r
                )\r
 \r
+       @gtk_toolbox.log_exception(_moduleLogger)\r
        def _on_cursor_changed(self, widget, data1 = None, data2 = None):\r
                """\r
-               Setzt den Wert von self._selectedItems. Dieser Wert kann\r
-               mit der Methode "get_selection_data" abgerufen werden.\r
+               Sets the value of self._selectedItems. This value can\r
+               be retrieved using the method "get_selection_data.\r
                """\r
 \r
                selection = widget.get_selection()\r