diff --git a/slic/gui/daqframe.py b/slic/gui/daqframe.py index 0d97f24a..6830fc5e 100644 --- a/slic/gui/daqframe.py +++ b/slic/gui/daqframe.py @@ -3,6 +3,7 @@ import wx from .daqpanels import ConfigPanel, StaticPanel, ScanPanel, TweakPanel from .widgets import NotebookPanel from .icon import get_wx_icon +from .persist import load, store class DAQFrame(wx.Frame): @@ -34,5 +35,20 @@ class DAQFrame(wx.Frame): sizer.Add(panel_main, proportion=1, flag=wx.EXPAND) self.SetSizerAndFit(sizer) + try: + load(".neatdaq", self) + except Exception as e: + en = type(e).__name__ + print(f"skipped persist load as it caused: {en}: {e}") + + self.Bind(wx.EVT_CLOSE, self.on_close) + + + def on_close(self, event): + try: # make sure the close event fires + store(".neatdaq", self) + finally: + event.Skip() + diff --git a/slic/gui/persist.py b/slic/gui/persist.py new file mode 100644 index 00000000..eca50217 --- /dev/null +++ b/slic/gui/persist.py @@ -0,0 +1,88 @@ +from pathlib import Path +from slic.gui import widgets as ws + + +PERSISTABLE_WIDGETS = ( + ws.MathEntry, + ws.FilenameEntry +) + + +def store(*args): + p = Persistence(*args) + p.store() + +def load(*args): + p = Persistence(*args) + p.load() + + + +class Persistence: + + def __init__(self, fname, managed): + home = Path.home() + self.fname = home / fname + self.managed = managed + self.values = [] + + + def store(self): + self._get() + list_store(self.fname, self.values) + + def load(self): + self.values = list_load(self.fname) + self._set() + + + def _get(self): + children = self.get_good_children() + for child in children: + value = child.GetValue() + self.values.append(value) + + def _set(self): + children = self.get_good_children() + nchildren = len(children) + nvalues = len(self.values) + if nchildren != nvalues: + raise ValueError(f"got {nchildren} widgets vs. {nvalues} values mismatch") + for child, value in zip(children, self.values): + child.SetValue(value) + + + def get_good_children(self): + return list(c for c in recurse(self.managed) if isinstance(c, PERSISTABLE_WIDGETS)) + + + +def recurse_all(objs): + for obj in objs: + yield from recurse(obj) + +def recurse(obj): + children = obj.GetChildren() + if children: + yield from recurse_all(children) + else: + yield obj + + +def list_store(fname, values): + print("store to", fname) + with open(fname, "w") as f: + for v in values: + f.write(f"{v}\n") + +def list_load(fname): + print("load from", fname) + values = [] + with open(fname, "r") as f: + for line in f: + value = line.strip() + values.append(value) + return values + + +