1
- from PyQt6 .QtCore import QObject
1
+ from PyQt6 .QtCore import QObject , pyqtSignal
2
2
from PyQt6 .QtWidgets import QFileDialog , QMessageBox
3
- from PyQt6 .QtCore import pyqtSignal
3
+ from PyQt6 .QtGui import QAction
4
4
5
+ import os
5
6
import motorlib
6
7
7
- from .fileIO import saveFile , loadFile , fileTypes
8
+ from .fileIO import saveFile , loadFile , fileTypes , getConfigPath
8
9
from .helpers import FLAGS_NO_ICON , excludeKeys
9
10
from .logger import logger
10
11
11
12
class FileManager (QObject ):
12
13
14
+ MAX_RECENT_FILES = 5
15
+
13
16
fileNameChanged = pyqtSignal (str , bool )
14
17
newMotor = pyqtSignal (object )
18
+ # TODO: eventually a signal like this that makes the mainWindow repopulate the propellant editor should
19
+ # be emitted whenever load() is called
20
+ recentFileLoaded = pyqtSignal ()
15
21
16
22
def __init__ (self , app ):
17
23
super ().__init__ ()
@@ -25,6 +31,9 @@ def __init__(self, app):
25
31
26
32
self .newFile ()
27
33
34
+ self .recentlyOpenedFiles = []
35
+ self .recentFilesPath = os .path .join (getConfigPath (), 'recent_files.yaml' )
36
+
28
37
# Check if current motor is unsaved and start over from default motor. Called when the menu item is triggered.
29
38
def newFile (self ):
30
39
if not self .unsavedCheck ():
@@ -67,6 +76,7 @@ def saveAs(self):
67
76
if fileName is not None :
68
77
self .fileName = fileName
69
78
self .save ()
79
+ self .addRecentFile (fileName )
70
80
71
81
# Checks for unsaved changes, asks for a filename, and loads the file
72
82
def load (self , path = None ):
@@ -80,6 +90,7 @@ def load(self, path=None):
80
90
motor = motorlib .motor .Motor ()
81
91
motor .applyDict (res )
82
92
self .startFromMotor (motor , path )
93
+ self .addRecentFile (path )
83
94
return True
84
95
except Exception as exc :
85
96
self .app .outputException (exc , "An error occurred while loading the file: " )
@@ -233,3 +244,44 @@ def checkPropellant(self, motor):
233
244
'New propellant added' )
234
245
235
246
return motor
247
+
248
+ def createRecentlyOpenedMenu (self , recentlyOpenedMenu ):
249
+ self .recentlyOpenedMenu = recentlyOpenedMenu
250
+
251
+ try :
252
+ self .recentFilesList = loadFile (self .recentFilesPath , fileTypes .RECENT_FILES )['recentFilesList' ]
253
+ except FileNotFoundError :
254
+ logger .warn ('Unable to load recent files, creating new file at {}' .format (self .recentFilesPath ))
255
+ self .recentFilesList = []
256
+ saveFile (self .recentFilesPath , {'recentFilesList' : self .recentFilesList }, fileTypes .RECENT_FILES )
257
+
258
+ self .createRecentlyOpenedItems ()
259
+
260
+ def createRecentlyOpenedItems (self ):
261
+ self .recentlyOpenedMenu .clear ()
262
+
263
+ if len (self .recentFilesList ) == 0 :
264
+ self .recentlyOpenedMenu .addAction (QAction ('No Recent Files' , self .recentlyOpenedMenu ))
265
+ return
266
+
267
+ for filepath in self .recentFilesList :
268
+ _ , filename = os .path .split (filepath )
269
+ action = QAction (filename , self .recentlyOpenedMenu )
270
+ action .triggered .connect (lambda _ , path = filepath : self .loadRecentFile (path ))
271
+ self .recentlyOpenedMenu .addAction (action )
272
+
273
+ def loadRecentFile (self , path ):
274
+ self .load (path )
275
+ self .recentFileLoaded .emit ()
276
+
277
+ def addRecentFile (self , filepath ):
278
+ if filepath in self .recentFilesList :
279
+ self .recentFilesList .remove (filepath )
280
+
281
+ self .recentFilesList = [filepath ] + self .recentFilesList
282
+
283
+ self .recentFilesList = self .recentFilesList [:FileManager .MAX_RECENT_FILES ]
284
+
285
+ saveFile (self .recentFilesPath , {'recentFilesList' : self .recentFilesList }, fileTypes .RECENT_FILES )
286
+
287
+ self .createRecentlyOpenedItems ()
0 commit comments