diff --git a/src/controller/__pycache__/controller.cpython-310.pyc b/src/controller/__pycache__/controller.cpython-310.pyc index dfd9346..88d8287 100644 Binary files a/src/controller/__pycache__/controller.cpython-310.pyc and b/src/controller/__pycache__/controller.cpython-310.pyc differ diff --git a/src/controller/__pycache__/mediator.cpython-310.pyc b/src/controller/__pycache__/mediator.cpython-310.pyc index 8d1ef3d..3b167e2 100644 Binary files a/src/controller/__pycache__/mediator.cpython-310.pyc and b/src/controller/__pycache__/mediator.cpython-310.pyc differ diff --git a/src/controller/controller.py b/src/controller/controller.py index 02eec45..b9ef996 100644 --- a/src/controller/controller.py +++ b/src/controller/controller.py @@ -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) \ No newline at end of file diff --git a/src/controller/mediator.py b/src/controller/mediator.py index 8587b17..51477eb 100644 --- a/src/controller/mediator.py +++ b/src/controller/mediator.py @@ -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) diff --git a/src/gui/__pycache__/mainGui.cpython-310.pyc b/src/gui/__pycache__/mainGui.cpython-310.pyc index 74baf8e..543b396 100644 Binary files a/src/gui/__pycache__/mainGui.cpython-310.pyc and b/src/gui/__pycache__/mainGui.cpython-310.pyc differ diff --git a/src/gui/__pycache__/plotter.cpython-310.pyc b/src/gui/__pycache__/plotter.cpython-310.pyc index df953b5..e1b1725 100644 Binary files a/src/gui/__pycache__/plotter.cpython-310.pyc and b/src/gui/__pycache__/plotter.cpython-310.pyc differ diff --git a/src/gui/mainGui.py b/src/gui/mainGui.py index 9421ec1..eef844d 100644 --- a/src/gui/mainGui.py +++ b/src/gui/mainGui.py @@ -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() diff --git a/src/gui/plotter.py b/src/gui/plotter.py index b709a29..f855d4e 100644 --- a/src/gui/plotter.py +++ b/src/gui/plotter.py @@ -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) + \ No newline at end of file diff --git a/src/main.py b/src/main.py index 018ac49..9172ba4 100644 --- a/src/main.py +++ b/src/main.py @@ -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) diff --git a/src/utils/base/__pycache__/base.cpython-310.pyc b/src/utils/base/__pycache__/base.cpython-310.pyc index e19bdba..5475de8 100644 Binary files a/src/utils/base/__pycache__/base.cpython-310.pyc and b/src/utils/base/__pycache__/base.cpython-310.pyc differ diff --git a/src/utils/base/base.py b/src/utils/base/base.py index ccc18f0..d9bc10d 100644 --- a/src/utils/base/base.py +++ b/src/utils/base/base.py @@ -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):