| 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();  }}
 |