debugFillProperties method
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);
}
}