diff --git a/src/Model/Stricklers/Stricklers.py b/src/Model/Stricklers/Stricklers.py index bd5dee12..6e63a75e 100644 --- a/src/Model/Stricklers/Stricklers.py +++ b/src/Model/Stricklers/Stricklers.py @@ -31,8 +31,10 @@ class Stricklers(SQLSubModel): comment: str = "", minor: float = 35.0, medium: float = 15.0, - status=None): - super(Stricklers, self).__init__(id) + status=None, owner_scenario=-1): + super(Stricklers, self).__init__( + id=id, owner_scenario=owner_scenario + ) self._status = status self._name = name @@ -46,6 +48,7 @@ class Stricklers(SQLSubModel): execute(f""" CREATE TABLE stricklers{ext} ( {cls.create_db_add_pamhyr_id()}, + deleted BOOLEAN NOT NULL DEFAULT FALSE, name TEXT, comment TEXT, minor REAL NOT NULL, @@ -64,6 +67,13 @@ class Stricklers(SQLSubModel): if major == minor == "0": cls._db_update_to_0_1_0(execute, data) + if major == "0" and minor == "1": + if release < 2: + execute( + "ALTER TABLE stricklers " + + "ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE" + ) + return cls._update_submodel(execute, version, data) @classmethod @@ -89,10 +99,19 @@ class Stricklers(SQLSubModel): def _db_load(cls, execute, data=None): stricklers = [] status = data["status"] + scenario = data["scenario"] + loaded = data['loaded_pid'] + + if scenario is None: + return [] table = execute( - "SELECT pamhyr_id, name, comment, minor, medium " + - "FROM stricklers" + "SELECT pamhyr_id, deleted, " + + "name, comment, minor, medium, scenario " + + "FROM stricklers " + + f"WHERE scenario = {scenario.id} " + + f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))})" + ) if table is None: @@ -102,32 +121,47 @@ class Stricklers(SQLSubModel): it = iter(row) pid = next(it) + deleted = (next(it) == 1) name = next(it) comment = next(it) minor = next(it) medium = next(it) + owner_scenario = next(it) new = cls( id=pid, name=name, comment=comment, minor=minor, medium=medium, - status=status + status=status, owner_scenario=owner_scenario ) + if deleted: + new.set_as_deleted() stricklers.append(new) + loaded.add(pid) + + data["scenario"] = scenario.parent + stricklers += cls._db_load(execute, data) + data["scenario"] = scenario return stricklers def _db_save(self, execute, data=None): + if not self.must_be_saved(): + return True + execute( "INSERT INTO " + - "stricklers(pamhyr_id, name, comment, minor, medium) " + + "stricklers(pamhyr_id, deleted, " + + "name, comment, minor, medium, scenario) " + "VALUES (" + f"{self.pamhyr_id}, " + + f"{self.is_deleted()}, " + f"'{self._db_format(self.name)}', " + f"'{self._db_format(self.comment)}', " + - f"{float(self.minor)}, {float(self.medium)}" + + f"{float(self.minor)}, {float(self.medium)}, " + + f"{self._status.scenario_id}" ")" ) @@ -148,6 +182,7 @@ class Stricklers(SQLSubModel): @name.setter def name(self, name): self._name = name + self.modified() @property def comment(self): @@ -156,6 +191,7 @@ class Stricklers(SQLSubModel): @comment.setter def comment(self, comment): self._comment = comment + self.modified() @property def minor(self): @@ -164,6 +200,7 @@ class Stricklers(SQLSubModel): @minor.setter def minor(self, minor): self._minor = float(minor) + self.modified() @property def medium(self): @@ -172,3 +209,4 @@ class Stricklers(SQLSubModel): @medium.setter def medium(self, medium): self._medium = float(medium) + self.modified() diff --git a/src/Model/Stricklers/StricklersList.py b/src/Model/Stricklers/StricklersList.py index 3cb53abe..51d34956 100644 --- a/src/Model/Stricklers/StricklersList.py +++ b/src/Model/Stricklers/StricklersList.py @@ -18,7 +18,7 @@ from tools import trace, timer -from Model.Tools.PamhyrList import PamhyrModelList +from Model.Tools.PamhyrListExt import PamhyrModelList from Model.Stricklers.Stricklers import Stricklers @@ -47,7 +47,10 @@ class StricklersList(PamhyrModelList): return new def _db_save(self, execute, data=None): - execute("DELETE FROM stricklers") + execute( + "DELETE FROM stricklers " + + f"WHERE scenario = {self._status.scenario_id}" + ) objs = self._lst return self._save_submodel(execute, objs, data) @@ -57,8 +60,12 @@ class StricklersList(PamhyrModelList): return self.lst def new(self, index): - s = Stricklers(status=self._status) + s = Stricklers( + status=self._status, + owner_scenario=self._status.scenario_id + ) self.insert(index, s) + self.modified() return s @timer @@ -73,5 +80,4 @@ class StricklersList(PamhyrModelList): reverse=reverse, ) - if self._status is not None: - self._status.modified() + self.modified() diff --git a/src/View/Stricklers/UndoCommand.py b/src/View/Stricklers/UndoCommand.py index 935b0584..a8373b7b 100644 --- a/src/View/Stricklers/UndoCommand.py +++ b/src/View/Stricklers/UndoCommand.py @@ -108,7 +108,8 @@ class AddCommand(QUndoCommand): if self._new is None: self._new = self._data.new(self._index) else: - self._data.insert(self._index, self._new) + self._data.undelete([self._new]) + # self._data.insert(self._index, self._new) class DelCommand(QUndoCommand): @@ -120,15 +121,14 @@ class DelCommand(QUndoCommand): self._el = [] for row in rows: - self._el.append((row, self._data.get(row))) + self._el.append(self._data.get(row)) self._el.sort() def undo(self): - for row, el in self._el: - self._data.insert(row, el) + self._data.undelete(self._el) def redo(self): - self._data.delete_i(self._rows) + self._data.delete(self._el) class SortCommand(QUndoCommand): @@ -167,10 +167,15 @@ class PasteCommand(QUndoCommand): self._row = row self._el = deepcopy(el) self._el.reverse() + self._done = False def undo(self): self._data.delete(self._el) def redo(self): - for el in self._el: - self._data.insert(self._row, el) + if self._done: + for el in self._el: + self._data.undelete([el]) + else: + for el in self._el: + self._data.insert(self._row, el)