chore: переработан контроллер

This commit is contained in:
Andrew 2025-01-21 16:45:53 +03:00
parent 16910133ac
commit 2ca5034c45
5 changed files with 80 additions and 78 deletions

View File

@ -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]):
...

View File

@ -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)

View File

@ -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]

View File

@ -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)

View File

@ -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_())