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;
  final customHash = Object.hashAll(
    customMetrics.entries.map((e) => Object.hash(e.key, e.value)),
  );

  // Use cached panel if metrics haven't changed
  if (_cachedPanel != null &&
      _cachedMetricsFrame == currentFrame &&
      _cachedPanelWidth == panelWidth &&
      _cachedCustomMetricsHash == customHash) {
    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 = StringBuffer()
    ..writeln(
      '${label.render('FPS:')} ${avgFps.toStringAsFixed(1)} '
      '(${m?.minFps.toStringAsFixed(0) ?? 0}-${m?.maxFps.toStringAsFixed(0) ?? 0})',
    )
    ..writeln(
      '${label.render('Frame Time:')} ${(avgFrameTimeUs / 1000).toStringAsFixed(2)}ms',
    )
    ..writeln(
      '${label.render('Render Time:')} $avgRenderTimeUsµs '
      '(${renderPct.toStringAsFixed(1)}%)',
    )
    ..writeln(
      '${label.render('Frames:')} $frameCount (skipped: $skippedFrames)',
    )
    ..writeln('${label.render('Cells:')} ${terminalWidth * terminalHeight}')
    ..writeln('${label.render('Renderer:')} $rendererLabel');

  for (final entry in customMetrics.entries) {
    content.writeln('${label.render('${entry.key}:')} ${entry.value}');
  }

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

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

  return rendered;
}