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 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):
|
||||||
|
|
||||||
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):
|
||||||
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):
|
||||||
|
|
||||||
# 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):
|
||||||
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):
|
||||||
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):
|
||||||
"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'],
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue