- Fixed DataTable row selection and event handling - Added explicit column keys to prevent auto-generated keys - Implemented row-to-flow mapping for reliable selection tracking - Converted left metrics panel to horizontal top bar - Fixed all missing FlowStats/EnhancedAnalysisData attributes - Created comprehensive Textual API documentation in Documentation/textual/ - Added validation checklist to prevent future API mismatches - Preserved cursor position during data refreshes - Fixed RowKey type handling and event names The TUI now properly handles flow selection, displays metrics in a compact top bar, and correctly correlates selected rows with the details pane.
4.5 KiB
4.5 KiB
TipTop Design Insights for StreamLens Textual UI
Key Design Patterns from TipTop
1. Multi-Column Layout with Graphs
TipTop uses a clean multi-column layout:
- Left column: System info and CPU details
- Center column: Real-time graphs (CPU, Memory, Disk, Network)
- Right column: Process list with live updates
2. Real-Time Sparkline Charts
- CPU usage shown as percentage with sparkline history
- Memory usage with bar visualization
- Disk I/O with read/write graphs
- Network traffic with up/down visualization
3. Color-Coded Information
- Green for normal values
- Yellow/Orange for warnings
- Red for critical values
- Subtle color gradients in graphs
4. Compact Information Display
- Multiple metrics per line (e.g., "CPU: 23.4% | Temp: 45°C")
- Efficient use of terminal space
- Clear visual hierarchy
5. Live Process Monitoring
- Sortable process list
- Real-time updates
- Resource usage per process
Application to StreamLens
Enhanced Flow Analysis View
# Inspired by TipTop's layout
class FlowAnalysisEnhanced(Container):
def compose(self):
# Left panel: Flow summary with sparklines
with Vertical(id="flow-summary", classes="column"):
yield Static("Flow Overview", classes="header")
yield FlowMetricsPanel() # Total flows, packets, volume
yield SparklineChart(id="flow-rate") # Flows/sec graph
# Center panel: Main flow table with mini-graphs
with Vertical(id="flow-table", classes="column-wide"):
yield EnhancedFlowTable() # DataTable with inline sparklines
# Right panel: Selected flow details
with Vertical(id="flow-details", classes="column"):
yield Static("Flow Details", classes="header")
yield FlowTimingChart() # Inter-arrival timing graph
yield ProtocolBreakdown() # Pie chart of protocols
Real-Time Metrics with Sparklines
class FlowSparkline(Widget):
"""Mini inline chart for flow metrics"""
def render(self) -> Text:
# Create ASCII sparkline like TipTop
values = self.get_recent_values()
spark = self.create_sparkline(values)
return Text(f"Rate: {self.current_rate:>6.1f} pps {spark}")
Enhanced DataTable Row Format
Instead of static columns, include inline visualizations:
Flow Source Proto Destination Volume Rate Quality Timing Graph
1 192.168.1.1:80 TCP 10.0.0.1:443 1.2GB ████ 95% ▁▃▅▇█▅▃▁
2 10.0.0.2:53 UDP 8.8.8.8:53 450MB ██░░ 87% ▇▇▅▃▁▁▃▅
Color-Coded Quality Indicators
def get_quality_style(quality: float) -> str:
if quality >= 90:
return "bold green"
elif quality >= 70:
return "yellow"
else:
return "bold red"
Live Update Pattern
class StreamLensApp(App):
def on_mount(self):
# TipTop-style periodic updates
self.set_interval(0.5, self.update_metrics) # 2Hz for smooth graphs
self.set_interval(1.0, self.update_flows) # 1Hz for flow data
def update_metrics(self):
# Update sparklines and real-time graphs
for widget in self.query(SparklineChart):
widget.add_data_point()
Compact Header Bar
StreamLens | Flows: 127 | Packets: 1.2M/s | Volume: 845MB/s | Enhanced: 12 | Outliers: 3
CSS Styling Inspired by TipTop
/* Dark theme with accent colors */
Screen {
background: $surface;
}
.column {
width: 25%;
padding: 1;
border: solid $primary-lighten-3;
}
.column-wide {
width: 1fr;
padding: 1;
}
SparklineChart {
height: 3;
border: none;
}
.metric-good { color: $success; }
.metric-warning { color: $warning; }
.metric-critical { color: $error; }
/* Subtle animations for live updates */
.updating {
background: $primary 10%;
transition: background 200ms;
}
Implementation Priority
- Phase 1: Add sparkline charts to flow table
- Phase 2: Create multi-column layout with live metrics
- Phase 3: Implement inline bar charts for volume/quality
- Phase 4: Add color-coded alerts and thresholds
- Phase 5: Create smooth animations for updates
Benefits
- Information Density: Show more data in less space
- Visual Clarity: Instant understanding of trends
- Professional Look: Modern monitoring aesthetic
- User Experience: Smooth, responsive interface
- Real-Time Insight: Immediate visibility of changes