Skip to content

Commit b2e0f5f

Browse files
Enable Recent Files (#62)
1 parent 7ce36b6 commit b2e0f5f

4 files changed

Lines changed: 65 additions & 4 deletions

File tree

src/petab_gui/controllers/mother_controller.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
ConditionController, ParameterController
2020
from .logger_controller import LoggerController
2121
from ..views import TaskBar
22-
from .utils import prompt_overwrite_or_append
22+
from .utils import prompt_overwrite_or_append, RecentFilesManager
2323
from functools import partial
2424

2525

@@ -83,6 +83,8 @@ def __init__(self, view, model: PEtabModel):
8383
self.condition_controller,
8484
self.sbml_controller
8585
]
86+
# Recent Files
87+
self.recent_files_manager = RecentFilesManager(max_files=10)
8688
# Checkbox states for Find + Replace
8789
self.petab_checkbox_states = {
8890
"measurement": False,
@@ -180,6 +182,10 @@ def setup_connections(self):
180182
self.view.plot_dock.visibilityChanged.connect(
181183
lambda visible: self.actions["show_plot"].setChecked(visible)
182184
)
185+
# Recent Files
186+
self.recent_files_manager.open_file.connect(
187+
partial(self.open_file, mode="overwrite")
188+
)
183189

184190
def setup_actions(self):
185191
"""Setup actions for the main controller."""
@@ -265,6 +271,8 @@ def setup_actions(self):
265271
actions["reset_model"].triggered.connect(
266272
self.sbml_controller.reset_to_original_model
267273
)
274+
# Recent Files
275+
actions["recent_files"] = self.recent_files_manager.tool_bar_menu
268276

269277
# Filter widget
270278
filter_widget = QWidget()
@@ -470,6 +478,7 @@ def open_file(self, file_path=None, mode=None):
470478
mode = prompt_overwrite_or_append(self)
471479
if mode is None:
472480
return
481+
self.recent_files_manager.add_file(file_path)
473482
self._open_file(actionable, file_path, sep, mode)
474483

475484
def _open_file(self, actionable, file_path, sep, mode):

src/petab_gui/controllers/utils.py

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
from PySide6.QtWidgets import QMessageBox
1+
from PySide6.QtWidgets import QMessageBox, QMenu
2+
from PySide6.QtCore import QObject, Signal, QSettings
3+
from PySide6.QtGui import QAction
24

35

46
def prompt_overwrite_or_append(controller):
@@ -17,4 +19,52 @@ def prompt_overwrite_or_append(controller):
1719
elif msg_box.clickedButton() == overwrite_button:
1820
return "overwrite"
1921
elif msg_box.clickedButton() == append_button:
20-
return "append"
22+
return "append"
23+
24+
25+
class RecentFilesManager(QObject):
26+
"""Manage a list of recent files."""
27+
open_file = Signal(str) # Signal to open a file
28+
29+
def __init__(self, max_files=10):
30+
super().__init__()
31+
self.max_files = max_files
32+
# TODO: link together with other settings, i.e. move settings to mc
33+
self.settings = QSettings("PEtab_GUI", "PEtab_GUI")
34+
self.recent_files = self.load_recent_files()
35+
self.tool_bar_menu = QMenu("Recent Files")
36+
self.update_tool_bar_menu()
37+
38+
def add_file(self, file_path):
39+
"""Add a file to the recent files list."""
40+
if file_path in self.recent_files:
41+
self.recent_files.remove(file_path)
42+
self.recent_files.insert(0, file_path)
43+
self.recent_files = self.recent_files[:self.max_files]
44+
self.save_recent_files()
45+
self.update_tool_bar_menu()
46+
47+
def load_recent_files(self):
48+
"""Load recent files from settings."""
49+
return self.settings.value("recent_files", [])
50+
51+
def save_recent_files(self):
52+
"""Save recent files to settings."""
53+
self.settings.setValue("recent_files", self.recent_files)
54+
55+
def update_tool_bar_menu(self):
56+
"""Create a menu for the tool bar."""
57+
self.tool_bar_menu.clear()
58+
for idx, file_path in enumerate(self.recent_files):
59+
action = QAction(file_path, self.tool_bar_menu)
60+
action.triggered.connect(lambda: self.open_file.emit(file_path))
61+
self.tool_bar_menu.addAction(action)
62+
self.tool_bar_menu.addSeparator()
63+
clear_action = QAction("Clear Recent Files", self.tool_bar_menu)
64+
clear_action.triggered.connect(self.clear_recent_files)
65+
66+
def clear_recent_files(self):
67+
"""Clear the recent files list."""
68+
self.recent_files = []
69+
self.save_recent_files()
70+
self.update_tool_bar_menu()

src/petab_gui/utils.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from .C import ROW, COLUMN, INDEX
1111
import antimony
1212
import os
13-
import numpy as np
1413
import math
1514

1615

@@ -24,6 +23,7 @@ def _checkAntimonyReturnCode(code):
2423
if code < 0:
2524
raise Exception('Antimony: {}'.format(antimony.getLastError()))
2625

26+
2727
def sbmlToAntimony(sbml):
2828
""" Convert SBML to antimony string.
2929
@@ -46,6 +46,7 @@ def sbmlToAntimony(sbml):
4646
_checkAntimonyReturnCode(code)
4747
return antimony.getAntimonyString(None)
4848

49+
4950
def antimonyToSBML(ant):
5051
""" Convert Antimony to SBML string.
5152

src/petab_gui/views/task_bar.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ def __init__(self, parent, actions):
4949
self.menu.addAction(actions["open"])
5050
self.menu.addAction(actions["add"])
5151
self.menu.addAction(actions["save"])
52+
self.menu.addMenu(actions["recent_files"])
5253
self.menu.addSeparator()
5354
self.menu.addAction(actions["close"])
5455

0 commit comments

Comments
 (0)