diff --git a/b_asic/scheduler-gui/main_window.py b/b_asic/scheduler-gui/main_window.py index 05c4f871f99e80767f7371fbd9aa925b50ac6d39..8d77aa7726d3d0a0ec516ae754b4d39839a9997d 100644 --- a/b_asic/scheduler-gui/main_window.py +++ b/b_asic/scheduler-gui/main_window.py @@ -4,20 +4,19 @@ Contains the scheduler-gui class for scheduling operations in an SFG. """ # This Python file uses the following encoding: utf-8 -import os +import os, sys from pathlib import Path -import sys from typing import Any -from pytest import ExitCode #from matplotlib.pyplot import bar #from diagram import * -from qtpy import uic, QtCore, QtGui, QtWidgets -from qtpy.QtCore import Qt, Slot +from qtpy import uic, QtCore, QtGui, QtWidgets +from qtpy.QtCore import Qt, Slot, QSettings +from qtpy.QtGui import QCloseEvent from qtpy.QtWidgets import QApplication, QMainWindow, QMessageBox # QPainter imports -from qtpy.QtWidgets import QGraphicsView, QGraphicsScene +from qtpy.QtWidgets import QGraphicsView, QGraphicsScene, QMessageBox from qtpy.QtGui import ( QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QLinearGradient) @@ -72,7 +71,6 @@ if __debug__: argv = ' '.join(argv) print("DEBUG: Running in debug mode. To disable, start program with: '" + argv + "'") - # Only availible when the form is compiled from ui.main_window_ui import Ui_MainWindow @@ -82,20 +80,17 @@ from ui.main_window_ui import Ui_MainWindow class MainWindow(QMainWindow, Ui_MainWindow): """Schedule of an SFG with scheduled Operations.""" - #_ui: QMainWindow # <class '__main__.Ui_MainWindow'> - #_widget: QMainWindow # <class 'PyQt5.QtWidgets.QMainWindow'> - #ui = Ui_MainWindow() # DEBUG, remove later + _settings: QSettings + def __init__(self): - """Construct a Schedule from an SFG and show it in the UI.""" + """Initialize Schedule-gui.""" super(MainWindow, self).__init__() self._init_ui() self._init_graphics_view() - def _init_ui(self): - - + def _init_ui(self) -> None: # self._ui = uic.loadUi("main_window.ui", None) # Load the .ui file # #self._ui.setupUi(self) # print('self:\t\t' + str(type(self))) @@ -115,55 +110,102 @@ class MainWindow(QMainWindow, Ui_MainWindow): # else: # uic.loadUi("main_window.ui", self) # Load the .ui file + self._settings = QSettings() self.setupUi(self) + # Init signals/slots self.pushbutton_add.clicked.connect(self.callback_pushButton) - self.menu_load_sfg.triggered.connect(self.load_sfg) - self.menu_save_schedule.triggered.connect(self.save_schedule) + self.menu_load_sfg.triggered.connect(self.open) + self.menu_save_schedule.triggered.connect(self.save) self.menu_quit.triggered.connect(self.close) - self.menu_node_info.triggered.connect(self.toggle_node_info) - #self.show() - - #print('self:\t\t' + str(type(self))) - - def _init_graphics_view(self): - self.setCentralWidget(self.graphicsView) + self.menu_node_info.triggered.connect(self._toggle_component_info) + self.splitter_center.splitterMoved.connect(self._splitter_center_moved) + + # Init info sidebar + for i in range(10): + self.listWidget.addItem('this is a very very very very long string that says abolutly nothing' + str(i)) + self.listWidget.addItem('this is a short string' + str(i)) + + # Init central-widget splitter + self.splitter_center.setStretchFactor(0, 1) + self.splitter_center.setStretchFactor(1, 0) + self.splitter_center.setCollapsible(0, False) + self.splitter_center.setCollapsible(1, True) + + def _init_graphics_view(self) -> None: + pass + #self.setCentralWidget(self.graphicsView) # pass - # self.scene = QGraphicsScene(self) - # self.graphic_view = QGraphicsView(self.scene, self) - # self.graphic_view.setRenderHint(QPainter.Antialiasing) - # self.graphic_view.setGeometry(20, 20, self.width(), self.height()) - # self.graphic_view.setDragMode(QGraphicsView.RubberBandDrag) + self.graphic_scene = QGraphicsScene(self) + self.graphic_view.setScene(self.graphic_scene) + #self.graphic_view = QGraphicsView(self.scene, self) + self.graphic_view.setRenderHint(QPainter.Antialiasing) + self.graphic_view.setGeometry(20, 20, self.width(), self.height()) + self.graphic_view.setDragMode(QGraphicsView.RubberBandDrag) # print(self.centralwidget.baseSize()) #self.setupUi(self) # Need to setup ui again - + + ############### + #### Slots #### + ############### @Slot() - def callback_pushButton(self): + def callback_pushButton(self) -> None: #diagram = Diagram() self.printButtonPressed('callback_pushButton') @Slot() - def load_sfg(self): + def open(self) -> None: + """This method loads an SFG and create a base schedule in gui.""" + #TODO: all self.printButtonPressed('load_sfg()') self.update_statusbar('SFG loaded successfully') @Slot() - def save_schedule(self): + def save(self) -> None: + """This method save an schedule.""" + #TODO: all self.printButtonPressed('save_schedule()') self.update_statusbar('Schedule saved successfully') @Slot(bool) - def toggle_node_info(self, checked: bool): - #if _ui.actionNode_info. - print(type(checked)) - print(checked) - self.printButtonPressed('toggle_node_info()') - #self.update_statusbar() + def _toggle_component_info(self, checked: bool) -> None: + widths = list(self.splitter_center.sizes()) + max_range = widths[0] + widths[1] + if checked: + self.splitter_center.restoreState(self._settings.value("splitterSizes")); + else: + self._settings.setValue("splitterSizes", self.splitter_center.saveState()); + self.splitter_center.moveSplitter(max_range, 1) # Note: splitter index starts at 1 + + @Slot(int, int) + def _splitter_center_moved(self, pos: int, index: int) -> None: + widths: list[int, int] = list(self.splitter_center.sizes()) + #TODO: Custom move handler, save state on click-release? + if widths[1] == 0: + self.menu_node_info.setChecked(False) + else: + self.menu_node_info.setChecked(True) + + + ################ + #### Events #### + ################ + def closeEvent(self, event: QCloseEvent) -> None: + """Overloads QMainWindow default closeEvent(QCloseEvent) event""" + QMessageBox.StandardButton resBtn = QMessageBox::question( this, APP_NAME, + self.tr("Are you sure?\n"), + QMessageBox::Cancel | QMessageBox::No | QMessageBox::Yes, + QMessageBox::Yes); + pass - def printButtonPressed(self, func_name: str): + ################################# + #### Helper member functions #### + ################################# + def printButtonPressed(self, func_name: str) -> None: + #TODO: remove self.label.setText("hello") @@ -171,7 +213,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): alert.setText("Called from " + func_name + '!') alert.exec_() - def update_statusbar(self, msg: str): + def update_statusbar(self, msg: str) -> None: + """Write the given str to the statusbar with temporarily policy.""" self.statusbar.showMessage(msg) diff --git a/b_asic/scheduler-gui/main_window.ui b/b_asic/scheduler-gui/main_window.ui index a6319b422d03a81de87c9189d2e9144a0eca3958..e39cfe4b83c689d504f5a455124772fd0a05f82e 100644 --- a/b_asic/scheduler-gui/main_window.ui +++ b/b_asic/scheduler-gui/main_window.ui @@ -30,32 +30,48 @@ <verstretch>0</verstretch> </sizepolicy> </property> - <widget class="QWidget" name="layoutWidget"> - <property name="geometry"> - <rect> - <x>30</x> - <y>90</y> - <width>258</width> - <height>225</height> - </rect> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>0</number> </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string>TextLabel</string> - </property> - </widget> - </item> - </layout> - </item> - <item> - <widget class="QGraphicsView" name="graphicsView"/> - </item> - </layout> - </widget> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QSplitter" name="splitter_center"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <widget class="QGraphicsView" name="graphic_view"/> + <widget class="QListWidget" name="listWidget"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="minimumSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + <property name="baseSize"> + <size> + <width>0</width> + <height>0</height> + </size> + </property> + </widget> + </widget> + </item> + </layout> </widget> <widget class="QMenuBar" name="menubar"> <property name="geometry"> @@ -96,32 +112,42 @@ <number>4</number> </attribute> <widget class="QWidget" name="dockWidgetContents_2"> - <widget class="QPushButton" name="pushbutton_add"> - <property name="geometry"> - <rect> - <x>30</x> - <y>0</y> - <width>81</width> - <height>23</height> - </rect> - </property> - <property name="text"> - <string>+</string> - </property> - </widget> - <widget class="QPushButton" name="pushbutton_remove"> - <property name="geometry"> - <rect> - <x>190</x> - <y>0</y> - <width>61</width> - <height>23</height> - </rect> - </property> - <property name="text"> - <string>-</string> - </property> - </widget> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <item> + <widget class="QPushButton" name="pushbutton_add"> + <property name="text"> + <string>+</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="pushbutton_remove"> + <property name="text"> + <string>-</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>TextLabel</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + </layout> </widget> </widget> <widget class="QToolBar" name="toolBar"> @@ -136,6 +162,7 @@ </attribute> <addaction name="menu_load_sfg"/> <addaction name="menu_save_schedule"/> + <addaction name="menu_node_info"/> </widget> <action name="menu_load_sfg"> <property name="text"> @@ -163,9 +190,15 @@ <property name="checkable"> <bool>true</bool> </property> + <property name="checked"> + <bool>true</bool> + </property> <property name="text"> <string>&Node info</string> </property> + <property name="toolTip"> + <string>Show node information</string> + </property> <property name="shortcut"> <string>Ctrl+I</string> </property>