diff --git a/src/model/editable.py b/src/model/editable.py index 345dcc9..175c2a8 100644 --- a/src/model/editable.py +++ b/src/model/editable.py @@ -1,6 +1,43 @@ -empty_doc = __new__(DOMParser()).parseFromString("", "text/xml") +empty_doc = __new__(DOMParser()).parseFromString("", "text/xml").firstChild + + +def copy(parent): + if type(parent) is None: + console.log("Copying non-transcrypt object, I think, this could go fairly wrong") + return parent + + elif type(parent) is dict: + result = {} + for k, v in parent.items(): + result[k] = copy(v) + return result + + elif type(parent) is list: + return [copy(i) for i in parent] + + elif type(parent) is int or type(parent) is float or type(parent) is str or parent is None: + return parent + + else: + # some fancy object it looks like + result = __pragma__ ('js', "{{}};") + console.log(parent) + proto = Object.getPrototypeOf(parent) + Object.setPrototypeOf(result, proto) + result["__class__"] = parent.__class__ + + for key in Object.getOwnPropertyNames(parent): + if key == "__class__": + continue + + val = getattr(parent, key) + result[key] = copy(val) + + return result + + class Editable: def make_copy(self): # makes an internal copy of self @@ -9,8 +46,9 @@ class Editable: if self._copy is not None: self._copy = None - # make new copy - self._copy = JSON.parse(JSON.stringify(self)) + # make new data only copy + self._copy = copy(self) + def copy(self): # return internal copy of self @@ -22,7 +60,8 @@ class Editable: def overwrite_with_copy(self): for key, value in dict(self._copy).items(): - if key == "_copy": + # skip functions and _copy + if key == "_copy" or type(value) is None: continue setattr(self, key, value)