good layout
This commit is contained in:
@@ -20,6 +20,7 @@ from .widgets.sparkline import SparklineWidget
|
||||
from .widgets.metric_card import MetricCard
|
||||
from .widgets.flow_table_v2 import EnhancedFlowTable
|
||||
from .widgets.split_flow_details import FlowMainDetailsPanel, SubFlowDetailsPanel
|
||||
from .widgets.debug_panel import DebugPanel
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from ...analysis.core import EthernetAnalyzer
|
||||
@@ -59,6 +60,7 @@ class StreamLensAppV2(App):
|
||||
bytes_per_sec = reactive(0.0)
|
||||
enhanced_flows = reactive(0)
|
||||
outlier_count = reactive(0)
|
||||
debug_visible = reactive(False) # Hide debug panel for now
|
||||
|
||||
# Update timers
|
||||
metric_timer: Timer = None
|
||||
@@ -90,7 +92,7 @@ class StreamLensAppV2(App):
|
||||
yield MetricCard("Enhanced", f"{self.enhanced_flows}", color="success", id="enhanced-metric")
|
||||
yield MetricCard("Outliers", f"{self.outlier_count}", color="warning" if self.outlier_count > 0 else "normal", id="outliers-metric")
|
||||
|
||||
# Main content area with 3 clean panels
|
||||
# Main content area with conditional debug panel
|
||||
with Horizontal(id="content-area"):
|
||||
# Left - Enhanced flow table
|
||||
yield EnhancedFlowTable(
|
||||
@@ -99,15 +101,32 @@ class StreamLensAppV2(App):
|
||||
classes="panel-wide"
|
||||
)
|
||||
|
||||
# Right top - Main flow details
|
||||
with Vertical(id="right-panels"):
|
||||
# Middle - Flow details
|
||||
with Vertical(id="flow-panels"):
|
||||
yield FlowMainDetailsPanel(id="main-flow-details")
|
||||
yield SubFlowDetailsPanel(id="sub-flow-details")
|
||||
|
||||
# Right - Debug panel (conditionally visible)
|
||||
if self.debug_visible:
|
||||
yield DebugPanel(id="debug-panel")
|
||||
|
||||
yield Footer()
|
||||
|
||||
def on_mount(self) -> None:
|
||||
"""Initialize the application with TipTop-style updates"""
|
||||
try:
|
||||
debug_panel = self.query_one("#debug-panel", DebugPanel)
|
||||
debug_panel.add_debug_message("APP: Application mounted, checking panels...")
|
||||
|
||||
try:
|
||||
main_panel = self.query_one("#main-flow-details", FlowMainDetailsPanel)
|
||||
sub_panel = self.query_one("#sub-flow-details", SubFlowDetailsPanel)
|
||||
debug_panel.add_debug_message("APP: Both panels found successfully")
|
||||
except Exception as e:
|
||||
debug_panel.add_debug_message(f"APP: Panel query failed: {e}")
|
||||
except:
|
||||
pass # Debug panel not visible
|
||||
|
||||
self.update_metrics()
|
||||
|
||||
# Set up update intervals like TipTop
|
||||
@@ -239,6 +258,13 @@ class StreamLensAppV2(App):
|
||||
|
||||
def on_enhanced_flow_table_flow_selected(self, event: EnhancedFlowTable.FlowSelected) -> None:
|
||||
"""Handle flow selection events"""
|
||||
try:
|
||||
debug_panel = self.query_one("#debug-panel", DebugPanel)
|
||||
flow_info = f"{event.flow.src_ip}:{event.flow.src_port}" if event.flow else "None"
|
||||
debug_panel.add_debug_message(f"APP: Flow selected - {flow_info}, subflow={event.subflow_type}")
|
||||
except:
|
||||
pass # Debug panel not visible
|
||||
|
||||
if event.flow:
|
||||
# Update main flow details panel
|
||||
main_panel = self.query_one("#main-flow-details", FlowMainDetailsPanel)
|
||||
|
||||
Reference in New Issue
Block a user