WeldingSpotPerformance/src/gui/mainGui.py

283 lines
11 KiB
Python

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.statusBar().showMessage("Ready")
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))
view_settings.triggered.connect(lambda: self._on_tab_changed(0))
# Добавляем действия в меню "Режимы"
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, qt_items = plot_widget
tab = QtWidgets.QWidget()
tab.setProperty("reg_items", reg_items)
tab.setProperty("curve_items", curve_items)
tab.setProperty("qt_items", qt_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")
qt_items = tab.property("qt_items")
self.repSettings.build(index, reg_items, curve_items, qt_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)