dev: добавлена строка состояния

This commit is contained in:
Andrew 2024-12-25 11:56:17 +03:00
parent 74b65eee5d
commit acbbc33fdb
11 changed files with 77 additions and 4 deletions

View File

@ -1,5 +1,6 @@
from PyQt5.QtWidgets import QWidget
from PyQt5.QtCore import pyqtSignal
from typing import Union
from utils.base.base import BaseController
@ -9,6 +10,8 @@ class Controller(BaseController):
signal_widgets = pyqtSignal(list)
signal_settings = pyqtSignal(list)
signal_open_file = pyqtSignal(str)
signal_statusBar = pyqtSignal(int)
signal_statusText = pyqtSignal(str)
signal_raport_mode = pyqtSignal()
signal_seeking_mode = pyqtSignal()
signal_update_plots = pyqtSignal()
@ -31,5 +34,10 @@ class Controller(BaseController):
def update_plots(self) -> None:
self.signal_update_plots.emit()
def update_status(self, msg: Union[str, float, int]) -> None:
if type(msg) == float or type(msg) == int:
self.signal_statusBar.emit(int(msg))
else:
self.signal_statusText.emit(msg)

View File

@ -1,4 +1,5 @@
import pandas as pd
import time
from typing import Union
from PyQt5.QtWidgets import QWidget
@ -15,19 +16,26 @@ class Mediator(BaseMediator):
data: Union[list[str], list[pd.DataFrame], list[list], list[QWidget]]):
if issubclass(source.__class__, BaseDirectoryMonitor):
self.update_status("CSV found! Calculating...")
self._converter.convert_data(data)
if issubclass(source.__class__, BaseDataConverter):
self.update_status(0.5)
self._passportFormer.form_passports(data)
if issubclass(source.__class__, BasePointPassportFormer):
self.update_status(1)
self._plot.build(data)
if issubclass(source.__class__, BasePlotWidget):
self.update_status(100)
self._controller.send_widgets(data)
def update_settings(self, settings: list[dict]):
self._monitor.update_settings(settings)
self._passportFormer.update_settings(settings)
def update_status(self, msg: Union[str, float]) -> None:
self._controller.update_status(msg)

View File

@ -3,6 +3,7 @@ from typing import Optional
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPixmap, QIcon
import time
from utils.base.base import BaseMainWindow, BaseController
from gui.settings_window import SystemSettings, OperatorSettings
@ -30,7 +31,7 @@ class MainWindow(BaseMainWindow):
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)
@ -61,6 +62,8 @@ class MainWindow(BaseMainWindow):
mainLayout.addWidget(label, alignment=Qt.AlignCenter)
mainLayout.addWidget(button_widget)
self._init_statusBar()
def _init_dock_widgets(self) -> None:
"""
Инициализация док-виджетов для настроек.
@ -132,7 +135,20 @@ class MainWindow(BaseMainWindow):
settings_menu.addAction(operator_settings)
settings_menu.addAction(view_settings)
def _init_statusBar(self) -> None:
note_widget = QtWidgets.QWidget()
note_layout = QtWidgets.QVBoxLayout(note_widget)
self.progress_bar = QtWidgets.QProgressBar()
self.progress_bar.setRange(0, 100)
self.progress_bar.setValue(0)
self.note_label = QtWidgets.QLabel()
self.note_label.setMinimumWidth(250)
self.progress_bar.setMinimumWidth(250)
self.progress_bar.setMaximumHeight(10)
self.progress_bar.setTextVisible(False)
note_layout.addWidget(self.note_label, alignment=Qt.AlignLeft)
note_layout.addWidget(self.progress_bar, alignment=Qt.AlignLeft)
self.statusBar().addPermanentWidget(note_widget)
def _toggle_visibility(self, body:QtWidgets.QDockWidget = None) -> None:
"""
@ -219,6 +235,8 @@ class MainWindow(BaseMainWindow):
for i in range(0, tab_count-10):
self._close_tab(i)
self.update_stateLabel("Done!")
def keyPressEvent(self, a0) -> None:
if a0.key() == Qt.Key_F5:
tab_count = self.tabWidget.count()
@ -231,6 +249,14 @@ class MainWindow(BaseMainWindow):
self.repSettings.close()
super().closeEvent(a0)
def update_progressBar(self, percent:int) -> None:
if percent > 100: percent = 100
self.progress_bar.setValue(percent)
def update_stateLabel(self, msg: str = None) -> None:
self.note_label.setText(msg)
def _transfer_settings(self) -> None:
self.tabWidget.clear()
operator_params = self.operSettings.getParams()

View File

@ -199,7 +199,12 @@ class PlotWidget(BasePlotWidget):
dat_is_none = dataframe is None
if not dat_is_none: dataframe_headers = dataframe.columns.tolist()
widget_steps = len(self._plt_channels)
if not dat_is_none:
dataframe_headers = dataframe.columns.tolist()
point_steps = len(points_pocket)
else: point_steps = 1
for widget_num, (channel, description) in enumerate(self._plt_channels.items()):
plot_item, legend = self._init_plot_item(title=channel)
@ -299,6 +304,9 @@ class PlotWidget(BasePlotWidget):
worst_perf = curr_perf
worst_timeframe = point_timeframe
# Считаем прогресс
self._update_status(widget_steps, point_steps, widget_num, cur_point)
# Добавляем реальные сигналы
if not dat_is_none:
self._add_real_signals(plot_item, dataframe, description["Real_signals"], legend, curve_items)
@ -333,7 +341,8 @@ class PlotWidget(BasePlotWidget):
]
"""
try:
widgets_datapack = [self._build_widget(data_sample) for data_sample in data]
self._datalen = len(data)
widgets_datapack = [self._build_widget(data_sample) for self._datastep, data_sample in enumerate(data)]
except:
tb = sys.exc_info()[2]
tbinfo = traceback.format_tb(tb)[0]
@ -343,5 +352,19 @@ class PlotWidget(BasePlotWidget):
finally:
self._mediator.notify(self, widgets_datapack)
def _update_status(self, widgsteps:int, pointsteps:int, cur_widg:int, cur_point:int):
if self._datalen != 0:
sycle_start = self._datastep/self._datalen*100 + 1
period1 = 100/self._datalen
else:
sycle_start = 1
period1 = 100
period2 = period1/widgsteps if widgsteps != 0 else period1
period3 = period2/pointsteps if pointsteps != 0 else period2
progress = sycle_start + period2*cur_widg + period3*cur_point
self._mediator.update_status(progress)

View File

@ -24,6 +24,8 @@ def main():
window.show()
controller.signal_widgets.connect(window.show_plot_tabs)
controller.signal_statusBar.connect(window.update_progressBar)
controller.signal_statusText.connect(window.update_stateLabel)
controller.signal_settings.connect(mediator.update_settings)
controller.signal_open_file.connect(monitor.custom_csv_extract_only)
controller.signal_raport_mode.connect(monitor.start_raport)

View File

@ -40,6 +40,9 @@ class BaseMediator:
def update_settings (self, data: list[dict]):
...
def update_status(self, msg: Union[str, float]) -> None:
...
class BaseDirectoryMonitor:
update_timer = QTimer()
@ -356,6 +359,9 @@ class BaseController(QObject):
def update_plots(self) -> None:
...
def update_status(self, msg: Union[str, float]) -> None:
...
class BaseIdealDataBuilder(OptAlgorithm):