from datetime import datetime as dt from typing import Optional from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap from utils.base.base import BaseMainWindow, BaseController from gui.settings_window import SystemSettings, OperatorSettings from gui.reportGui import ReportSettings class MainWindow(BaseMainWindow): def __init__(self, controller: Optional[BaseController] = None) -> None: super().__init__() self._controller = controller self._init_startUI() def _init_startUI(self) -> None: self.operSettings = OperatorSettings("params/operator_params.json", 'Operator', self._transfer_settings) self.sysSettings = SystemSettings("params/system_params.json", 'System', self._transfer_settings) self.repSettings = ReportSettings() self.tabWidget = QtWidgets.QTabWidget() self._clear() seeking_mode_btn = QtWidgets.QPushButton("Real time folder scanning") seeking_mode_btn.setFixedWidth(300) seeking_mode_btn.clicked.connect(self._init_seekingUI) raport_mode_btn = QtWidgets.QPushButton("Raport editor") raport_mode_btn.setFixedWidth(300) raport_mode_btn.clicked.connect(self._init_raportUI) button_layout = QtWidgets.QHBoxLayout() button_layout.setSpacing(2) button_layout.addWidget(seeking_mode_btn) button_layout.addWidget(raport_mode_btn) button_widget = QtWidgets.QWidget() button_widget.setLayout(button_layout) mainLayout = self.layout() label = QtWidgets.QLabel("Select work mode") label.setStyleSheet( """QLabel{ color: #ffffff; font-size: 40px; font-weight: bold; font-family: "Segoe UI", sans-serif; }""" ) mainLayout.addWidget(label, alignment=Qt.AlignCenter) mainLayout.addWidget(button_widget) def _clear(self) -> None: main = self.layout() if self.layout() is not None: while main.count(): child = main.takeAt(0) if child.widget() is not None: child.widget().deleteLater() else: self.setLayout(QtWidgets.QVBoxLayout()) def _init_seekingUI(self) -> None: self._clear() self._transfer_settings() self.tabWidget = QtWidgets.QTabWidget() self.tabWidget.setTabsClosable(True) self.tabWidget.tabCloseRequested.connect(self._close_tab) sys_settings_btn = QtWidgets.QPushButton("System settings") sys_settings_btn.setFixedWidth(200) sys_settings_btn.clicked.connect(lambda: self.sysSettings.show()) oper_settings_btn = QtWidgets.QPushButton("Operator settings") oper_settings_btn.setFixedWidth(200) oper_settings_btn.clicked.connect(lambda: self.operSettings.show()) button_layout = QtWidgets.QHBoxLayout() button_layout.setSpacing(2) button_layout.addWidget(sys_settings_btn) button_layout.addWidget(oper_settings_btn) button_widget = QtWidgets.QWidget() button_widget.setLayout(button_layout) title = QtWidgets.QLabel("online mode") mainLayout = self.layout() mainLayout.addWidget(self.tabWidget) mainLayout.addWidget(button_widget) mainLayout.addWidget(title, alignment=Qt.AlignRight) self.resize(800,800) self._controller.seeking_mode() # TODO:push seeking to mediator def _init_raportUI(self) -> None: self._clear() self._transfer_settings() self.tabWidget = QtWidgets.QTabWidget() self.tabWidget.setTabsClosable(True) self.tabWidget.tabCloseRequested.connect(self._close_tab) sys_settings_btn = QtWidgets.QPushButton("System settings") sys_settings_btn.setFixedWidth(185) sys_settings_btn.clicked.connect(lambda: self.sysSettings.show()) oper_settings_btn = QtWidgets.QPushButton("Operator settings") oper_settings_btn.setFixedWidth(185) oper_settings_btn.clicked.connect(lambda: self.operSettings.show()) view_settings_btn = QtWidgets.QPushButton("Customize view") view_settings_btn.setFixedWidth(185) view_settings_btn.clicked.connect(self._customization_window) save_screen_btn = QtWidgets.QPushButton("Save state") save_screen_btn.setFixedWidth(185) save_screen_btn.clicked.connect(self._save_plots) open_file_btn = QtWidgets.QPushButton("Open file") open_file_btn.setFixedWidth(185) open_file_btn.clicked.connect(self._open_file) button_layout = QtWidgets.QHBoxLayout() button_layout.setSpacing(2) button_layout.addWidget(sys_settings_btn) button_layout.addWidget(oper_settings_btn) button_layout.addWidget(view_settings_btn) button_layout.addWidget(save_screen_btn) button_layout.addWidget(open_file_btn) button_widget = QtWidgets.QWidget() button_widget.setLayout(button_layout) title = QtWidgets.QLabel("raport mode") mainLayout = self.layout() mainLayout.addWidget(self.tabWidget) mainLayout.addWidget(button_widget) mainLayout.addWidget(title, alignment=Qt.AlignRight) self.resize(800,800) self._controller.raport_mode(None) #self._controller.raport_mode(path) # TODO: push only one dir to monitor def show_plot_tabs(self, plot_widgets: list[QtWidgets.QWidget]) -> None: for plot_widget in plot_widgets: widget, reg_items, curve_items = plot_widget tab = QtWidgets.QWidget() tab.setProperty("reg_items", reg_items) tab.setProperty("curve_items", curve_items) grid = QtWidgets.QGridLayout() grid.addWidget(widget) tab.setLayout(grid) self.tabWidget.addTab(tab, "SF_trace_" + dt.now().strftime('%Y_%m_%d-%H_%M_%S')) self.tabWidget.setCurrentWidget(tab) tab_count = self.tabWidget.count() if tab_count > 10: for i in range(0, tab_count-2): self._close_tab(i) def keyPressEvent(self, a0) -> None: if a0.key() == Qt.Key_F5: tab_count = self.tabWidget.count() for i in range(0, tab_count): self._close_tab(i) def closeEvent(self, a0): self.operSettings.close() self.sysSettings.close() self.repSettings.close() super().closeEvent(a0) def _show_settings(self) -> None: self.operSettings.show() self.sysSettings.show() def _transfer_settings(self) -> None: self.tabWidget.clear() operator_params = self.operSettings.getParams() system_params = self.sysSettings.getParams() self._controller.update_settings([operator_params, system_params]) def _close_tab(self, index:int) -> None: self.tabWidget.removeTab(index) def _open_file(self) -> None: path = self._select_csv() self._controller.raport_mode(path) def _select_csv(self) -> Optional[str]: CSV_path, _ = QtWidgets.QFileDialog.getOpenFileName(self,"Select csv file", "", "CSV Files (*.csv)") if CSV_path: print(CSV_path) return CSV_path return None def _customization_window(self) -> None: tab = self.tabWidget.currentWidget() reg_items = tab.property("reg_items") curve_items = tab.property("curve_items") self.repSettings.build(reg_items, curve_items) def _save_plots(self) -> None: filepath, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save file", "", "Image Files (*.png *.jpeg)") tab = self.tabWidget.currentWidget() pixmap = QPixmap(tab.size()) tab.render(pixmap) pixmap.save(filepath)