diff --git a/b_asic/GUI/arrow.py b/b_asic/GUI/arrow.py index 4014c78a4397f2d27823a2d570d1229d214f6393..575d6aeca164ed0bd5d0560593bbd284912e7a34 100644 --- a/b_asic/GUI/arrow.py +++ b/b_asic/GUI/arrow.py @@ -28,5 +28,7 @@ class Arrow(QGraphicsLineItem): def moveLine(self): self.setPen(QPen(Qt.black, 3)) - self.setLine(QLineF(self.source.x()+50, self.source.y()+25,\ - self.destination.x(), self.destination.y()+25)) \ No newline at end of file + self.setLine(QLineF(self.source.operation.x()+self.source.x()+14,\ + self.source.operation.y()+self.source.y()+7.5,\ + self.destination.operation.x()+self.destination.x(),\ + self.destination.operation.y()+self.destination.y()+7.5)) diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py index 9f2f26e439dff2706dc1ec13fb2b3224c6f8bf6f..9f10c1cebc9c8590a5a671063a15739954fb4a49 100644 --- a/b_asic/GUI/drag_button.py +++ b/b_asic/GUI/drag_button.py @@ -6,14 +6,12 @@ This class creates a dragbutton which can be clicked, dragged and dropped. import os.path -from PyQt5.QtWidgets import QPushButton, QMenu -from PyQt5.QtCore import Qt, QSize, pyqtSignal, QMimeData +from PyQt5.QtWidgets import QPushButton +from PyQt5.QtCore import Qt, QSize from PyQt5.QtGui import QIcon class DragButton(QPushButton): - connectionRequested = pyqtSignal(QPushButton) - moved = pyqtSignal() def __init__(self, name, operation, operation_path_name, window, parent = None): self.name = name self.__window = window @@ -23,11 +21,6 @@ class DragButton(QPushButton): self.pressed = False super(DragButton, self).__init__(self.__window) - def contextMenuEvent(self, event): - menu = QMenu() - menu.addAction("Connect", lambda: self.connectionRequested.emit(self)) - menu.exec_(self.cursor().pos()) - def mousePressEvent(self, event): self._mouse_press_pos = None self._mouse_move_pos = None diff --git a/b_asic/GUI/improved_main_window.py b/b_asic/GUI/improved_main_window.py index 2db960d65e4b1150aeb31f24f7641153439ed2d1..b2cad0f5e30f9cbd26b59fa739a6e04b0323ff10 100644 --- a/b_asic/GUI/improved_main_window.py +++ b/b_asic/GUI/improved_main_window.py @@ -3,12 +3,12 @@ B-ASIC GUI Module. This python file is the main window of the GUI for B-ASIC. """ -from os import getcwd import sys from drag_button import DragButton from gui_interface import Ui_main_window from arrow import Arrow +from port_button import PortButton from b_asic import Constant, Addition, Subtraction, Absolute,\ Multiplication, Division, ConstantMultiplication, SquareRoot, ComplexConjugate,\ @@ -51,6 +51,8 @@ class MainWindow(QMainWindow): self.operationList = [] self.signalList = [] self.pressed_button = [] + self.portList = [] + self.pressed_ports = [] self.source = None def init_ui(self): @@ -77,38 +79,50 @@ class MainWindow(QMainWindow): def add_ports(self, operation): if operation.operation.input_count == 2: - self.input_port_1 = QPushButton(">", operation) + self.input_port_1 = PortButton(">", operation, window) + self.input_port_1.setFixedSize(15, 15) self.input_port_1.setStyleSheet("background-color: white") - self.input_port_1.clicked.connect(self.print_input_port_1) self.input_port_1.show() - self.input_port_2 = QPushButton(">", operation) + self.input_port_2 = PortButton(">", operation, window) + self.input_port_2.setFixedSize(15, 15) self.input_port_2.setStyleSheet("background-color: white") - self.input_port_2.move(0, 33) - self.input_port_2.clicked.connect(self.print_input_port_2) + self.input_port_2.move(0, 35) self.input_port_2.show() + self.portList.append(self.input_port_1) + self.portList.append(self.input_port_2) + self.input_port_1.connectionRequested.connect(self.connectButton) + self.input_port_2.connectionRequested.connect(self.connectButton) else: - self.input_port_1 = QPushButton(">", operation) + self.input_port_1 = PortButton(">", operation, window) + self.input_port_1.setFixedSize(15, 15) self.input_port_1.setStyleSheet("background-color: white") self.input_port_1.move(0, 16) - self.input_port_1.clicked.connect(self.print_input_port_1) self.input_port_1.show() + self.portList.append(self.input_port_1) + self.input_port_1.connectionRequested.connect(self.connectButton) if operation.operation.output_count == 2: - self.output_port = QPushButton(">", operation) + self.output_port = PortButton(">", operation, window) + self.output_port.setFixedSize(15, 15) self.output_port.setStyleSheet("background-color: white") self.output_port.move(38, 0) - self.output_port.clicked.connect(self.print_output_port_1) self.output_port.show() - self.output_port2 = QPushButton(">", operation) + self.output_port2 = PortButton(">", operation, window) + self.output_port_2.setFixedSize(15, 15) self.output_port2.setStyleSheet("background-color: white") self.output_port2.move(38, 33) - self.output_port2.clicked.connect(self.print_output_port_2) self.output_port2.show() + self.portList.append(self.output_port) + self.portList.append(self.output_port_2) + self.output_port.connectionRequested.connect(self.connectButton) + self.output_port_2.connectionRequested.connect(self.connectButton) else: - self.output_port = QPushButton(">", operation) + self.output_port = PortButton(">", operation, window) + self.output_port.setFixedSize(15, 15) self.output_port.setStyleSheet("background-color: white") - self.output_port.move(38, 16) - self.output_port.clicked.connect(self.print_output_port_1) + self.output_port.move(38, 20) self.output_port.show() + self.portList.append(self.output_port) + self.output_port.connectionRequested.connect(self.connectButton) def create_addition_operation(self): self.add_counter += 1 @@ -118,28 +132,16 @@ class MainWindow(QMainWindow): self.addition_operation.move(250, 100) self.addition_operation.setFixedSize(50, 50) self.addition_operation.setStyleSheet("background-color: white; border-style: solid;\ - border-color: black; border-width: 2px; border-radius: 10px") + border-color: black; border-width: 2px") self.addition_operation.setIcon(QIcon(r"operation_icons\addition.png")) self.addition_operation.setIconSize(QSize(50, 50)) self.addition_operation.setParent(None) self.scene.addWidget(self.addition_operation) self.operationList.append(self.addition_operation) - self.addition_operation.connectionRequested.connect(self.connectButton) + self.operationList.append(self.addition_operation) self.add_ports(self.addition_operation) - def print_input_port_1(self): - print("Input port 1") - - def print_input_port_2(self): - print("Input port 2") - - def print_output_port_1(self): - print("Output port 1") - - def print_output_port_2(self): - print("Output port 2") - def create_subtraction_operation(self): self.sub_counter += 1 subtraction_object = Subtraction() @@ -423,11 +425,10 @@ class MainWindow(QMainWindow): super().keyPressEvent(event) def connectButton(self, button): - if len(self.pressed_button) < 2: + if len(self.pressed_ports) < 2: return - - for i in range(len(self.pressed_button) - 1): - line = Arrow(self.pressed_button[i], self.pressed_button[i + 1], self) + 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) diff --git a/b_asic/GUI/port_button.py b/b_asic/GUI/port_button.py new file mode 100644 index 0000000000000000000000000000000000000000..d9fd2b135d1b11c9677be8ee814d95fe01d8007a --- /dev/null +++ b/b_asic/GUI/port_button.py @@ -0,0 +1,39 @@ + +import sys + +from PyQt5.QtWidgets import QPushButton, QMenu +from PyQt5.QtCore import Qt, pyqtSignal + +class PortButton(QPushButton): + connectionRequested = pyqtSignal(QPushButton) + moved = pyqtSignal() + def __init__(self, name, operation, window, parent=None): + self.pressed = False + self.window = window + self.operation = operation + self.clicked = 0 + super(PortButton, self).__init__(name, operation) + + def contextMenuEvent(self, event): + menu = QMenu() + menu.addAction("Connect", lambda: self.connectionRequested.emit(self)) + menu.exec_(self.cursor().pos()) + + def mousePressEvent(self, event): + + if event.button() == Qt.LeftButton: + self.clicked += 1 + if self.clicked == 1: + self.setStyleSheet("background-color: grey") + self.pressed = True + self.window.pressed_ports.append(self) + elif self.clicked == 2: + self.setStyleSheet("background-color: white") + self.pressed = False + self.clicked = 0 + self.window.pressed_ports.remove(self) + super(PortButton, self).mousePressEvent(event) + + def mouseReleaseEvent(self, event): + super(PortButton, self).mouseReleaseEvent(event) +