123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import 'package:flowy_sdk/log.dart';
- import 'package:flowy_sdk/protobuf/flowy-error/errors.pb.dart';
- import 'package:flowy_sdk/protobuf/flowy-grid/protobuf.dart';
- import 'group_listener.dart';
- typedef OnGroupError = void Function(FlowyError);
- abstract class GroupControllerDelegate {
- void removeRow(GroupPB group, String rowId);
- void insertRow(GroupPB group, RowPB row, int? index);
- void updateRow(GroupPB group, RowPB row);
- void addNewRow(GroupPB group, RowPB row, int? index);
- }
- class GroupController {
- final GroupPB group;
- final GroupListener _listener;
- final GroupControllerDelegate delegate;
- GroupController({
- required String gridId,
- required this.group,
- required this.delegate,
- }) : _listener = GroupListener(group);
- RowPB? rowAtIndex(int index) {
- if (index < group.rows.length) {
- return group.rows[index];
- } else {
- return null;
- }
- }
- RowPB? lastRow() {
- if (group.rows.isEmpty) return null;
- return group.rows.last;
- }
- void startListening() {
- _listener.start(onGroupChanged: (result) {
- result.fold(
- (GroupChangesetPB changeset) {
- for (final deletedRow in changeset.deletedRows) {
- group.rows.removeWhere((rowPB) => rowPB.id == deletedRow);
- delegate.removeRow(group, deletedRow);
- }
- for (final insertedRow in changeset.insertedRows) {
- final index = insertedRow.hasIndex() ? insertedRow.index : null;
- if (insertedRow.hasIndex() &&
- group.rows.length > insertedRow.index) {
- group.rows.insert(insertedRow.index, insertedRow.row);
- } else {
- group.rows.add(insertedRow.row);
- }
- if (insertedRow.isNew) {
- delegate.addNewRow(group, insertedRow.row, index);
- } else {
- delegate.insertRow(group, insertedRow.row, index);
- }
- }
- for (final updatedRow in changeset.updatedRows) {
- final index = group.rows.indexWhere(
- (rowPB) => rowPB.id == updatedRow.id,
- );
- if (index != -1) {
- group.rows[index] = updatedRow;
- }
- delegate.updateRow(group, updatedRow);
- }
- },
- (err) => Log.error(err),
- );
- });
- }
- // GroupChangesetPB _transformChangeset(GroupChangesetPB changeset) {
- // final insertedRows = changeset.insertedRows
- // .where(
- // (delete) => !changeset.deletedRows.contains(delete.row.id),
- // )
- // .toList();
- // final deletedRows = changeset.deletedRows
- // .where((deletedRowId) =>
- // changeset.insertedRows
- // .indexWhere((insert) => insert.row.id == deletedRowId) ==
- // -1)
- // .toList();
- // return changeset.rebuild((rebuildChangeset) {
- // rebuildChangeset.insertedRows.clear();
- // rebuildChangeset.insertedRows.addAll(insertedRows);
- // rebuildChangeset.deletedRows.clear();
- // rebuildChangeset.deletedRows.addAll(deletedRows);
- // });
- // }
- Future<void> dispose() async {
- _listener.stop();
- }
- }
|