mirror of https://gitlab.com/pamhyr/pamhyr2
Network: Refacto graph context menu.
parent
36b62260b1
commit
ed5e520b35
|
|
@ -0,0 +1,84 @@
|
|||
# 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
|
|||
from Model.Network.Graph import Graph
|
||||
|
||||
from View.Network.UndoCommand import *
|
||||
from View.Network.ContextMenu import (
|
||||
DefaultMenu, NodeMenu, EdgeMenu,
|
||||
)
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
|
|
@ -292,7 +295,8 @@ class GraphWidget(QGraphicsView):
|
|||
|
||||
def __init__(self, graph, parent=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)
|
||||
|
||||
self.timerId = 0
|
||||
|
|
@ -300,6 +304,7 @@ class GraphWidget(QGraphicsView):
|
|||
self._state = "move"
|
||||
self._only_display = only_display
|
||||
self._undo = undo
|
||||
self._trad = trad
|
||||
|
||||
self.graph = graph
|
||||
|
||||
|
|
@ -813,45 +818,6 @@ class GraphWidget(QGraphicsView):
|
|||
|
||||
# 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):
|
||||
if self._only_display:
|
||||
return
|
||||
|
|
@ -859,10 +825,17 @@ class GraphWidget(QGraphicsView):
|
|||
pos = self.mapToScene(event.pos())
|
||||
items = self.items(event.pos())
|
||||
|
||||
menu = QMenu(self)
|
||||
# Select current menu
|
||||
if len(items) == 0:
|
||||
self._menu_default(event, pos, items, menu)
|
||||
m_type = DefaultMenu
|
||||
elif type(items[0]) is NodeItem:
|
||||
self._menu_node(event, pos, items, menu)
|
||||
m_type = NodeMenu
|
||||
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):
|
|||
def setup_graph(self):
|
||||
self._graph_widget = GraphWidget(
|
||||
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.addWidget(self._graph_widget)
|
||||
|
|
|
|||
|
|
@ -31,6 +31,16 @@ class NetworkTranslate(MainTranslate):
|
|||
"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"] = {
|
||||
"name": self._dict['name'],
|
||||
"type": self._dict['type'],
|
||||
|
|
|
|||
Loading…
Reference in New Issue