2024-11-25 14:01:09 +03:00
|
|
|
from datetime import datetime as dt
|
2024-11-26 18:28:05 +03:00
|
|
|
from typing import Optional
|
2024-11-25 14:01:09 +03:00
|
|
|
from PyQt5 import QtWidgets
|
|
|
|
|
from PyQt5.QtCore import Qt
|
2024-12-23 18:51:17 +03:00
|
|
|
from PyQt5.QtGui import QPixmap, QIcon
|
2024-12-18 10:16:50 +03:00
|
|
|
|
2024-12-05 13:18:53 +03:00
|
|
|
from utils.base.base import BaseMainWindow, BaseController
|
2024-12-23 14:18:54 +03:00
|
|
|
from gui.settings_window import SystemSettings, OperatorSettings
|
2024-12-17 20:40:04 +03:00
|
|
|
from gui.reportGui import ReportSettings
|
2024-11-25 14:01:09 +03:00
|
|
|
|
2024-12-24 10:37:34 +03:00
|
|
|
|
|
|
|
|
# FIXME: При отркытии RaportMode все прочитанные трейсы должны удаляться, но они открываются...
|
2024-11-25 14:01:09 +03:00
|
|
|
class MainWindow(BaseMainWindow):
|
2024-11-26 18:28:05 +03:00
|
|
|
def __init__(self,
|
2024-12-18 12:58:37 +03:00
|
|
|
controller: Optional[BaseController] = None) -> None:
|
2024-11-25 14:01:09 +03:00
|
|
|
super().__init__()
|
2024-11-26 18:28:05 +03:00
|
|
|
self._controller = controller
|
2024-12-18 19:43:46 +03:00
|
|
|
self._init_startUI()
|
2024-12-23 18:51:17 +03:00
|
|
|
self._init_dock_widgets()
|
|
|
|
|
self._init_menu()
|
|
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
|
2024-12-24 10:37:34 +03:00
|
|
|
def _init_TabWidget(self) -> None:
|
2024-12-18 19:43:46 +03:00
|
|
|
self.tabWidget = QtWidgets.QTabWidget()
|
2024-12-23 18:51:17 +03:00
|
|
|
self.tabWidget.setTabsClosable(True)
|
|
|
|
|
self.tabWidget.tabCloseRequested.connect(self._close_tab)
|
|
|
|
|
self.tabWidget.currentChanged.connect(self._on_tab_changed)
|
2024-11-25 14:01:09 +03:00
|
|
|
|
2024-12-24 10:37:34 +03:00
|
|
|
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()
|
2024-12-24 16:56:04 +03:00
|
|
|
self.statusBar().showMessage("Ready")
|
2024-12-24 10:37:34 +03:00
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
self._clear()
|
2024-12-24 10:37:34 +03:00
|
|
|
self.resize(800,800)
|
2024-12-18 19:43:46 +03:00
|
|
|
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)
|
|
|
|
|
|
2024-12-23 18:51:17 +03:00
|
|
|
mainLayout = self._central_layout
|
2024-12-18 19:43:46 +03:00
|
|
|
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)
|
|
|
|
|
|
2024-12-23 18:51:17 +03:00
|
|
|
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))
|
|
|
|
|
|
2024-12-24 11:46:00 +03:00
|
|
|
operator_settings = QtWidgets.QAction("Operator settings ", self)
|
2024-12-23 18:51:17 +03:00
|
|
|
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))
|
2024-12-24 16:56:04 +03:00
|
|
|
view_settings.triggered.connect(lambda: self._on_tab_changed(0))
|
2024-12-23 18:51:17 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
# Добавляем действия в меню "Режимы"
|
|
|
|
|
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)
|
|
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
def _clear(self) -> None:
|
2024-12-23 18:51:17 +03:00
|
|
|
if self._central_layout is not None:
|
|
|
|
|
while self._central_layout.count():
|
|
|
|
|
child = self._central_layout.takeAt(0)
|
2024-12-18 19:43:46 +03:00
|
|
|
if child.widget() is not None:
|
|
|
|
|
child.widget().deleteLater()
|
|
|
|
|
|
|
|
|
|
def _init_seekingUI(self) -> None:
|
|
|
|
|
self._clear()
|
2024-12-24 10:37:34 +03:00
|
|
|
self._init_TabWidget()
|
2024-12-18 19:43:46 +03:00
|
|
|
self._transfer_settings()
|
|
|
|
|
|
2024-12-16 15:49:01 +03:00
|
|
|
button_layout = QtWidgets.QHBoxLayout()
|
|
|
|
|
button_layout.setSpacing(2)
|
2024-12-18 19:43:46 +03:00
|
|
|
button_widget = QtWidgets.QWidget()
|
|
|
|
|
button_widget.setLayout(button_layout)
|
|
|
|
|
|
|
|
|
|
title = QtWidgets.QLabel("online mode")
|
2024-12-23 18:51:17 +03:00
|
|
|
self._central_layout.addWidget(self.tabWidget)
|
|
|
|
|
self._central_layout.addWidget(button_widget)
|
|
|
|
|
self._central_layout.addWidget(title, alignment=Qt.AlignRight)
|
2024-12-18 19:43:46 +03:00
|
|
|
self._controller.seeking_mode()
|
|
|
|
|
|
|
|
|
|
def _init_raportUI(self) -> None:
|
|
|
|
|
self._clear()
|
2024-12-24 10:37:34 +03:00
|
|
|
self._init_TabWidget()
|
2024-12-18 19:43:46 +03:00
|
|
|
self._transfer_settings()
|
2024-12-23 18:51:17 +03:00
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
save_screen_btn = QtWidgets.QPushButton("Save state")
|
|
|
|
|
save_screen_btn.setFixedWidth(185)
|
|
|
|
|
save_screen_btn.clicked.connect(self._save_plots)
|
2024-12-19 14:25:11 +03:00
|
|
|
open_file_btn = QtWidgets.QPushButton("Open file")
|
|
|
|
|
open_file_btn.setFixedWidth(185)
|
|
|
|
|
open_file_btn.clicked.connect(self._open_file)
|
2024-12-18 19:43:46 +03:00
|
|
|
|
|
|
|
|
button_layout = QtWidgets.QHBoxLayout()
|
|
|
|
|
button_layout.setSpacing(2)
|
2024-12-23 18:51:17 +03:00
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
button_layout.addWidget(save_screen_btn)
|
2024-12-19 14:25:11 +03:00
|
|
|
button_layout.addWidget(open_file_btn)
|
2024-12-18 19:43:46 +03:00
|
|
|
button_widget = QtWidgets.QWidget()
|
|
|
|
|
button_widget.setLayout(button_layout)
|
|
|
|
|
|
|
|
|
|
title = QtWidgets.QLabel("raport mode")
|
2024-12-23 18:51:17 +03:00
|
|
|
self._central_layout.addWidget(self.tabWidget)
|
|
|
|
|
self._central_layout.addWidget(button_widget)
|
|
|
|
|
self._central_layout.addWidget(title, alignment=Qt.AlignRight)
|
2024-12-24 10:37:34 +03:00
|
|
|
|
|
|
|
|
self._controller.raport_mode()
|
2024-11-25 14:01:09 +03:00
|
|
|
|
|
|
|
|
def show_plot_tabs(self, plot_widgets: list[QtWidgets.QWidget]) -> None:
|
|
|
|
|
for plot_widget in plot_widgets:
|
2024-12-17 20:40:04 +03:00
|
|
|
widget, reg_items, curve_items = plot_widget
|
|
|
|
|
|
2024-11-25 14:01:09 +03:00
|
|
|
tab = QtWidgets.QWidget()
|
2024-12-17 20:40:04 +03:00
|
|
|
tab.setProperty("reg_items", reg_items)
|
|
|
|
|
tab.setProperty("curve_items", curve_items)
|
2024-11-25 14:01:09 +03:00
|
|
|
grid = QtWidgets.QGridLayout()
|
2024-12-17 20:40:04 +03:00
|
|
|
grid.addWidget(widget)
|
2024-11-25 14:01:09 +03:00
|
|
|
tab.setLayout(grid)
|
|
|
|
|
self.tabWidget.addTab(tab, "SF_trace_" + dt.now().strftime('%Y_%m_%d-%H_%M_%S'))
|
|
|
|
|
self.tabWidget.setCurrentWidget(tab)
|
|
|
|
|
|
2024-12-02 11:21:22 +03:00
|
|
|
tab_count = self.tabWidget.count()
|
|
|
|
|
if tab_count > 10:
|
2024-12-23 18:51:17 +03:00
|
|
|
for i in range(0, tab_count-10):
|
2024-12-02 11:21:22 +03:00
|
|
|
self._close_tab(i)
|
|
|
|
|
|
2024-12-18 12:58:37 +03:00
|
|
|
def keyPressEvent(self, a0) -> None:
|
2024-11-25 14:01:09 +03:00
|
|
|
if a0.key() == Qt.Key_F5:
|
2024-12-18 12:58:37 +03:00
|
|
|
tab_count = self.tabWidget.count()
|
|
|
|
|
for i in range(0, tab_count):
|
|
|
|
|
self._close_tab(i)
|
2024-12-23 14:18:54 +03:00
|
|
|
|
|
|
|
|
def closeEvent(self, a0):
|
|
|
|
|
self.operSettings.close()
|
|
|
|
|
self.sysSettings.close()
|
|
|
|
|
self.repSettings.close()
|
|
|
|
|
super().closeEvent(a0)
|
2024-11-25 14:01:09 +03:00
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
def _transfer_settings(self) -> None:
|
2024-11-25 17:20:00 +03:00
|
|
|
self.tabWidget.clear()
|
|
|
|
|
operator_params = self.operSettings.getParams()
|
|
|
|
|
system_params = self.sysSettings.getParams()
|
2024-12-18 19:43:46 +03:00
|
|
|
self._controller.update_settings([operator_params, system_params])
|
2024-11-25 17:20:00 +03:00
|
|
|
|
2024-12-24 10:37:34 +03:00
|
|
|
def _upd_settings(self) -> None:
|
|
|
|
|
self._transfer_settings()
|
|
|
|
|
self._controller.update_plots()
|
|
|
|
|
|
2024-12-02 11:21:22 +03:00
|
|
|
def _close_tab(self, index:int) -> None:
|
|
|
|
|
self.tabWidget.removeTab(index)
|
2024-12-19 14:25:11 +03:00
|
|
|
|
|
|
|
|
def _open_file(self) -> None:
|
|
|
|
|
path = self._select_csv()
|
2024-12-24 10:37:34 +03:00
|
|
|
self._controller.open_file(path)
|
2024-11-25 17:20:00 +03:00
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
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
|
|
|
|
|
|
2024-12-23 18:51:17 +03:00
|
|
|
def _on_tab_changed(self, index):
|
2024-12-17 20:40:04 +03:00
|
|
|
tab = self.tabWidget.currentWidget()
|
2024-12-23 18:51:17 +03:00
|
|
|
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)
|
2024-12-17 20:40:04 +03:00
|
|
|
|
2024-12-18 19:43:46 +03:00
|
|
|
def _save_plots(self) -> None:
|
|
|
|
|
filepath, _ = QtWidgets.QFileDialog.getSaveFileName(self, "Save file", "", "Image Files (*.png *.jpeg)")
|
|
|
|
|
tab = self.tabWidget.currentWidget()
|
2024-12-23 18:51:17 +03:00
|
|
|
if tab is not None:
|
|
|
|
|
pixmap = QPixmap(tab.size())
|
|
|
|
|
tab.render(pixmap)
|
|
|
|
|
pixmap.save(filepath)
|
2024-12-18 19:43:46 +03:00
|
|
|
|
2024-12-17 20:40:04 +03:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-11-25 17:20:00 +03:00
|
|
|
|
2024-11-25 14:01:09 +03:00
|
|
|
|