[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 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.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.QtCore import Qt, QSize, QSettings
from numpy import unique
from file_handler import FileHandler
import constants as cnst
import communicator as comm
class NixView(QMainWindow):
@ -24,8 +25,13 @@ class NixView(QMainWindow):
self._cw = CentralWidget(self)
self.setCentralWidget(self._cw)
comm.communicator.open_recent.connect(self.on_open_recent)
self.show()
def on_open_recent(self, event):
self.open_file(event)
def create_actions(self):
self._file_open_action = QAction(QIcon("./icons/nix_open.png"), "Open", self)
self._file_open_action.setStatusTip("Open nix file")
@ -74,20 +80,23 @@ class NixView(QMainWindow):
new_filenames = list(unique(new_filenames))
settings.setValue(cnst.settings_recent_files_key, new_filenames)
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):
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(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])
self.open_file(filenames[0])
def on_file_close(self, s):
self._file_handler.close()
self._cw.reset()
@ -104,10 +113,10 @@ class CentralWidget(QWidget):
def __init__(self, parent=None) -> None:
super().__init__(parent=parent)
splash = SplashScreen()
self._splash = SplashScreen()
self._file_view = FileView(self)
self._stack = QStackedLayout(self)
self._stack.addWidget(splash)
self._stack.addWidget(self._splash)
self._stack.addWidget(self._file_view)
self.setLayout(self._stack)
self.setStyleSheet("background-color: white;")
@ -117,6 +126,7 @@ class CentralWidget(QWidget):
def reset(self):
self._file_view.reset()
self._splash.reset()
self._stack.setCurrentIndex(0)
@ -158,31 +168,38 @@ class SplashScreen(QWidget):
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)
self._file_map = {}
self._read_recent_files()
def _create_short_filename(original, max_len=40):
def _create_short_filename(self, original, index, max_len=40):
short = original
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
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)
for i, f in enumerate(filenames):
shortname = self._create_short_filename(f, i + 1, max_len=38)
self._file_map[shortname] = f
item = QListWidgetItem(shortname)
item.setToolTip(f)
self._file_list.addItem(item)
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()])