1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
"""
ui/windows/debug_window.py
DEBUG window — developer-mode only.
Minimal first pass: a live console showing everything the app has printed
via core.debug_log (stdout/stderr tee), so debugging doesn't require a
terminal. Not wired to any other diagnostics yet — extend as needed.
"""
from PyQt6.QtWidgets import (
QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton,
QTextEdit, QFrame,
)
from PyQt6.QtCore import Qt, pyqtSignal
from PyQt6.QtGui import QFont, QCloseEvent
from core.debug_log import get_broadcaster, get_history
class DebugWindow(QWidget):
closed = pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent, Qt.WindowType.Window | Qt.WindowType.Tool)
self.setWindowTitle("Debug")
self.setMinimumSize(560, 420)
self.resize(700, 500)
self._build()
broadcaster = get_broadcaster()
if broadcaster is not None:
broadcaster.line_written.connect(self._append)
def _build(self):
root = QVBoxLayout(self); root.setContentsMargins(0, 0, 0, 0); root.setSpacing(0)
hdr = QWidget(); hdr.setObjectName("devWindowTitleBar"); hdr.setFixedHeight(44)
hl = QHBoxLayout(hdr); hl.setContentsMargins(14, 0, 14, 0)
title = QLabel("DEBUG"); title.setObjectName("devWindowTitle")
hl.addWidget(title, 1)
clear_btn = QPushButton("Clear"); clear_btn.setObjectName("configButton")
clear_btn.clicked.connect(lambda: self._console.clear())
hl.addWidget(clear_btn)
root.addWidget(hdr)
div = QFrame(); div.setFrameShape(QFrame.Shape.HLine)
div.setObjectName("devWindowDivider"); root.addWidget(div)
self._console = QTextEdit(); self._console.setObjectName("codeEditor")
self._console.setReadOnly(True)
mono = QFont("IBM Plex Mono, Consolas, Monospace")
mono.setStyleHint(QFont.StyleHint.Monospace)
self._console.setFont(mono)
self._console.setPlainText(get_history())
self._console.verticalScrollBar().setValue(self._console.verticalScrollBar().maximum())
root.addWidget(self._console, 1)
def _append(self, text: str):
self._console.insertPlainText(text)
sb = self._console.verticalScrollBar()
sb.setValue(sb.maximum())
def closeEvent(self, e: QCloseEvent):
self.closed.emit(); e.accept()
|