Commit ed5e520b authored by Pierre-Antoine Rouby's avatar Pierre-Antoine Rouby
Browse files

Network: Refacto graph context menu.

No related merge requests found
Pipeline #53958 passed with stages
in 3 minutes and 18 seconds
Showing with 113 additions and 45 deletions
+113 -45
# ContextMenu.py -- Pamhyr
# Copyright (C) 2024 INRAE
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import (
QMenu,
)
class AbstractMenu(object):
def __init__(self, event=None, pos=None, items=[],
trad=None, parent=None):
super(AbstractMenu, self).__init__()
self._menu = QMenu(parent)
self._event = event
self._pos = pos
self._items = items
self._trad = trad
self._parent = parent
def map_to_global(self):
return self._parent.mapToGlobal(self._event.pos())
def _exec(self):
return self._menu.exec_(self.map_to_global())
def run(self):
return
class DefaultMenu(AbstractMenu):
def run(self):
add_node = self._menu.addAction(self._trad["menu_add_node"])
action = self._exec()
if action == add_node:
self._parent.add_node(self._pos)
class NodeMenu(AbstractMenu):
def run(self):
delete = self._menu.addAction(self._trad["menu_del_node"])
action = self._exec()
if action == delete:
self._parent.del_node(self._items[0])
class EdgeMenu(AbstractMenu):
def run(self):
it = self._items[0]
reverse = self._menu.addAction(self._trad["menu_rev_edge"])
delete = self._menu.addAction(self._trad["menu_del_edge"])
if self._parent.graph.is_enable_edge(it.edge):
enable = self._menu.addAction(self._trad["menu_dis_edge"])
is_enable = True
else:
enable = self._menu.addAction(self._trad["menu_ena_edge"])
is_enable = False
action = self._exec()
if action == delete:
self._parent.del_edge(it)
elif action == enable:
self._parent.enable_edge(it, is_enable)
elif action == reverse:
self._parent.reverse_edge(it)
...@@ -39,6 +39,9 @@ from Model.Network.Edge import Edge ...@@ -39,6 +39,9 @@ from Model.Network.Edge import Edge
from Model.Network.Graph import Graph from Model.Network.Graph import Graph
from View.Network.UndoCommand import * from View.Network.UndoCommand import *
from View.Network.ContextMenu import (
DefaultMenu, NodeMenu, EdgeMenu,
)
logger = logging.getLogger() logger = logging.getLogger()
...@@ -292,7 +295,8 @@ class GraphWidget(QGraphicsView): ...@@ -292,7 +295,8 @@ class GraphWidget(QGraphicsView):
def __init__(self, graph, parent=None, def __init__(self, graph, parent=None,
min_size=(400, 400), max_size=None, min_size=(400, 400), max_size=None,
size=None, only_display=False, undo=None): size=None, only_display=False, undo=None,
trad=None):
super(GraphWidget, self).__init__(parent=parent) super(GraphWidget, self).__init__(parent=parent)
self.timerId = 0 self.timerId = 0
...@@ -300,6 +304,7 @@ class GraphWidget(QGraphicsView): ...@@ -300,6 +304,7 @@ class GraphWidget(QGraphicsView):
self._state = "move" self._state = "move"
self._only_display = only_display self._only_display = only_display
self._undo = undo self._undo = undo
self._trad = trad
self.graph = graph self.graph = graph
...@@ -813,45 +818,6 @@ class GraphWidget(QGraphicsView): ...@@ -813,45 +818,6 @@ class GraphWidget(QGraphicsView):
# Contextual menu # Contextual menu
def _menu_default(self, event, pos, items, menu):
add_node = menu.addAction(_translate("Network", "Add node"))
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == add_node:
self.add_node(pos)
def _menu_node(self, event, pos, items, menu):
delete = menu.addAction(_translate("Network", "Delete the node"))
disable = menu.addAction(_translate("Network", "Disable the node"))
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == delete:
self.del_node(items[0])
def _menu_edge(self, event, pos, items, menu):
delete = menu.addAction(_translate("Network", "Delete the reach"))
if self.graph.is_enable_edge(items[0].edge):
enable = menu.addAction(_translate("Network", "Disable the reach"))
is_enable = True
else:
enable = menu.addAction(_translate("Network", "Enable the reach"))
is_enable = False
reverse = menu.addAction(_translate(
"Network", "Reverse the reach orientation"))
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == delete:
self.del_edge(items[0])
elif action == enable:
self.enable_edge(items[0], is_enable)
elif action == reverse:
self.reverse_edge(items[0])
def contextMenuEvent(self, event): def contextMenuEvent(self, event):
if self._only_display: if self._only_display:
return return
...@@ -859,10 +825,17 @@ class GraphWidget(QGraphicsView): ...@@ -859,10 +825,17 @@ class GraphWidget(QGraphicsView):
pos = self.mapToScene(event.pos()) pos = self.mapToScene(event.pos())
items = self.items(event.pos()) items = self.items(event.pos())
menu = QMenu(self) # Select current menu
if len(items) == 0: if len(items) == 0:
self._menu_default(event, pos, items, menu) m_type = DefaultMenu
elif type(items[0]) is NodeItem: elif type(items[0]) is NodeItem:
self._menu_node(event, pos, items, menu) m_type = NodeMenu
elif type(items[0]) is EdgeItem: elif type(items[0]) is EdgeItem:
self._menu_edge(event, pos, items, menu) m_type = EdgeMenu
# Create and exec menu
m = m_type(
event=event, pos=pos, items=items,
trad=self._trad, parent=self
)
m.run()
...@@ -117,7 +117,8 @@ class NetworkWindow(PamhyrWindow): ...@@ -117,7 +117,8 @@ class NetworkWindow(PamhyrWindow):
def setup_graph(self): def setup_graph(self):
self._graph_widget = GraphWidget( self._graph_widget = GraphWidget(
self._graph, parent=self, self._graph, parent=self,
undo=self._undo_stack undo=self._undo_stack,
trad=self._trad,
) )
self._graph_layout = self.find(QHBoxLayout, "horizontalLayout_graph") self._graph_layout = self.find(QHBoxLayout, "horizontalLayout_graph")
self._graph_layout.addWidget(self._graph_widget) self._graph_layout.addWidget(self._graph_widget)
......
...@@ -31,6 +31,16 @@ class NetworkTranslate(MainTranslate): ...@@ -31,6 +31,16 @@ class NetworkTranslate(MainTranslate):
"Network", "River network" "Network", "River network"
) )
self._dict["menu_add_node"] = _translate("Network", "Add node")
self._dict["menu_del_node"] = _translate("Network", "Delete the node")
self._dict["menu_del_edge"] = _translate("Network", "Delete the reach")
self._dict["menu_ena_edge"] = _translate("Network", "Enable the reach")
self._dict["menu_dis_edge"] = _translate("Network", "Disable the reach")
self._dict["menu_rev_edge"] = _translate(
"Network", "Reverse the reach orientation"
)
self._sub_dict["table_headers_node"] = { self._sub_dict["table_headers_node"] = {
"name": self._dict['name'], "name": self._dict['name'],
"type": self._dict['type'], "type": self._dict['type'],
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment