From bb4f17118e20f2002ce135b80411fdda385c3d03 Mon Sep 17 00:00:00 2001 From: Jan Grewe Date: Sun, 27 Dec 2020 14:21:07 +0100 Subject: [PATCH] [refactor] extract central widget to own file --- central_widget.py | 104 ++++++++++++++++++++++++++++++++++++++++++++++ communicator.py | 5 ++- main_window.py | 104 ++-------------------------------------------- 3 files changed, 112 insertions(+), 101 deletions(-) create mode 100644 central_widget.py diff --git a/central_widget.py b/central_widget.py new file mode 100644 index 0000000..91d7931 --- /dev/null +++ b/central_widget.py @@ -0,0 +1,104 @@ +import os +from PyQt5.QtWidgets import QFrame, QLabel, QListWidget, QListWidgetItem, QStackedLayout, QVBoxLayout, QWidget, QGridLayout, QSpacerItem, QSizePolicy +from PyQt5.QtGui import QPixmap +from PyQt5.QtCore import Qt, QSettings + +from file_handler import FileHandler +import communicator as comm +import constants as cnst + +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) + + 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.setLayout(QVBoxLayout()) + self.layout().addWidget(QLabel("FileView")) + self._file_handler = FileHandler() + + 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()]) diff --git a/communicator.py b/communicator.py index 3f563d8..746c90d 100644 --- a/communicator.py +++ b/communicator.py @@ -1,6 +1,9 @@ from PyQt5.QtCore import QObject, pyqtSignal class Communicate(QObject): - open_recent = pyqtSignal(str) + """ + Small class for across app communication. Defines signals, to which other classes can connect. + """ + open_recent = pyqtSignal(str) communicator = Communicate() \ No newline at end of file diff --git a/main_window.py b/main_window.py index 5c04978..cc188f8 100644 --- a/main_window.py +++ b/main_window.py @@ -1,14 +1,13 @@ import sys -import os -from typing import Hashable -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 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): @@ -108,98 +107,3 @@ class NixView(QMainWindow): sys.exit() -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) - - 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.setLayout(QVBoxLayout()) - self.layout().addWidget(QLabel("FileView")) - self._file_handler = FileHandler() - - 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()])