[new class] add communicator class for app-wide singaling

This commit is contained in:
Jan Grewe 2020-12-27 14:11:43 +01:00
parent a55a34f9f0
commit c44d958097
2 changed files with 48 additions and 25 deletions

6
communicator.py Normal file
View File

@ -0,0 +1,6 @@
from PyQt5.QtCore import QObject, pyqtSignal
class Communicate(QObject):
open_recent = pyqtSignal(str)
communicator = Communicate()

View File

@ -1,13 +1,14 @@
import sys import sys
import os import os
from typing import Hashable 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.QtWidgets import QFileDialog, QFrame, QLabel, QListWidget, QListWidgetItem, QMainWindow, QMenuBar, QStackedLayout, QToolBar, QAction, QStatusBar, QVBoxLayout, QWidget, QGridLayout, QSpacerItem, QSizePolicy
from PyQt5.QtGui import QIcon, QPixmap, QKeySequence from PyQt5.QtGui import QIcon, QPixmap, QKeySequence
from PyQt5.QtCore import Qt, QSize, QSettings from PyQt5.QtCore import Qt, QSize, QSettings
from numpy import unique from numpy import unique
from file_handler import FileHandler from file_handler import FileHandler
import constants as cnst import constants as cnst
import communicator as comm
class NixView(QMainWindow): class NixView(QMainWindow):
@ -24,8 +25,13 @@ class NixView(QMainWindow):
self._cw = CentralWidget(self) self._cw = CentralWidget(self)
self.setCentralWidget(self._cw) self.setCentralWidget(self._cw)
comm.communicator.open_recent.connect(self.on_open_recent)
self.show() self.show()
def on_open_recent(self, event):
self.open_file(event)
def create_actions(self): def create_actions(self):
self._file_open_action = QAction(QIcon("./icons/nix_open.png"), "Open", self) self._file_open_action = QAction(QIcon("./icons/nix_open.png"), "Open", self)
self._file_open_action.setStatusTip("Open nix file") self._file_open_action.setStatusTip("Open nix file")
@ -74,20 +80,23 @@ class NixView(QMainWindow):
new_filenames = list(unique(new_filenames)) new_filenames = list(unique(new_filenames))
settings.setValue(cnst.settings_recent_files_key, new_filenames) settings.setValue(cnst.settings_recent_files_key, new_filenames)
del settings del settings
def open_file(self, filename):
success, msg = self._file_handler.open(filename)
self.statusBar().showMessage(msg, 5000)
if success:
self._file_close_action.setEnabled(success)
self._cw.show_file_content()
self._update_recent_files(filename)
def on_file_open(self, s): def on_file_open(self, s):
dlg = QFileDialog(self, 'Open nix data file', '', "NIX files (*.h5 *.nix)") dlg = QFileDialog(self, 'Open nix data file', '', "NIX files (*.h5 *.nix)")
dlg.setFileMode(QFileDialog.ExistingFile) dlg.setFileMode(QFileDialog.ExistingFile)
filenames = None filenames = None
if dlg.exec_(): if dlg.exec_():
filenames = dlg.selectedFiles() filenames = dlg.selectedFiles()
success, msg = self._file_handler.open(filenames[0]) self.open_file(filenames[0])
self.statusBar().showMessage(msg, 5000)
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): def on_file_close(self, s):
self._file_handler.close() self._file_handler.close()
self._cw.reset() self._cw.reset()
@ -104,10 +113,10 @@ class CentralWidget(QWidget):
def __init__(self, parent=None) -> None: def __init__(self, parent=None) -> None:
super().__init__(parent=parent) super().__init__(parent=parent)
splash = SplashScreen() self._splash = SplashScreen()
self._file_view = FileView(self) self._file_view = FileView(self)
self._stack = QStackedLayout(self) self._stack = QStackedLayout(self)
self._stack.addWidget(splash) self._stack.addWidget(self._splash)
self._stack.addWidget(self._file_view) self._stack.addWidget(self._file_view)
self.setLayout(self._stack) self.setLayout(self._stack)
self.setStyleSheet("background-color: white;") self.setStyleSheet("background-color: white;")
@ -117,6 +126,7 @@ class CentralWidget(QWidget):
def reset(self): def reset(self):
self._file_view.reset() self._file_view.reset()
self._splash.reset()
self._stack.setCurrentIndex(0) self._stack.setCurrentIndex(0)
@ -158,31 +168,38 @@ class SplashScreen(QWidget):
self._file_list = QListWidget(self) self._file_list = QListWidget(self)
self._file_list.itemClicked.connect(self._on_file_clicked) self._file_list.itemClicked.connect(self._on_file_clicked)
self._file_list.itemDoubleClicked.connect(self._on_file_clicked)
l.addWidget(self._file_list) l.addWidget(self._file_list)
frame.setLayout(l) frame.setLayout(l)
layout.addWidget(frame, 3, 1) layout.addWidget(frame, 3, 1)
self._file_map = {} self._file_map = {}
self._read_recent_files() self._read_recent_files()
def _create_short_filename(original, max_len=40): def _create_short_filename(self, original, index, max_len=40):
short = original short = original
parts = original.split(os.sep) parts = original.split(os.sep)
print(parts) post = parts[-1]
if len(post) > max_len - 4:
post = post[:max_len - 4]
short = str("%i: " % index) + "... " + post
else:
short = str("%i: " % index) + " ... ".join([original[:max_len - len(post) - 4], post])
return short return short
def _read_recent_files(self): def _read_recent_files(self):
settings = QSettings(cnst.organization, cnst.application) settings = QSettings(cnst.organization, cnst.application)
filenames = settings.value(cnst.settings_recent_files_key, []) filenames = settings.value(cnst.settings_recent_files_key, [])
del settings del settings
for f in filenames: for i, f in enumerate(filenames):
shortname = _create_short_filename(f, max_len=40) shortname = self._create_short_filename(f, i + 1, max_len=38)
self._file_map[f] =shortname self._file_map[shortname] = f
self._file_list.addItem(self._file_map[f]) item = QListWidgetItem(shortname)
item.setToolTip(f)
self._file_list.addItem(item)
def _on_file_clicked(self, s):
print(s) def reset(self):
self._file_list.clear()
self._read_recent_files()
def _on_file_clicked(self, item):
comm.communicator.open_recent.emit(self._file_map[item.text()])