grid_data_controller.dart 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import 'package:app_flowy/plugins/grid/presentation/widgets/filter/filter_info.dart';
  2. import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
  3. import 'package:flowy_sdk/protobuf/flowy-folder/view.pb.dart';
  4. import 'package:flowy_sdk/protobuf/flowy-grid/grid_entities.pb.dart';
  5. import 'dart:async';
  6. import 'package:dartz/dartz.dart';
  7. import 'view/grid_view_cache.dart';
  8. import 'field/field_controller.dart';
  9. import 'prelude.dart';
  10. import 'row/row_cache.dart';
  11. typedef OnFieldsChanged = void Function(List<FieldInfo>);
  12. typedef OnFiltersChanged = void Function(List<FilterInfo>);
  13. typedef OnGridChanged = void Function(GridPB);
  14. typedef OnRowsChanged = void Function(
  15. List<RowInfo> rowInfos,
  16. RowsChangedReason,
  17. );
  18. typedef ListenOnRowChangedCondition = bool Function();
  19. class GridController {
  20. final String gridId;
  21. final GridFFIService _gridFFIService;
  22. final GridFieldController fieldController;
  23. late GridViewCache _viewCache;
  24. OnRowsChanged? _onRowChanged;
  25. OnGridChanged? _onGridChanged;
  26. List<RowInfo> get rowInfos => _viewCache.rowInfos;
  27. GridRowCache get rowCache => _viewCache.rowCache;
  28. GridController({required ViewPB view})
  29. : gridId = view.id,
  30. _gridFFIService = GridFFIService(gridId: view.id),
  31. fieldController = GridFieldController(gridId: view.id) {
  32. _viewCache = GridViewCache(
  33. gridId: gridId,
  34. fieldController: fieldController,
  35. );
  36. _viewCache.addListener(onRowsChanged: (reason) {
  37. _onRowChanged?.call(rowInfos, reason);
  38. });
  39. }
  40. void addListener({
  41. OnGridChanged? onGridChanged,
  42. OnRowsChanged? onRowsChanged,
  43. OnFieldsChanged? onFieldsChanged,
  44. OnFiltersChanged? onFiltersChanged,
  45. }) {
  46. _onGridChanged = onGridChanged;
  47. _onRowChanged = onRowsChanged;
  48. fieldController.addListener(
  49. onFields: onFieldsChanged,
  50. onFilters: onFiltersChanged,
  51. );
  52. }
  53. // Loads the rows from each block
  54. Future<Either<Unit, FlowyError>> openGrid() async {
  55. return _gridFFIService.openGrid().then((result) {
  56. return result.fold(
  57. (grid) async {
  58. _onGridChanged?.call(grid);
  59. _viewCache.rowCache.initializeRows(grid.rows);
  60. final result = await fieldController.loadFields(
  61. fieldIds: grid.fields,
  62. );
  63. return result;
  64. },
  65. (err) => right(err),
  66. );
  67. });
  68. }
  69. Future<void> createRow() async {
  70. await _gridFFIService.createRow();
  71. }
  72. Future<void> dispose() async {
  73. await _gridFFIService.closeGrid();
  74. await fieldController.dispose();
  75. }
  76. }