board_cell.dart 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import 'package:app_flowy/plugins/grid/application/prelude.dart';
  2. import 'package:flowy_infra/notifier.dart';
  3. import 'package:flutter/material.dart';
  4. abstract class FocusableBoardCell {
  5. set becomeFocus(bool isFocus);
  6. }
  7. class EditableCellNotifier {
  8. final Notifier becomeFirstResponder = Notifier();
  9. final Notifier resignFirstResponder = Notifier();
  10. final ValueNotifier<bool> isCellEditing;
  11. EditableCellNotifier({bool isEditing = false})
  12. : isCellEditing = ValueNotifier(isEditing);
  13. void dispose() {
  14. becomeFirstResponder.dispose();
  15. resignFirstResponder.dispose();
  16. isCellEditing.dispose();
  17. }
  18. }
  19. class EditableRowNotifier {
  20. final Map<EditableCellId, EditableCellNotifier> _cells = {};
  21. void insertCell(
  22. GridCellIdentifier cellIdentifier,
  23. EditableCellNotifier notifier,
  24. ) {
  25. final id = EditableCellId.from(cellIdentifier);
  26. _cells[id]?.dispose();
  27. notifier.isCellEditing.addListener(() {});
  28. _cells[EditableCellId.from(cellIdentifier)] = notifier;
  29. }
  30. void becomeFirstResponder() {
  31. for (final notifier in _cells.values) {
  32. notifier.becomeFirstResponder.notify();
  33. }
  34. }
  35. void resignFirstResponder() {
  36. for (final notifier in _cells.values) {
  37. notifier.resignFirstResponder.notify();
  38. }
  39. }
  40. void clear() {
  41. for (final notifier in _cells.values) {
  42. notifier.dispose();
  43. }
  44. _cells.clear();
  45. }
  46. void dispose() {
  47. for (final notifier in _cells.values) {
  48. notifier.resignFirstResponder.notify();
  49. }
  50. _cells.clear();
  51. }
  52. }
  53. abstract class EditableCell {
  54. EditableCellNotifier? get editableNotifier;
  55. }
  56. class EditableCellId {
  57. String fieldId;
  58. String rowId;
  59. EditableCellId(this.rowId, this.fieldId);
  60. factory EditableCellId.from(GridCellIdentifier cellIdentifier) =>
  61. EditableCellId(
  62. cellIdentifier.rowId,
  63. cellIdentifier.fieldId,
  64. );
  65. }