69 lines
2.0 KiB
Python
69 lines
2.0 KiB
Python
"""
|
|
Debug Panel - Real-time debugging information in TUI
|
|
"""
|
|
|
|
from textual.widget import Widget
|
|
from textual.containers import Vertical
|
|
from textual.widgets import Static
|
|
from rich.text import Text
|
|
from rich.console import RenderableType
|
|
from typing import Optional, List
|
|
from datetime import datetime
|
|
|
|
|
|
class DebugPanel(Vertical):
|
|
"""Debug panel showing real-time flow selection and logic information"""
|
|
|
|
DEFAULT_CSS = """
|
|
DebugPanel {
|
|
height: 1fr;
|
|
padding: 1;
|
|
background: #1a1a1a;
|
|
border: solid #ff0080;
|
|
}
|
|
|
|
DebugPanel Static {
|
|
margin-bottom: 0;
|
|
}
|
|
"""
|
|
|
|
def __init__(self, **kwargs):
|
|
super().__init__(**kwargs)
|
|
self.debug_messages = []
|
|
self.max_messages = 20
|
|
|
|
def compose(self):
|
|
"""Create the debug panel layout"""
|
|
yield Static("DEBUG PANEL", classes="panel-header")
|
|
yield Static(
|
|
"Waiting for flow selection...",
|
|
id="debug-content"
|
|
)
|
|
|
|
def add_debug_message(self, message: str) -> None:
|
|
"""Add a debug message with timestamp"""
|
|
timestamp = datetime.now().strftime("%H:%M:%S.%f")[:-3]
|
|
full_message = f"[{timestamp}] {message}"
|
|
|
|
self.debug_messages.append(full_message)
|
|
if len(self.debug_messages) > self.max_messages:
|
|
self.debug_messages.pop(0)
|
|
|
|
self._update_display()
|
|
|
|
def _update_display(self) -> None:
|
|
"""Update the debug display with recent messages"""
|
|
content_widget = self.query_one("#debug-content", Static)
|
|
|
|
if not self.debug_messages:
|
|
content_widget.update("No debug messages yet...")
|
|
return
|
|
|
|
# Show recent messages, newest at bottom
|
|
display_text = "\n".join(self.debug_messages[-15:]) # Show last 15 messages
|
|
content_widget.update(Text(display_text, style="white"))
|
|
|
|
def clear_messages(self) -> None:
|
|
"""Clear all debug messages"""
|
|
self.debug_messages.clear()
|
|
self._update_display() |