calculateWidthOfAllColumnsContent method

void calculateWidthOfAllColumnsContent()

Implementation

void calculateWidthOfAllColumnsContent() {
  double cloneWidthOfAllColumns = _state.widthOfColumnsContent!;
  final List<DataTableColumn<T>> tableColumnsContentWithWidth = [];
  final List<DataTableColumn<T>> tableColumnsContentWithFlex = [];
  int sumOfAllFlex = 0;
  for (var element in this.tableColumnsContent) {
    if (isShowInScreen(element.showOnScreens)) {
      if (element.width != null) {
        tableColumnsContentWithWidth.add(element);
      } else {
        sumOfAllFlex += element.flex ?? 1;
        tableColumnsContentWithFlex.add(element);
      }
    } else {
      _state.mapKeyToWidthOfEachColumnContent[element.key] = 0;
    }
  }
  for (var element in tableColumnsContentWithWidth) {
    _state.mapKeyToWidthOfEachColumnContent[element.key] = element.width!;
    cloneWidthOfAllColumns -= element.width!;
  }
  for (var element in tableColumnsContentWithFlex) {
    if (cloneWidthOfAllColumns <= 0) {
      assert(
        false,
        'Tổng độ rộng của các cột được set minWidth và maxWidth phải nhỏ hơn độ dài của màn hình (nếu trong danh sách cột có cột set mặc định hoặc flex)',
      );
      return;
    }
    final double preCalculatedWidth = cloneWidthOfAllColumns * (element.flex ?? 1) / sumOfAllFlex;
    if (element.maxWidth != null && element.minWidth != null) {
      final double width = preCalculatedWidth.clamp(element.minWidth!, element.maxWidth!);
      _state.mapKeyToWidthOfEachColumnContent[element.key] = width;
      if (preCalculatedWidth != width) {
        cloneWidthOfAllColumns -= width;
        sumOfAllFlex -= element.flex ?? 1;
      }
    } else if (element.minWidth != null && element.maxWidth == null) {
      final double width = max(preCalculatedWidth, element.minWidth!);
      _state.mapKeyToWidthOfEachColumnContent[element.key] = width;
      if (preCalculatedWidth != width) {
        cloneWidthOfAllColumns -= width;
        sumOfAllFlex -= element.flex ?? 1;
      }
    } else if (element.maxWidth != null && element.minWidth == null) {
      final double width = min(preCalculatedWidth, element.maxWidth!);
      _state.mapKeyToWidthOfEachColumnContent[element.key] = width;
      if (preCalculatedWidth != width) {
        cloneWidthOfAllColumns -= width;
        sumOfAllFlex -= element.flex ?? 1;
      }
    } else {
      _state.mapKeyToWidthOfEachColumnContent[element.key] = preCalculatedWidth;
    }
  }
}