From c3f0761bbb26ee78eb4cf7626c5afddc77ee5e7f Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Fri, 14 May 2021 19:32:16 +0200 Subject: [PATCH] persistence contains widget name and uses json --- slic/gui/persist.py | 53 +++++++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/slic/gui/persist.py b/slic/gui/persist.py index 5ab64d2d7..4cdd6fffa 100644 --- a/slic/gui/persist.py +++ b/slic/gui/persist.py @@ -1,4 +1,5 @@ from pathlib import Path +from slic.utils import json_save, json_load from slic.gui import widgets as ws from slic.gui.special import ValueEntry @@ -19,15 +20,15 @@ class Persistence: home = Path.home() self.fname = home / fname self.managed = managed - self.values = [] + self.values = {} def store(self): self._get() - list_store(self.fname, self.values) + json_save(self.values, self.fname) def load(self): - self.values = list_load(self.fname) + self.values = json_load(self.fname) self._set() @@ -35,16 +36,20 @@ class Persistence: children = self.get_good_children() for child in children: value = child.GetValue() - self.values.append(value) + name = get_long_name(child) +# print(name, value, sep="\t") + self.values[name] = 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) + for child in children: + name = get_long_name(child) + try: + value = self.values[name] + except KeyError: + print(f"Warning: cannot load previous value for: {name}") + else: + child.SetValue(value) def get_good_children(self): @@ -64,20 +69,22 @@ def recurse(obj): 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 +def get_long_name(obj): + lineage = get_lineage(obj) + names = [g.GetName() for g in lineage] + name = "\\".join(escape_backslash(n) for n in reversed(names)) + return name + +def get_lineage(obj): + lineage = [] + while obj: + lineage.append(obj) + obj = obj.GetParent() + return lineage + +def escape_backslash(s): + return repr(s)[1:-1]