chore: переработан контроллер
This commit is contained in:
parent
16910133ac
commit
2ca5034c45
@ -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]):
|
||||||
...
|
...
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
|
||||||
|
|
||||||
|
|
||||||
@ -38,23 +38,25 @@ 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:
|
||||||
self._monitor.stop()
|
match num:
|
||||||
self._paths_library.clear()
|
case 1: # Режим создания отчета
|
||||||
self._paths_library.add('')
|
self._monitor.stop()
|
||||||
self._mediator.notify(self, list(self._paths_library))
|
self._paths_library.clear()
|
||||||
|
self._paths_library.add('')
|
||||||
|
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()
|
||||||
|
|
||||||
def update_monitor_settings(self, settings:list[dict]) -> None:
|
def update_monitor_settings(self, settings:list[dict]) -> None:
|
||||||
_, system_params = settings
|
_, system_params = settings
|
||||||
@ -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)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
17
src/main.py
17
src/main.py
@ -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_())
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user