nixview-python/main_window.py

110 lines
4.0 KiB
Python

import sys
from PyQt5.QtWidgets import QFileDialog, QMainWindow, QMenuBar, QToolBar, QAction, QStatusBar
from PyQt5.QtGui import QIcon, QKeySequence
from PyQt5.QtCore import QSize, QSettings
from numpy import unique
from file_handler import FileHandler
import constants as cnst
import communicator as comm
from central_widget import CentralWidget
class NixView(QMainWindow):
def __init__(self, *args, **kwargs):
super(NixView, self).__init__(*args, **kwargs)
self.setWindowTitle("NixView")
self.setWindowIcon(QIcon('./icons/nixview.icns'))
self._file_handler = FileHandler()
self.setStatusBar(QStatusBar(self))
self.setMenuBar(QMenuBar(self))
self.create_actions()
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")
self._file_open_action.setShortcut(QKeySequence("Ctrl+o"))
self._file_open_action.triggered.connect(self.on_file_open)
self._file_close_action = QAction(QIcon("./icons/nix_close.png"), "Close", self)
self._file_close_action.setStatusTip("Close current nix file")
self._file_close_action.setShortcut(QKeySequence("Ctrl+w"))
self._file_close_action.setEnabled(False)
self._file_close_action.triggered.connect(self.on_file_close)
self._quit_action = QAction(QIcon("./icons/quit.png"), "Quit", self)
self._quit_action.setStatusTip("Close current file and quit")
self._quit_action.triggered.connect(self.on_quit)
self.create_toolbar()
self.create_menu()
def create_toolbar(self):
self._toolbar = QToolBar("My main toolbar")
self._toolbar.setIconSize(QSize(32, 32))
self._toolbar.addAction(self._file_open_action)
self._toolbar.addAction(self._file_close_action)
self._toolbar.addAction(self._quit_action)
self.addToolBar(self._toolbar)
def create_menu(self):
menu = self.menuBar()
file_menu = menu.addMenu("&File")
file_menu.addAction(self._file_open_action)
file_menu.addAction(self._file_close_action)
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 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()
self.open_file(filenames[0])
def on_file_close(self, s):
self._file_handler.close()
self._cw.reset()
self._file_close_action.setEnabled(False)
self.statusBar().showMessage("Successfully closed current file", 1000)
def on_quit(self, s):
self._file_handler.close()
sys.exit()