Added ports to icon
This commit is contained in:
@@ -8,6 +8,7 @@ from PySide6.QtCore import QObject, QPointF, QRectF, Qt, Signal
|
||||
from PySide6.QtGui import QBrush, QColor, QPainter, QPainterPath, QPen
|
||||
from PySide6.QtWidgets import QGraphicsItem, QGraphicsPathItem, QGraphicsRectItem, QGraphicsScene, QGraphicsSceneContextMenuEvent, QGraphicsSceneMouseEvent, QMenu, QStyleOptionGraphicsItem, QWidget
|
||||
|
||||
from bedit_core.models import Port, PortID, SignalDirection
|
||||
from bedit_gui.models import Icon, LineType, Rectangle, Shape, ShapeID
|
||||
|
||||
|
||||
@@ -172,7 +173,48 @@ class RectangleGraphicsItem(ShapeGraphicsItem):
|
||||
self.setPath(path)
|
||||
|
||||
|
||||
class PortGraphicsItem(QGraphicsRectItem):
|
||||
size = 16.0
|
||||
|
||||
def __init__(self, port_id: PortID, port: Port, position: tuple[int, int], scene: IconGraphicsScene) -> None:
|
||||
super().__init__(0, 0, self.size, self.size)
|
||||
self.port_id = port_id
|
||||
self.icon_scene = scene
|
||||
self._original_position: tuple[int, int] | None = None
|
||||
self.setPos(position[0], position[1])
|
||||
self.setPen(QPen(QColor("#000000")))
|
||||
self.setBrush(QBrush(QColor("#000000") if port.direction is SignalDirection.INPUT else QColor("#ffffff")))
|
||||
self.setZValue(1000000)
|
||||
self.setToolTip(port.name)
|
||||
self.setFlags(QGraphicsItem.GraphicsItemFlag.ItemIsSelectable | QGraphicsItem.GraphicsItemFlag.ItemIsMovable | QGraphicsItem.GraphicsItemFlag.ItemSendsGeometryChanges)
|
||||
|
||||
def mousePressEvent(self, event: QGraphicsSceneMouseEvent) -> None:
|
||||
self._original_position = self.position()
|
||||
super().mousePressEvent(event)
|
||||
|
||||
def mouseReleaseEvent(self, event: QGraphicsSceneMouseEvent) -> None:
|
||||
super().mouseReleaseEvent(event)
|
||||
position = self.position()
|
||||
if self._original_position is not None and position != self._original_position:
|
||||
self.icon_scene.port_moved.emit(self.port_id, self._original_position, position)
|
||||
self._original_position = None
|
||||
|
||||
def itemChange(self, change: QGraphicsItem.GraphicsItemChange, value: object) -> object:
|
||||
if change is QGraphicsItem.GraphicsItemChange.ItemPositionChange and self.scene() is not None:
|
||||
position = value
|
||||
if isinstance(position, QPointF):
|
||||
bounds = self.icon_scene.sceneRect()
|
||||
x = max(bounds.left(), min(bounds.right() - self.size, round(position.x())))
|
||||
y = max(bounds.top(), min(bounds.bottom() - self.size, round(position.y())))
|
||||
return QPointF(x, y)
|
||||
return super().itemChange(change, value)
|
||||
|
||||
def position(self) -> tuple[int, int]:
|
||||
return (round(self.pos().x()), round(self.pos().y()))
|
||||
|
||||
|
||||
class IconGraphicsScene(QGraphicsScene):
|
||||
port_moved = Signal(object, object, object)
|
||||
shape_created = Signal(object)
|
||||
shape_changed = Signal(object, object, object)
|
||||
shape_options_requested = Signal(object)
|
||||
@@ -181,13 +223,21 @@ class IconGraphicsScene(QGraphicsScene):
|
||||
def __init__(self, parent: QObject | None = None) -> None:
|
||||
super().__init__(parent)
|
||||
self._tool: ShapeCreationTool | None = None
|
||||
self._ports: dict[PortID, Port] = {}
|
||||
self.setSceneRect(-64, -64, 128, 128)
|
||||
|
||||
def set_ports(self, ports: dict[PortID, Port]) -> None:
|
||||
self._ports = deepcopy(ports)
|
||||
|
||||
def set_icon(self, icon: Icon) -> None:
|
||||
self.cancel_creation_tool()
|
||||
self.clear()
|
||||
for shape_id, shape in sorted(icon.shapes.items(), key=lambda item: item[1].layer):
|
||||
self._add_shape_item(shape_id, shape)
|
||||
for port_id, port in self._ports.items():
|
||||
position = icon.port_positions.get(port_id)
|
||||
if position is not None:
|
||||
self.addItem(PortGraphicsItem(port_id, port, position, self))
|
||||
|
||||
def set_creation_tool(self, tool: ShapeCreationTool) -> None:
|
||||
self.cancel_creation_tool()
|
||||
|
||||
Reference in New Issue
Block a user