preferences.py

Go to the documentation of this file.
00001 # Copyright 2005, 2006  Timo Savola
00002 #
00003 # This program is free software; you can redistribute it and/or modify
00004 # it under the terms of the GNU Lesser General Public License as published
00005 # by the Free Software Foundation; either version 2.1 of the License, or
00006 # (at your option) any later version.
00007 
00008 import os
00009 import gobject
00010 import pango
00011 import gtk
00012 import gtk.glade
00013 
00014 import settings
00015 import extension
00016 
00017 ##
00018 ## Preferences
00019 
00020 class Preferences (gobject.GObject):
00021         current = (None, None)
00022 
00023         def __init__(self, datadir):
00024                 gobject.GObject.__init__(self)
00025 
00026                 path = os.path.join(datadir, 'encode', 'preferences.glade')
00027                 self.glade = gtk.glade.XML(path)
00028                 self.glade.signal_autoconnect(self)
00029 
00030                 # Tree
00031 
00032                 treeview = self.glade.get_widget('treeview')
00033 
00034                 store = gtk.TreeStore(gobject.TYPE_STRING, gobject.TYPE_OBJECT, gobject.TYPE_INT, gobject.TYPE_BOOLEAN)
00035                 treeview.set_model(store)
00036 
00037                 render = gtk.CellRendererText()
00038                 render.set_property('foreground', 'blue')
00039                 column = gtk.TreeViewColumn(None, render)
00040                 column.add_attribute(render, 'text', 0)
00041                 column.add_attribute(render, 'foreground-set', 3)
00042                 treeview.append_column(column)
00043 
00044                 selection = treeview.get_selection()
00045                 selection.connect('changed', self.on_selection_changed)
00046 
00047                 # Extensions
00048 
00049                 extensions_by_name = []
00050 
00051                 for klass in extension.get_children(settings.SettingsExtension):
00052                         ext = klass()
00053                         name = ext.get_name()
00054 
00055                         extensions_by_name.append((name, ext))
00056 
00057                 extensions_by_name.sort()
00058 
00059                 # Pages
00060 
00061                 import environment
00062                 env = environment.Settings()
00063                 del environment
00064 
00065                 root = self.add_page(store, None, env)
00066 
00067                 for name, ext in extensions_by_name:
00068                         self.add_page(store, root, ext)
00069 
00070                 treeview.expand_row((0,), open_all=True)
00071                 selection.select_iter(root)
00072 
00073                 # Show
00074 
00075                 window = self.glade.get_widget('window')
00076                 window.show()
00077 
00078         def add_page(self, store, parent, settings):
00079                 widget = settings.get_widget()
00080 
00081                 normal_size = widget.style.font_desc.get_size()
00082                 label_size = int(normal_size * 1.5)
00083 
00084                 normal_weight = widget.style.font_desc.get_weight()
00085                 label_weight = int(normal_weight * 1.5)
00086 
00087                 attrs = pango.AttrList()
00088                 attrs.insert(pango.AttrSize(label_size, end_index=-1))
00089                 attrs.insert(pango.AttrWeight(label_weight, end_index=-1))
00090 
00091                 title = settings.get_title()
00092                 label = gtk.Label(title)
00093                 label.set_attributes(attrs)
00094                 label.set_alignment(0, 0)
00095                 label.set_padding(12, 6)
00096                 label.show()
00097 
00098                 separator = gtk.HSeparator()
00099                 separator.show()
00100 
00101                 align = gtk.Alignment(xscale=1, yscale=1)
00102                 align.set_padding(12, 12, 12, 12)
00103                 align.show()
00104                 align.add(widget)
00105 
00106                 viewport = gtk.Viewport()
00107                 viewport.set_shadow_type(gtk.SHADOW_NONE)
00108                 viewport.show()
00109                 viewport.add(align)
00110 
00111                 window = gtk.ScrolledWindow()
00112                 window.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
00113                 window.set_shadow_type(gtk.SHADOW_NONE)
00114                 window.show()
00115                 window.add(viewport)
00116 
00117                 box = gtk.VBox()
00118                 box.show()
00119                 box.pack_start(label, expand=False, fill=False)
00120                 box.pack_start(separator, expand=False, fill=False)
00121                 box.pack_start(window, expand=True, fill=True)
00122 
00123                 notebook = self.glade.get_widget('notebook')
00124                 page = notebook.append_page(box)
00125 
00126                 name = settings.get_name()
00127                 iter = store.append(parent, (name, settings, page, False))
00128 
00129                 settings.connect('modified', self.on_settings_modified, iter)
00130 
00131                 return iter
00132 
00133         def on_selection_changed(self, selection):
00134                 self.current = selection.get_selected()
00135                 store, iter = self.current
00136 
00137                 page = store.get_value(iter, 2)
00138                 notebook = self.glade.get_widget('notebook')
00139                 notebook.set_current_page(page)
00140 
00141                 self._update_buttons()
00142 
00143         def on_settings_modified(self, settings, iter):
00144                 if settings.accept:
00145                         store = self.current[0]
00146                         store.set_value(iter, 3, True)
00147 
00148                         self._update_buttons()
00149 
00150         def on_apply_clicked(self, button):
00151                 store, iter = self.current
00152 
00153                 settings = store.get_value(iter, 1)
00154                 try:
00155                         settings.accept = False
00156                         settings.apply()
00157                 finally:
00158                         settings.accept = True
00159 
00160                 store.set_value(iter, 3, False)
00161 
00162                 self._update_buttons()
00163 
00164         def on_revert_clicked(self, button):
00165                 store, iter = self.current
00166 
00167                 settings = store.get_value(iter, 1)
00168                 try:
00169                         settings.accept = False
00170                         settings.revert()
00171                 finally:
00172                         settings.accept = True
00173 
00174                 store.set_value(iter, 3, False)
00175 
00176                 self._update_buttons()
00177 
00178         # TODO: prompt user if there are unsaved changes?
00179         def on_close_clicked(self, button):
00180                 window = self.glade.get_widget('window')
00181                 window.destroy()
00182 
00183         def on_window_destroy(self, window):
00184                 self.emit('quit')
00185 
00186         def _update_buttons(self):
00187                 store, iter = self.current
00188                 modified = store.get_value(iter, 3)
00189 
00190                 for name in ('apply_button', 'revert_button'):
00191                         widget = self.glade.get_widget(name)
00192                         widget.set_sensitive(modified)
00193 
00194 gobject.type_register(Preferences)
00195 gobject.signal_new('quit', Preferences, 0, gobject.TYPE_NONE, [])
00196 
00197 ##
00198 ## Main
00199 
00200 def main(datadir):
00201         try:
00202                 extension.load(None, 'encode.*', datadir)
00203 
00204                 def on_quit(prefs):
00205                         gtk.main_quit()
00206 
00207                 prefs = Preferences(datadir)
00208                 prefs.connect('quit', on_quit)
00209 
00210                 gtk.main()
00211 
00212         except KeyboardInterrupt:
00213                 pass

Generated on Thu Jan 18 09:47:40 2007 for Encode by  doxygen 1.4.7