|
@@ -1,22 +1,24 @@
|
|
|
-import 'dart:collection';
|
|
|
-
|
|
|
+import 'package:appflowy_board/src/utils/log.dart';
|
|
|
import 'package:flutter/material.dart';
|
|
|
import 'package:provider/provider.dart';
|
|
|
import 'board_column/board_column.dart';
|
|
|
import 'board_column/board_column_data.dart';
|
|
|
import 'board_data.dart';
|
|
|
+import 'reorder_flex/drag_state.dart';
|
|
|
import 'reorder_flex/drag_target_interceptor.dart';
|
|
|
import 'reorder_flex/reorder_flex.dart';
|
|
|
import 'reorder_phantom/phantom_controller.dart';
|
|
|
import '../rendering/board_overlay.dart';
|
|
|
|
|
|
class AFBoardScrollManager {
|
|
|
- BoardColumnState? _columnState;
|
|
|
+ BoardColumnsState? _columnState;
|
|
|
|
|
|
// AFBoardScrollManager();
|
|
|
|
|
|
void scrollToBottom(String columnId, VoidCallback? completed) {
|
|
|
- _columnState?.reorderFlexStateAtColumn(columnId)?.scrollToBottom(completed);
|
|
|
+ _columnState
|
|
|
+ ?.getReorderFlexState(columnId: columnId)
|
|
|
+ ?.scrollToBottom(completed);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -70,7 +72,7 @@ class AFBoard extends StatelessWidget {
|
|
|
|
|
|
final AFBoardScrollManager? scrollManager;
|
|
|
|
|
|
- final BoardColumnState _columnState = BoardColumnState();
|
|
|
+ final BoardColumnsState _columnState = BoardColumnsState();
|
|
|
|
|
|
AFBoard({
|
|
|
required this.dataController,
|
|
@@ -101,7 +103,7 @@ class AFBoard extends StatelessWidget {
|
|
|
dataController: dataController,
|
|
|
scrollController: scrollController,
|
|
|
scrollManager: scrollManager,
|
|
|
- columnState: _columnState,
|
|
|
+ columnsState: _columnState,
|
|
|
background: background,
|
|
|
delegate: phantomController,
|
|
|
columnConstraints: columnConstraints,
|
|
@@ -128,7 +130,7 @@ class AFBoardContent extends StatefulWidget {
|
|
|
final ReorderFlexConfig reorderFlexConfig;
|
|
|
final BoxConstraints columnConstraints;
|
|
|
final AFBoardScrollManager? scrollManager;
|
|
|
- final BoardColumnState columnState;
|
|
|
+ final BoardColumnsState columnsState;
|
|
|
|
|
|
///
|
|
|
final AFBoardColumnCardBuilder cardBuilder;
|
|
@@ -149,7 +151,7 @@ class AFBoardContent extends StatefulWidget {
|
|
|
required this.delegate,
|
|
|
required this.dataController,
|
|
|
required this.scrollManager,
|
|
|
- required this.columnState,
|
|
|
+ required this.columnsState,
|
|
|
this.onDragStarted,
|
|
|
this.onDragEnded,
|
|
|
this.scrollController,
|
|
@@ -180,11 +182,10 @@ class _AFBoardContentState extends State<AFBoardContent> {
|
|
|
reorderFlexId: widget.dataController.identifier,
|
|
|
acceptedReorderFlexId: widget.dataController.columnIds,
|
|
|
delegate: widget.delegate,
|
|
|
- columnKeys: UnmodifiableMapView(widget.columnState.columnKeys),
|
|
|
+ columnsState: widget.columnsState,
|
|
|
);
|
|
|
|
|
|
final reorderFlex = ReorderFlex(
|
|
|
- key: const PageStorageKey<String>('AFBoardContent'),
|
|
|
config: widget.reorderFlexConfig,
|
|
|
scrollController: widget.scrollController,
|
|
|
onDragStarted: widget.onDragStarted,
|
|
@@ -243,7 +244,8 @@ class _AFBoardContentState extends State<AFBoardContent> {
|
|
|
child: Consumer<AFBoardColumnDataController>(
|
|
|
builder: (context, value, child) {
|
|
|
final boardColumn = AFBoardColumnWidget(
|
|
|
- key: const PageStorageKey<String>('AFBoardColumnWidget'),
|
|
|
+ key: PageStorageKey<String>(columnData.id),
|
|
|
+ // key: GlobalObjectKey(columnData.id),
|
|
|
margin: _marginFromIndex(columnIndex),
|
|
|
itemMargin: widget.config.columnItemPadding,
|
|
|
headerBuilder: _buildHeader,
|
|
@@ -255,10 +257,11 @@ class _AFBoardContentState extends State<AFBoardContent> {
|
|
|
onReorder: widget.dataController.moveColumnItem,
|
|
|
cornerRadius: widget.config.cornerRadius,
|
|
|
backgroundColor: widget.config.columnBackgroundColor,
|
|
|
+ dragStateStorage: widget.columnsState,
|
|
|
+ dragTargetIndexKeyStorage: widget.columnsState,
|
|
|
);
|
|
|
|
|
|
- widget.columnState
|
|
|
- .addColumn(columnData.id, boardColumn.globalKey);
|
|
|
+ widget.columnsState.addColumn(columnData.id, boardColumn);
|
|
|
|
|
|
return ConstrainedBox(
|
|
|
constraints: widget.columnConstraints,
|
|
@@ -320,18 +323,23 @@ class _BoardColumnDataSourceImpl extends AFBoardColumnDataDataSource {
|
|
|
List<String> get acceptedColumnIds => dataController.columnIds;
|
|
|
}
|
|
|
|
|
|
-class BoardColumnState {
|
|
|
+class BoardColumnContext {
|
|
|
+ GlobalKey? columnKey;
|
|
|
+ DraggingState? draggingState;
|
|
|
+}
|
|
|
+
|
|
|
+class BoardColumnsState extends DraggingStateStorage
|
|
|
+ with ReorderDragTargerIndexKeyStorage {
|
|
|
/// Quick access to the [AFBoardColumnWidget]
|
|
|
final Map<String, GlobalKey> columnKeys = {};
|
|
|
+ final Map<String, DraggingState> columnDragStates = {};
|
|
|
+ final Map<String, Map<String, GlobalObjectKey>> columnDragDragTargets = {};
|
|
|
|
|
|
- /// Records the position of the [AFBoardColumnWidget]
|
|
|
- final Map<String, ScrollPosition> columnScrollPositions = {};
|
|
|
-
|
|
|
- void addColumn(String columnId, GlobalKey key) {
|
|
|
- columnKeys[columnId] = key;
|
|
|
+ void addColumn(String columnId, AFBoardColumnWidget columnWidget) {
|
|
|
+ columnKeys[columnId] = columnWidget.globalKey;
|
|
|
}
|
|
|
|
|
|
- ReorderFlexState? reorderFlexStateAtColumn(String columnId) {
|
|
|
+ ReorderFlexState? getReorderFlexState({required String columnId}) {
|
|
|
final flexGlobalKey = columnKeys[columnId];
|
|
|
if (flexGlobalKey == null) return null;
|
|
|
if (flexGlobalKey.currentState is! ReorderFlexState) return null;
|
|
@@ -339,11 +347,52 @@ class BoardColumnState {
|
|
|
return state;
|
|
|
}
|
|
|
|
|
|
- ReorderFlex? reorderFlexAtColumn(String columnId) {
|
|
|
+ ReorderFlex? getReorderFlex({required String columnId}) {
|
|
|
final flexGlobalKey = columnKeys[columnId];
|
|
|
if (flexGlobalKey == null) return null;
|
|
|
if (flexGlobalKey.currentWidget is! ReorderFlex) return null;
|
|
|
final widget = flexGlobalKey.currentWidget as ReorderFlex;
|
|
|
return widget;
|
|
|
}
|
|
|
+
|
|
|
+ @override
|
|
|
+ DraggingState? read(String reorderFlexId) {
|
|
|
+ return columnDragStates[reorderFlexId];
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void write(String reorderFlexId, DraggingState state) {
|
|
|
+ Log.trace('$reorderFlexId Write dragging state: $state');
|
|
|
+ columnDragStates[reorderFlexId] = state;
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void remove(String reorderFlexId) {
|
|
|
+ columnDragStates.remove(reorderFlexId);
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ void addKey(
|
|
|
+ String reorderFlexId,
|
|
|
+ String key,
|
|
|
+ GlobalObjectKey<State<StatefulWidget>> value,
|
|
|
+ ) {
|
|
|
+ Map<String, GlobalObjectKey>? column = columnDragDragTargets[reorderFlexId];
|
|
|
+ if (column == null) {
|
|
|
+ column = {};
|
|
|
+ columnDragDragTargets[reorderFlexId] = column;
|
|
|
+ }
|
|
|
+ column[key] = value;
|
|
|
+ }
|
|
|
+
|
|
|
+ @override
|
|
|
+ GlobalObjectKey<State<StatefulWidget>>? readKey(
|
|
|
+ String reorderFlexId, String key) {
|
|
|
+ Map<String, GlobalObjectKey>? column = columnDragDragTargets[reorderFlexId];
|
|
|
+ if (column != null) {
|
|
|
+ return column[key];
|
|
|
+ } else {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|