12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import 'package:app_flowy/plugins/grid/application/prelude.dart';
- import 'package:flutter/material.dart';
- abstract class FocusableBoardCell {
- set becomeFocus(bool isFocus);
- }
- class EditableCellNotifier {
- final ValueNotifier<bool> isCellEditing;
- EditableCellNotifier({bool isEditing = false})
- : isCellEditing = ValueNotifier(isEditing);
- void dispose() {
- isCellEditing.dispose();
- }
- }
- class EditableRowNotifier {
- final Map<EditableCellId, EditableCellNotifier> _cells = {};
- final ValueNotifier<bool> isEditing;
- EditableRowNotifier({required bool isEditing})
- : isEditing = ValueNotifier(isEditing);
- void bindCell(
- GridCellIdentifier cellIdentifier,
- EditableCellNotifier notifier,
- ) {
- assert(
- _cells.values.isEmpty,
- 'Only one cell can receive the notification',
- );
- final id = EditableCellId.from(cellIdentifier);
- _cells[id]?.dispose();
- notifier.isCellEditing.addListener(() {
- isEditing.value = notifier.isCellEditing.value;
- });
- _cells[EditableCellId.from(cellIdentifier)] = notifier;
- }
- void becomeFirstResponder() {
- if (_cells.values.isEmpty) return;
- assert(
- _cells.values.length == 1,
- 'Only one cell can receive the notification',
- );
- _cells.values.first.isCellEditing.value = true;
- }
- void resignFirstResponder() {
- if (_cells.values.isEmpty) return;
- assert(
- _cells.values.length == 1,
- 'Only one cell can receive the notification',
- );
- _cells.values.first.isCellEditing.value = false;
- }
- void unbind() {
- for (final notifier in _cells.values) {
- notifier.dispose();
- }
- _cells.clear();
- }
- void dispose() {
- for (final notifier in _cells.values) {
- notifier.dispose();
- }
- _cells.clear();
- }
- }
- abstract class EditableCell {
- // Each cell notifier will be bind to the [EditableRowNotifier], which enable
- // the row notifier receive its cells event. For example: begin editing the
- // cell or end editing the cell.
- //
- EditableCellNotifier? get editableNotifier;
- }
- class EditableCellId {
- String fieldId;
- String rowId;
- EditableCellId(this.rowId, this.fieldId);
- factory EditableCellId.from(GridCellIdentifier cellIdentifier) =>
- EditableCellId(
- cellIdentifier.rowId,
- cellIdentifier.fieldId,
- );
- }
|