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): class BaseController(QObject):
def __init__(self, def __init__(self,
mediator: Optional[BaseMediator] = None): mediator: Optional[BaseMediator] = None,
file_manager: Optional[BaseFileManager] = None):
self._mediator = mediator self._mediator = mediator
self._file_manager = file_manager
def send_widgets(self, widgets: list[QWidget]) -> None: def send_widgets(self, widgets: list[QWidget]) -> None:
... ...
@ -374,12 +376,7 @@ class BaseController(QObject):
def update_settings(self, settings: list[dict]) -> None: def update_settings(self, settings: list[dict]) -> None:
... ...
def raport_mode (self) -> None: def set_working_mode(self, mode:int) -> None:
# TODO: обычно в названиях методов должен присутствовать глагол.
...
def seeking_mode(self) -> None:
# TODO: обычно в названиях методов должен присутствовать глагол.
... ...
def open_file(self, filepath: str) -> None: def open_file(self, filepath: str) -> None:
@ -388,7 +385,10 @@ class BaseController(QObject):
def update_plots(self) -> None: 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 @property
@ -399,6 +399,14 @@ class BaseController(QObject):
def mediator(self, mediator: BaseMediator) -> None: def mediator(self, mediator: BaseMediator) -> None:
self._mediator = mediator 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: class BaseFileManager:
@ -429,6 +437,18 @@ class BaseFileManager:
def monitor(self, monitor: BaseDirectoryMonitor) -> None: def monitor(self, monitor: BaseDirectoryMonitor) -> None:
self._monitor = monitor 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]): def add_new_paths(self, paths:list[str]):
... ...

View File

@ -7,47 +7,31 @@ from base.base import BaseController
class Controller(BaseController): class Controller(BaseController):
signal_widgets = pyqtSignal(list) signal_widgets = pyqtSignal(list)
signal_settings = pyqtSignal(list) signal_progress_bar = pyqtSignal(int)
signal_open_file = pyqtSignal(str) signal_status_text = pyqtSignal(str)
signal_statusBar = pyqtSignal(int)
signal_statusText = pyqtSignal(str) def update_settings(self, settings: list[dict]) -> None:
signal_raport_mode = pyqtSignal() self.mediator.notify(settings)
signal_seeking_mode = pyqtSignal()
signal_update_plots = pyqtSignal() # 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: def send_widgets(self, widgets: list[QWidget]) -> None:
self.signal_widgets.emit(widgets) self.signal_widgets.emit(widgets)
def update_settings(self, settings: list[dict]) -> None: def update_status(self, msg:str) -> None:
# TODO: Почему контроллеру просто не сообщить о медиаторе, и ему сообщать что-то через notify? Тем более, что self.signal_status_text.emit(msg)
# медиатор уже знает про контроллер...
self.signal_settings.emit(settings) def update_progress(self, progress:int) -> None:
self.signal_progress_bar.emit(progress)
# TODO: Объедини переключение режимов в один метод, и по входному аргументу (например 1 и 2) переключай их.
def raport_mode(self) -> None:
self.signal_raport_mode.emit()
def seeking_mode(self) -> None:
self.signal_seeking_mode.emit()
def open_file(self, filepath: str) -> None:
# TODO: Где тут открытие файла?
self.signal_open_file.emit(filepath)
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,21 +38,23 @@ class DirectoryMonitor(BaseDirectoryMonitor):
class FileManager(BaseFileManager): class FileManager(BaseFileManager):
def update_plots(self): def replot_all(self) -> None:
if self._paths_library is not None: if self._paths_library is not None:
self._mediator.notify(self, list(self._paths_library)) 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._paths_library.add(path)
self._mediator.notify(self, [path if path else '']) self._mediator.notify(self, [path if path else ''])
def start_raport_mode(self) -> None: def set_mode(self, num:int) -> None:
match num:
case 1: # Режим создания отчета
self._monitor.stop() self._monitor.stop()
self._paths_library.clear() self._paths_library.clear()
self._paths_library.add('') self._paths_library.add('')
self._mediator.notify(self, list(self._paths_library)) self._mediator.notify(self, list(self._paths_library))
def start_seeking_mode(self) -> None: case 2: # Режим онлайн-мониторинга папки
self._monitor.init_state() self._monitor.init_state()
self._monitor.start() self._monitor.start()

