grid_data_controller.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import 'package:app_flowy/plugins/grid/presentation/widgets/filter/filter_info.dart';
  2. import 'package:appflowy_backend/protobuf/flowy-error/errors.pb.dart';
  3. import 'package:appflowy_backend/protobuf/flowy-folder/view.pb.dart';
  4. import 'package:appflowy_backend/protobuf/flowy-database/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(DatabasePB);
  14. typedef OnRowsChanged = void Function(
  15. List<RowInfo> rowInfos,
  16. RowsChangedReason,
  17. );
  18. typedef ListenOnRowChangedCondition = bool Function();
  19. class GridController {
  20. final String databaseId;
  21. final DatabaseFFIService _gridFFIService;
  22. final GridFieldController fieldController;
  23. late DatabaseViewCache _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. : databaseId = view.id,
  30. _gridFFIService = DatabaseFFIService(viewId: view.id),
  31. fieldController = GridFieldController(databaseId: view.id) {
  32. _viewCache = DatabaseViewCache(
  33. databaseId: databaseId,
  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. Future<Either<Unit, FlowyError>> openGrid() async {
  54. return _gridFFIService.openGrid().then((result) {
  55. return result.fold(
  56. (grid) async {
  57. _onGridChanged?.call(grid);
  58. _viewCache.rowCache.initializeRows(grid.rows);
  59. final result = await fieldController.loadFields(
  60. fieldIds: grid.fields,
  61. );
  62. return result;
  63. },
  64. (err) => right(err),
  65. );
  66. });
  67. }
  68. Future<void> createRow() async {
  69. await _gridFFIService.createRow();
  70. }
  71. Future<void> dispose() async {
  72. await _gridFFIService.closeGrid();
  73. await fieldController.dispose();
  74. }
  75. }