computeHeaderAutoFitExtent<CellDataType extends SwayzeCellData> function

Future<double?> computeHeaderAutoFitExtent<CellDataType extends SwayzeCellData>({
  1. required BuildContext context,
  2. required Axis axis,
  3. required int headerPosition,
  4. required SwayzeTableDataController<SwayzeController> tableDataController,
  5. required CellDelegate<CellDataType> cellDelegate,
  6. required MatrixMapReadOnly<CellDataType> cellMatrix,
  7. required SwayzeStyle style,
  8. 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;
}