diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py index bbdcf8ddb2e9d787a1846aa65818ab2214311907..1cdd161e44b45bdf44046f56e683dac26bd27b1e 100644 --- a/b_asic/GUI/drag_button.py +++ b/b_asic/GUI/drag_button.py @@ -10,9 +10,16 @@ from qtpy.QtCore import QSize, Qt, Signal from qtpy.QtGui import QIcon from qtpy.QtWidgets import QAction, QMenu, QPushButton +from b_asic.GUI.port_button import PortButton from b_asic.GUI.properties_window import PropertiesWindow from b_asic.GUI.utils import decorate_class, handle_error -from b_asic.GUI._preferences import GRID, MINBUTTONSIZE, PORTWIDTH +from b_asic.GUI._preferences import ( + GAP, + GRID, + MINBUTTONSIZE, + PORTHEIGHT, + PORTWIDTH, +) from b_asic.port import InputPort @@ -67,8 +74,8 @@ class DragButton(QPushButton): menu.exec_(self.cursor().pos()) def show_properties_window(self, event): - self.properties_window = PropertiesWindow(self, self._window) - self.properties_window.show() + self._properties_window = PropertiesWindow(self, self._window) + self._properties_window.show() def add_label(self, label): self.label = label @@ -146,9 +153,7 @@ class DragButton(QPushButton): path_to_image = os.path.join( os.path.dirname(__file__), "operation_icons", - ( - f"{self.operation_path_name}{'_grey.png' if self.pressed else '.png'}" - ), + f"{self.operation_path_name}{'_grey.png' if self.pressed else '.png'}", ) self.setIcon(QIcon(path_to_image)) self.setIconSize(QSize(MINBUTTONSIZE, MINBUTTONSIZE)) @@ -227,3 +232,36 @@ class DragButton(QPushButton): if self.operation in self._window.operationDragDict: del self._window.operationDragDict[self.operation] + + def add_ports(self): + def _determine_port_distance(height, 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 ( + [(height - PORTHEIGHT) // 2] + if ports == 1 + else [(PORTHEIGHT + GAP) * i for i in range(ports)] + ) + + def _get_button_height(op): + max_ports = max(op.input_count, op.output_count) + return max( + MINBUTTONSIZE, max_ports * PORTHEIGHT + (max_ports - 1) * GAP + ) + + op = self.operation + height = self.height() + _output_ports_dist = _determine_port_distance(height, op.output_count) + _input_ports_dist = _determine_port_distance(height, op.input_count) + for i, dist in enumerate(_input_ports_dist): + port = PortButton(">", self, op.input(i), self._window) + self.ports.append(port) + port.move(0, dist) + port.show() + + for i, dist in enumerate(_output_ports_dist): + port = PortButton(">", self, op.output(i), self._window) + self.ports.append(port) + port.move(MINBUTTONSIZE - PORTWIDTH, dist) + port.show() diff --git a/b_asic/GUI/main_window.py b/b_asic/GUI/main_window.py index 5420bc010930902f6170f39bedad867c73fa5fa0..f7322181a6338bcd59133bd6061039773640f23e 100644 --- a/b_asic/GUI/main_window.py +++ b/b_asic/GUI/main_window.py @@ -32,7 +32,6 @@ from b_asic.GUI.about_window import AboutWindow, FaqWindow, KeybindsWindow from b_asic.GUI.arrow import Arrow from b_asic.GUI.drag_button import DragButton from b_asic.GUI.gui_interface import Ui_main_window -from b_asic.GUI.port_button import PortButton from b_asic.GUI.select_sfg_window import SelectSFGWindow from b_asic.GUI._preferences import ( GAP, @@ -452,40 +451,6 @@ class MainWindow(QMainWindow): self.dialog.add_sfg_to_dialog() self.dialog.show() - def _determine_port_distance(self, height, 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 ( - [(height - PORTHEIGHT) // 2] - if ports == 1 - else [(PORTHEIGHT + GAP) * i for i in range(ports)] - ) - - def add_ports(self, operation): - op = operation.operation - height = self._get_button_height(op) - _output_ports_dist = self._determine_port_distance( - height, op.output_count - ) - _input_ports_dist = self._determine_port_distance( - height, op.input_count - ) - self.portDict[operation] = [] - for i, dist in enumerate(_input_ports_dist): - port = PortButton(">", operation, op.input(i), self) - self.portDict[operation].append(port) - operation.ports.append(port) - port.move(0, dist) - port.show() - - for i, dist in enumerate(_output_ports_dist): - port = PortButton(">", operation, op.output(i), self) - self.portDict[operation].append(port) - operation.ports.append(port) - port.move(MINBUTTONSIZE - PORTWIDTH, dist) - port.show() - def get_operations_from_namespace(self, namespace): self.logger.info( f"Fetching operations from namespace: {namespace.__name__}." @@ -511,7 +476,7 @@ class MainWindow(QMainWindow): f"Added operations from namespace: {namespace.__name__}." ) - def add_namespace(self): + def add_namespace(self, event=None): module, accepted = QFileDialog().getOpenFileName() if not accepted: return @@ -526,12 +491,6 @@ class MainWindow(QMainWindow): namespace, self.ui.custom_operations_list ) - def _get_button_height(self, op): - max_ports = max(op.input_count, op.output_count) - return max( - MINBUTTONSIZE, max_ports * PORTHEIGHT + (max_ports - 1) * GAP - ) - def create_operation(self, op, position=None): try: attr_button = DragButton( @@ -542,14 +501,18 @@ class MainWindow(QMainWindow): else: attr_button.move(*position) - attr_button.setFixedSize( - MINBUTTONSIZE, self._get_button_height(op) + max_ports = max(op.input_count, op.output_count) + button_height = max( + MINBUTTONSIZE, max_ports * PORTHEIGHT + (max_ports - 1) * GAP ) + + attr_button.setFixedSize(MINBUTTONSIZE, button_height) attr_button.setStyleSheet( "background-color: white; border-style: solid;" "border-color: black; border-width: 2px" ) - self.add_ports(attr_button) + attr_button.add_ports() + self.portDict[attr_button] = attr_button.ports icon_path = os.path.join( os.path.dirname(__file__), @@ -588,7 +551,7 @@ class MainWindow(QMainWindow): self.dragOperationSceneDict[attr_button] = attr_button_scene except Exception as e: self.logger.error( - f"Unexpected error occured while creating operation: {e}." + f"Unexpected error occurred while creating operation: {e}." ) def _create_operation_item(self, item):