diff --git a/b_asic/scheduler-gui/graphics_signal.py b/b_asic/scheduler-gui/graphics_signal.py new file mode 100644 index 0000000000000000000000000000000000000000..ac44f0fbdcc12930bd6927880894bcd88793c553 --- /dev/null +++ b/b_asic/scheduler-gui/graphics_signal.py @@ -0,0 +1,54 @@ +from typing import Optional + +from qtpy.QtWidgets import QGraphicsItem, QGraphicsPathItem +from qtpy.QtGui import QPainterPath, QPen +from qtpy.QtCore import Qt, QPointF + +# B-ASIC +from b_asic.signal import Signal +from graphics_component_item import GraphicsComponentItem + +class GraphicsSignal(QGraphicsPathItem): + _path: Optional[QPainterPath] = None + _src_operation: GraphicsComponentItem + _dest_operation: GraphicsComponentItem + _signal: Signal + def __init__(self, + src_operation: GraphicsComponentItem, + dest_operation: GraphicsComponentItem, + signal: Signal, pen: Optional[QPen] = None, + parent: Optional[QGraphicsItem] = None): + super().__init__(parent=parent) + self._src_operation = src_operation + self._dest_operation = dest_operation + self._signal = signal + if pen is None: + pen = QPen(Qt.black) + pen.setWidthF(0.03) + self.setPen(pen) + self.update_path() + + def update_path(self): + """ + Create a new path after moving connected operations. + """ + source_point = self._src_operation.get_port_location( + f"out{self._signal.source.index}") + dest_point = self._dest_operation.get_port_location( + f"in{self._signal.destination.index}") + path = QPainterPath() + path.moveTo(source_point) + source_x = source_point.x() + source_y = source_point.y() + dest_x = dest_point.x() + dest_y = dest_point.y() + if abs(source_x - dest_x) <= 0.1: + ctrl_point1 = QPointF(source_x + 0.5, source_y) + ctrl_point2 = QPointF(source_x - 0.5, dest_y) + else: + mid_x = (source_x + dest_x)/2 + ctrl_point1 = QPointF(mid_x, source_y) + ctrl_point2 = QPointF(mid_x, dest_y) + + path.cubicTo(ctrl_point1, ctrl_point2, dest_point) + self.setPath(path)