reservedLabeledSelectionExtent static method

double? reservedLabeledSelectionExtent({
  1. required List<M3EToolbarItem> inline,
  2. required Axis axis,
  3. required double iconVisualExtent,
  4. required double iconSlotExtent,
  5. required TextStyle labelStyle,
  6. required TextScaler textScaler,
  7. required double gap,
  8. required double labelGap,
  9. bool includeOverflowSlot = false,
})

Fixed pill width for labeled selection when the outer pill should not grow/shrink: widest (icon+label) action + icon-only neighbors + gaps.

Returns null when reservation does not apply (no labeled actions, or inline widgets that cannot be measured cheaply).

iconSlotExtent must be the laid-out icon-only width (max(visual, target)), matching the icon button outer size.

For Axis.horizontal this is the full row main-axis extent. For Axis.vertical it is the column cross-axis width (widest expanded action) — labels expand horizontally even in a vertical toolbar.

Implementation

static double? reservedLabeledSelectionExtent({
  required List<M3EToolbarItem> inline,
  required Axis axis,
  required double iconVisualExtent,
  required double iconSlotExtent,
  required TextStyle labelStyle,
  required TextScaler textScaler,
  required double gap,
  required double labelGap,
  bool includeOverflowSlot = false,
}) {
  final metrics = _labeledSelectionMetrics(
    inline: inline,
    iconVisualExtent: iconVisualExtent,
    iconSlotExtent: iconSlotExtent,
    labelStyle: labelStyle,
    textScaler: textScaler,
    labelGap: labelGap,
  );
  if (metrics == null) {
    return null;
  }
  final slotCount = metrics.slotCount + (includeOverflowSlot ? 1 : 0);
  if (metrics.labeledCount == 0 || slotCount == 0) {
    return null;
  }
  if (axis == Axis.vertical) {
    return metrics.maxExpanded;
  }
  return metrics.maxExpanded +
      (slotCount - 1) * iconSlotExtent +
      (slotCount - 1) * gap;
}