Skip to content
Snippets Groups Projects
Commit d6443d56 authored by Johannes Kung's avatar Johannes Kung
Browse files

Ports now has context menu for hiding ports and signals

parent f4108a6c
No related branches found
No related tags found
No related merge requests found
Pipeline #101004 passed
...@@ -166,6 +166,7 @@ class CpuGraphicsScene(QGraphicsScene): ...@@ -166,6 +166,7 @@ class CpuGraphicsScene(QGraphicsScene):
for item in self.module_graphics_items.values(): for item in self.module_graphics_items.values():
item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked) item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked)
item.setLocked(is_layout_locked)
for item in self.signal_graphics_items: for item in self.signal_graphics_items:
item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked) item.setFlag(QGraphicsItem.ItemIsMovable, not is_layout_locked)
......
...@@ -59,6 +59,8 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem): ...@@ -59,6 +59,8 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem):
self.actions = [] self.actions = []
self.isLocked = False
# Do general draw # Do general draw
self.draw_graphics_item() self.draw_graphics_item()
...@@ -197,6 +199,10 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem): ...@@ -197,6 +199,10 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem):
for action in self.actions: for action in self.actions:
menu.addAction(action) menu.addAction(action)
action.setData(self.name) 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 return menu
def getPortNames(self) -> list[str]: def getPortNames(self) -> list[str]:
...@@ -235,6 +241,11 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem): ...@@ -235,6 +241,11 @@ class ModuleGraphicsItem(QGraphicsObject, QGraphicsItem):
""" """
return action.data() 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: def load_state_from_str(self, state_str) -> None:
state = state_str.split() state = state_str.split()
......
...@@ -3,10 +3,12 @@ from typing import Optional ...@@ -3,10 +3,12 @@ from typing import Optional
from PyQt5.QtCore import QObject, QPointF, Qt, pyqtSignal from PyQt5.QtCore import QObject, QPointF, Qt, pyqtSignal
from PyQt5.QtWidgets import ( from PyQt5.QtWidgets import (
QAction,
QGraphicsItemGroup, QGraphicsItemGroup,
QGraphicsLineItem, QGraphicsLineItem,
QGraphicsSceneMouseEvent, QGraphicsSceneMouseEvent,
QGraphicsSimpleTextItem, QGraphicsSimpleTextItem,
QMenu,
) )
from simudator.core.signal import Signal from simudator.core.signal import Signal
...@@ -51,6 +53,7 @@ class PortGraphicsItem(QGraphicsItemGroup): ...@@ -51,6 +53,7 @@ class PortGraphicsItem(QGraphicsItemGroup):
self.parent = parent self.parent = parent
self.signal = signal self.signal = signal
self.orientation = orientation self.orientation = orientation
self.isLocked = False
# Set up pyqt signals using a QObject instance since inheriting from # Set up pyqt signals using a QObject instance since inheriting from
# QObject or QGraphicsObject directly does not work with subclasses # QObject or QGraphicsObject directly does not work with subclasses
...@@ -58,6 +61,7 @@ class PortGraphicsItem(QGraphicsItemGroup): ...@@ -58,6 +61,7 @@ class PortGraphicsItem(QGraphicsItemGroup):
self.pyqtSignalHolder = PyQtSignalHolder() self.pyqtSignalHolder = PyQtSignalHolder()
self.moved = self.pyqtSignalHolder.moved self.moved = self.pyqtSignalHolder.moved
self.toggled = self.pyqtSignalHolder.toggled self.toggled = self.pyqtSignalHolder.toggled
self.drawPort() self.drawPort()
self.setOrientation(orientation) self.setOrientation(orientation)
self.left_click = False self.left_click = False
...@@ -165,13 +169,13 @@ class PortGraphicsItem(QGraphicsItemGroup): ...@@ -165,13 +169,13 @@ class PortGraphicsItem(QGraphicsItemGroup):
if event.button() == Qt.MouseButton.LeftButton: if event.button() == Qt.MouseButton.LeftButton:
self.left_click = True self.left_click = True
elif event.button() == Qt.MouseButton.RightButton:
self.toggled.emit()
event.accept() event.accept()
def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None: def mouseMoveEvent(self, event: QGraphicsSceneMouseEvent) -> None:
if not self.left_click and self.parent is not None: if not self.left_click and self.parent is not None:
return return
if self.isLocked:
return
# Get mouses relative position to parent # Get mouses relative position to parent
current_mouse_point = event.scenePos() current_mouse_point = event.scenePos()
...@@ -217,9 +221,24 @@ class PortGraphicsItem(QGraphicsItemGroup): ...@@ -217,9 +221,24 @@ class PortGraphicsItem(QGraphicsItemGroup):
self.left_click = False self.left_click = False
def contextMenuEvent(self, event: QGraphicsSceneMouseEvent) -> None: 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() event.accept()
def toggleVisibility(self) -> None:
self.setVisible(not self.isVisible())
self.toggled.emit()
def getDisplayName(self) -> str: def getDisplayName(self) -> str:
return self.name return self.name
...@@ -232,5 +251,8 @@ class PortGraphicsItem(QGraphicsItemGroup): ...@@ -232,5 +251,8 @@ class PortGraphicsItem(QGraphicsItemGroup):
def setNameVisibility(self, is_visible): def setNameVisibility(self, is_visible):
self.name_label.setVisible(is_visible) self.name_label.setVisible(is_visible)
def setLocked(self, locked: bool) -> None:
self.isLocked = locked
def getOrientation(self) -> Orientation: def getOrientation(self) -> Orientation:
return self.orientation return self.orientation
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment