import os
import logging
+import ConfigParser
import gtk
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(Multilist, self).__init__()
self._clipboard = gtk.clipboard_get()
logging.info('Starting Multilist')
try:
- os.makedirs(self._user_data)
+ os.makedirs(constants._data_path_)
except OSError, e:
if e.errno != 17:
raise
self.db = libspeichern.Speichern()
- self.window_in_fullscreen = False #The window isn't in full screen mode initially.
- self.__isLandscape = True
+ self.__window_in_fullscreen = False #The window isn't in full screen mode initially.
+ self.__isPortrait = False
#Haupt vbox für alle Elemente
self.window = gtk.Window()
+ self.__settingsWindow = None
+ self.__settingsManager = None
self.vbox = gtk.VBox(homogeneous = False, spacing = 0)
self.selection = libselection.Selection(self.db, isHildon)
menu_items.connect("activate", self.sync_notes, None)
fileMenu.append(menu_items)
+ menu_items = gtk.MenuItem(_("Import"))
+ menu_items.connect("activate", self._on_import, None)
+ fileMenu.append(menu_items)
+
+ menu_items = gtk.MenuItem(_("Export"))
+ menu_items.connect("activate", self._on_export, None)
+ fileMenu.append(menu_items)
+
menu_items = gtk.MenuItem(_("Quit"))
menu_items.connect("activate", self._on_destroy, None)
fileMenu.append(menu_items)
filterGroup = button
button = hildonize.hildon.GtkRadioButton(gtk.HILDON_SIZE_AUTO, filterGroup)
+ button.set_label("New")
+ menuBar.add_filter(button)
+ button.connect("clicked", self._on_click_menu_filter, self.liststorehandler.SHOW_NEW)
+ button.set_mode(False)
+
+ 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)
+ button = hildonize.hildon.GtkRadioButton(gtk.HILDON_SIZE_AUTO, filterGroup)
+ button.set_label("Done")
+ menuBar.add_filter(button)
+ button.connect("clicked", self._on_click_menu_filter, self.liststorehandler.SHOW_COMPLETE)
+ button.set_mode(False)
+
+ button = gtk.Button(_("Import"))
+ button.connect("clicked", self._on_import)
+ menuBar.append(button)
+
+ button = gtk.Button(_("Export"))
+ button.connect("clicked", self._on_export)
+ menuBar.append(button)
+
renameListButton= gtk.Button(_("Rename List"))
renameListButton.connect("clicked", self.bottombar.rename_list)
menuBar.append(renameListButton)
self.window.show_all()
self._search.hide()
+ self._load_settings()
self._prepare_sync_dialog()
+ def _save_settings(self):
+ config = ConfigParser.SafeConfigParser()
+ self.save_settings(config)
+ 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__, "portrait", str(self.__isPortrait))
+ config.set(constants.__pretty_app_name__, "fullscreen", str(self.__window_in_fullscreen))
+
+ config.add_section("List")
+ self.liststorehandler.save_settings(config, "List")
+
+ def _load_settings(self):
+ config = ConfigParser.SafeConfigParser()
+ config.read(constants._user_settings_)
+ self.load_settings(config)
+
+ def load_settings(self, config):
+ isPortrait = False
+ window_in_fullscreen = False
+ try:
+ isPortrait = config.getboolean(constants.__pretty_app_name__, "portrait")
+ 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 isPortrait ^ self.__isPortrait:
+ if isPortrait:
+ orientation = gtk.ORIENTATION_VERTICAL
+ else:
+ orientation = gtk.ORIENTATION_HORIZONTAL
+ self.set_orientation(orientation)
+
+ self.__window_in_fullscreen = window_in_fullscreen
+ if self.__window_in_fullscreen:
+ self.window.fullscreen()
+ else:
+ self.window.unfullscreen()
+
+ self.liststorehandler.load_settings(config, "List")
+
def _toggle_search(self):
if self._search.get_property("visible"):
self._search.hide()
hildonize.window_to_portrait(self.window)
self.bottombar.set_orientation(gtk.ORIENTATION_VERTICAL)
self.selection.set_orientation(gtk.ORIENTATION_VERTICAL)
- self.__isLandscape = False
+ self.__isPortrait = True
elif orientation == gtk.ORIENTATION_HORIZONTAL:
hildonize.window_to_landscape(self.window)
self.bottombar.set_orientation(gtk.ORIENTATION_HORIZONTAL)
self.selection.set_orientation(gtk.ORIENTATION_HORIZONTAL)
- self.__isLandscape = True
+ self.__isPortrait = False
else:
raise NotImplementedError(orientation)
def get_orientation(self):
- return gtk.ORIENTATION_HORIZONTAL if self.__isLandscape else gtk.ORIENTATION_VERTICAL
+ return gtk.ORIENTATION_VERTICAL if self.__isPortrait else gtk.ORIENTATION_HORIZONTAL
def _toggle_rotate(self):
- if self.__isLandscape:
- self.set_orientation(gtk.ORIENTATION_VERTICAL)
- else:
+ if self.__isPortrait:
self.set_orientation(gtk.ORIENTATION_HORIZONTAL)
+ else:
+ self.set_orientation(gtk.ORIENTATION_VERTICAL)
@gtk_toolbox.log_exception(_moduleLogger)
def _on_checkout_all(self, widget):
event.keyval in RETURN_TYPES and isCtrl
):
# The "Full screen" hardware key has been pressed
- if self.window_in_fullscreen:
+ if self.__window_in_fullscreen:
self.window.unfullscreen ()
else:
self.window.fullscreen ()
return True
- elif event.keyval == gtk.keysyms.r and isCtrl:
+ elif event.keyval == gtk.keysyms.o and isCtrl:
self._toggle_rotate()
return True
elif event.keyval == gtk.keysyms.f and isCtrl:
@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
+ self.__window_in_fullscreen = True
else:
- self.window_in_fullscreen = False
+ self.__window_in_fullscreen = False
@gtk_toolbox.log_exception(_moduleLogger)
def _on_sync_finished(self, data = None, data2 = None):
self.selection.comboCategory_changed()
self.liststorehandler.update_list()
+ @gtk_toolbox.log_exception(_moduleLogger)
+ def _on_import(self, *args):
+ csvFilter = gtk.FileFilter()
+ csvFilter.set_name("Import Lists")
+ csvFilter.add_pattern("*.csv")
+ importFileChooser = gtk.FileChooserDialog(
+ title="Contacts",
+ action=gtk.FILE_CHOOSER_ACTION_OPEN,
+ parent=self.window,
+ )
+ importFileChooser.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
+ importFileChooser.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
+
+ importFileChooser.set_property("filter", csvFilter)
+ userResponse = importFileChooser.run()
+ importFileChooser.hide()
+ if userResponse == gtk.RESPONSE_OK:
+ filename = importFileChooser.get_filename()
+ self.liststorehandler.append_data(filename)
+
+ @gtk_toolbox.log_exception(_moduleLogger)
+ def _on_export(self, *args):
+ csvFilter = gtk.FileFilter()
+ csvFilter.set_name("Export Lists")
+ csvFilter.add_pattern("*.csv")
+ importFileChooser = gtk.FileChooserDialog(
+ title="Contacts",
+ action=gtk.FILE_CHOOSER_ACTION_SAVE,
+ parent=self.window,
+ )
+ importFileChooser.add_button(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
+ importFileChooser.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
+
+ importFileChooser.set_property("filter", csvFilter)
+ userResponse = importFileChooser.run()
+ importFileChooser.hide()
+ if userResponse == gtk.RESPONSE_OK:
+ filename = importFileChooser.get_filename()
+ self.liststorehandler.export_data(filename)
+
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))
@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)
- )
+ if self.__settingsWindow is None:
+ vbox = gtk.VBox()
+ self.__settingsManager = settings.SettingsDialog(vbox, self.db, self.liststorehandler)
+
+ self.__settingsWindow = gtk.Window()
+ self.__settingsWindow.add(vbox)
+ self.__settingsWindow = hildonize.hildonize_window(self, self.__settingsWindow)
+
+ self.__settingsWindow.set_title(_("Settings"))
+ self.__settingsWindow.set_transient_for(self.window)
+ self.__settingsWindow.set_default_size(*self.window.get_size())
+ self.__settingsWindow.connect("delete-event", self._on_settings_delete)
+ self.__settingsManager.set_portrait_state(self.__isPortrait)
+ self.__settingsWindow.set_modal(True)
+ self.__settingsWindow.show_all()
- cols = settings.SettingsDialog(col_dialog.vbox, self.db, self.liststorehandler)
- col_dialog.show_all()
+ @gtk_toolbox.log_exception(_moduleLogger)
+ def _on_settings_delete(self, *args):
+ self.__settingsWindow.emit_stop_by_name("delete-event")
+ self.__settingsWindow.hide()
+ self.__settingsWindow.set_modal(False)
+
+ logging.info("changing columns")
+ self.__settingsManager.save(self.db)
+ self.view.reload_view()
+
+ isPortrait = self.__settingsManager.is_portrait()
+ if isPortrait ^ self.__isPortrait:
+ if isPortrait:
+ orientation = gtk.ORIENTATION_VERTICAL
+ else:
+ orientation = gtk.ORIENTATION_HORIZONTAL
+ self.set_orientation(orientation)
- 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()
+ return True
@gtk_toolbox.log_exception(_moduleLogger)
def _on_destroy(self, widget = None, data = None):
try:
self.db.close()
+ self._save_settings()
+
try:
self._osso_c.close()
except AttributeError:
dialog.set_name(constants.__pretty_app_name__)
dialog.set_version(constants.__version__)
dialog.set_copyright("")
- dialog.set_website("http://axique.de/f = Multilist")
- comments = "%s is a program to handle multiple lists." % constants.__pretty_app_name__
+ dialog.set_website("http://multilist.garage.maemo.org")
+ comments = "%s is a program to handle multiple lists. For licensing on the icon, see the website." % 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()