debugFillProperties method

void debugFillProperties(
  1. DiagnosticPropertiesBuilder properties
)

Add debugging information for the inline formatting context.

Implementation

void debugFillProperties(DiagnosticPropertiesBuilder properties) {
  properties.add(DiagnosticsProperty<RenderLayoutBox>('container', container));
  properties.add(IntProperty('items', _items.length));
  properties.add(StringProperty('textContent', _textContent, showName: true, quoted: true, ifEmpty: '<empty>'));
  properties.add(
      FlagProperty('needsCollectInlines', value: _needsCollectInlines, ifTrue: 'needs collect', ifFalse: 'ready'));

  // Add inline item details with visual formatting
  if (_items.isNotEmpty) {
    // Create a visual representation of inline items
    final itemsDescription = <String>[];
    final itemTypeCounts = <String, int>{};

    for (int i = 0; i < _items.length; i++) {
      final item = _items[i];
      final typeStr = item.type.toString().split('.').last;
      itemTypeCounts[typeStr] = (itemTypeCounts[typeStr] ?? 0) + 1;

      // Build visual representation
      String itemStr = '';
      switch (item.type) {
        case InlineItemType.text:
          final text = item.getText(_textContent);
          final truncatedText = text.length > 20 ? '${text.substring(0, 20)}...' : text;
          itemStr = '[TEXT: "$truncatedText" (${item.length} chars)]';
          break;
        case InlineItemType.openTag:
          itemStr = '[OPEN: <${_getElementDescription(item.renderBox)}>]';
          break;
        case InlineItemType.closeTag:
          itemStr = '[CLOSE: </${_getElementDescription(item.renderBox)}>]';
          break;
        case InlineItemType.atomicInline:
          itemStr = '[ATOMIC: ${_getElementDescription(item.renderBox)}]';
          break;
        case InlineItemType.lineBreakOpportunity:
          itemStr = '[BREAK]';
          break;
        case InlineItemType.bidiControl:
          itemStr = '[BIDI: level=${item.bidiLevel}]';
          break;
        default:
          itemStr = '[${typeStr.toUpperCase()}]';
      }

      if (i < 10) {
        // Show first 10 items
        itemsDescription.add(itemStr);
      } else if (i == 10) {
        itemsDescription.add('... ${_items.length - 10} more items');
        break;
      }
    }

    properties.add(DiagnosticsProperty<List<String>>(
      'inlineItems',
      itemsDescription,
      style: DiagnosticsTreeStyle.truncateChildren,
    ));

    properties.add(DiagnosticsProperty<Map<String, int>>(
      'itemSummary',
      itemTypeCounts,
      style: DiagnosticsTreeStyle.sparse,
    ));
  }

  // Add paragraph line information (legacy line boxes removed)
  if (_paraLines.isNotEmpty) {
    final lines = <String>[];
    double totalHeight = 0;
    for (int i = 0; i < _paraLines.length && i < 5; i++) {
      final lm = _paraLines[i];
      totalHeight += lm.height;
      lines.add('Line ${i + 1}: w=${lm.width.toStringAsFixed(1)}, h=${lm.height.toStringAsFixed(1)}, '
          'baseline=${lm.baseline.toStringAsFixed(1)}');
    }
    if (_paraLines.length > 5) {
      lines.add('... ${_paraLines.length - 5} more lines');
    }
    properties.add(
        DiagnosticsProperty<List<String>>('paragraphLines', lines, style: DiagnosticsTreeStyle.truncateChildren));
    final layoutMetrics = <String, String>{
      'totalLines': _paraLines.length.toString(),
      'totalHeight': totalHeight.toStringAsFixed(1),
      'avgLineHeight': (_paraLines.isEmpty ? 0 : totalHeight / _paraLines.length).toStringAsFixed(1),
    };
    properties.add(
        DiagnosticsProperty<Map<String, String>>('layoutMetrics', layoutMetrics, style: DiagnosticsTreeStyle.sparse));
  }

  // Add bidi information if present
  final bidiLevels = <int>{};
  for (final item in _items) {
    if (item.bidiLevel > 0) {
      bidiLevels.add(item.bidiLevel);
    }
  }
  if (bidiLevels.isNotEmpty) {
    properties.add(DiagnosticsProperty<Set<int>>(
      'bidiLevels',
      bidiLevels,
      style: DiagnosticsTreeStyle.singleLine,
    ));
  }

  // Add detailed visual debugging if items and line boxes are available
  if (_items.isNotEmpty && _paraLines.isNotEmpty) {
    final debugger = InlineLayoutDebugger(this);
    debugger.debugFillProperties(properties);
  }
}