Skip to content
Snippets Groups Projects
Commit 0ae3c517 authored by Andreas Bolin's avatar Andreas Bolin
Browse files

use QSettings api

parent 0ccb061b
No related branches found
No related tags found
1 merge request!78Add scheduler GUI
Pipeline #72768 passed
...@@ -19,14 +19,16 @@ from pprint import pprint ...@@ -19,14 +19,16 @@ from pprint import pprint
#from diagram import * #from diagram import *
from importlib.machinery import SourceFileLoader from importlib.machinery import SourceFileLoader
import inspect import inspect
from numpy import uint
# Qt/qtpy # Qt/qtpy
import qtpy import qtpy
from qtpy import uic, QtCore, QtGui, QtWidgets from qtpy import uic, QtCore, QtGui, QtWidgets
from qtpy.QtCore import Qt, Slot, QSettings, QStandardPaths from qtpy.QtCore import QCoreApplication, Qt, Slot, QSettings, QStandardPaths
#QtCore QSize, QPoint
from qtpy.QtGui import QCloseEvent from qtpy.QtGui import QCloseEvent
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
QApplication, QMainWindow, QMessageBox, QFileDialog, QInputDialog) QApplication, QMainWindow, QMessageBox, QFileDialog, QInputDialog, QCheckBox)
# QGraphics and QPainter imports # QGraphics and QPainter imports
from qtpy.QtWidgets import ( from qtpy.QtWidgets import (
...@@ -41,7 +43,6 @@ from qtpy.QtCore import ( ...@@ -41,7 +43,6 @@ from qtpy.QtCore import (
# B-ASIC # B-ASIC
import logger import logger
#import b_asic.schedule
from b_asic.schedule import Schedule from b_asic.schedule import Schedule
...@@ -94,24 +95,29 @@ if __debug__: ...@@ -94,24 +95,29 @@ if __debug__:
os._exit(1) os._exit(1)
from ui_main_window import Ui_MainWindow # Only availible when the form is compiled from ui_main_window import Ui_MainWindow # Only availible when the form (.ui) is compiled
# The folowing QCoreApplication values is used for QSettings among others
QCoreApplication.setOrganizationName('Linöping University')
QCoreApplication.setOrganizationDomain('liu.se')
QCoreApplication.setApplicationName('B-ASIC Scheduler')
#QCoreApplication.setApplicationVersion(__version__) # TODO: read from packet __version__
class MainWindow(QMainWindow, Ui_MainWindow): class MainWindow(QMainWindow, Ui_MainWindow):
"""Schedule of an SFG with scheduled Operations.""" """Schedule of an SFG with scheduled Operations."""
_settings: QSettings
_schedules: dict _schedules: dict
def __init__(self): def __init__(self):
"""Initialize Schedule-gui.""" """Initialize Schedule-gui."""
super(MainWindow, self).__init__() super(MainWindow, self).__init__()
self._settings = QSettings()
self._schedules = {} self._schedules = {}
self._init_ui() self._init_ui()
self._init_graphics_view() self._init_graphics_view()
self._read_settings()
...@@ -129,7 +135,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -129,7 +135,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Setup event member functions # Setup event member functions
self.closeEvent = self._close_event self.closeEvent = self._close_event
# Init info sidebar # Init info sidebar
for i in range(10): 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 very very very very long string that says abolutly nothing' + str(i))
...@@ -156,9 +162,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -156,9 +162,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
############### ###############
@Slot() @Slot()
def callback_pushButton(self) -> None: def callback_pushButton(self) -> None:
#diagram = Diagram() self.printButtonPressed('callback_pushButton()')
pass
@Slot() @Slot()
def _load_schedule_from_pyfile(self) -> None: def _load_schedule_from_pyfile(self) -> None:
...@@ -210,7 +214,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -210,7 +214,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
#@Slot() #@Slot()
def open(self, schedule: Schedule) -> None: def open(self, schedule: Schedule) -> None:
"""This method loads an SFG and create a base schedule in gui.""" """Takes in an Schedule and place it in the schedule list."""
#TODO: all #TODO: all
self.printButtonPressed('load_sfg()') self.printButtonPressed('load_sfg()')
self.update_statusbar(self.tr('SFG loaded successfully')) self.update_statusbar(self.tr('SFG loaded successfully'))
...@@ -225,20 +229,24 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -225,20 +229,24 @@ class MainWindow(QMainWindow, Ui_MainWindow):
@Slot(bool) @Slot(bool)
def toggle_component_info(self, checked: bool) -> None: def toggle_component_info(self, checked: bool) -> None:
"""This method toggles the right hand side info window.""" """This method toggles the right hand side info window."""
widths = list(self.splitter_center.sizes()) # Note: splitter handler index 0 is a hidden splitter handle far most left, use index 1
max_range = widths[0] + widths[1] settings = QSettings()
range = self.splitter_center.getRange(1) # tuple(min, max)
if checked: if checked:
self.splitter_center.restoreState(self._settings.value("splitterSizes")); self.splitter_center.restoreState(settings.value("mainwindow/splitter_center/last_state"))
# self.splitter_center.restoreState(settings.value("splitterSizes"))
else: else:
self._settings.setValue("splitterSizes", self.splitter_center.saveState()); settings.setValue("mainwindow/splitter_center/last_state", self.splitter_center.saveState())
self.splitter_center.moveSplitter(max_range, 1) # Note: splitter index starts at 1 self.splitter_center.moveSplitter(range[1], 1)
@Slot(int, int) @Slot(int, int)
def _splitter_center_moved(self, pos: int, index: int) -> None: def _splitter_center_moved(self, pos: int, index: int) -> None:
"""Callback method used to check if the right widget (info window) """Callback method used to check if the right widget (info window)
has collapsed. Update the checkbutton accordingly.""" has collapsed. Update the checkbutton accordingly."""
# TODO: Custom move handler, save state on click-release?
widths: list[int, int] = list(self.splitter_center.sizes()) widths: list[int, int] = list(self.splitter_center.sizes())
#TODO: Custom move handler, save state on click-release?
if widths[1] == 0: if widths[1] == 0:
self.menu_node_info.setChecked(False) self.menu_node_info.setChecked(False)
else: else:
...@@ -250,20 +258,29 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -250,20 +258,29 @@ class MainWindow(QMainWindow, Ui_MainWindow):
#### Events #### #### Events ####
################ ################
def _close_event(self, event: QCloseEvent) -> None: def _close_event(self, event: QCloseEvent) -> None:
"""Replace QMainWindow default closeEvent(QCloseEvent) event""" """Replaces QMainWindow default closeEvent(QCloseEvent) event"""
s = QSettings()
box = QMessageBox(self) hide_dialog = s.value('mainwindow/hide_exit_dialog', False, bool)
box.setWindowTitle(self.tr('Confirm Exit')) ret = QMessageBox.StandardButton.Yes
box.setText('<h3>' + self.tr('Confirm Exit') + '</h3><p><br>' +
self.tr('Are you sure you want to exit?') + if not hide_dialog:
'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></p>') box = QMessageBox(self)
box.setIcon(QMessageBox.Question) box.setWindowTitle(self.tr('Confirm Exit'))
box.setStandardButtons(QMessageBox.Yes | QMessageBox.No) box.setText('<h3>' + self.tr('Confirm Exit') + '</h3><p><br>' +
box.setButtonText(QMessageBox.Yes, self.tr("&Exit")) self.tr('Are you sure you want to exit?') +
box.setButtonText(QMessageBox.No, self.tr("&Cancel")) '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></p>')
box.setIcon(QMessageBox.Question)
box.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
box.setButtonText(QMessageBox.Yes, self.tr("&Exit"))
box.setButtonText(QMessageBox.No, self.tr("&Cancel"))
checkbox = QCheckBox('Don\'t ask again')
box.setCheckBox(checkbox)
ret = box.exec_()
ret = box.exec_()
if ret == QMessageBox.StandardButton.Yes: if ret == QMessageBox.StandardButton.Yes:
if not hide_dialog:
s.setValue('mainwindow/hide_exit_dialog', checkbox.isChecked())
self._write_settings()
log.info('Exit: {}'.format(os.path.basename(__file__))) log.info('Exit: {}'.format(os.path.basename(__file__)))
event.accept() event.accept()
else: else:
...@@ -285,6 +302,29 @@ class MainWindow(QMainWindow, Ui_MainWindow): ...@@ -285,6 +302,29 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def update_statusbar(self, msg: str) -> None: def update_statusbar(self, msg: str) -> None:
"""Write the given str to the statusbar with temporarily policy.""" """Write the given str to the statusbar with temporarily policy."""
self.statusbar.showMessage(msg) self.statusbar.showMessage(msg)
def _write_settings(self) -> None:
"""Write settings from MainWindow to Settings."""
s = QSettings()
s.setValue('mainwindow/geometry', self.saveGeometry()) # window: pos, size
s.setValue('mainwindow/state', self.saveState()) # toolbars, dockwidgets: pos, size
s.setValue('mainwindow/menu/node_info', self.menu_node_info.isChecked())
s.setValue('mainwindow/splitter/state', self.splitter_center.saveState())
if s.isWritable():
log.debug('Settings written to \'{}\'.'.format(s.fileName()))
else:
log.warning('Settings cant be saved to file, read-only.')
def _read_settings(self) -> None:
"""Read settings from Settings to MainWindow."""
s = QSettings()
self.restoreGeometry( s.value('mainwindow/geometry'))
self.restoreState( s.value('mainwindow/state'))
self.menu_node_info.setChecked( s.value('mainwindow/menu/node_info', True, type=bool))
self.splitter_center.restoreState( s.value('mainwindow/splitter/state'))
log.debug('Settings read from \'{}\'.'.format(s.fileName()))
def start_gui(): def start_gui():
......
...@@ -16,9 +16,6 @@ ...@@ -16,9 +16,6 @@
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="windowTitle">
<string>B-ASIC scheduler</string>
</property>
<property name="windowIcon"> <property name="windowIcon">
<iconset resource="resources.qrc"> <iconset resource="resources.qrc">
<normaloff>:/icons/small_logo.png</normaloff>:/icons/small_logo.png</iconset> <normaloff>:/icons/small_logo.png</normaloff>:/icons/small_logo.png</iconset>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment