from datetime import datetime as dt from typing import Optional from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.QtGui import QPixmap, QIcon from utils.base.base import BaseMainWindow, BaseController from gui.settings_window import SystemSettings, OperatorSettings from gui.reportGui import ReportSettings # FIXME: При отркытии RaportMode все прочитанные трейсы должны удаляться, но они открываются... class MainWindow(BaseMainWindow): def __init__(self, controller: Optional[BaseController] = None) -> None: super().__init__() self._controller = controller self._init_startUI() self._init_dock_widgets() self._init_menu() def _init_TabWidget(self) -> None: self.tabWidget = QtWidgets.QTabWidget() self.tabWidget.setTabsClosable(True) self.tabWidget.tabCloseRequested.connect(self._close_tab) self.tabWidget.currentChanged.connect(self._on_tab_changed) def _init_startUI(self) -> None: self.operSettings = OperatorSettings("params/operator_params.json", 'Operator', self._upd_settings) self.sysSettings = SystemSettings("params/system_params.json", 'System', self._upd_settings) self.repSettings = ReportSettings() self._clear() self.resize(800,800) 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._central_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 _init_dock_widgets(self) -> None: """ Инициализация док-виджетов для настроек. """ # Создаем док-виджет для OperatorSettings self.operator_dock = QtWidgets.QDockWidget("Operator Settings", self) self.operator_dock.setWidget(self.operSettings) self.operator_dock.setObjectName("OperatorSettings") self.addDockWidget(Qt.RightDockWidgetArea, self.operator_dock) self.operator_dock.hide() # Скрываем по умолчанию # Создаем док-виджет для SystemSettings self.system_dock = QtWidgets.QDockWidget("System Settings", self) self.system_dock.setWidget(self.sysSettings) self.system_dock.setObjectName("SystemSettings") self.addDockWidget(Qt.RightDockWidgetArea, self.system_dock) self.system_dock.hide() # Скрываем по умолчанию # Создаем док-виджет для ReportSettings self.report_dock = QtWidgets.QDockWidget("Report Settings", self) self.report_dock.setWidget(self.repSettings) self.report_dock.setObjectName("ReportSettings") self.addDockWidget(Qt.RightDockWidgetArea, self.report_dock) self.report_dock.hide() # Скрываем по умолчанию # Настройка док-виджетов self._set_dock_features(self.operator_dock) self._set_dock_features(self.system_dock) self._set_dock_features(self.report_dock) def _init_menu(self) -> None: """ Инициализация главного меню. """ # Создаем главное меню menu_bar = self.menuBar() # Создаем меню "Режимы" modes_menu = menu_bar.addMenu("Mode") settings_menu = menu_bar.addMenu("Settings") # Создаем действия для меню seeking_action = QtWidgets.QAction("Real time folder scanning", self) seeking_action.triggered.connect(self._init_seekingUI) raport_action = QtWidgets.QAction("Raport editor", self) raport_action.triggered.connect(self._init_raportUI) system_settings = QtWidgets.QAction("System settings", self) system_settings.setIcon(QIcon('resources/system_ico.png')) system_settings.triggered.connect(lambda: self._toggle_visibility(self.system_dock)) operator_settings = QtWidgets.QAction("Operator settings ", self) operator_settings.setIcon(QIcon('resources/operator_ico.png')) operator_settings.triggered.connect(lambda: self._toggle_visibility(self.operator_dock)) view_settings = QtWidgets.QAction("View settings", self) view_settings.setIcon(QIcon('resources/view_ico.png')) view_settings.triggered.connect(lambda: self._toggle_visibility(self.report_dock)) # Добавляем действия в меню "Режимы" modes_menu.addAction(seeking_action) modes_menu.addAction(raport_action) settings_menu.addAction(system_settings) settings_menu.addAction(operator_settings) settings_menu.addAction(view_settings) def _toggle_visibility(self, body:QtWidgets.QDockWidget = None) -> None: """ Переключение видимости док-виджета. """ is_visible = body.isVisible() body.setVisible(not is_visible) def _set_dock_features(self, body:QtWidgets.QDockWidget = None) -> None: """ Настройка флагов док-виджета. """ flag_move = QtWidgets.QDockWidget.DockWidgetMovable flag_close = QtWidgets.QDockWidget.DockWidgetClosable flag_floating = QtWidgets.QDockWidget.DockWidgetFloatable body.setFeatures(flag_move | flag_close | flag_floating) def _clear(self) -> None: if self._central_layout is not None: while self._central_layout.count(): child = self._central_layout.takeAt(0) if child.widget() is not None: child.widget().deleteLater() def _init_seekingUI(self) -> None: self._clear() self._init_TabWidget() self._transfer_settings() button_layout = QtWidgets.QHBoxLayout() button_layout.setSpacing(2) button_widget = QtWidgets.QWidget() button_widget.setLayout(button_layout) title = QtWidgets.QLabel("online mode") self._central_layout.addWidget(self.tabWidget) self._central_layout.addWidget(button_widget) self._central_layout.addWidget(title, alignment=Qt.AlignRight) self._controller.seeking_mode() def _init_raportUI(self) -> None: self._clear() self._init_TabWidget() self._transfer_settings() 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(save_screen_btn) button_layout.addWidget(open_file_btn) button_widget = QtWidgets.QWidget() button_widget.setLayout(button_layout) title = QtWidgets.QLabel("raport mode") self._central_layout.addWidget(self.tabWidget) self._central_layout.addWidget(button_widget) self._central_layout.addWidget(title, alignment=Qt.AlignRight) self._controller.raport_mode() 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-10): 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 _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 _upd_settings(self) -> None: self._transfer_settings() self._controller.update_plots() def _close_tab(self, index:int) -> None: self.tabWidget.removeTab(index) def _open_file(self) -> None: path = self._select_csv() self._controller.open_file(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 _on_tab_changed(self, index): tab = self.tabWidget.currentWidget() if tab is not None and self.report_dock.isVisible(): reg_items = tab.property("reg_items") curve_items = tab.property("curve_items") self.repSettings.build(index, reg_items, curve_items) def _save_plots(self) -> None: filepath, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save file", "", "Image Files (*.png *.jpeg)") tab = self.tabWidget.currentWidget() if tab is not None: pixmap = QPixmap(tab.size()) tab.render(pixmap) pixmap.save(filepath)