00001
00002
00003
00004
00005
00006
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
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
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
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
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
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
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
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