diff --git a/b_asic/GUI/drag_button.py b/b_asic/GUI/drag_button.py index bbdcf8ddb2e9d787a1846aa65818ab2214311907..241e00e3aa8e65f381b9baeeb0c4e2e1c547e7c4 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 @@ -49,6 +56,8 @@ class DragButton(QPushButton): self._mouse_press_pos = None self._mouse_move_pos = None self._flipped = False + self._properties_window = None + self.label = None super().__init__(parent) def contextMenuEvent(self, event): @@ -67,8 +76,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 +155,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)) @@ -188,9 +195,7 @@ class DragButton(QPushButton): for signal, ports in self._window.signalPortDict.items(): if any( map( - lambda port: set(port).intersection( - set(self._window.portDict[self]) - ), + lambda port: set(port).intersection(set(self.ports)), ports, ) ): @@ -227,3 +232,31 @@ class DragButton(QPushButton): if self.operation in self._window.operationDragDict: del self._window.operationDragDict[self.operation] + + def add_ports(self): + def _determine_port_distance(opheight, 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 ( + [(opheight - PORTHEIGHT) // 2] + if ports == 1 + else [(PORTHEIGHT + GAP) * no for no in range(ports)] + ) + + 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..5ea25e56070a2ae91c8ec9244c62c95f273967c6 100644 --- a/b_asic/GUI/main_window.py +++ b/b_asic/GUI/main_window.py @@ -26,22 +26,18 @@ from qtpy.QtWidgets import ( QShortcut, ) -import b_asic.core_operations as c_oper -import b_asic.special_operations as s_oper +import b_asic.core_operations +import b_asic.special_operations 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, GRID, MINBUTTONSIZE, PORTHEIGHT, - PORTWIDTH, - MIN_HEIGHT_SCENE, - MIN_WIDTH_SCENE, ) from b_asic.GUI.show_pc_window import ShowPCWindow from b_asic.GUI.simulate_sfg_window import Plot, SimulateSFGWindow @@ -64,7 +60,7 @@ class MainWindow(QMainWindow): self.ui = Ui_main_window() self.ui.setupUi(self) self.setWindowIcon(QIcon("small_logo.png")) - self.scene = None + self.scene = QGraphicsScene(self) self._operations_from_name = {} self.zoom = 1 self.sfg_name_i = 0 @@ -82,10 +78,10 @@ class MainWindow(QMainWindow): self.logger = logging.getLogger(__name__) self.init_ui() self.add_operations_from_namespace( - c_oper, self.ui.core_operations_list + b_asic.core_operations, self.ui.core_operations_list ) self.add_operations_from_namespace( - s_oper, self.ui.special_operations_list + b_asic.special_operations, self.ui.special_operations_list ) self.shortcut_core = QShortcut( @@ -143,7 +139,6 @@ class MainWindow(QMainWindow): self.create_graphics_view() def create_graphics_view(self): - self.scene = QGraphicsScene(self) self.graphic_view = QGraphicsView(self.scene, self) self.graphic_view.setRenderHint(QPainter.Antialiasing) self.graphic_view.setGeometry( @@ -334,7 +329,7 @@ class MainWindow(QMainWindow): if not accepted: return - if name == "": + if not name: self.logger.warning("Failed to initialize SFG with empty name.") return @@ -452,40 +447,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 +472,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 +487,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 +497,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 +547,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): @@ -598,7 +557,7 @@ class MainWindow(QMainWindow): self.create_operation(attr_oper) except Exception as e: self.logger.error( - f"Unexpected error occured while creating operation: {e}." + f"Unexpected error occurred while creating operation: {e}." ) def _refresh_operations_list_from_namespace(self): @@ -607,10 +566,10 @@ class MainWindow(QMainWindow): self.ui.special_operations_list.clear() self.add_operations_from_namespace( - c_oper, self.ui.core_operations_list + b_asic.core_operations, self.ui.core_operations_list ) self.add_operations_from_namespace( - s_oper, self.ui.special_operations_list + b_asic.special_operations, self.ui.special_operations_list ) self.logger.info("Finished refreshing operation list.")