diff --git a/src/base/base.py b/src/base/base.py index 297fe51..d059942 100644 --- a/src/base/base.py +++ b/src/base/base.py @@ -365,8 +365,10 @@ class BasePlotWidget: class BaseController(QObject): def __init__(self, - mediator: Optional[BaseMediator] = None): - self._mediator = mediator + mediator: Optional[BaseMediator] = None, + file_manager: Optional[BaseFileManager] = None): + self._mediator = mediator + self._file_manager = file_manager def send_widgets(self, widgets: list[QWidget]) -> None: ... @@ -374,12 +376,7 @@ class BaseController(QObject): def update_settings(self, settings: list[dict]) -> None: ... - def raport_mode (self) -> None: - # TODO: обычно в названиях методов должен присутствовать глагол. - ... - - def seeking_mode(self) -> None: - # TODO: обычно в названиях методов должен присутствовать глагол. + def set_working_mode(self, mode:int) -> None: ... def open_file(self, filepath: str) -> None: @@ -388,9 +385,12 @@ class BaseController(QObject): def update_plots(self) -> None: ... - def update_status(self, msg: Union[str, float]) -> None: + def update_status(self, msg:str) -> None: ... + def update_progress(self, progress:int) -> None: + ... + @property def mediator(self) -> BaseMediator: return self._mediator @@ -398,6 +398,14 @@ class BaseController(QObject): @mediator.setter def mediator(self, mediator: BaseMediator) -> None: self._mediator = mediator + + @property + def file_manager(self) -> BaseFileManager: + return self._file_manager + + @file_manager.setter + def file_manager(self, file_manager: BaseFileManager) -> None: + self._file_manager = file_manager class BaseFileManager: @@ -429,6 +437,18 @@ class BaseFileManager: def monitor(self, monitor: BaseDirectoryMonitor) -> None: self._monitor = monitor + def replot_all(self) -> None: + ... + + def open_custom_file(self, path:str) -> None: + ... + + def set_mode(self, num:int) -> None: + ... + + def update_monitor_settings(self, settings:list[dict]) -> None: + ... + def add_new_paths(self, paths:list[str]): ... diff --git a/src/controller/controller.py b/src/controller/controller.py index 3e3e7ae..009b7ee 100644 --- a/src/controller/controller.py +++ b/src/controller/controller.py @@ -7,47 +7,31 @@ from base.base import BaseController 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() + signal_progress_bar = pyqtSignal(int) + signal_status_text = pyqtSignal(str) + + def update_settings(self, settings: list[dict]) -> None: + self.mediator.notify(settings) + + # TODO: Объедини переключение режимов в один метод, и по входному аргументу (например 1 и 2) переключай их. + def set_working_mode(self, mode:int) -> None: + self._file_manager.set_mode(mode) + + def open_file(self, filepath: str) -> None: + self._file_manager.open_custom_file(filepath) + + def update_plots(self) -> None: + self._file_manager.replot_all() def send_widgets(self, widgets: list[QWidget]) -> None: self.signal_widgets.emit(widgets) - - def update_settings(self, settings: list[dict]) -> None: - # TODO: Почему контроллеру просто не сообщить о медиаторе, и ему сообщать что-то через notify? Тем более, что - # медиатор уже знает про контроллер... - self.signal_settings.emit(settings) - # TODO: Объедини переключение режимов в один метод, и по входному аргументу (например 1 и 2) переключай их. - def raport_mode(self) -> None: - self.signal_raport_mode.emit() - - def seeking_mode(self) -> None: - self.signal_seeking_mode.emit() + def update_status(self, msg:str) -> None: + self.signal_status_text.emit(msg) - def open_file(self, filepath: str) -> None: - # TODO: Где тут открытие файла? - self.signal_open_file.emit(filepath) + def update_progress(self, progress:int) -> None: + self.signal_progress_bar.emit(progress) - def update_plots(self) -> None: - self.signal_update_plots.emit() - - def update_status(self, msg: Union[str, float, int]) -> None: - # TODO: Довольно странный набор возможных типов входных аргументов. - # TODO: Для чего сюда принимается float, если он все равно приводится к int? - # TODO: Из медиатора сюда приходит статус 0.5, который становится нулем. - # Это точно ожидаемое и корректное поведение? Сомнительно... - # TODO: if isinstance(msg, float): ... - 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/monitor.py b/src/controller/file_manager.py similarity index 81% rename from src/controller/monitor.py rename to src/controller/file_manager.py index 6ccadb6..b631da7 100644 --- a/src/controller/monitor.py +++ b/src/controller/file_manager.py @@ -38,24 +38,26 @@ class DirectoryMonitor(BaseDirectoryMonitor): class FileManager(BaseFileManager): - def update_plots(self): + def replot_all(self) -> None: if self._paths_library is not None: self._mediator.notify(self, list(self._paths_library)) - def open_custom_file(self, path:str): + def open_custom_file(self, path:str) -> None: self._paths_library.add(path) self._mediator.notify(self, [path if path else '']) - def start_raport_mode(self) -> None: - self._monitor.stop() - self._paths_library.clear() - self._paths_library.add('') - self._mediator.notify(self, list(self._paths_library)) - - def start_seeking_mode(self) -> None: - self._monitor.init_state() - self._monitor.start() + def set_mode(self, num:int) -> None: + match num: + case 1: # Режим создания отчета + self._monitor.stop() + self._paths_library.clear() + self._paths_library.add('') + self._mediator.notify(self, list(self._paths_library)) + case 2: # Режим онлайн-мониторинга папки + self._monitor.init_state() + self._monitor.start() + def update_monitor_settings(self, settings:list[dict]) -> None: _, system_params = settings directory_path = system_params['trace_storage_path'][0] diff --git a/src/controller/mediator.py b/src/controller/mediator.py index cfe3fdf..a4f1031 100644 --- a/src/controller/mediator.py +++ b/src/controller/mediator.py @@ -5,38 +5,35 @@ from PyQt5.QtWidgets import QWidget from base.base import (BaseMediator, BaseDirectoryMonitor, BaseDataConverter, BasePlotWidget, - BasePointPassportFormer) + BasePointPassportFormer, + BaseController) class Mediator(BaseMediator): def notify(self, - source: Union[BaseDirectoryMonitor, BaseDataConverter, BasePointPassportFormer, BasePlotWidget], - data: Union[list[str], list[pd.DataFrame], list[list], list[QWidget]]): + source: Union[BaseDirectoryMonitor, BaseDataConverter, BasePointPassportFormer, BasePlotWidget, BaseController], + data: Union[list[str], list[pd.DataFrame], list[list], list[QWidget], list[dict]]): if issubclass(source.__class__, BaseDirectoryMonitor): self._controller.update_status("CSV found! Calculating...") self._converter.convert_data(data) if issubclass(source.__class__, BaseDataConverter): - self._controller.update_status(1) + self._controller.update_progress(1) self._passportFormer.form_passports(data) if issubclass(source.__class__, BasePointPassportFormer): - self._controller.update_status(2) + self._controller.update_progress(2) self._plot.build(data) if issubclass(source.__class__, BasePlotWidget): - self._controller.update_status(100) + self._controller.update_progress(100) self._controller.send_widgets(data) - - def update_settings(self, settings: list[dict]): - # TODO: А дописать self.notify не? - # if issubclass(source.__class__, BaseController): - # self._monitor.update_settings(data) - # self._passportFormer.update_settings(data) - self._monitor.update_settings(settings) - self._passportFormer.update_settings(settings) + + if issubclass(source.__class__, BaseController): + self._file_manager.update_monitor_settings(data) + self._passportFormer.update_settings(data) diff --git a/src/main.py b/src/main.py index a332d20..5e6b762 100644 --- a/src/main.py +++ b/src/main.py @@ -4,14 +4,13 @@ import pyqtgraph as pg from PyQt5 import QtWidgets from gui.mainGui import MainWindow -from controller.monitor import DirectoryMonitor +from src.controller.file_manager import DirectoryMonitor from controller.mediator import Mediator from controller.converter import DataConverter from gui.plotter import PlotWidget from controller.controller import Controller from controller.passportFormer import PassportFormer -# TODO: Актуализировать requirements.txt!!! Делать это регулярно после добавления новых библиотек! # TODO: Именование модулей: lowercase / snake_case. def main(): @@ -27,13 +26,13 @@ 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) - controller.signal_seeking_mode.connect(monitor.start_seeking) - controller.signal_update_plots.connect(monitor.update_plots) + controller.signal_progress_bar.connect(window.update_progressBar) + controller.signal_status_text.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) + #controller.signal_seeking_mode.connect(monitor.start_seeking) + #controller.signal_update_plots.connect(monitor.update_plots) sys.exit(app.exec_())