diff --git a/src/Model/Network/Graph.py b/src/Model/Network/Graph.py index 4b15484084c998ebc724e1edf995618440770189..df48f03da6932229d9365347c7f4abebe09903a1 100644 --- a/src/Model/Network/Graph.py +++ b/src/Model/Network/Graph.py @@ -220,6 +220,12 @@ class Graph(object): True ) + def is_internal_node(self, node): + return not ( + self.is_upstream_node(node) or + self.is_downstream_node(node) + ) + def is_enable_node(self, node): return reduce( lambda acc, e: ( diff --git a/src/Model/Tools/PamhyrList.py b/src/Model/Tools/PamhyrList.py index 4ae98deeb41c70bb92aebee7b1fa071e435579e3..024273cd0b11c4d68dc1fbe98a1c4aa18ce4591f 100644 --- a/src/Model/Tools/PamhyrList.py +++ b/src/Model/Tools/PamhyrList.py @@ -67,6 +67,9 @@ class PamhyrModelList(SQLSubModel): def __len__(self): return len(self.lst) + def index(self, el): + return self._lst.index(el) + def get(self, row): return self._lst[row] diff --git a/src/View/Network/ContextMenu.py b/src/View/Network/ContextMenu.py index 4e29fefe5d562177de7575166a5c18b9980cd493..f7ad10a9cdf39245aef60d282d3dec62dfa569c2 100644 --- a/src/View/Network/ContextMenu.py +++ b/src/View/Network/ContextMenu.py @@ -23,7 +23,7 @@ from PyQt5.QtWidgets import ( class AbstractMenu(object): def __init__(self, event=None, pos=None, items=[], - trad=None, parent=None): + graph=None, trad=None, parent=None): super(AbstractMenu, self).__init__() self._menu = QMenu(parent) @@ -31,6 +31,7 @@ class AbstractMenu(object): self._pos = pos self._items = items + self._graph = graph self._trad = trad self._parent = parent @@ -55,11 +56,34 @@ class DefaultMenu(AbstractMenu): class NodeMenu(AbstractMenu): def run(self): + item = self._items[0] + node = item.node + delete = self._menu.addAction(self._trad["menu_del_node"]) + is_internal = self._graph.is_internal_node(node) + if is_internal: + res = self._graph.reservoir.get_assoc_to_node(node) + if res is not None: + edt_res = self._menu.addAction(self._trad["menu_edit_res_node"]) + del_res = self._menu.addAction(self._trad["menu_del_res_node"]) + res_edit = True + else: + add_res = self._menu.addAction(self._trad["menu_add_res_node"]) + res_edit = False + action = self._exec() if action == delete: - self._parent.del_node(self._items[0]) + self._parent.del_node(item) + elif is_internal: + if res_edit: + if action == edt_res: + self._parent.edit_node_reservoir(node) + elif action == del_res: + self._parent.del_node_reservoir(node) + else: + if action == add_res: + self._parent.add_node_reservoir(node) class EdgeMenu(AbstractMenu): diff --git a/src/View/Network/GraphWidget.py b/src/View/Network/GraphWidget.py index b3e321cdad8b8cb4c23a71729c3fec4f2d1a838c..3fbc96d9ba84e1bda07841e2f9d705898a0d1edc 100644 --- a/src/View/Network/GraphWidget.py +++ b/src/View/Network/GraphWidget.py @@ -454,6 +454,15 @@ class GraphWidget(QGraphicsView): if type(i) is NodeItem: self.texts[i].rename() + def add_node_reservoir(self, node): + self.parent.add_node_reservoir(node) + + def del_node_reservoir(self, node): + self.parent.del_node_reservoir(node) + + def edit_node_reservoir(self, node): + self.parent.edit_node_reservoir(node) + def enable_edge(self, edge, prev): self._undo.push( EnableEdgeCommand( @@ -487,7 +496,7 @@ class GraphWidget(QGraphicsView): Args: node1: The source node - node2: The destination node + node2: The desitnation node Returns: Nothing @@ -836,6 +845,6 @@ class GraphWidget(QGraphicsView): # Create and exec menu m = m_type( event=event, pos=pos, items=items, - trad=self._trad, parent=self + graph=self.graph, trad=self._trad, parent=self ) m.run() diff --git a/src/View/Network/Window.py b/src/View/Network/Window.py index 18763bc6ce28dba855fef6b96d2f653f1314783e..bd0daee4f33101378e6425ca46df4f0d336d9d2b 100644 --- a/src/View/Network/Window.py +++ b/src/View/Network/Window.py @@ -46,6 +46,11 @@ from View.Network.Table import ( ComboBoxDelegate, NodeTableModel, EdgeTableModel, ) +# Reservoir short cut +from View.Reservoir.Edit.Window import EditReservoirWindow +import View.Reservoir.UndoCommand as ResUndoCommand + + logger = logging.getLogger() _translate = QCoreApplication.translate @@ -69,6 +74,7 @@ class NetworkWindow(PamhyrWindow): ) self._graph = study.river + self._reservoir = study.river.reservoir self._table_headers_node = self._trad.get_dict("table_headers_node") self._table_headers_edge = self._trad.get_dict("table_headers_edge") @@ -162,7 +168,39 @@ class NetworkWindow(PamhyrWindow): if key == Qt.Key_Escape: self._graph_widget.reset_selection - # Redefine undo/redo method + def add_node_reservoir(self, node): + if self._reservoir.get_assoc_to_node(node) is None: + self._undo_stack.push( + ResUndoCommand.AddAndAssociateCommand( + self._reservoir, 0, node + ) + ) + + def del_node_reservoir(self, node): + res = self._reservoir.get_assoc_to_node(node) + ind = self._reservoir.index(res) + + self._undo_stack.push( + ResUndoCommand.DelCommand( + self._reservoir, [ind] + ) + ) + + def edit_node_reservoir(self, node): + data = self._reservoir.get_assoc_to_node(node) + + if self.sub_window_exists( + EditReservoirWindow, + data=[self._study, None, data] + ): + return + + win = EditReservoirWindow( + data=data, + study=self._study, + parent=self + ) + win.show() def _undo(self): self._undo_stack.undo() diff --git a/src/View/Network/translate.py b/src/View/Network/translate.py index ff5440b81b3d6a9bfdff6d139d813acc674f3d43..200af192591a8054a66469cb7cc7cc705038d469 100644 --- a/src/View/Network/translate.py +++ b/src/View/Network/translate.py @@ -33,6 +33,15 @@ class NetworkTranslate(MainTranslate): self._dict["menu_add_node"] = _translate("Network", "Add node") self._dict["menu_del_node"] = _translate("Network", "Delete the node") + self._dict["menu_edit_res_node"] = _translate( + "Network", "Edit node reservoir" + ) + self._dict["menu_add_res_node"] = _translate( + "Network", "Add node reservoir" + ) + self._dict["menu_del_res_node"] = _translate( + "Network", "Delete node reservoir" + ) self._dict["menu_del_edge"] = _translate("Network", "Delete the reach") self._dict["menu_ena_edge"] = _translate("Network", "Enable the reach") diff --git a/src/View/Reservoir/Edit/Plot.py b/src/View/Reservoir/Edit/Plot.py index 9de7d4a1c99aefc8b90e9d72c42abbbc87be7809..ac1859a19632ac98941f296e6bf6858b647f65ef 100644 --- a/src/View/Reservoir/Edit/Plot.py +++ b/src/View/Reservoir/Edit/Plot.py @@ -50,7 +50,7 @@ class Plot(PamhyrPlot): self._table_headers = self._trad.get_dict("table_headers") self.label_x = self._table_headers["z"] - self.label_y = self._table_headers["Area"] + self.label_y = self._table_headers["area"] self._isometric_axis = False diff --git a/src/View/Reservoir/Edit/Translate.py b/src/View/Reservoir/Edit/Translate.py index 657cad0d09885195e7152b5871a31873f9c7dc4f..e90da5713153d1ba2709d084335eaafe7900e2c8 100644 --- a/src/View/Reservoir/Edit/Translate.py +++ b/src/View/Reservoir/Edit/Translate.py @@ -35,5 +35,5 @@ class EditReservoirTranslate(ReservoirTranslate): self._sub_dict["table_headers"] = { "z": self._dict["unit_elevation"], - "Area": self._dict["unit_area"], + "area": self._dict["unit_area"], } diff --git a/src/View/Reservoir/UndoCommand.py b/src/View/Reservoir/UndoCommand.py index 4544b4ba75fbb69a035b320d720676fc701b885a..ef7b2dc4279a420db958f836366563ba78b90d4a 100644 --- a/src/View/Reservoir/UndoCommand.py +++ b/src/View/Reservoir/UndoCommand.py @@ -85,6 +85,28 @@ class AddCommand(QUndoCommand): self._reservoir_lst.insert(self._index, self._new) +class AddAndAssociateCommand(QUndoCommand): + def __init__(self, reservoir_lst, index, node): + QUndoCommand.__init__(self) + + self._reservoir_lst = reservoir_lst + + self._new = None + self._index = index + self._node = node + + def undo(self): + self._reservoir_lst.delete_i([self._index]) + + def redo(self): + if self._new is None: + self._new = self._reservoir_lst.new(self._index) + else: + self._reservoir_lst.insert(self._index, self._new) + + self._reservoir_lst.get(self._index).node = self._node + + class DelCommand(QUndoCommand): def __init__(self, reservoir_lst, rows): QUndoCommand.__init__(self) diff --git a/src/View/Translate.py b/src/View/Translate.py index bbebaf5f439e9f8db12b35f40256909380b9c5e2..bf94adcd7cbcc1f35c84df565955ed020c897856 100644 --- a/src/View/Translate.py +++ b/src/View/Translate.py @@ -62,7 +62,7 @@ class UnitTranslate(CommonWordTranslate): "Unit", "Water elevation (m)" ) self._dict["unit_discharge"] = _translate("Unit", "Discharge (m³/s)") - self._dict["unit_area"] = _translate("Unit", "Area (hectare)"), + self._dict["unit_area"] = _translate("Unit", "Area (hectare)") self._dict["unit_time_s"] = _translate("Unit", "Time (sec)") self._dict["unit_time_p"] = _translate("Unit", "Time (JJJ:HH:MM:SS)")