diff --git a/src/simudator/gui/signal_graphics_item.py b/src/simudator/gui/signal_graphics_item.py index f8a48c42edd064a71b14d6ee8e00d3eb9288b25f..37398aa9efab93e6310640fbbea3eaa21408fe71 100644 --- a/src/simudator/gui/signal_graphics_item.py +++ b/src/simudator/gui/signal_graphics_item.py @@ -3,7 +3,7 @@ import math from qtpy import QtCore from qtpy.QtCore import QPoint, QPointF, QRectF, Qt -from qtpy.QtGui import QCursor, QPainter +from qtpy.QtGui import QCursor, QPainter, QPen from qtpy.QtWidgets import QGraphicsLineItem, QGraphicsSceneMouseEvent, QGraphicsWidget from simudator.gui.color_scheme import ColorScheme @@ -44,7 +44,7 @@ class SignalGraphicsItem(QGraphicsWidget): self.points: list[QPointF] = [] self.lines = [] - self.line_segments: list[LineSegment] = [] + self._line_segments: list[LineSegment] = [] # Variables and flags for handling mouse events self.left_click = False @@ -57,34 +57,40 @@ class SignalGraphicsItem(QGraphicsWidget): # |---- port # | # port -----| + start_point = self.start_port.getPoint() end_point = self.end_port.getPoint() - self.points.append(start_point) - half_x = (start_point.x() + end_point.x()) / 2 - self.points.append(QPointF(half_x, start_point.y())) - self.points.append(QPointF(half_x, end_point.y())) - self.points.append(end_point) - self.drawSignal() + self._init_line_points(start_point, end_point) # local_start = self.mapFromItem(start_port, start_point) # local_end = self.mapFromItem(end_port, end_point) local_start = self.mapFromScene(start_point) local_end = self.mapFromScene(end_point) - self.line_segments.append(LineSegment(local_start, local_end, self)) - """ - self.line_segments.append( - LineSegment( - QPointF(half_x, start_point.y()), QPointF(half_x, end_point.y()), self - ) - ) - self.line_segments.append( - LineSegment(QPointF(half_x, end_point.y()), end_point, self) - )""" + self._init_line_points(start_point, end_point) + + self.drawSignal() # Used to lock layout self.is_locked = False + def _init_line_points(self, start_point: QPointF, end_point: QPointF) -> None: + """ """ + # TODO: work on self._points + + # |---- port + # | + # port -----| + + half_x = (start_point.x() + end_point.x()) / 2 + + self.points: list[QPointF] = [] + + self.points.append(start_point) + self.points.append(QPointF(half_x, start_point.y())) + self.points.append(QPointF(half_x, end_point.y())) + self.points.append(end_point) + def reset(self) -> None: """ Reset the visual representation of the signal to what it looked @@ -121,14 +127,17 @@ class SignalGraphicsItem(QGraphicsWidget): to another segment at its end points, except for the two end segments which are connected to module ports. """ - for line in self.line_segments: - line.paint(QPainter(), None, None) - return + # Remove old lines from the GUI while self.lines: item = self.lines.pop() item.setParentItem(None) + # Remove old lines form the GUI + while self._line_segments: + item = self._line_segments.pop() + item.setParentItem(None) + # Draw lines from the first to the second point, from the second # to the third point and so on prev_point = self.points[0] @@ -139,9 +148,11 @@ class SignalGraphicsItem(QGraphicsWidget): y1 = prev_point.y() x2 = point.x() y2 = point.y() - line = QGraphicsLineItem(x1, y1, x2, y2, self) - line.setPen(ColorScheme.Signal) - self.lines.append(line) + # line = QGraphicsLineItem(x1, y1, x2, y2, self) + # line.setPen(ColorScheme.Signal) + segment = LineSegment(prev_point, point, self) + self._line_segments.append(segment) + # self.lines.append(line) prev_point = point def splitLine(self, start_point_index: int, end_point_index: int) -> None: @@ -205,7 +216,7 @@ class SignalGraphicsItem(QGraphicsWidget): event.ignore() # Save whether the pressed line segment is vertical or horisontal - # for convenience288.5 + # for convenience if line_start.x() == line_end.x(): self.last_line_vertical = True elif line_start.y() == line_end.y(): @@ -464,29 +475,50 @@ class LineSegment(QGraphicsWidget): self, start_pos: QPointF, end_pos: QPointF, parent: SignalGraphicsItem ): super().__init__(parent) - start_pos = self.mapFromItem(parent, start_pos) - end_pos = self.mapFromItem(parent, end_pos) + + self._parent = parent + self._start_pos = start_pos self._end_pos = end_pos - # Vertical line - if self._start_pos.x() == self._end_pos.x(): - x = self._start_pos.x() - y = min(self._start_pos.y(), self._end_pos.y()) - w = 10 - h = max(self._start_pos.y(), self._end_pos.y()) - y + self._calc_area(start_pos, end_pos) - # Horizontal line - else: - x = min(self._start_pos.x(), self._end_pos.x()) - y = self._start_pos.y() - w = max(self._start_pos.y(), self._end_pos.y()) - x - h = 10 + def _calc_area(self, start_pos: QPointF, end_pos: QPointF): + + # start_pos = self.mapFromScene(start_pos) + # end_pos = self.mapFromScene(end_pos) + + self._start_pos = start_pos + self._end_pos = end_pos + + top_left = QPointF( + min(self._start_pos.x(), self._end_pos.x()), + min(self._start_pos.y(), self._end_pos.y()), + ) + width = max(self._start_pos.x(), self._end_pos.x()) - top_left.x() + height = max(self._start_pos.y(), self._end_pos.y()) - top_left.y() + self.setGeometry(top_left.x() - 5, top_left.y() - 5, width + 10, height + 10) - self.setGeometry(x, y, w, h) + def update_position(self, start_pos: QPointF, end_pos: QPointF): + self._calc_area(start_pos, end_pos) def paint(self, painter: QPainter, option, widget): painter.drawLine(self._start_pos, self._end_pos) + painter.setPen(QPen(QtCore.Qt.red)) + painter.drawRect(self.boundingRect()) def boundingRect(self): return self.geometry() + + def mouseReleaseEvent(self, event: QGraphicsSceneMouseEvent) -> None: + """ + Calls the functions 'handleLeftClick' or 'handleRightClick' if + the user left or right clicked. + """ + print(123) + return + if event.button() == Qt.MouseButton.LeftButton: + self.handleLeftClick() + + elif event.button() == Qt.MouseButton.RightButton: + self.handleRightClick()