View File

@ -5,38 +5,35 @@ from PyQt5.QtWidgets import QWidget
from base.base import (BaseMediator, BaseDirectoryMonitor, from base.base import (BaseMediator, BaseDirectoryMonitor,
BaseDataConverter, BasePlotWidget, BaseDataConverter, BasePlotWidget,
BasePointPassportFormer) BasePointPassportFormer,
BaseController)
class Mediator(BaseMediator): class Mediator(BaseMediator):
def notify(self, def notify(self,
source: Union[BaseDirectoryMonitor, BaseDataConverter, BasePointPassportFormer, BasePlotWidget], source: Union[BaseDirectoryMonitor, BaseDataConverter, BasePointPassportFormer, BasePlotWidget, BaseController],
data: Union[list[str], list[pd.DataFrame], list[list], list[QWidget]]): data: Union[list[str], list[pd.DataFrame], list[list], list[QWidget], list[dict]]):
if issubclass(source.__class__, BaseDirectoryMonitor): if issubclass(source.__class__, BaseDirectoryMonitor):
self._controller.update_status("CSV found! Calculating...") self._controller.update_status("CSV found! Calculating...")
self._converter.convert_data(data) self._converter.convert_data(data)
if issubclass(source.__class__, BaseDataConverter): if issubclass(source.__class__, BaseDataConverter):
self._controller.update_status(1) self._controller.update_progress(1)
self._passportFormer.form_passports(data) self._passportFormer.form_passports(data)
if issubclass(source.__class__, BasePointPassportFormer): if issubclass(source.__class__, BasePointPassportFormer):
self._controller.update_status(2) self._controller.update_progress(2)
self._plot.build(data) self._plot.build(data)
if issubclass(source.__class__, BasePlotWidget): if issubclass(source.__class__, BasePlotWidget):
self._controller.update_status(100) self._controller.update_progress(100)
self._controller.send_widgets(data) self._controller.send_widgets(data)
def update_settings(self, settings: list[dict]): if issubclass(source.__class__, BaseController):
# TODO: А дописать self.notify не? self._file_manager.update_monitor_settings(data)
# if issubclass(source.__class__, BaseController): self._passportFormer.update_settings(data)
# self._monitor.update_settings(data)
# self._passportFormer.update_settings(data)
self._monitor.update_settings(settings)
self._passportFormer.update_settings(settings)

View File

@ -4,14 +4,13 @@ import pyqtgraph as pg
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from gui.mainGui import MainWindow from gui.mainGui import MainWindow
from controller.monitor import DirectoryMonitor from src.controller.file_manager import DirectoryMonitor
from controller.mediator import Mediator from controller.mediator import Mediator
from controller.converter import DataConverter from controller.converter import DataConverter
from gui.plotter import PlotWidget from gui.plotter import PlotWidget
from controller.controller import Controller from controller.controller import Controller
from controller.passportFormer import PassportFormer from controller.passportFormer import PassportFormer
# TODO: Актуализировать requirements.txt!!! Делать это регулярно после добавления новых библиотек!
# TODO: Именование модулей: lowercase / snake_case. # TODO: Именование модулей: lowercase / snake_case.
def main(): def main():
@ -27,13 +26,13 @@ def main():
window.show() window.show()
controller.signal_widgets.connect(window.show_plot_tabs) controller.signal_widgets.connect(window.show_plot_tabs)
controller.signal_statusBar.connect(window.update_progressBar) controller.signal_progress_bar.connect(window.update_progressBar)
controller.signal_statusText.connect(window.update_stateLabel) controller.signal_status_text.connect(window.update_stateLabel)
controller.signal_settings.connect(mediator.update_settings) #controller.signal_settings.connect(mediator.update_settings)
controller.signal_open_file.connect(monitor.custom_csv_extract_only) #controller.signal_open_file.connect(monitor.custom_csv_extract_only)
controller.signal_raport_mode.connect(monitor.start_raport) #controller.signal_raport_mode.connect(monitor.start_raport)
controller.signal_seeking_mode.connect(monitor.start_seeking) #controller.signal_seeking_mode.connect(monitor.start_seeking)
controller.signal_update_plots.connect(monitor.update_plots) #controller.signal_update_plots.connect(monitor.update_plots)
sys.exit(app.exec_()) sys.exit(app.exec_())