From e1316076bf6681522c159450cdbff06738f11160 Mon Sep 17 00:00:00 2001 From: LemonNexus Date: Sun, 8 Feb 2026 22:14:52 +0000 Subject: [PATCH] fix(gui): logging methods don't depend on log_watcher - log_debug/info/warning/error now use _append_log directly - Avoids AttributeError when log_watcher is None during init - LogWatcher is only used for game events, not UI logging --- ui/main_window.py | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/ui/main_window.py b/ui/main_window.py index d107609..bb28194 100644 --- a/ui/main_window.py +++ b/ui/main_window.py @@ -1142,39 +1142,36 @@ class MainWindow(QMainWindow): def log_debug(self, source: str, message: str): """Log a debug message.""" - self.log_watcher.emit(LogEvent( - timestamp=datetime.now(), - level="DEBUG", - source=source, - message=message - )) + self._append_log("DEBUG", source, message) def log_info(self, source: str, message: str): """Log an info message.""" - self.log_watcher.emit(LogEvent( - timestamp=datetime.now(), - level="INFO", - source=source, - message=message - )) + self._append_log("INFO", source, message) def log_warning(self, source: str, message: str): """Log a warning message.""" - self.log_watcher.emit(LogEvent( - timestamp=datetime.now(), - level="WARNING", - source=source, - message=message - )) + self._append_log("WARNING", source, message) def log_error(self, source: str, message: str): """Log an error message.""" - self.log_watcher.emit(LogEvent( - timestamp=datetime.now(), - level="ERROR", - source=source, - message=message - )) + self._append_log("ERROR", source, message) + + def _append_log(self, level: str, source: str, message: str): + """Append log message to output.""" + timestamp = datetime.now().strftime("%H:%M:%S") + color = { + "DEBUG": "#888888", + "INFO": "#4caf50", + "WARNING": "#ff9800", + "ERROR": "#f44336" + }.get(level, "#ffffff") + + log_entry = f'[{timestamp}] [{level}] [{source}] {self.escape_html(message)}' + self.log_output.append(log_entry) + + # Auto-scroll to bottom + scrollbar = self.log_output.verticalScrollBar() + scrollbar.setValue(scrollbar.maximum()) def escape_html(self, text: str) -> str: """Escape HTML special characters."""