diff --git a/constants.py b/constants.py new file mode 100644 index 0000000..4ec9052 --- /dev/null +++ b/constants.py @@ -0,0 +1,7 @@ +organization = "nixio" +application = "nixview" +version = 0.1 + +settings_recent_files_key = "/".join([organization, application, "recent_files"]) +settings_recent_file_max_count_key = "/".join([organization, application, "recent_files_max_count"]) +settings_recent_file_max_count = 10 \ No newline at end of file diff --git a/file_handler.py b/file_handler.py index 64b0c23..b251ed2 100644 --- a/file_handler.py +++ b/file_handler.py @@ -12,7 +12,6 @@ class Singleton(type): class FileHandler(metaclass=Singleton): def __init__(self) -> None: - print("Handler Init") super().__init__() self._nix_file = None self._file_requests = [] diff --git a/main_window.py b/main_window.py index e7feeee..ebe6f58 100644 --- a/main_window.py +++ b/main_window.py @@ -1,15 +1,19 @@ import sys +import os from typing import Hashable from PyQt5.QtWidgets import QFileDialog, QFrame, QLabel, QListWidget, QMainWindow, QMenuBar, QStackedLayout, QToolBar, QAction, QStatusBar, QVBoxLayout, QWidget, QGridLayout, QSpacerItem, QSizePolicy from PyQt5.QtGui import QIcon, QPixmap, QKeySequence from PyQt5.QtCore import Qt, QSize, QSettings +from numpy import unique from file_handler import FileHandler +import constants as cnst class NixView(QMainWindow): def __init__(self, *args, **kwargs): super(NixView, self).__init__(*args, **kwargs) + self.setWindowTitle("NixView") self.setWindowIcon(QIcon('./icons/nixview.icns')) @@ -58,16 +62,31 @@ class NixView(QMainWindow): file_menu.addAction(self._quit_action) self.setMenuBar(menu) + def _update_recent_files(self, filename): + settings = QSettings(cnst.organization, cnst.application) + recent_file_max_count = settings.value(cnst.settings_recent_file_max_count_key, 10, type=int) + filenames = settings.value(cnst.settings_recent_files_key, []) + new_filenames = [filename] + if len(filenames) < recent_file_max_count: + new_filenames.extend(filenames) + else: + new_filenames.extend(filenames[:-1]) + new_filenames = list(unique(new_filenames)) + settings.setValue(cnst.settings_recent_files_key, new_filenames) + del settings + def on_file_open(self, s): dlg = QFileDialog(self, 'Open nix data file', '', "NIX files (*.h5 *.nix)") dlg.setFileMode(QFileDialog.ExistingFile) filenames = None if dlg.exec_(): filenames = dlg.selectedFiles() - success, msg = self._file_handler.open("nix_test.h5") + success, msg = self._file_handler.open(filenames[0]) self.statusBar().showMessage(msg, 5000) - self._file_close_action.setEnabled(success) - self._cw.show_file_content() + if success: + self._file_close_action.setEnabled(success) + self._cw.show_file_content() + self._update_recent_files(filenames[0]) def on_file_close(self, s): self._file_handler.close() @@ -136,7 +155,34 @@ class SplashScreen(QWidget): frame = QFrame() l = QVBoxLayout() l.addWidget(QLabel("Recently opened files:")) - l.addWidget(QListWidget()) + + self._file_list = QListWidget(self) + self._file_list.itemClicked.connect(self._on_file_clicked) + self._file_list.itemDoubleClicked.connect(self._on_file_clicked) + l.addWidget(self._file_list) frame.setLayout(l) layout.addWidget(frame, 3, 1) - \ No newline at end of file + self._file_map = {} + self._read_recent_files() + + def _create_short_filename(original, max_len=40): + short = original + parts = original.split(os.sep) + print(parts) + return short + + def _read_recent_files(self): + settings = QSettings(cnst.organization, cnst.application) + filenames = settings.value(cnst.settings_recent_files_key, []) + del settings + + for f in filenames: + shortname = _create_short_filename(f, max_len=40) + self._file_map[f] =shortname + self._file_list.addItem(self._file_map[f]) + + + def _on_file_clicked(self, s): + print(s) + + \ No newline at end of file