1.1 --- a/imiptools/editing.py Sat Dec 09 22:35:53 2017 +0100
1.2 +++ b/imiptools/editing.py Sun Dec 10 23:41:21 2017 +0100
1.3 @@ -33,6 +33,16 @@
1.4
1.5 # General editing abstractions.
1.6
1.7 +class CopiableList(list):
1.8 +
1.9 + "A list whose elements promise to implement a copy method."
1.10 +
1.11 + def copy(self):
1.12 + copied = []
1.13 + for i in self:
1.14 + copied.append(i.copy())
1.15 + return copied
1.16 +
1.17 class State:
1.18
1.19 "Manage editing state."
1.20 @@ -64,7 +74,12 @@
1.21 "Return the original state for the given 'key'."
1.22
1.23 self.ensure_original(key)
1.24 - return copy(self.original[key])
1.25 + data = self.original[key]
1.26 + if isinstance(data, CopiableList):
1.27 + copied = data.copy()
1.28 + else:
1.29 + copied = copy(self.original[key])
1.30 + return copied
1.31
1.32 def get(self, key, reset=False):
1.33
1.34 @@ -88,6 +103,13 @@
1.35 self.ensure_original(key)
1.36 self.state[key] = value
1.37
1.38 + def unset(self, key):
1.39 +
1.40 + "Unset 'key' in the state."
1.41 +
1.42 + del self.state[key]
1.43 + del self.original[key]
1.44 +
1.45 def has_changed(self, key):
1.46
1.47 "Return whether 'key' has changed during editing."
1.48 @@ -96,6 +118,9 @@
1.49
1.50 # Dictionary emulation methods.
1.51
1.52 + def __delitem__(self, key):
1.53 + self.unset(key)
1.54 +
1.55 def __getitem__(self, key):
1.56 return self.get(key)
1.57
1.58 @@ -127,7 +152,7 @@
1.59 self.state = State({
1.60 "attendees" : lambda: OrderedDict(self.obj.get_items("ATTENDEE") or []),
1.61 "organiser" : lambda: self.obj.get_value("ORGANIZER"),
1.62 - "periods" : lambda: form_periods_from_periods(self.get_unedited_periods()),
1.63 + "periods" : lambda: CopiableList(form_periods_from_periods(self.get_unedited_periods())),
1.64 "suggested_attendees" : self.get_suggested_attendees,
1.65 "suggested_periods" : self.get_suggested_periods,
1.66 "summary" : lambda: self.obj.get_value("SUMMARY"),
1.67 @@ -398,7 +423,7 @@
1.68
1.69 "Combine unedited and checked edited periods to make updated periods."
1.70
1.71 - original = self.get_unedited_periods()
1.72 + original = self.state.get_original("periods")
1.73 current = self.get_checked_periods()
1.74 return combine_periods(original, current)
1.75