On 21 Jul 2004 19:18:25 -0500 Doug Quale <[EMAIL PROTECTED]> wrote: > I was imagining a simple system that required the application > programmer to save the preferences and load them into the appropriate > widgets by hand. This would be very tedious, but smarter mechanisms > could be built on top of those low level facilities. Maybe this is > aiming too low.
Well, here's some code that aims even lower -- I use the attached class in my applications as a way to remember where a user has positioned a window and the state of various widgets (panes, toggles). I haven't yet used it for scrollbars, but it should be do-able. I ran into some trouble with adjustable column-widths as I couldn't find a reliable way to get and set them while still allowing the user to reset them (I believe this has already been commented on). I haven't even thought about touching the parts of the TreeView that would require knowing something about the TreeModel. Tom
#!/usr/bin/env python import gtk, gtk.gdk class WidgetSaver: """A class to save and load widget properties to/from a dictionary. We leave it to whoever hands us the dictionary to save the dictionary. dictionary should contain a property name as a key and a value as a value. On __init__, we will load these properties into the widget and who the widget. Each signal in signals will be connected to save_properties""" def __init__ (self, widget, dictionary={}, signals=['destroy'], show=True): self.w = widget self.dictionary = dictionary self.signals = signals self.load_properties() for s in self.signals: self.w.connect(s,self.save_properties) if show: self.w.show() def load_properties (self): for p,v in self.dictionary.items(): self.w.set_property(p,v) def save_properties (self, *args): for p in self.dictionary.keys(): self.dictionary[p]=self.w.get_property(p) return False # we don't handle any signals class WindowSaver (WidgetSaver): def __init__ (self, widget, dictionary={}, signals=['configure-event','delete-event'], show=True): """We save the position and state of the window in dictionary. The dictionary consists of {window_size: widget.get_size(), position: widget.get_position(),}""" widget.set_gravity(gtk.gdk.GRAVITY_STATIC) WidgetSaver.__init__(self, widget, dictionary, signals, show) def load_properties (self): for p,f in ['window_size', self.w.resize],['position',self.w.move]: if self.dictionary.has_key(p) and self.dictionary[p]: apply(f,self.dictionary[p]) def save_properties (self, *args): self.dictionary['window_size']=self.w.get_size() self.dictionary['position']=self.w.get_position() return False if __name__ == '__main__': import os.path, pickle # set up a quick preference saver which will save the # dictionary quick_prefs.config to the config file # ~/.testing/widget_positions and load from that file # on startup class quick_prefs: def __init__ (self, file=os.path.expanduser(os.path.join('~/','.testing','widget_positions'))): self.file=file self.config={} self.load() def get_pref (self, key, default=None): if not self.config.has_key(key): self.config[key]=default return self.config[key] def save (self): if not os.path.exists(os.path.split(self.file)[0]): ## if our config directory doesn't exist... os.makedirs(os.path.split(self.file)[0]) ofi=open(self.file,'w') pickle.dump(self.config,ofi) ofi.close() def load (self): if os.path.isfile(self.file): ifi=open(self.file,'r') self.config=pickle.load(ifi) return True else: return False prefs = quick_prefs() # a list of savers we're using... savers=[] w = gtk.Window() wsaver = WindowSaver(w,prefs.get_pref('window',{})) savers.append(wsaver) vp=gtk.VPaned() vps=WidgetSaver(vp,prefs.get_pref('vpane',{'position':vp.get_position()})) savers.append(vps) vp.add1(gtk.Label('WidgetSaver can remember where this pane was left')) w.add(vp) exp=gtk.Expander('Expander') exp.add(gtk.Label('WidgetSaver can remember whether this widget is expanded or not.')) exps=WidgetSaver(exp, prefs.get_pref('expander', {'expanded':exp.get_expanded()}), signals=['activate']) savers.append(exps) vb = gtk.VBox() vb.add(exp) vp.add2(vb) tog = gtk.CheckButton("WidgetSaver will remember the state\nof this CheckButton") togs=WidgetSaver(tog, prefs.get_pref('toggle',{'active':tog.get_active()}), signals=['toggled']) savers.append(togs) vb.add(tog) def quit (*args): for s in savers: s.save_properties() prefs.save() w.destroy() gtk.main_quit() w.connect('delete-event',quit) dbutton=gtk.Button(stock=gtk.STOCK_QUIT) dbutton.connect('clicked',quit) vb.add(dbutton) w.show_all() gtk.main()
_______________________________________________ pygtk mailing list [EMAIL PROTECTED] http://www.daa.com.au/mailman/listinfo/pygtk Read the PyGTK FAQ: http://www.async.com.br/faq/pygtk/