Skip to content
Snippets Groups Projects
Commit e52f9cab authored by Oscar Gustafsson's avatar Oscar Gustafsson :bicyclist:
Browse files

Add recent files for scheduler GUI

parent de43075f
No related branches found
No related tags found
1 merge request!259Add recent files for scheduler GUI
Pipeline #93177 passed
# -*- coding: utf-8 -*-
# Originally generated from QT designer, but now manually maintained
# Form implementation generated from reading ui file 'gui_interface.ui'
#
# Created by: PyQt5 UI code generator 5.14.2
#
# WARNING! All changes made in this file will be lost!
from qtpy import QtCore, QtGui, QtWidgets
from qtpy import QtCore, QtWidgets
class Ui_main_window(object):
......
......@@ -333,8 +333,8 @@ class MainWindow(QMainWindow):
if dequelen > 0:
for i in range(dequelen):
action = self.recentFilesList[i]
action.setText(rfp[i].fileName())
action.setData(rfp[i])
action.setText(rfp[i])
action.setData(QFileInfo(rfp[i]))
action.setVisible(True)
for i in range(dequelen, self.maxFileNr):
......@@ -348,13 +348,12 @@ class MainWindow(QMainWindow):
rfp = settings.value("SFG/recentFiles")
recentFile = QFileInfo(module)
if rfp:
if recentFile not in rfp:
rfp.append(recentFile)
if module not in rfp:
rfp.append(module)
else:
rfp = deque(maxlen=self.maxFileNr)
rfp.append(recentFile)
rfp.append(module)
settings.setValue("SFG/recentFiles", rfp)
......
......@@ -11,6 +11,7 @@ import inspect
import os
import sys
import webbrowser
from collections import deque
from copy import deepcopy
from importlib.machinery import SourceFileLoader
from typing import Optional, Union, cast
......@@ -22,6 +23,7 @@ import qtpy
from qtpy.QtCore import (
QByteArray,
QCoreApplication,
QFileInfo,
QRectF,
QSettings,
QStandardPaths,
......@@ -31,6 +33,7 @@ from qtpy.QtCore import (
from qtpy.QtGui import QCloseEvent
from qtpy.QtWidgets import (
QAbstractButton,
QAction,
QApplication,
QCheckBox,
QFileDialog,
......@@ -85,10 +88,8 @@ if __debug__:
# The following QCoreApplication values is used for QSettings among others
QCoreApplication.setOrganizationName("Linköping University")
QCoreApplication.setOrganizationDomain("liu.se")
QCoreApplication.setApplicationName("B-ASIC Scheduler")
QCoreApplication.setApplicationVersion(
__version__
) # TODO: read from packet __version__
QCoreApplication.setApplicationName("B-ASIC Scheduling GUI")
QCoreApplication.setApplicationVersion(__version__)
class MainWindow(QMainWindow, Ui_MainWindow):
......@@ -129,7 +130,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.menu_node_info.triggered.connect(self.show_info_table)
self.menu_exit_dialog.triggered.connect(self.hide_exit_dialog)
self.actionReorder.triggered.connect(self._actionReorder)
self.actionT.triggered.connect(self._actionTbtn)
self.actionPlot_schedule.triggered.connect(self._actionTbtn)
self.splitter.splitterMoved.connect(self._splitter_moved)
self.actionDocumentation.triggered.connect(self._open_documentation)
self.actionAbout.triggered.connect(self._open_about_window)
......@@ -148,6 +149,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.splitter.setCollapsible(0, False)
self.splitter.setCollapsible(1, True)
# Recent files
self.maxFileNr = 4
self.recentFilesList = []
self.recentFilePaths = deque(maxlen=self.maxFileNr)
self.createActionsAndMenus()
def _init_graphics(self) -> None:
"""Initialize the QGraphics framework"""
self._scene = QGraphicsScene()
......@@ -217,15 +224,19 @@ class MainWindow(QMainWindow, Ui_MainWindow):
QStandardPaths.HomeLocation
)[0]
abs_path_filename, _ = QFileDialog.getOpenFileName(
abs_path_filename, accepted = QFileDialog.getOpenFileName(
self,
self.tr("Open python file"),
last_file,
self.tr("Python Files (*.py *.py3)"),
)
if not abs_path_filename: # return if empty filename (QFileDialog was canceled)
if not abs_path_filename or not accepted:
return
self._load_from_file(abs_path_filename)
def _load_from_file(self, abs_path_filename):
log.debug("abs_path_filename = {}.".format(abs_path_filename))
module_name = inspect.getmodulename(abs_path_filename)
......@@ -242,6 +253,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
)
return
self.addRecentFile(abs_path_filename)
schedule_obj_list = dict(
inspect.getmembers(module, (lambda x: isinstance(x, Schedule)))
)
......@@ -285,6 +298,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.open(schedule)
del module
settings = QSettings()
settings.setValue("scheduler/last_opened_file", abs_path_filename)
@Slot()
......@@ -630,6 +644,55 @@ class MainWindow(QMainWindow, Ui_MainWindow):
else:
log.error("'Operator' not found in info table. It may have been renamed.")
def createActionsAndMenus(self):
for i in range(self.maxFileNr):
recentFileAction = QAction(self.menu_Recent_Schedule)
recentFileAction.setVisible(False)
recentFileAction.triggered.connect(
lambda b=0, x=recentFileAction: self.openRecent(x)
)
self.recentFilesList.append(recentFileAction)
self.menu_Recent_Schedule.addAction(recentFileAction)
self.updateRecentActionList()
def updateRecentActionList(self):
settings = QSettings()
rfp = settings.value("scheduler/recentFiles")
# print(rfp)
if rfp:
dequelen = len(rfp)
if dequelen > 0:
for i in range(dequelen):
action = self.recentFilesList[i]
action.setText(rfp[i])
action.setData(QFileInfo(rfp[i]))
action.setVisible(True)
for i in range(dequelen, self.maxFileNr):
self.recentFilesList[i].setVisible(False)
def openRecent(self, action):
self._load_from_file(action.data().filePath())
def addRecentFile(self, module):
settings = QSettings()
rfp = settings.value("scheduler/recentFiles")
if rfp:
if module not in rfp:
rfp.append(module)
else:
rfp = deque(maxlen=self.maxFileNr)
rfp.append(module)
settings.setValue("scheduler/recentFiles", rfp)
self.updateRecentActionList()
def start_gui() -> None:
app = QApplication(sys.argv)
......
......@@ -209,11 +209,18 @@
<property name="title">
<string>&amp;File</string>
</property>
<widget class="QMenu" name="menu_Recent_Schedule">
<property name="title">
<string>&amp;Recent Schedule</string>
</property>
</widget>
<addaction name="menu_load_from_file"/>
<addaction name="menu_close_schedule"/>
<addaction name="menu_save"/>
<addaction name="menu_save_as"/>
<addaction name="separator"/>
<addaction name="menu_Recent_Schedule"/>
<addaction name="separator"/>
<addaction name="menu_quit"/>
</widget>
<widget class="QMenu" name="menuView">
......@@ -221,6 +228,8 @@
<string>&amp;View</string>
</property>
<addaction name="menu_node_info"/>
<addaction name="separator"/>
<addaction name="actionPlot_schedule"/>
</widget>
<widget class="QMenu" name="menu_Edit">
<property name="title">
......@@ -263,7 +272,6 @@
<addaction name="menu_save_as"/>
<addaction name="separator"/>
<addaction name="menu_node_info"/>
<addaction name="actionT"/>
<addaction name="actionReorder"/>
</widget>
<action name="menu_load_from_file">
......@@ -401,6 +409,11 @@
<string>Reorder schedule based on start time</string>
</property>
</action>
<action name="actionPlot_schedule">
<property name="text">
<string>Plot schedule</string>
</property>
</action>
</widget>
<resources/>
<connections/>
......
......@@ -20,9 +20,7 @@ class Ui_MainWindow(object):
)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(
MainWindow.sizePolicy().hasHeightForWidth()
)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
icon = QtGui.QIcon()
icon.addPixmap(
......@@ -57,21 +55,15 @@ class Ui_MainWindow(object):
self.view.setRenderHints(
QtGui.QPainter.Antialiasing | QtGui.QPainter.TextAntialiasing
)
self.view.setViewportUpdateMode(
QtWidgets.QGraphicsView.FullViewportUpdate
)
self.view.setViewportUpdateMode(QtWidgets.QGraphicsView.FullViewportUpdate)
self.view.setObjectName("view")
self.info_table = QtWidgets.QTableWidget(self.splitter)
self.info_table.setStyleSheet(
"alternate-background-color: #fadefb;background-color: #ebebeb;"
)
self.info_table.setEditTriggers(
QtWidgets.QAbstractItemView.NoEditTriggers
)
self.info_table.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
self.info_table.setAlternatingRowColors(True)
self.info_table.setSelectionBehavior(
QtWidgets.QAbstractItemView.SelectRows
)
self.info_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.info_table.setRowCount(2)
self.info_table.setColumnCount(2)
self.info_table.setObjectName("info_table")
......@@ -139,6 +131,8 @@ class Ui_MainWindow(object):
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
self.menu_Recent_Schedule = QtWidgets.QMenu(self.menuFile)
self.menu_Recent_Schedule.setObjectName("menu_Recent_Schedule")
self.menuView = QtWidgets.QMenu(self.menubar)
self.menuView.setObjectName("menuView")
self.menu_Edit = QtWidgets.QMenu(self.menubar)
......@@ -208,13 +202,19 @@ class Ui_MainWindow(object):
self.actionDocumentation.setObjectName("actionDocumentation")
self.actionReorder = QtWidgets.QAction(MainWindow)
self.actionReorder.setObjectName("actionReorder")
self.actionPlot_schedule = QtWidgets.QAction(MainWindow)
self.actionPlot_schedule.setObjectName("actionPlot_schedule")
self.menuFile.addAction(self.menu_load_from_file)
self.menuFile.addAction(self.menu_close_schedule)
self.menuFile.addAction(self.menu_save)
self.menuFile.addAction(self.menu_save_as)
self.menuFile.addSeparator()
self.menuFile.addAction(self.menu_Recent_Schedule.menuAction())
self.menuFile.addSeparator()
self.menuFile.addAction(self.menu_quit)
self.menuView.addAction(self.menu_node_info)
self.menuView.addSeparator()
self.menuView.addAction(self.actionPlot_schedule)
self.menuWindow.addAction(self.menu_exit_dialog)
self.menuHelp.addAction(self.actionDocumentation)
self.menuHelp.addSeparator()
......@@ -229,7 +229,6 @@ class Ui_MainWindow(object):
self.toolBar.addAction(self.menu_save_as)
self.toolBar.addSeparator()
self.toolBar.addAction(self.menu_node_info)
self.toolBar.addAction(self.actionT)
self.toolBar.addAction(self.actionReorder)
self.retranslateUi(MainWindow)
......@@ -253,6 +252,7 @@ class Ui_MainWindow(object):
item.setText(_translate("MainWindow", "Operator"))
self.info_table.setSortingEnabled(__sortingEnabled)
self.menuFile.setTitle(_translate("MainWindow", "&File"))
self.menu_Recent_Schedule.setTitle(_translate("MainWindow", "&Recent Schedule"))
self.menuView.setTitle(_translate("MainWindow", "&View"))
self.menu_Edit.setTitle(_translate("MainWindow", "&Edit"))
self.menuWindow.setTitle(_translate("MainWindow", "&Window"))
......@@ -264,9 +264,7 @@ class Ui_MainWindow(object):
self.menu_load_from_file.setToolTip(
_translate("MainWindow", "Load schedule from python script")
)
self.menu_load_from_file.setShortcut(
_translate("MainWindow", "Ctrl+O")
)
self.menu_load_from_file.setShortcut(_translate("MainWindow", "Ctrl+O"))
self.menu_save.setText(_translate("MainWindow", "&Save"))
self.menu_save.setToolTip(_translate("MainWindow", "Save schedule"))
self.menu_save.setShortcut(_translate("MainWindow", "Ctrl+S"))
......@@ -278,21 +276,14 @@ class Ui_MainWindow(object):
self.menu_quit.setText(_translate("MainWindow", "&Quit"))
self.menu_quit.setShortcut(_translate("MainWindow", "Ctrl+Q"))
self.menu_save_as.setText(_translate("MainWindow", "Save &As..."))
self.menu_exit_dialog.setText(
_translate("MainWindow", "&Hide exit dialog")
)
self.menu_exit_dialog.setToolTip(
_translate("MainWindow", "Hide exit dialog")
)
self.menu_exit_dialog.setText(_translate("MainWindow", "&Hide exit dialog"))
self.menu_exit_dialog.setToolTip(_translate("MainWindow", "Hide exit dialog"))
self.actionT.setText(_translate("MainWindow", "T"))
self.menu_close_schedule.setText(
_translate("MainWindow", "&Close Schedule")
)
self.menu_close_schedule.setText(_translate("MainWindow", "&Close Schedule"))
self.actionAbout.setText(_translate("MainWindow", "About"))
self.actionDocumentation.setText(
_translate("MainWindow", "Documentation")
)
self.actionDocumentation.setText(_translate("MainWindow", "Documentation"))
self.actionReorder.setText(_translate("MainWindow", "Reorder"))
self.actionReorder.setToolTip(
_translate("MainWindow", "Reorder schedule based on start time")
)
self.actionPlot_schedule.setText(_translate("MainWindow", "Plot schedule"))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment