Adding settings to app menu
[multilist] / src / multilist_gtk.py
index a9f18d1..4933a11 100755 (executable)
@@ -21,22 +21,15 @@ Copyright (C) 2008 Christoph Würstle
 """
 
 import os
-import sys
 import logging
 
 import gtk
 
 try:
        import hildon
-       isHildon=True
+       isHildon = True
 except:
-       isHildon=False
-       class hildon():
-               def __init__(self):
-                       print "PseudoClass hildon"
-               class Program():
-                       def __init__(self):
-                               print "PseudoClass hildon.Program"
+       isHildon = False
 
 try:
        import osso
@@ -45,9 +38,12 @@ except ImportError:
 
 import constants
 import hildonize
+import gtk_toolbox
 
 import libspeichern
-import libsqldialog
+import search
+import sqldialog
+import settings
 import libselection
 import libview
 import libliststorehandler
@@ -64,13 +60,13 @@ _moduleLogger = logging.getLogger(__name__)
 PROFILE_STARTUP = False
 
 
-class multilistclass(hildonize.get_app_class()):
+class Multilist(hildonize.get_app_class()):
 
        _user_data = os.path.join(os.path.expanduser("~"), ".%s" % constants.__app_name__)
        _user_settings = "%s/settings.ini" % _user_data
 
        def __init__(self):
-               super(multilistclass, self).__init__()
+               super(Multilist, self).__init__()
                self._clipboard = gtk.clipboard_get()
 
                logging.info('Starting Multilist')
@@ -86,76 +82,102 @@ class multilistclass(hildonize.get_app_class()):
 
                #Haupt vbox für alle Elemente
                self.window = gtk.Window()
-               self.vbox = gtk.VBox(homogeneous=False, spacing=0)
+               self.vbox = gtk.VBox(homogeneous = False, spacing = 0)
 
                self.selection = libselection.Selection(self.db, isHildon)
+               self._search = search.Search()
                self.liststorehandler = libliststorehandler.Liststorehandler(self.db, self.selection)
                self.view = libview.View(self.db, self.liststorehandler, self.window)
                self.bottombar = libbottombar.Bottombar(self.db, self.view, isHildon)
 
                #Menue
                if hildonize.GTK_MENU_USED:
-                       dateimenu = gtk.Menu()
+                       fileMenu = gtk.Menu()
 
                        menu_items = gtk.MenuItem(_("Choose database file"))
-                       dateimenu.append(menu_items)
                        menu_items.connect("activate", self.select_db_dialog, None)
+                       fileMenu.append(menu_items)
 
                        menu_items = gtk.MenuItem(_("SQL history"))
-                       dateimenu.append(menu_items)
                        menu_items.connect("activate", self.view_sql_history, None)
+                       fileMenu.append(menu_items)
 
                        menu_items = gtk.MenuItem(_("SQL optimize"))
-                       dateimenu.append(menu_items)
                        menu_items.connect("activate", self.optimizeSQL, None)
+                       fileMenu.append(menu_items)
 
                        menu_items = gtk.MenuItem(_("Sync items"))
-                       dateimenu.append(menu_items)
                        menu_items.connect("activate", self.sync_notes, None)
+                       fileMenu.append(menu_items)
 
                        menu_items = gtk.MenuItem(_("Quit"))
-                       dateimenu.append(menu_items)
                        menu_items.connect("activate", self.destroy, None)
-                       #menu_items.show()
+                       fileMenu.append(menu_items)
 
-                       datei_menu = gtk.MenuItem(_("File"))
-                       datei_menu.show()
-                       datei_menu.set_submenu(dateimenu)
+                       fileMenuItem = gtk.MenuItem(_("File"))
+                       fileMenuItem.show()
+                       fileMenuItem.set_submenu(fileMenu)
 
-                       toolsmenu = gtk.Menu()
+                       categorymenu = gtk.Menu()
 
-                       menu_items = gtk.MenuItem(_("Choose columns"))
-                       toolsmenu.append(menu_items)
-                       menu_items.connect("activate", self.show_columns_dialog, None)
+                       menu_items = gtk.MenuItem(_("Search"))
+                       menu_items.connect("activate", self._on_toggle_search)
+                       categorymenu.append(menu_items)
+
+                       menu_items = gtk.MenuItem(_("Checkout All"))
+                       menu_items.connect("activate", self._on_checkout_all)
+                       categorymenu.append(menu_items)
 
                        menu_items = gtk.MenuItem(_("Rename Category"))
-                       toolsmenu.append(menu_items)
                        menu_items.connect("activate", self.bottombar.rename_category, None)
+                       categorymenu.append(menu_items)
+
+                       category_menu = gtk.MenuItem(_("Category"))
+                       category_menu.show()
+                       category_menu.set_submenu(categorymenu)
+
+                       viewMenu = gtk.Menu()
+
+                       menu_items = gtk.MenuItem(_("Show Active"))
+                       menu_items.connect("activate", self._on_toggle_filter, None)
+                       viewMenu.append(menu_items)
+
+                       menu_items = gtk.MenuItem(_("Settings"))
+                       menu_items.connect("activate", self._on_settings, None)
+                       viewMenu.append(menu_items)
+
+                       viewMenuItem = gtk.MenuItem(_("View"))
+                       viewMenuItem.show()
+                       viewMenuItem.set_submenu(viewMenu)
+
+                       toolsMenu = gtk.Menu()
 
                        menu_items = gtk.MenuItem(_("Rename List"))
-                       toolsmenu.append(menu_items)
                        menu_items.connect("activate", self.bottombar.rename_list, None)
+                       toolsMenu.append(menu_items)
 
-                       tools_menu = gtk.MenuItem(_("Tools"))
-                       tools_menu.show()
-                       tools_menu.set_submenu(toolsmenu)
+                       toolsMenuItem = gtk.MenuItem(_("Tools"))
+                       toolsMenuItem.show()
+                       toolsMenuItem.set_submenu(toolsMenu)
 
-                       hilfemenu = gtk.Menu()
+                       helpMenu = gtk.Menu()
                        menu_items = gtk.MenuItem(_("About"))
-                       hilfemenu.append(menu_items)
+                       helpMenu.append(menu_items)
                        menu_items.connect("activate", self.show_about, None)
 
-                       hilfe_menu = gtk.MenuItem(_("Help"))
-                       hilfe_menu.show()
-                       hilfe_menu.set_submenu(hilfemenu)
+                       helpMenuItem = gtk.MenuItem(_("Help"))
+                       helpMenuItem.show()
+                       helpMenuItem.set_submenu(helpMenu)
 
                        menu_bar = gtk.MenuBar()
                        menu_bar.show()
-                       menu_bar.append (datei_menu)
-                       menu_bar.append (tools_menu)
-                       # unten -> damit als letztes menu_bar.append (hilfe_menu)
+                       menu_bar.append (fileMenuItem)
+                       menu_bar.append (toolsMenuItem)
+                       menu_bar.append (category_menu)
+                       menu_bar.append (viewMenuItem)
+                       # unten -> damit als letztes menu_bar.append (helpMenuItem)
                        #Als letztes menü
-                       menu_bar.append (hilfe_menu)
+                       menu_bar.append (helpMenuItem)
 
                        self.vbox.pack_start(menu_bar, False, False, 0)
                else:
@@ -164,9 +186,10 @@ class multilistclass(hildonize.get_app_class()):
                        self.vbox.pack_start(menuBar, False, False, 0)
 
                #add to vbox below (to get it on top)
-               self.vbox.pack_end(self.bottombar, expand=False, fill=True, padding=0)
-               self.vbox.pack_end(self.view, expand=True, fill=True, padding=0)
-               self.vbox.pack_end(self.selection, expand=False, fill=True, padding=0)
+               self.vbox.pack_end(self._search, expand = False, fill = True)
+               self.vbox.pack_end(self.bottombar, expand = False, fill = True, padding = 0)
+               self.vbox.pack_end(self.view, expand = True, fill = True, padding = 0)
+               self.vbox.pack_end(self.selection, expand = False, fill = True, padding = 0)
 
                #Get the Main Window, and connect the "destroy" event
                self.window.add(self.vbox)
@@ -178,7 +201,36 @@ class multilistclass(hildonize.get_app_class()):
                        menu_bar,
                )
                if hildonize.IS_FREMANTLE_SUPPORTED:
-                       pass
+                       button = hildonize.hildon.GtkRadioButton(gtk.HILDON_SIZE_AUTO, None)
+                       button.set_label("All")
+                       menuBar.add_filter(button)
+                       button.connect("clicked", self._on_click_menu_filter, self.liststorehandler.SHOW_ALL)
+                       button.set_mode(False)
+                       filterGroup = button
+
+                       button = hildonize.hildon.GtkRadioButton(gtk.HILDON_SIZE_AUTO, filterGroup)
+                       button.set_label("Active")
+                       menuBar.add_filter(button)
+                       button.connect("clicked", self._on_click_menu_filter, self.liststorehandler.SHOW_ACTIVE)
+                       button.set_mode(False)
+
+                       renameCategoryButton = gtk.Button(_("Rename Category"))
+                       renameCategoryButton.connect("clicked", self.bottombar.rename_category)
+                       menuBar.append(renameCategoryButton)
+
+                       renameListButton= gtk.Button(_("Rename List"))
+                       renameListButton.connect("clicked", self.bottombar.rename_list)
+                       menuBar.append(renameListButton)
+
+                       searchButton= gtk.Button(_("Search Category"))
+                       searchButton.connect("clicked", self._on_toggle_search)
+                       menuBar.append(searchButton)
+
+                       searchButton= gtk.Button(_("Settings"))
+                       searchButton.connect("clicked", self._on_settings)
+                       menuBar.append(searchButton)
+
+                       menuBar.show_all()
 
                if not hildonize.IS_HILDON_SUPPORTED:
                        _moduleLogger.info("No hildonization support")
@@ -197,11 +249,45 @@ class multilistclass(hildonize.get_app_class()):
                self.window.connect("destroy", self.destroy)
                self.window.connect("key-press-event", self.on_key_press)
                self.window.connect("window-state-event", self.on_window_state_change)
+               self._search.connect("search_changed", self._on_search)
 
                self.window.show_all()
+               self._search.hide()
                self.prepare_sync_dialog()
                self.ladeAlles()
 
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def _on_checkout_all(self, widget):
+               self.liststorehandler.checkout_rows()
+
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def _on_search(self, widget):
+               self.liststorehandler.get_liststore(self._search.get_search_pattern())
+
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def _on_click_menu_filter(self, button, val):
+               self.liststorehandler.set_filter(val)
+
+       def _toggle_search(self):
+               if self._search.get_property("visible"):
+                       self._search.hide()
+               else:
+                       self._search.show()
+
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def _on_toggle_search(self, *args):
+               self._toggle_search()
+
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def _on_toggle_filter(self, *args):
+               if self.liststorehandler.get_filter() == self.liststorehandler.SHOW_ALL:
+                       self.liststorehandler.set_filter(self.liststorehandler.SHOW_ACTIVE)
+               elif self.liststorehandler.get_filter() == self.liststorehandler.SHOW_ACTIVE:
+                       self.liststorehandler.set_filter(self.liststorehandler.SHOW_ALL)
+               else:
+                       assert False, "Unknown"
+
+       @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)
@@ -215,14 +301,14 @@ class multilistclass(hildonize.get_app_class()):
                        else:
                                self.window.fullscreen ()
                        return True
-               #elif event.keyval == gtk.keysyms.f and isCtrl:
-               #       self._toggle_search()
-               #       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()
+                       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()
@@ -230,70 +316,69 @@ class multilistclass(hildonize.get_app_class()):
                                self._clipboard.set_text(str(log))
                        return True
 
+       @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
 
-       def speichereAlles(self,data=None,data2=None):
+       def speichereAlles(self, data = None, data2 = None):
                logging.info("Speichere alles")
 
-       def ladeAlles(self,data=None,data2=None):
+       def ladeAlles(self, data = None, data2 = None):
                logging.info("Lade alles")
 
-       def beforeSync(self,data=None,data2=None):
+       def beforeSync(self, data = None, data2 = None):
                logging.info("Lade alles")
 
-       def sync_finished(self,data=None,data2=None):
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def sync_finished(self, data = None, data2 = None):
                self.selection.comboList_changed()
                self.selection.comboCategory_changed()
                self.liststorehandler.update_list()
 
        def prepare_sync_dialog(self):
-               self.sync_dialog = gtk.Dialog(_("Sync"),None,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,(gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
+               self.sync_dialog = gtk.Dialog(_("Sync"), None, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
 
                self.sync_dialog.set_position(gtk.WIN_POS_CENTER)
-               sync=libsync.Sync(self.db,self.window,50503)
-               sync.connect("syncFinished",self.sync_finished)
+               sync = libsync.Sync(self.db, self.window, 50503)
+               sync.connect("syncFinished", self.sync_finished)
                self.sync_dialog.vbox.pack_start(sync, True, True, 0)
-               self.sync_dialog.set_size_request(500,350)
+               self.sync_dialog.set_size_request(500, 350)
                self.sync_dialog.vbox.show_all()
-               sync.connect("syncFinished",self.sync_finished)
 
-       def sync_notes(self,widget=None,data=None):
-               if self.sync_dialog==None:
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def sync_notes(self, widget = None, data = None):
+               if self.sync_dialog == None:
                        self.prepare_sync_dialog()
                self.sync_dialog.run()
                self.sync_dialog.hide()
 
-       def show_columns_dialog(self,widget=None,data=None):
-               col_dialog = gtk.Dialog(_("Choose columns"),self.window,gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT))
-
-               col_dialog.set_position(gtk.WIN_POS_CENTER)
-               cols=libview.Columns_dialog(self.db,self.liststorehandler)
-
-               col_dialog.vbox.pack_start(cols, True, True, 0)
-               col_dialog.set_size_request(500,350)
-               col_dialog.vbox.show_all()
-
-               resp=col_dialog.run()
-               col_dialog.hide()
-               if resp==gtk.RESPONSE_ACCEPT:
-                       logging.info("changing columns")
-                       cols.save_column_setting()
-                       self.view.reload_view()
-                       #children=self.vbox.get_children()
-                       #while len(children)>1:
-                       #       self.vbox.remove(children[1])
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def _on_settings(self, *args):
+               col_dialog = gtk.Dialog(
+                       _("Settings"),
+                       self.window,
+                       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
+                       (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT, gtk.STOCK_OK, gtk.RESPONSE_ACCEPT)
+               )
 
-                       #self.vbox.pack_end(self.bottombar, expand=True, fill=True, padding=0)
-                       #self.vbox.pack_end(view, expand=True, fill=True, padding=0)
-                       #self.vbox.pack_end(self.selection, expand=False, fill=True, padding=0)
+               cols = settings.SettingsDialog(col_dialog.vbox, self.db, self.liststorehandler)
+               col_dialog.show_all()
 
-               col_dialog.destroy()
+               resp = col_dialog.run()
+               try:
+                       col_dialog.hide()
+                       if resp == gtk.RESPONSE_ACCEPT:
+                               logging.info("changing columns")
+                               cols.save(self.db)
+                               self.view.reload_view()
+               finally:
+                       col_dialog.destroy()
 
-       def destroy(self, widget=None, data=None):
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def destroy(self, widget = None, data = None):
                try:
                        self.speichereAlles()
                        self.db.close()
@@ -304,34 +389,40 @@ class multilistclass(hildonize.get_app_class()):
                finally:
                        gtk.main_quit()
 
-       def delete_event(self, widget, event, data=None):
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def delete_event(self, widget, event, data = None):
                #print "delete event occurred"
                return False
 
-       def dlg_delete(self,widget,event,data=None):
+       def dlg_delete(self, widget, event, data = None):
                return False
 
-       def show_about(self, widget=None,data=None):
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def show_about(self, widget = None, data = None):
                dialog = gtk.AboutDialog()
                dialog.set_position(gtk.WIN_POS_CENTER)
                dialog.set_name(constants.__pretty_app_name__)
                dialog.set_version(constants.__version__)
                dialog.set_copyright("")
-               dialog.set_website("http://axique.de/f=Multilist")
+               dialog.set_website("http://axique.de/f = Multilist")
                comments = "%s is a program to handle multiple lists." % constants.__pretty_app_name__
                dialog.set_comments(comments)
                dialog.set_authors(["Christoph Wurstle <n800@axique.net>", "Ed Page <eopage@byu.net> (Blame him for the most recent bugs)"])
                dialog.run()
                dialog.destroy()
 
-       def on_info1_activate(self,menuitem):
+       def on_info1_activate(self, menuitem):
                self.show_about(menuitem)
 
-       def view_sql_history(self,widget=None,data=None,data2=None):
-               sqldiag=libsqldialog.sqlDialog(self.db)
-               res=sqldiag.run()
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def view_sql_history(self, widget = None, data = None, data2 = None):
+               sqldiag = sqldialog.SqlDialog(self.db)
+               res = sqldiag.run()
                sqldiag.hide()
-               if res==444:
+
+               try:
+                       if res != gtk.RESPONSE_OK:
+                               return
                        logging.info("exporting sql")
 
                        if not isHildon:
@@ -342,38 +433,40 @@ class multilistclass(hildonize.get_app_class()):
                                dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
                                dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
                        else:
-                               #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
-                               dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
+                               dlg = hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
 
                        dlg.set_title(_("Select SQL export file"))
-                       if dlg.run() == gtk.RESPONSE_OK:
-                               fileName = dlg.get_filename()
-                               dlg.destroy()
-                               sqldiag.exportSQL(fileName)
-                       else:
+                       exportFileResponse = dlg.run()
+                       try:
+                               if exportFileResponse == gtk.RESPONSE_OK:
+                                       fileName = dlg.get_filename()
+                                       sqldiag.exportSQL(fileName)
+                       finally:
                                dlg.destroy()
+               finally:
+                       sqldiag.destroy()
 
-               sqldiag.destroy()
-
-       def optimizeSQL(self,widget=None,data=None,data2=None):
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def optimizeSQL(self, widget = None, data = None, data2 = None):
                #optimiere sql
-               self.db.speichereSQL("VACUUM",log=False)
+               self.db.speichereSQL("VACUUM", log = False)
 
-       def select_db_dialog(self,widget=None,data=None,data2=None):
-               if (isHildon==False):
+       @gtk_toolbox.log_exception(_moduleLogger)
+       def select_db_dialog(self, widget = None, data = None, data2 = None):
+               if (isHildon == False):
                        dlg = gtk.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
                        dlg.add_button( gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
                        dlg.add_button( gtk.STOCK_OK, gtk.RESPONSE_OK)
                else:
                        #dlg = hildon.FileChooserDialog(parent = self.window, action = gtk.FILE_CHOOSER_ACTION_SAVE)
-                       dlg=hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
+                       dlg = hildon.FileChooserDialog(self.window, gtk.FILE_CHOOSER_ACTION_SAVE)
 
                if self.db.ladeDirekt('datenbank'):
                        dlg.set_filename(self.db.ladeDirekt('datenbank'))
                dlg.set_title(_("Choose your database file"))
                if dlg.run() == gtk.RESPONSE_OK:
                        fileName = dlg.get_filename()
-                       self.db.speichereDirekt('datenbank',fileName)
+                       self.db.speichereDirekt('datenbank', fileName)
                        self.speichereAlles()
                        self.db.openDB()
                        self.ladeAlles()
@@ -383,11 +476,11 @@ class multilistclass(hildonize.get_app_class()):
 def run_multilist():
        if hildonize.IS_HILDON_SUPPORTED:
                gtk.set_application_name(constants.__pretty_app_name__)
-       app = multilistclass()
+       app = Multilist()
        if not PROFILE_STARTUP:
                gtk.main()
 
 
 if __name__ == "__main__":
-       logging.basicConfig(level=logging.DEBUG)
+       logging.basicConfig(level = logging.DEBUG)
        run_multilist()