53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
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)
|