tableColumnWidths function
Implementation
List<double> tableColumnWidths(
List<TableColumn> columns,
double width, [
Map<String, double> overrides = const {},
]) {
final sized = [
for (final column in columns) overrides[column.id] ?? column.width,
];
var fixed = 0.0;
var flex = 0.0;
var flexCount = 0;
for (final (index, column) in columns.indexed) {
final size = sized[index];
if (size == null) {
flex += column.flex;
flexCount++;
} else {
fixed += size;
}
}
final free = width - fixed;
if (overrides.isEmpty ||
(flexCount > 0 && free >= flexCount * tableColumnMinWidth)) {
final share = free.clamp(0.0, double.infinity);
return [
for (final (index, column) in columns.indexed)
sized[index] ?? share * column.flex / flex,
];
}
// The window has shrunk below the dragged widths, or they left no column to
// take up the slack: everything scales to fit.
final natural = [for (final size in sized) size ?? tableColumnMinWidth];
final total = natural.fold<double>(0, (sum, size) => sum + size);
return [for (final size in natural) size * width / total];
}