import os from PyQt5.QtWidgets import QFrame, QLabel, QListWidget, QListWidgetItem, QStackedLayout, QVBoxLayout, QWidget, QGridLayout, QSpacerItem, QSizePolicy, QTreeView, QHeaderView from PyQt5.QtGui import QPixmap from PyQt5.QtCore import Qt, QSettings, QSize from file_handler import FileHandler import communicator as comm import constants as cnst from tree_model import TreeModel, TreeType class CentralWidget(QWidget): def __init__(self, parent=None) -> None: super().__init__(parent=parent) self._splash = SplashScreen() self._file_view = FileView(self) self._stack = QStackedLayout(self) self._stack.addWidget(self._splash) self._stack.addWidget(self._file_view) self.setLayout(self._stack) self.setStyleSheet("background-color: white;") def show_file_content(self): self._stack.setCurrentIndex(1) self._file_view.update() def reset(self): self._file_view.reset() self._splash.reset() self._stack.setCurrentIndex(0) class FileView(QWidget): icon_size = QSize(30, 30) def __init__(self, parent=None) -> None: super().__init__(parent=parent) self._file_handler = FileHandler() vbox = QVBoxLayout() self.setLayout(vbox) splitter = QSplitter(Qt.Vertical) self._mdata_tree = QTreeView(self) self._mdata_tree.expanded.connect(self.metadataTreeResize) self._mdata_tree.collapsed.connect(self.metadataTreeResize) self._mdata_tree.setAlternatingRowColors(True) self._mdata_tree.setUniformRowHeights(True) # Allows for scrolling optimizations. self._mdata_tree.setWindowTitle("Metadata Tree") self._mdata_tree.setIconSize(self.icon_size) mheader = self._mdata_tree.header() mheader.setStretchLastSection(False) mheader.setSectionResizeMode(1, QHeaderView.ResizeToContents) mheader.setSectionResizeMode(2, QHeaderView.ResizeToContents) mheader.setSectionResizeMode(0, QHeaderView.Stretch) mdata_group = QGroupBox("Metadata") mdata_group.setLayout(QVBoxLayout()) mdata_group.layout().addWidget(self._mdata_tree) self._data_tree = QTreeView(self) self._data_tree.expanded.connect(self.dataTreeResize) self._data_tree.collapsed.connect(self.dataTreeResize) self._data_tree.setAlternatingRowColors(True) self._data_tree.setUniformRowHeights(True) # Allows for scrolling optimizations. self._data_tree.setWindowTitle("Data Tree") self._data_tree.setIconSize(self.icon_size) self._data_tree.setSelectionBehavior(QAbstractItemView.SelectItems) self._data_tree.setSelectionMode(QAbstractItemView.SingleSelection) header = self._data_tree.header() header.setStretchLastSection(False) header.setSectionResizeMode(1, QHeaderView.ResizeToContents) header.setSectionResizeMode(2, QHeaderView.ResizeToContents) header.setSectionResizeMode(0, QHeaderView.Stretch) data_group = QGroupBox("Data") data_vbox = QVBoxLayout() data_vbox.addWidget(self._data_tree) data_group.setLayout(data_vbox) splitter.insertWidget(0, mdata_group) splitter.insertWidget(1, data_group) vbox.addWidget(splitter) def metadataTreeResize(self, index): self._mdata_tree.resizeColumnToContents(index.column()) def dataTreeResize(self, index): self._data_tree.resizeColumnToContents(index.column()) def update(self): data_model = TreeModel(self._file_handler, TreeType.Data) metadata_model = TreeModel(self._file_handler, TreeType.Metadata) self._data_tree.setModel(data_model) self._mdata_tree.setModel(metadata_model) self._data_tree.resizeColumnToContents(0) self._mdata_tree.resizeColumnToContents(0) def reset(self): print("FileView ", self._file_handler.is_valid) pass class SplashScreen(QWidget): def __init__(self, parent=None) -> None: super().__init__(parent=parent) layout = QGridLayout() self.setLayout(layout) self.setStyleSheet("background-color: white;") label = QLabel() label.setPixmap(QPixmap("./icons/nixview256.png")) label.setAlignment(Qt.AlignCenter) layout.addWidget(label, 1, 1) verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) verticalSpacer2 = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) hSpacer = QSpacerItem(400, 20, QSizePolicy.Maximum, QSizePolicy.Expanding) hSpacer2 = QSpacerItem(400, 20, QSizePolicy.Maximum, QSizePolicy.Expanding) layout.addItem(verticalSpacer, 0, 1) layout.addItem(verticalSpacer2, 2, 1) layout.addItem(hSpacer, 1, 0) layout.addItem(hSpacer2, 1, 2) frame = QFrame() l = QVBoxLayout() l.addWidget(QLabel("Recently opened files:")) self._file_list = QListWidget(self) self._file_list.itemClicked.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(self, original, index, max_len=40): short = original parts = original.split(os.sep) 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 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()])