panel method

String panel({
  1. int? terminalWidthOverride,
})

Renders just the debug panel (cached for performance).

Implementation

String panel({int? terminalWidthOverride}) {
  final m = metrics;
  final currentFrame = m?.frameCount ?? 0;

  // Use cached panel if metrics haven't changed
  if (_cachedPanel != null &&
      _cachedMetricsFrame == currentFrame &&
      _cachedPanelWidth == panelWidth) {
    return _cachedPanel!;
  }

  final label = Style().foreground(Colors.yellow).bold();
  final avgFps = m?.averageFps ?? 0.0;
  final avgFrameTimeUs = m?.averageFrameTime.inMicroseconds ?? 0;
  final avgRenderTimeUs = m?.averageRenderDuration.inMicroseconds ?? 0;
  final frameCount = m?.frameCount ?? 0;
  final skippedFrames = m?.skippedFrames ?? 0;
  final renderPct = m?.renderTimePercentage ?? 0.0;

  final content =
      '${label.render('FPS:')} ${avgFps.toStringAsFixed(1)} (${m?.minFps.toStringAsFixed(0) ?? 0}-${m?.maxFps.toStringAsFixed(0) ?? 0})\n'
      '${label.render('Frame Time:')} ${(avgFrameTimeUs / 1000).toStringAsFixed(2)}ms\n'
      '${label.render('Render Time:')} $avgRenderTimeUsµs (${renderPct.toStringAsFixed(1)}%)\n'
      '${label.render('Frames:')} $frameCount (skipped: $skippedFrames)\n'
      '${label.render('Cells:')} ${terminalWidth * terminalHeight}\n'
      '${label.render('Renderer:')} $rendererLabel';

  final rendered = PanelComponent(
    title: title,
    content: content,
    width: panelWidth,
    renderConfig: RenderConfig(
      terminalWidth: terminalWidthOverride ?? terminalWidth,
    ),
  ).render();

  // Cache the result
  _cachedPanel = rendered;
  _cachedMetricsFrame = currentFrame;
  _cachedPanelWidth = panelWidth;
  final lines = rendered.split('\n');
  _cachedPanelHeight = lines.length;

  return rendered;
}