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 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): def __init__(self, parent=None) -> None: super().__init__(parent=parent) self._file_handler = FileHandler() grid = QGridLayout() grid.addWidget(QLabel("FileView"), 0, 0, 1, 3) self.setLayout(grid) self._view = QTreeView() self._view.setAlternatingRowColors(True) self._view.setUniformRowHeights(True) # Allows for scrolling optimizations. self._view.setWindowTitle("Simple Tree Model") self._view.setIconSize(QSize(20,20)) header = self._view.header() header.setStretchLastSection(False) header.setSectionResizeMode(1, QHeaderView.ResizeToContents) header.setSectionResizeMode(2, QHeaderView.ResizeToContents) header.setSectionResizeMode(0, QHeaderView.Stretch) grid.addWidget(self._view, 1, 0, 3, 3) def update(self): model = TreeModel(self._file_handler) self._view.setModel(model) 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()])