changeset 28:b0342f9ee328

attempts to save params, better loading behavior
author dmcc
date Sun, 07 Jul 2002 10:17:00 +0000
parents bee0862f4436
children f595fdd4c548
files light8/Subs.py light8/rsn.py
diffstat 2 files changed, 50 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/light8/Subs.py	Sun Jul 07 08:36:21 2002 +0000
+++ b/light8/Subs.py	Sun Jul 07 10:17:00 2002 +0000
@@ -8,10 +8,17 @@
 class Param: # abstract
     def get_value(self):
         pass
-    def set_value(self):
+    def set_value(self, v):
         pass
     def draw_tk(self, frame):
         pass
+    def __getstate__(self):
+        print "get_state:", self.get_value()
+        return {'value' : self.get_value()}
+    def __setstate__(self, dict):
+        print "set_state to", dict
+        self.value = StringVar()
+        self.set_value(dict['value'])
 
 class CheckboxParam(Param):
     def __init__(self, initial=0):
@@ -84,6 +91,8 @@
     def get_value(self):
         return self.value.get()
     def set_value(self, v):
+        if 'value' not in self.__dict__:
+            self.value = StringVar()
         self.value.set(v)
     def draw_tk(self, frame):
         l = Label(frame, textvariable=self.value, font=stdfont)
@@ -143,15 +152,23 @@
     def get(self, level):
         if self.var is not None:
             return self.var.get()
-
         return None
     def justturnedon(self):
         return self.atzero
+    def __getstate__(self):
+        state = self.__dict__.copy()
+        # remove var (non-pickleable)
+        try:
+            del state['var']
+        except KeyError:
+            pass
+        return state
+    # no setstate needed
 
 class Sub:
     def __init__(self, levels, dimmers=68, color=None):
         self.levels = levels
-        self.dimmers = dimmers
+        self.dimmers = dimmers # needed?
         self.is_effect = callable(self.levels)
         self.slideradjuster = SliderAdjuster()
         if self.is_effect:
@@ -166,7 +183,14 @@
         if self.is_effect:
             self.params.draw_tk(frame)
     def get_state(self):
-        pass
+        state = self.__dict__.copy()
+        if self.is_effect:
+            del state['levels']
+            del state['generator']
+
+        return state
+    def set_state(self, statedict):
+        self.__dict__.update(statedict)
     def get_levels(self, level):
         d = {}
         if level == 0: 
@@ -194,7 +218,7 @@
         if type(name) == TupleType:
             name, color = name
         else:
-            color=None
+            color = None
 
         subs[name] = Sub(levels, color=color)
 
--- a/light8/rsn.py	Sun Jul 07 08:36:21 2002 +0000
+++ b/light8/rsn.py	Sun Jul 07 10:17:00 2002 +0000
@@ -127,8 +127,15 @@
                     self.scalelevels[s].set(v)
                 except:
                     print "Couldn't set %s -> %s" % (s, v)
-        except:
-            print "Couldn't load prefs (%s)" % filename
+            for name, substate in p.substate.items():
+                try:
+                    Subs.subs[name].set_state(substate)
+                except:
+                    print "Couldn't set sub %s state" % name
+        except IOError:
+            print "IOError: Couldn't load prefs (%s)" % filename
+        except EOFError:
+            print "EOFrror: Couldn't load prefs (%s)" % filename
 
     def make_sub(self, name):
         i = 1
@@ -161,19 +168,26 @@
         self.master.after(50, self.backgroundloop, ())
         self.changelevel()
     def quit(self, *args):
+        self.save()
+        root.destroy()
+        sys.exit()
+    def save(self, *args):
         filename = '/tmp/light9.prefs'
         if DUMMY:
             filename += '.dummy'
         print "Saving to", filename
         file = open(filename, 'w')
-        cPickle.dump(Pickles(self.scalelevels), file)
-        root.destroy()
-        sys.exit()
+        try:
+            cPickle.dump(Pickles(self.scalelevels, Subs.subs.items()), file)
+        except cPickle.UnpickleableError:
+            print "UnpickleableError!  There's yer problem."
 
 class Pickles:
-    def __init__(self, scalelevels):
+    def __init__(self, scalelevels, subs=None):
         self.scalelevels = dict([(name, lev.get()) 
-            for name,lev in scalelevels.items()])
+            for name, lev in scalelevels.items()])
+        self.substate = dict([(name, subobj.get_state())
+            for name, subobj in subs])
 
 mr_lightboard = Lightboard(root)