diff --git a/b_asic/scheduler-gui/__init__.py b/b_asic/scheduler-gui/__init__.py index c18cf2c1978e59a4d2f0d1d7e978e4bd39cd501d..ed7b11a01d4ced3cb6ae01c8ef4b41e3017d27ee 100644 --- a/b_asic/scheduler-gui/__init__.py +++ b/b_asic/scheduler-gui/__init__.py @@ -3,8 +3,9 @@ Graphical user interface for B-ASIC scheduler. """ -from .main_window import * -from .scheduler import * +from logger import * +from main_window import * +from scheduler import * #__all__ = ['main_window', 'scheduler'] __version__ = '0.1' diff --git a/b_asic/scheduler-gui/main_window.py b/b_asic/scheduler-gui/main_window.py index 2b53cb3d1761934491df842dd6ea8640b4813ae3..518febed6327c35d7a74cfab1ea4a97c236fe573 100644 --- a/b_asic/scheduler-gui/main_window.py +++ b/b_asic/scheduler-gui/main_window.py @@ -8,35 +8,49 @@ Start main-window with start_gui(). -import os, sys + +import os +import sys from pathlib import Path +from types import ModuleType from typing import Any +from pprint import pprint #from matplotlib.pyplot import bar #from diagram import * -import logger +from importlib.machinery import SourceFileLoader +import inspect +# Qt/qtpy import qtpy from qtpy import uic, QtCore, QtGui, QtWidgets -from qtpy.QtCore import Qt, Slot, QSettings +from qtpy.QtCore import Qt, Slot, QSettings, QStandardPaths from qtpy.QtGui import QCloseEvent -from qtpy.QtWidgets import QApplication, QMainWindow, QMessageBox, QAbstractButton +from qtpy.QtWidgets import ( + QApplication, QMainWindow, QMessageBox, QFileDialog, QInputDialog) # QGraphics and QPainter imports from qtpy.QtWidgets import ( QGraphicsView, QGraphicsScene, QGraphicsWidget, QGraphicsLayout, QGraphicsLinearLayout, QGraphicsGridLayout, QGraphicsLayoutItem, QGraphicsAnchorLayout, - QGraphicsItem, QGraphicsItemGroup, QGraphicsItemAnimation - ) + QGraphicsItem, QGraphicsItemGroup, QGraphicsItemAnimation) from qtpy.QtGui import ( QPaintEvent, QPainter, QPainterPath, QColor, QBrush, QPen, QFont, QPolygon, QLinearGradient) from qtpy.QtCore import ( QRect) +# B-ASIC +import logger +#import b_asic.schedule +from b_asic.schedule import Schedule + log = logger.getLogger() # Debug struff +if __debug__: + log.setLevel('DEBUG') + if __debug__: # Print some system version information QT_API = os.environ.get('QT_API') @@ -89,27 +103,29 @@ class MainWindow(QMainWindow, Ui_MainWindow): """Schedule of an SFG with scheduled Operations.""" _settings: QSettings + _schedules: dict def __init__(self): """Initialize Schedule-gui.""" super(MainWindow, self).__init__() + self._settings = QSettings() + self._schedules = {} self._init_ui() self._init_graphics_view() - + def _init_ui(self) -> None: """Initialize the ui""" - self._settings = QSettings() self.setupUi(self) - + # Connect signals to slots - self.pushbutton_add.clicked.connect(self.callback_pushButton) - 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_component_info) - self.splitter_center.splitterMoved.connect(self._splitter_center_moved) + self.pushbutton_add .clicked .connect(self.callback_pushButton) + self.menu_load_from_file.triggered .connect(self._load_schedule_from_pyfile) + self.menu_save_schedule .triggered .connect(self.save) + self.menu_quit .triggered .connect(self.close) + self.menu_node_info .triggered .connect(self.toggle_component_info) + self.splitter_center .splitterMoved .connect(self._splitter_center_moved) # Setup event member functions self.closeEvent = self._close_event @@ -141,10 +157,59 @@ class MainWindow(QMainWindow, Ui_MainWindow): @Slot() def callback_pushButton(self) -> None: #diagram = Diagram() - self.printButtonPressed(self.tr('callback_pushButton')) + + pass @Slot() - def open(self) -> None: + def _load_schedule_from_pyfile(self) -> None: + abs_path_filename = QFileDialog.getOpenFileName(self, self.tr("Open python file"), + QStandardPaths.standardLocations(QStandardPaths.HomeLocation)[0], + self.tr("Python Files (*.py *.py3)")) + abs_path_filename = abs_path_filename[0] + + if not abs_path_filename: # return if empty filename (QFileDialog was canceled) + return + log.debug('abs_path_filename = {}.'.format(abs_path_filename)) + + module_name = inspect.getmodulename(abs_path_filename) + if not module_name: # return if empty module name + log.error('Could not load module from file \'{}\'.'.format(abs_path_filename)) + return + + try: + module = SourceFileLoader(module_name, abs_path_filename).load_module() + except: + log.exception('Exception occurred. Could not load module from file \'{}\'.'.format(abs_path_filename)) + return + + schedule_obj_list = dict(inspect.getmembers(module, (lambda x: type(x) == Schedule))) + + if not schedule_obj_list: # return if no Schedule objects in script + QMessageBox.warning(self, + self.tr('File not found'), + self.tr('Could not find any Schedule object in file \'{}\'.') + .format(os.path.basename(abs_path_filename))) + log.info('Could not find any Schedule object in file \'{}\'.' + .format(os.path.basename(abs_path_filename))) + return + + ret_tuple = QInputDialog.getItem(self, + self.tr('Load object'), + self.tr('Found the following Schedule object(s) in file.)\n\n' + 'Select an object to proceed:'), + schedule_obj_list.keys(),0,False) + + if not ret_tuple[1]: # User canceled the operation + log.debug('Load schedule operation: user canceled') + return + + #TODO: Unique hash keys + #TODO: self.open(schedule_obj_list[ret_tuple[0]) + self._schedules[ret_tuple[0]] = schedule_obj_list[ret_tuple[0]] + pprint(self._schedules) + + #@Slot() + def open(self, schedule: Schedule) -> None: """This method loads an SFG and create a base schedule in gui.""" #TODO: all self.printButtonPressed('load_sfg()') @@ -199,6 +264,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ret = box.exec_() if ret == QMessageBox.StandardButton.Yes: + log.info('Exit: {}'.format(os.path.basename(__file__))) event.accept() else: event.ignore() diff --git a/b_asic/scheduler-gui/main_window.ui b/b_asic/scheduler-gui/main_window.ui index e39cfe4b83c689d504f5a455124772fd0a05f82e..1a32c4e8ffa39a255e17b27de0e2854a525f1016 100644 --- a/b_asic/scheduler-gui/main_window.ui +++ b/b_asic/scheduler-gui/main_window.ui @@ -86,7 +86,7 @@ <property name="title"> <string>&File</string> </property> - <addaction name="menu_load_sfg"/> + <addaction name="menu_load_from_file"/> <addaction name="menu_save_schedule"/> <addaction name="separator"/> <addaction name="menu_quit"/> @@ -160,13 +160,13 @@ <attribute name="toolBarBreak"> <bool>false</bool> </attribute> - <addaction name="menu_load_sfg"/> + <addaction name="menu_load_from_file"/> <addaction name="menu_save_schedule"/> <addaction name="menu_node_info"/> </widget> - <action name="menu_load_sfg"> + <action name="menu_load_from_file"> <property name="text"> - <string>&Load SFG...</string> + <string>&Load schedule from file...</string> </property> <property name="toolTip"> <string>Load Signal Flow Graph</string>