diff --git a/src/simudator/gui/cpu_graphics_scene.py b/src/simudator/gui/cpu_graphics_scene.py index 25a8c40796aeb670a71b27aedfefba3f0c2dd6e9..748870b4b8a9b060bdb02d9046f53d68b9147759 100644 --- a/src/simudator/gui/cpu_graphics_scene.py +++ b/src/simudator/gui/cpu_graphics_scene.py @@ -166,6 +166,7 @@ class CpuGraphicsScene(QGraphicsScene): for item in self.module_graphics_items.values(): item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked) + item.setLocked(is_layout_locked) for item in self.signal_graphics_items: item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked) diff --git a/src/simudator/gui/module_graphics_item/module_graphics_item.py b/src/simudator/gui/module_graphics_item/module_graphics_item.py index 2041f152eadf62e8228ec2cb87e85ef48e9f85c4..eed66c67338029ff4e8a88b5f36bd2987a16d062 100644 --- a/src/simudator/gui/module_graphics_item/module_graphics_item.py +++ b/src/simudator/gui/module_graphics_item/module_graphics_item.py @@ -59,6 +59,8 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem): self.actions = [] + self.isLocked = False + # Do general draw self.draw_graphics_item() @@ -197,6 +199,10 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem): for action in self.actions: menu.addAction(action) action.setData(self.name) + show_ports_action = QAction("Show all ports", menu) + show_ports_action.triggered.connect(self.showPorts) + show_ports_action.setEnabled(not self.isLocked) + menu.addAction(show_ports_action) return menu def getPortNames(self) -> list[str]: @@ -235,6 +241,11 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem): """ return action.data() + def setLocked(self, locked: bool) -> None: + self.isLocked = locked + for port in self.ports: + port.setLocked(locked) + def load_state_from_str(self, state_str) -> None: state = state_str.split() diff --git a/src/simudator/gui/port_graphics_item.py b/src/simudator/gui/port_graphics_item.py index 8f8fe57325059dd031ef127c4e0391964fff7379..095d24f15f114d8563efb2b8d01087da76a883fd 100644 --- a/src/simudator/gui/port_graphics_item.py +++ b/src/simudator/gui/port_graphics_item.py @@ -3,10 +3,12 @@ from typing import Optional from PyQt5.QtCore import QObject, QPointF, Qt, pyqtSignal from PyQt5.QtWidgets import ( + QAction, QGraphicsItemGroup, QGraphicsLineItem, QGraphicsSceneMouseEvent, QGraphicsSimpleTextItem, + QMenu, ) from simudator.core.signal import Signal @@ -51,6 +53,7 @@ class PortGraphicsItem(QGraphicsItemGroup): self.parent = parent self.signal = signal self.orientation = orientation + self.isLocked = False # Set up pyqt signals using a QObject instance since inheriting from # QObject or QGraphicsObject directly does not work with subclasses @@ -58,6 +61,7 @@ class PortGraphicsItem(QGraphicsItemGroup): self.pyqtSignalHolder = PyQtSignalHolder() self.moved = self.pyqtSignalHolder.moved self.toggled = self.pyqtSignalHolder.toggled + self.drawPort() self.setOrientation(orientation) self.left_click = False @@ -165,13 +169,13 @@ class PortGraphicsItem(QGraphicsItemGroup): if event.button() == Qt.MouseButton.LeftButton: self.left_click = True - elif event.button() == Qt.MouseButton.RightButton: - self.toggled.emit() event.accept() def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None: if not self.left_click and self.parent is not None: return + if self.isLocked: + return # Get mouses relative position to parent current_mouse_point = event.scenePos() @@ -217,9 +221,24 @@ class PortGraphicsItem(QGraphicsItemGroup): self.left_click = False def contextMenuEvent(self, event: QGraphicsSceneMouseEvent) -> None: - # We do this so no menu is showen when right clicking a port + menu = QMenu() + hide_signal_action = QAction("Toggle signal visibility", menu) + hide_signal_action.triggered.connect(self.toggled) + hide_signal_action.setEnabled(not self.isLocked) + + hide_port_action = QAction("Toggle port visibility", menu) + hide_port_action.triggered.connect(self.toggleVisibility) + hide_port_action.setEnabled(not self.isLocked) + + menu.addAction(hide_signal_action) + menu.addAction(hide_port_action) + menu.exec_(event.screenPos()) event.accept() + def toggleVisibility(self) -> None: + self.setVisible(not self.isVisible()) + self.toggled.emit() + def getDisplayName(self) -> str: return self.name @@ -232,5 +251,8 @@ class PortGraphicsItem(QGraphicsItemGroup): def setNameVisibility(self, is_visible): self.name_label.setVisible(is_visible) + def setLocked(self, locked: bool) -> None: + self.isLocked = locked + def getOrientation(self) -> Orientation: return self.orientation