diff --git a/b_asic/GUI/arrow.py b/b_asic/GUI/arrow.py index cb980a5f635163156390b871766fa2965c7a561a..c975c728c8c4a36a1aa208e4f5bfd22107bc9a26 100644 --- a/b_asic/GUI/arrow.py +++ b/b_asic/GUI/arrow.py @@ -5,12 +5,14 @@ QGraphicsLineItem, QGraphicsWidget from PySide2.QtCore import Qt, QSize, QLineF, QPoint, QRectF from PySide2.QtGui import QIcon, QFont, QPainter, QPen +from b_asic import Signal class Arrow(QGraphicsLineItem): def __init__(self, source, destination, window, parent=None): super(Arrow, self).__init__(parent) self.source = source + self.signal = Signal(source.port, destination.port) self.destination = destination self._window = window self.moveLine() diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py index a417723ac8c4766813ab49ebf8434b86185a9c4f..5b0a734a09c41cd64848dd994ecaaef2d2fa120f 100644 --- a/b_asic/GUI/drag_button.py +++ b/b_asic/GUI/drag_button.py @@ -57,21 +57,25 @@ class DragButton(QPushButton): if self.clicked == 1: self.pressed = True self.setStyleSheet("background-color: grey; border-style: solid;\ - border-color: black; border-width: 2px") + border-color: black; border-width: 2px; border-radius: 10px") + self.setStyleSheet(""" QToolTip { background-color: white; + color: black }""") path_to_image = os.path.join('operation_icons', self.operation_path_name + '_grey.png') self.setIcon(QIcon(path_to_image)) self.setIconSize(QSize(55, 55)) - self._window.pressed_button.append(self) + self._window.pressed_operations.append(self) elif self.clicked == 2: self.clicked = 0 self.pressed = False self.setStyleSheet("background-color: white; border-style: solid;\ - border-color: black; border-width: 2px") + border-color: black; border-width: 2px; border-radius: 10px") + self.setStyleSheet(""" QToolTip { background-color: white; + color: black}""") path_to_image = os.path.join('operation_icons', self.operation_path_name + '.png') self.setIcon(QIcon(path_to_image)) self.setIconSize(QSize(55, 55)) - self._window.pressed_button.remove(self) + self._window.pressed_operations.remove(self) super(DragButton, self).mousePressEvent(event) diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py index 049ef8be8546c7e75eeec75fd44bc2775f90085c..ffa8448a7b2ed93b2b7cb79d3c609ac2fed34303 100644 --- a/b_asic/GUI/main_window.py +++ b/b_asic/GUI/main_window.py @@ -15,6 +15,8 @@ from b_asic import Operation import b_asic.core_operations as c_oper import b_asic.special_operations as s_oper from utils import decorate_class, handle_error +from b_asic import SFG +from b_asic import InputPort, OutputPort from numpy import linspace @@ -41,11 +43,13 @@ class MainWindow(QMainWindow): self.scene = None self._operations_from_name = dict() self.zoom = 1 + self.sfg_name_i = 0 self.operationList = [] self.signalList = [] - self.pressed_button = [] + self.pressed_operations = [] self.portList = [] self.pressed_ports = [] + self.sfg_list = [] self.source = None self._window = self @@ -69,6 +73,7 @@ class MainWindow(QMainWindow): self.ui.core_operations_list.itemClicked.connect(self.on_list_widget_item_clicked) self.ui.special_operations_list.itemClicked.connect(self.on_list_widget_item_clicked) self.ui.exit_menu.triggered.connect(self.exit_app) + self.create_toolbar_view() self.create_graphics_view() def create_graphics_view(self): @@ -78,6 +83,10 @@ class MainWindow(QMainWindow): self.graphic_view.setGeometry(self.ui.operation_box.width(), 0, self.width(), self.height()) self.graphic_view.setDragMode(QGraphicsView.ScrollHandDrag) + def create_toolbar_view(self): + self.toolbar = self.addToolBar("Toolbar") + self.toolbar.addAction("Create SFG", self.create_SFG_from_toolbar) + def resizeEvent(self, event): self.ui.operation_box.setGeometry(10, 10, self.ui.operation_box.width(), self.height()) self.graphic_view.setGeometry(self.ui.operation_box.width() + 20, 0, self.width() - self.ui.operation_box.width() - 20, self.height()) @@ -102,15 +111,30 @@ class MainWindow(QMainWindow): def exit_app(self, checked): QApplication.quit() + def create_SFG_from_toolbar(self): + inputs = [] + outputs = [] + for op in self.pressed_operations: + if isinstance(op.operation, s_oper.Input): + inputs.append(op.operation) + elif isinstance(op.operation, s_oper.Output): + outputs.append(op.operation) + + self.sfg_name_i += 1 + sfg = SFG(inputs=inputs, outputs=outputs, name="sfg" + str(self.sfg_name_i)) + for op in self.pressed_operations: + op.setToolTip(sfg.name) + self.sfg_list.append(sfg) + def _determine_port_distance(self, length, ports): """Determine the distance between each port on the side of an operation. The method returns the distance that each port should have from 0. """ return [length / 2] if ports == 1 else linspace(0, length, ports) - def _create_port(self, operation, output_port=True): + def _create_port(self, operation, port, output_port=True): text = ">" if output_port else "<" - button = PortButton(text, operation, self) + button = PortButton(text, operation, port, self) button.setStyleSheet("background-color: white") button.connectionRequested.connect(self.connectButton) return button @@ -119,13 +143,13 @@ class MainWindow(QMainWindow): _output_ports_dist = self._determine_port_distance(55 - 17, operation.operation.output_count) _input_ports_dist = self._determine_port_distance(55 - 17, operation.operation.input_count) - for dist in _input_ports_dist: - port = self._create_port(operation) + for i, dist in enumerate(_input_ports_dist): + port = self._create_port(operation, operation.operation.input(i)) port.move(0, dist) port.show() - for dist in _output_ports_dist: - port = self._create_port(operation) + for i, dist in enumerate(_output_ports_dist): + port = self._create_port(operation, operation.operation.output(i)) port.move(55 - 12, dist) port.show() @@ -158,6 +182,9 @@ class MainWindow(QMainWindow): icon_path = path.join("operation_icons", f"custom_operation.png") attr_button.setIcon(QIcon(icon_path)) attr_button.setIconSize(QSize(55, 55)) + attr_button.setToolTip("No sfg") + attr_button.setStyleSheet(""" QToolTip { background-color: white; + color: black }""") attr_button.setParent(None) attr_button_scene = self.scene.addWidget(attr_button) attr_button_scene.moveBy(self.move_button_index * 100, 0) @@ -183,12 +210,12 @@ class MainWindow(QMainWindow): self._create_operation(item) def keyPressEvent(self, event): - pressed_buttons = [] + pressed_operations = [] for op in self.operationList: if op.pressed: - pressed_buttons.append(op) + pressed_operations.append(op) if event.key() == Qt.Key_Delete: - for pressed_op in pressed_buttons: + for pressed_op in pressed_operations: self.operationList.remove(pressed_op) pressed_op.remove() self.move_button_index -= 1 @@ -198,9 +225,11 @@ class MainWindow(QMainWindow): if len(self.pressed_ports) < 2: return for i in range(len(self.pressed_ports) - 1): - line = Arrow(self.pressed_ports[i], self.pressed_ports[i + 1], self) - self.scene.addItem(line) - self.signalList.append(line) + if isinstance(self.pressed_ports[i].port, OutputPort) and \ + isinstance(self.pressed_ports[i+1].port, InputPort): + line = Arrow(self.pressed_ports[i], self.pressed_ports[i + 1], self) + self.scene.addItem(line) + self.signalList.append(line) self.update() diff --git a/b_asic/GUI/port_button.py b/b_asic/GUI/port_button.py index 98189c1981fbcae3aa67596e0be1b9ff327956fc..04b355663cd057b399c6e2c182f70aebeddffc50 100644 --- a/b_asic/GUI/port_button.py +++ b/b_asic/GUI/port_button.py @@ -7,9 +7,10 @@ from PySide2.QtCore import Qt, Signal class PortButton(QPushButton): connectionRequested = Signal(QPushButton) moved = Signal() - def __init__(self, name, operation, window, parent=None): + def __init__(self, name, operation, port, window, parent=None): self.pressed = False self.window = window + self.port = port self.operation = operation self.clicked = 0 super(PortButton, self).__init__(name, operation)