From a55a34f9f0d6218940b2bf1b3b970d2836380ee1 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Sun, 27 Dec 2020 12:52:14 +0100 Subject: [PATCH] [main] store recent files in settings, add constants.py for global constants --- constants.py | 7 +++++++ file_handler.py | 1 - main_window.py | 56 ++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 constants.py 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