[new class] add communicator class for app-wide singaling
This commit is contained in:
parent
a55a34f9f0
commit
c44d958097
6
communicator.py
Normal file
6
communicator.py
Normal file
@ -0,0 +1,6 @@
|
||||
from PyQt5.QtCore import QObject, pyqtSignal
|
||||
|
||||
class Communicate(QObject):
|
||||
open_recent = pyqtSignal(str)
|
||||
|
||||
communicator = Communicate()
|
@ -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()])
|
||||
|
Loading…
Reference in New Issue
Block a user