mirror of https://gitlab.com/pamhyr/pamhyr2
Scenario: Add delete scenario command and use undo command.
parent
064b3efa13
commit
29df56c8b4
|
|
@ -155,6 +155,9 @@ class Scenario(SQLSubModel):
|
||||||
return scenarios
|
return scenarios
|
||||||
|
|
||||||
def _db_save(self, execute, data=None):
|
def _db_save(self, execute, data=None):
|
||||||
|
if self.is_deleted():
|
||||||
|
return self.drop_all(execute)
|
||||||
|
|
||||||
parent = 'NULL'
|
parent = 'NULL'
|
||||||
if self.parent is not None:
|
if self.parent is not None:
|
||||||
parent = self.parent._id
|
parent = self.parent._id
|
||||||
|
|
@ -174,6 +177,33 @@ class Scenario(SQLSubModel):
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
def drop_all(self, execute):
|
||||||
|
execute(f"DELETE FROM scenario WHERE id = {self.id}")
|
||||||
|
|
||||||
|
tables = [
|
||||||
|
"additional_files",
|
||||||
|
"boundary_condition", "boundary_condition_data",
|
||||||
|
"lateral_contribution", "lateral_contribution_data",
|
||||||
|
"friction", "stricklers",
|
||||||
|
"hydraulic_structures",
|
||||||
|
"hydraulic_structures_basic", "hydraulic_structures_basic_value",
|
||||||
|
"initial_conditions",
|
||||||
|
"sedimentary_layer", "sedimentary_layer_layer",
|
||||||
|
"reservoir", "reservoir_data",
|
||||||
|
"rep_lines",
|
||||||
|
"solver_parameter",
|
||||||
|
"geometry_pointXYZ", "geometry_profileXYZ",
|
||||||
|
"river_reach", "river_node"
|
||||||
|
]
|
||||||
|
|
||||||
|
for table in tables:
|
||||||
|
execute(
|
||||||
|
f"DELETE FROM {table} " +
|
||||||
|
f"WHERE scenario = {self.id}"
|
||||||
|
)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def id(self):
|
def id(self):
|
||||||
return self._id
|
return self._id
|
||||||
|
|
|
||||||
|
|
@ -68,3 +68,10 @@ class Scenarios(PamhyrModelDict):
|
||||||
self._dict
|
self._dict
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def delete(self, key):
|
||||||
|
el = self._dict.get(key)
|
||||||
|
if el is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
el.set_as_deleted()
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,8 @@ class Study(SQLModel):
|
||||||
|
|
||||||
self._old_save_id = 0
|
self._old_save_id = 0
|
||||||
|
|
||||||
|
self._river_scenario_cache = {}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def checkers(cls):
|
def checkers(cls):
|
||||||
lst = [
|
lst = [
|
||||||
|
|
@ -462,6 +464,10 @@ class Study(SQLModel):
|
||||||
return new
|
return new
|
||||||
|
|
||||||
def reload_from_scenario(self, scenario):
|
def reload_from_scenario(self, scenario):
|
||||||
|
if scenario in self._river_scenario_cache:
|
||||||
|
self._river = self._river_scenario_cache[scenario]
|
||||||
|
self.status.scenario = scenario
|
||||||
|
else:
|
||||||
def sql_exec(sql):
|
def sql_exec(sql):
|
||||||
return self.execute(
|
return self.execute(
|
||||||
sql, fetch_one=False, commit=True
|
sql, fetch_one=False, commit=True
|
||||||
|
|
@ -475,10 +481,12 @@ class Study(SQLModel):
|
||||||
}
|
}
|
||||||
|
|
||||||
# Reload river data
|
# Reload river data
|
||||||
self._river = River._db_load(
|
river = River._db_load(
|
||||||
sql_exec,
|
sql_exec,
|
||||||
data=data
|
data=data
|
||||||
)
|
)
|
||||||
|
self._river_scenario_cache[scenario] = river
|
||||||
|
self._river = self._river
|
||||||
|
|
||||||
if reduce(
|
if reduce(
|
||||||
lambda a, s: a or (s.parent is scenario),
|
lambda a, s: a or (s.parent is scenario),
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,9 @@ class SQLSubModel(PamhyrID):
|
||||||
Returns:
|
Returns:
|
||||||
Nothing
|
Nothing
|
||||||
"""
|
"""
|
||||||
|
if self._status is None:
|
||||||
|
return
|
||||||
|
|
||||||
self._owner_scenario = self._status.scenario_id
|
self._owner_scenario = self._status.scenario_id
|
||||||
self._status.modified()
|
self._status.modified()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -59,10 +59,10 @@ class ScenarioMenu(AbstractMenu):
|
||||||
item = self._items[0]
|
item = self._items[0]
|
||||||
|
|
||||||
select = self._menu.addAction(self._trad["menu_select_scenario"])
|
select = self._menu.addAction(self._trad["menu_select_scenario"])
|
||||||
# delete = self._menu.addAction(self._trad["menu_del_scenario"])
|
delete = self._menu.addAction(self._trad["menu_del_scenario"])
|
||||||
|
|
||||||
action = self._exec()
|
action = self._exec()
|
||||||
if action == select:
|
if action == select:
|
||||||
self._parent.select_scenario(item)
|
self._parent.select_scenario(item)
|
||||||
# if action == delete:
|
if action == delete:
|
||||||
# self._parent.del_node(item)
|
self._parent.delete_scenario(item)
|
||||||
|
|
|
||||||
|
|
@ -265,6 +265,9 @@ class GraphWidget(QGraphicsView):
|
||||||
self.edge_items = []
|
self.edge_items = []
|
||||||
|
|
||||||
for scenar in self._study.scenarios.lst:
|
for scenar in self._study.scenarios.lst:
|
||||||
|
if scenar.is_deleted():
|
||||||
|
continue
|
||||||
|
|
||||||
iscenar = ScenarioItem(scenar, self)
|
iscenar = ScenarioItem(scenar, self)
|
||||||
self.scene().addItem(iscenar)
|
self.scene().addItem(iscenar)
|
||||||
self.scenarios_items[scenar] = iscenar
|
self.scenarios_items[scenar] = iscenar
|
||||||
|
|
@ -294,6 +297,7 @@ class GraphWidget(QGraphicsView):
|
||||||
def scenario_has_child(self, scenario):
|
def scenario_has_child(self, scenario):
|
||||||
for scenar in self._study.scenarios.lst:
|
for scenar in self._study.scenarios.lst:
|
||||||
if scenar.parent is scenario:
|
if scenar.parent is scenario:
|
||||||
|
if not scenar.is_deleted():
|
||||||
return True
|
return True
|
||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
@ -409,23 +413,48 @@ class GraphWidget(QGraphicsView):
|
||||||
return
|
return
|
||||||
|
|
||||||
def fn():
|
def fn():
|
||||||
self._study.save()
|
|
||||||
self._study.reload_from_scenario(item.scenario)
|
|
||||||
|
|
||||||
self._close_other_window()
|
self._close_other_window()
|
||||||
|
self._study.save()
|
||||||
|
self._undo.push(
|
||||||
|
SelectScenariosCommand(
|
||||||
|
self._study,
|
||||||
|
item.scenario
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# self._study.reload_from_scenario(item.scenario)
|
||||||
|
|
||||||
self.exec_with_waiting_window(fn, "select_scenario")
|
self.exec_with_waiting_window(fn, "select_scenario")
|
||||||
|
|
||||||
self.changeScenario.emit(self.sender())
|
self.changeScenario.emit(self.sender())
|
||||||
|
|
||||||
def new_scenario(self, pos):
|
def new_scenario(self, pos):
|
||||||
def fn():
|
def fn():
|
||||||
self._study.save()
|
|
||||||
scenario = self._study.new_scenario_from_current()
|
|
||||||
scenario.set_pos(pos.x(), pos.y())
|
|
||||||
|
|
||||||
self._close_other_window()
|
self._close_other_window()
|
||||||
self.exec_with_waiting_window(fn, "new_scenario")
|
self._study.save()
|
||||||
|
self._undo.push(
|
||||||
|
AddScenariosCommand(
|
||||||
|
self._study,
|
||||||
|
pos
|
||||||
|
)
|
||||||
|
)
|
||||||
|
# scenario = self._study.new_scenario_from_current()
|
||||||
|
# scenario.set_pos(pos.x(), pos.y())
|
||||||
|
|
||||||
|
self.exec_with_waiting_window(fn, "new_scenario")
|
||||||
|
self.changeScenario.emit(self.sender())
|
||||||
|
|
||||||
|
def delete_scenario(self, item):
|
||||||
|
def fn():
|
||||||
|
self._close_other_window()
|
||||||
|
# self._study.save()
|
||||||
|
self._undo.push(
|
||||||
|
DeleteScenariosCommand(
|
||||||
|
self._study,
|
||||||
|
item.scenario
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
self.exec_with_waiting_window(fn, "delete_scenario")
|
||||||
self.changeScenario.emit(self.sender())
|
self.changeScenario.emit(self.sender())
|
||||||
|
|
||||||
def _close_other_window(self):
|
def _close_other_window(self):
|
||||||
|
|
|
||||||
|
|
@ -25,32 +25,59 @@ from PyQt5.QtWidgets import (
|
||||||
|
|
||||||
|
|
||||||
class AddScenariosCommand(QUndoCommand):
|
class AddScenariosCommand(QUndoCommand):
|
||||||
def __init__(self, study, source):
|
def __init__(self, study, pos):
|
||||||
QUndoCommand.__init__(self)
|
QUndoCommand.__init__(self)
|
||||||
|
|
||||||
self._study = study
|
self._study = study
|
||||||
self._source = source
|
self._pos = pos
|
||||||
|
self._new = None
|
||||||
|
|
||||||
def undo(self):
|
def undo(self):
|
||||||
logger.error(f"TODO {type(self)} : undo")
|
self._study.scenarios.delete(self._new.id)
|
||||||
|
self._study.reload_from_scenario(self._new.parent)
|
||||||
|
|
||||||
def redo(self):
|
def redo(self):
|
||||||
self._study.new_scenario_from_current(switch=False)
|
if self._new is None:
|
||||||
|
self._new = self._study.new_scenario_from_current()
|
||||||
|
self._new.set_pos(self._pos.x(), self._pos.y())
|
||||||
|
else:
|
||||||
|
self._new.set_as_not_deleted()
|
||||||
|
self._study.reload_from_scenario(self._new)
|
||||||
|
|
||||||
|
|
||||||
class DelScenariosCommand(QUndoCommand):
|
class SelectScenariosCommand(QUndoCommand):
|
||||||
|
def __init__(self, study, new):
|
||||||
|
QUndoCommand.__init__(self)
|
||||||
|
|
||||||
|
self._study = study
|
||||||
|
self._old = study.status.scenario
|
||||||
|
self._new = new
|
||||||
|
|
||||||
|
def undo(self):
|
||||||
|
self._study.reload_from_scenario(self._old)
|
||||||
|
|
||||||
|
def redo(self):
|
||||||
|
self._study.reload_from_scenario(self._new)
|
||||||
|
|
||||||
|
|
||||||
|
class DeleteScenariosCommand(QUndoCommand):
|
||||||
def __init__(self, study, scenario):
|
def __init__(self, study, scenario):
|
||||||
QUndoCommand.__init__(self)
|
QUndoCommand.__init__(self)
|
||||||
|
|
||||||
self._study = study
|
self._study = study
|
||||||
self._scenario = scenario
|
self._scenario = scenario
|
||||||
|
self._reload = study.status.scenario == scenario
|
||||||
|
|
||||||
def undo(self):
|
def undo(self):
|
||||||
logger.error(f"TODO {type(self)} : undo")
|
self._scenario.set_as_not_deleted()
|
||||||
|
if self._reload:
|
||||||
|
self._study.reload_from_scenario(self._scenario)
|
||||||
|
|
||||||
def redo(self):
|
def redo(self):
|
||||||
logger.error(f"TODO {type(self)} : redo")
|
if self._reload:
|
||||||
|
self._study.reload_from_scenario(self._scenario.parent)
|
||||||
|
|
||||||
|
self._scenario.set_as_deleted()
|
||||||
|
|
||||||
class SetCommand(QUndoCommand):
|
class SetCommand(QUndoCommand):
|
||||||
def __init__(self, scenario, column, new_value):
|
def __init__(self, scenario, column, new_value):
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ from PyQt5.QtWidgets import (
|
||||||
from Modules import Modules
|
from Modules import Modules
|
||||||
from Model.River import RiverNode, RiverReach, River
|
from Model.River import RiverNode, RiverReach, River
|
||||||
|
|
||||||
|
from View.WaitingDialog import WaitingDialog
|
||||||
from View.Tools.PamhyrWindow import PamhyrWindow
|
from View.Tools.PamhyrWindow import PamhyrWindow
|
||||||
from View.Scenarios.GraphWidget import GraphWidget
|
from View.Scenarios.GraphWidget import GraphWidget
|
||||||
from View.Scenarios.UndoCommand import *
|
from View.Scenarios.UndoCommand import *
|
||||||
|
|
@ -114,11 +115,31 @@ class ScenariosWindow(PamhyrWindow):
|
||||||
self._graph_widget.changeScenario.connect(self.update)
|
self._graph_widget.changeScenario.connect(self.update)
|
||||||
|
|
||||||
def _undo(self):
|
def _undo(self):
|
||||||
|
def fn():
|
||||||
self._undo_stack.undo()
|
self._undo_stack.undo()
|
||||||
|
|
||||||
|
dlg = WaitingDialog(
|
||||||
|
payload_fn=fn,
|
||||||
|
title="undo_waiting",
|
||||||
|
trad=self._trad,
|
||||||
|
parent=self
|
||||||
|
)
|
||||||
|
dlg.exec_()
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def _redo(self):
|
def _redo(self):
|
||||||
|
def fn():
|
||||||
self._undo_stack.redo()
|
self._undo_stack.redo()
|
||||||
|
|
||||||
|
dlg = WaitingDialog(
|
||||||
|
payload_fn=fn,
|
||||||
|
title="redo_waiting",
|
||||||
|
trad=self._trad,
|
||||||
|
parent=self
|
||||||
|
)
|
||||||
|
dlg.exec_()
|
||||||
|
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
def update(self):
|
def update(self):
|
||||||
|
|
|
||||||
|
|
@ -37,6 +37,9 @@ class ScenariosTranslate(MainTranslate):
|
||||||
self._dict["menu_add_scenario"] = _translate(
|
self._dict["menu_add_scenario"] = _translate(
|
||||||
"Scenarios", "Create new scenario from current scenario"
|
"Scenarios", "Create new scenario from current scenario"
|
||||||
)
|
)
|
||||||
|
self._dict["menu_del_scenario"] = _translate(
|
||||||
|
"Scenarios", "Delete this scenario"
|
||||||
|
)
|
||||||
|
|
||||||
self._sub_dict["table_headers_scenarios"] = {
|
self._sub_dict["table_headers_scenarios"] = {
|
||||||
# "id": self._dict['id'],
|
# "id": self._dict['id'],
|
||||||
|
|
@ -48,6 +51,15 @@ class ScenariosTranslate(MainTranslate):
|
||||||
self._dict["new_scenario"] = _translate(
|
self._dict["new_scenario"] = _translate(
|
||||||
"Scenarios", "Create new scenario"
|
"Scenarios", "Create new scenario"
|
||||||
)
|
)
|
||||||
|
self._dict["delete_scenario"] = _translate(
|
||||||
|
"Scenarios", "Delete scenario"
|
||||||
|
)
|
||||||
self._dict["select_scenario"] = _translate(
|
self._dict["select_scenario"] = _translate(
|
||||||
"Scenarios", "Select scenario"
|
"Scenarios", "Select scenario"
|
||||||
)
|
)
|
||||||
|
self._dict["undo_waiting"] = _translate(
|
||||||
|
"Scenarios", "Undo ..."
|
||||||
|
)
|
||||||
|
self._dict["redo_waiting"] = _translate(
|
||||||
|
"Scenarios", "Redo ..."
|
||||||
|
)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue