56 lines
1.7 KiB
Python
56 lines
1.7 KiB
Python
from __future__ import annotations
|
|
|
|
from collections.abc import Callable
|
|
from typing import Protocol
|
|
|
|
from PySide6.QtCore import QObject
|
|
from PySide6.QtWidgets import QDialog
|
|
|
|
from bedit_gui.services.application_logging import get_logger, set_log_level
|
|
from bedit_gui.services.application_settings import ApplicationSettings
|
|
from bedit_gui.views.dialogs.settings_dialog import SettingsDialog
|
|
from bedit_gui.views.main_window import MainWindow
|
|
|
|
logger = get_logger(__name__)
|
|
|
|
|
|
class SettingsDialogLike(Protocol):
|
|
@property
|
|
def log_level(self) -> int: ...
|
|
|
|
@property
|
|
def snap_to_grid_size(self) -> int: ...
|
|
|
|
def exec(self) -> int: ...
|
|
|
|
|
|
SettingsDialogFactory = Callable[[int, int, MainWindow], SettingsDialogLike]
|
|
|
|
|
|
class SettingsController(QObject):
|
|
"""Opens the settings dialog and applies accepted preferences."""
|
|
|
|
def __init__(
|
|
self,
|
|
window: MainWindow,
|
|
settings: ApplicationSettings,
|
|
dialog_factory: SettingsDialogFactory = SettingsDialog,
|
|
) -> None:
|
|
super().__init__(window)
|
|
self.window = window
|
|
self.settings = settings
|
|
self.dialog_factory = dialog_factory
|
|
|
|
window.ui.actionSettings.triggered.connect(self.open_settings)
|
|
|
|
def open_settings(self) -> None:
|
|
dialog = self.dialog_factory(self.settings.log_level, self.settings.snap_to_grid_size, self.window)
|
|
if dialog.exec() != QDialog.DialogCode.Accepted:
|
|
return
|
|
|
|
self.settings.log_level = dialog.log_level
|
|
self.settings.snap_to_grid_size = dialog.snap_to_grid_size
|
|
self.window.graph_editor.set_snap_to_grid_size(dialog.snap_to_grid_size)
|
|
set_log_level(dialog.log_level)
|
|
logger.info("Application settings updated")
|