partitionInline static method

({List<M3EToolbarItem> inline, List<M3EToolbarAction> overflow}) partitionInline({
  1. required List<M3EToolbarItem> items,
  2. required int maxInline,
  3. int? triggerIndex,
})

Keeps all widgets inline; only excess non-trigger actions overflow.

Returns (inline, overflowActions) preserving relative order in inline.

Implementation

static ({List<M3EToolbarItem> inline, List<M3EToolbarAction> overflow})
partitionInline({
  required List<M3EToolbarItem> items,
  required int maxInline,
  int? triggerIndex,
}) {
  if (items.isEmpty) {
    return (
      inline: const <M3EToolbarItem>[],
      overflow: const <M3EToolbarAction>[],
    );
  }

  // Count how many non-trigger icon actions may stay inline.
  final reservedTrigger = triggerIndex != null ? 1 : 0;
  final int actionBudget = (maxInline - reservedTrigger).clamp(0, maxInline);

  final inline = <M3EToolbarItem>[];
  final overflow = <M3EToolbarAction>[];
  var usedActionSlots = 0;

  for (var i = 0; i < items.length; i++) {
    final M3EToolbarItem item = items[i];
    if (item is M3EToolbarWidget) {
      inline.add(item);
      continue;
    }
    final action = item as M3EToolbarAction;
    if (action.isExpandTrigger) {
      inline.add(action);
      continue;
    }
    if (usedActionSlots < actionBudget) {
      inline.add(action);
      usedActionSlots++;
    } else {
      overflow.add(action);
    }
  }

  return (inline: inline, overflow: overflow);
}