computeHeaderAutoFitExtent<CellDataType extends SwayzeCellData> function
Future<double?>
computeHeaderAutoFitExtent<CellDataType extends SwayzeCellData>({
- required BuildContext context,
- required Axis axis,
- required int headerPosition,
- required SwayzeTableDataController<
SwayzeController> tableDataController, - required CellDelegate<
CellDataType> cellDelegate, - required MatrixMapReadOnly<
CellDataType> cellMatrix, - required SwayzeStyle style,
- required String headerLabel,
Implementation
Future<double?> computeHeaderAutoFitExtent<CellDataType extends SwayzeCellData>({
required BuildContext context,
required Axis axis,
required int headerPosition,
required SwayzeTableDataController tableDataController,
required CellDelegate<CellDataType> cellDelegate,
required MatrixMapReadOnly<CellDataType> cellMatrix,
required SwayzeStyle style,
required String headerLabel,
}) async {
final requests = <SwayzeAutoFitMeasurementRequest>[createHeaderAutoFitMeasurementRequest(label: headerLabel, style: style)];
if (axis == Axis.horizontal) {
cellMatrix.forEach((item, colIndex, rowIndex) {
if (colIndex != headerPosition) {
return;
}
final cellData = item as CellDataType;
if (!cellData.hasVisibleContent) {
return;
}
final cellLayout = cellDelegate.getCellLayout(cellData);
requests.add(SwayzeAutoFitMeasurementRequest(builder: (context) => cellLayout.buildCell(context)));
});
} else {
cellMatrix.forEachInRow(headerPosition, (item, colIndex, rowIndex) {
final cellData = item as CellDataType;
if (!cellData.hasVisibleContent) {
return;
}
final columnExtent = tableDataController.columns.value.getHeaderExtentFor(index: colIndex);
final constrainedWidth = (columnExtent - style.cellSeparatorStrokeWidth).clamp(0.0, double.infinity) as double;
final cellLayout = cellDelegate.getCellLayout(cellData);
requests.add(SwayzeAutoFitMeasurementRequest(builder: (context) => cellLayout.buildCell(context), width: constrainedWidth));
});
}
final sizes = await measureAutoFitLayouts(context, requests);
if (!context.mounted) {
return null;
}
final contentExtent = sizes.fold<double>(0.0, (currentMax, size) {
final nextExtent = axis == Axis.horizontal ? size.width : size.height;
return nextExtent > currentMax ? nextExtent : currentMax;
});
final maxExtent = maxAutoFitExtentForAxis(style, axis);
final minimumExtent = axis == Axis.vertical ? tableDataController.rows.value.defaultHeaderExtent : minimumResizableExtentForAxis(axis);
final fittedExtent = math.max(contentExtent + style.cellSeparatorStrokeWidth, minimumExtent);
return (maxExtent == null ? fittedExtent : math.min(fittedExtent, maxExtent)).clamp(minimumResizableExtentForAxis(axis), double.infinity)
as double;
}