from __future__ import annotations import logging from PySide6.QtCore import QObject, Signal from bedit_gui.services.application_logging import configure_logging from bedit_gui.views.main_window import MainWindow from bedit_gui.views.simulation_window import SimulationWindow from bedit_gui.views.models import LogListModel class _LogEmitter(QObject): message = Signal(str) class _QtLogHandler(logging.Handler): def __init__(self, emitter: _LogEmitter) -> None: super().__init__() self._emitter = emitter def emit(self, record: logging.LogRecord) -> None: try: self._emitter.message.emit(self.format(record)) except (RuntimeError, TypeError, ValueError): self.handleError(record) class LogController(QObject): """Routes standard application log records into the log list view.""" def __init__( self, window: MainWindow | SimulationWindow, level: int | str = logging.INFO, ) -> None: super().__init__(window) self.model = LogListModel() self.emitter = _LogEmitter(self) self.handler = _QtLogHandler(self.emitter) self.handler.setFormatter( logging.Formatter( "%(asctime)s %(levelname)s %(message)s", datefmt="%H:%M:%S", ) ) self.emitter.message.connect(self.model.append) self.model.rowsInserted.connect(window.ui.listView.scrollToBottom) window.ui.listView.setModel(self.model) configure_logging(self.handler, level)