MhItemsViewColumnDef<T> constructor

MhItemsViewColumnDef<T>({
  1. required String id,
  2. String? header,
  3. Widget buildColumnHeader(
    1. BuildContext,
    2. MhItemsViewState<T>
    )?,
  4. double? columnWidth,
  5. CdItemsViewColumnTypes? columnType,
  6. Widget buildDisplay(
    1. BuildContext context,
    2. T item,
    3. MhItemsViewDisplayInfo displayInfo
    )?,
  7. Object? getDisplayValue(
    1. T
    )?,
  8. Alignment alignment = Alignment.center,
  9. EdgeInsetsGeometry? padding,
  10. Widget buildEdit(
    1. T
    )?,
  11. Object? getEditValue(
    1. T
    )?,
  12. void setEditValue(
    1. T,
    2. Object?
    )?,
  13. bool allowEdit(
    1. T item
    )?,
  14. bool allowSorting = false,
  15. Object getSortValue(
    1. T item
    )?,
})

Implementation

MhItemsViewColumnDef({
  required this.id,
  String? header,
  Widget Function(BuildContext, MhItemsViewState<T>)? buildColumnHeader,
  double? columnWidth,
  CdItemsViewColumnTypes? columnType,
  Widget Function(
          BuildContext context, T item, MhItemsViewDisplayInfo displayInfo)?
      buildDisplay,
  Object? Function(T)? getDisplayValue,
  this.alignment = Alignment.center,
  this.padding,
  Widget Function(T)? buildEdit,
  Object? Function(T)? getEditValue,
  void Function(T, Object?)? setEditValue,
  this.allowEdit,
  this.allowSorting = false,
  this.getSortValue,
}) {
  //Type
  if (columnType == null) {
    this.columnType = CdItemsViewColumnTypes.string;
  } else {
    this.columnType = columnType;
  }

  //Column Header
  if (buildColumnHeader != null) {
    _buildColumnHeader = buildColumnHeader;
  } else {
    switch (this.columnType) {
      case CdItemsViewColumnTypes.select:
        _buildColumnHeader = (context, state) {
          if (state.settings.selectionSettings.selectionMode ==
              MhItemsViewSelectionModes.multiple) {
            return Padding(
              padding: const EdgeInsets.only(left: 5),
              child: Checkbox(
                value: areAllSelected?.call(),
                tristate: true,
                onChanged: (bool? value) {
                  setAllSelected?.call(value == true);
                },
              ),
            );
          }
          return const SizedBox();
        };
        break;
      case CdItemsViewColumnTypes.reorder:
        _buildColumnHeader = (context, state) {
          return const SizedBox();
        };
        break;
      default:
        _header = header ?? "";
        _buildColumnHeader = (context, state) {
          var textColor = state.theme.headerTextColor;
          return Center(
              child: MhTitleMedium(
                  text: _header,
                  textColor: textColor,
                  paddingTop: 0,
                  paddingBottom: 0));
        };
        break;
    }
  }

  //Value
  if (buildDisplay != null) {
    _buildValue = buildDisplay;
  } else {
    switch (columnType) {
      case CdItemsViewColumnTypes.select:
        _buildValue = (context, item, rowIsSelected) => Center(
              child: Checkbox(
                value: isSelected?.call(item),
                onChanged: (bool? value) {
                  setSelected?.call(item, value == true);
                },
              ),
            );
        break;

      case CdItemsViewColumnTypes.reorder:
        _buildValue = (context, item, displayInfo) {
          var state = context.read<MhItemsViewState<T>>();

          var allowDrag = state.settings.dragDropSettings.allowReorder ||
              state.settings.dragDropSettings.allowDrag;
          if (allowDrag &&
              state.settings.dragDropSettings.dragDropMode ==
                  MhItemsViewDragDropModes.reorderColumnOnly) {
            return state.widget._controller.widgetState!.buildDraggable(
                item,
                state,
                displayInfo.vicinity,
                context,
                const Center(
                    child:
                        Opacity(opacity: 0.3, child: Icon(Icons.reorder))));
          }
          return const Center(
              child: Opacity(opacity: 0.3, child: Icon(Icons.reorder)));
        };
        break;

      case CdItemsViewColumnTypes.bool:
        _buildValue = (context, item, rowIsSelected) => Center(
                child: Checkbox(
              value: getDisplayValueBool(item),
              onChanged: (bool? value) {
                setEditValue?.call(item, value);
              },
            ));
        break;
      default:
        _buildValue = (context, item, displayInfo) {
          var state = context.read<MhItemsViewState<T>>();
          return Align(
              alignment: alignment,
              child: MhBodyMedium(
                text: getDisplayValue?.call(item)?.toString() ?? "",
                textColor: displayInfo.rowIsSelected
                    ? state.theme.selectionTextColor
                    : state.theme.textColor,
                topPadding: 0,
                bottomPadding: 0,
              ));
        };
        break;
    }
  }

  _getEditValue = getEditValue ?? (item) => item.toString();
  _setEditValue = setEditValue;
  _getDisplayValue = getDisplayValue ?? (item) => item.toString();

  //Settings
  if (columnWidth != null) {
    this._columnWidth = columnWidth;
    this.virtualColumnWidth = columnWidth;
  } else {
    this._columnWidthAuto = true;
  }

  // Prepare for Sorting
  if (!showSortIconOnHover) {
    _showSortIcon = true;
  }
  _sortDef = MhItemsViewSortDef<T>(
      getSortValue: _getSortValue,
      columnDef: this,
      sortDirection: MhItemsViewSortDirections.none);
}