mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
chore: update import path
This commit is contained in:
@ -9,7 +9,18 @@ class MultiBoardListExample extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _MultiBoardListExampleState extends State<MultiBoardListExample> {
|
class _MultiBoardListExampleState extends State<MultiBoardListExample> {
|
||||||
final BoardDataController boardDataController = BoardDataController();
|
final BoardDataController boardDataController = BoardDataController(
|
||||||
|
onMoveColumn: (fromIndex, toIndex) {
|
||||||
|
debugPrint('Move column from $fromIndex to $toIndex');
|
||||||
|
},
|
||||||
|
onMoveColumnItem: (columnId, fromIndex, toIndex) {
|
||||||
|
debugPrint('Column:$columnId move item from $fromIndex to $toIndex');
|
||||||
|
},
|
||||||
|
onMoveColumnItemToColumn: (fromColumnId, fromIndex, toColumnId, toIndex) {
|
||||||
|
debugPrint(
|
||||||
|
'Column:$fromColumnId move item at $fromIndex to column:$toColumnId $toIndex');
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
@ -34,9 +45,9 @@ class _MultiBoardListExampleState extends State<MultiBoardListExample> {
|
|||||||
TextItem("D"),
|
TextItem("D"),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
boardDataController.setColumnData(column1);
|
boardDataController.addColumn(column1);
|
||||||
boardDataController.setColumnData(column2);
|
boardDataController.addColumn(column2);
|
||||||
boardDataController.setColumnData(column3);
|
boardDataController.addColumn(column3);
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ class _SingleBoardListExampleState extends State<SingleBoardListExample> {
|
|||||||
TextItem("d"),
|
TextItem("d"),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
boardData.setColumnData(column);
|
boardData.addColumn(column);
|
||||||
super.initState();
|
super.initState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
library flowy_board;
|
library flowy_board;
|
||||||
|
|
||||||
export 'src/widgets/board_column/board_column.dart';
|
export 'src/widgets/board_column/board_column_data.dart';
|
||||||
export 'src/widgets/board_column/data_controller.dart';
|
|
||||||
export 'src/widgets/board.dart';
|
|
||||||
export 'src/widgets/board_data.dart';
|
export 'src/widgets/board_data.dart';
|
||||||
|
export 'src/widgets/board.dart';
|
||||||
|
@ -6,7 +6,7 @@ const DART_LOG = "Dart_LOG";
|
|||||||
class Log {
|
class Log {
|
||||||
// static const enableLog = bool.hasEnvironment(DART_LOG);
|
// static const enableLog = bool.hasEnvironment(DART_LOG);
|
||||||
// static final shared = Log();
|
// static final shared = Log();
|
||||||
static const enableLog = true;
|
static const enableLog = false;
|
||||||
|
|
||||||
static void info(String? message) {
|
static void info(String? message) {
|
||||||
if (enableLog) {
|
if (enableLog) {
|
||||||
@ -22,7 +22,7 @@ class Log {
|
|||||||
|
|
||||||
static void trace(String? message) {
|
static void trace(String? message) {
|
||||||
if (enableLog) {
|
if (enableLog) {
|
||||||
debugPrint('❗️[Trace]=> $message');
|
// debugPrint('❗️[Trace]=> $message');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:provider/provider.dart';
|
import 'package:provider/provider.dart';
|
||||||
|
import 'board_column/board_column.dart';
|
||||||
|
import 'board_column/board_column_data.dart';
|
||||||
|
import 'board_data.dart';
|
||||||
import 'flex/drag_target_inteceptor.dart';
|
import 'flex/drag_target_inteceptor.dart';
|
||||||
import 'flex/reorder_flex.dart';
|
import 'flex/reorder_flex.dart';
|
||||||
import 'phantom/phantom_controller.dart';
|
import 'phantom/phantom_controller.dart';
|
||||||
import '../../flowy_board.dart';
|
|
||||||
import '../rendering/board_overlay.dart';
|
import '../rendering/board_overlay.dart';
|
||||||
|
|
||||||
class Board extends StatelessWidget {
|
class Board extends StatelessWidget {
|
||||||
@ -122,7 +124,8 @@ class BoardContent extends StatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _BoardContentState extends State<BoardContent> {
|
class _BoardContentState extends State<BoardContent> {
|
||||||
final GlobalKey _columnContainerOverlayKey = GlobalKey(debugLabel: '$BoardContent overlay key');
|
final GlobalKey _columnContainerOverlayKey =
|
||||||
|
GlobalKey(debugLabel: '$BoardContent overlay key');
|
||||||
late BoardOverlayEntry _overlayEntry;
|
late BoardOverlayEntry _overlayEntry;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -215,7 +218,8 @@ class _BoardColumnDataSourceImpl extends BoardColumnDataDataSource {
|
|||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
BoardColumnData get columnData => dataController.columnController(columnId).columnData;
|
BoardColumnData get columnData =>
|
||||||
|
dataController.columnController(columnId).columnData;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<String> get acceptedColumnIds => dataController.columnIds;
|
List<String> get acceptedColumnIds => dataController.columnIds;
|
||||||
|
@ -6,7 +6,7 @@ import '../../utils/log.dart';
|
|||||||
import '../phantom/phantom_controller.dart';
|
import '../phantom/phantom_controller.dart';
|
||||||
import '../flex/reorder_flex.dart';
|
import '../flex/reorder_flex.dart';
|
||||||
import '../flex/drag_target_inteceptor.dart';
|
import '../flex/drag_target_inteceptor.dart';
|
||||||
import 'data_controller.dart';
|
import 'board_column_data.dart';
|
||||||
|
|
||||||
typedef OnColumnDragStarted = void Function(int index);
|
typedef OnColumnDragStarted = void Function(int index);
|
||||||
|
|
||||||
|
@ -2,16 +2,33 @@ import 'dart:collection';
|
|||||||
|
|
||||||
import 'package:equatable/equatable.dart';
|
import 'package:equatable/equatable.dart';
|
||||||
|
|
||||||
import '../../flowy_board.dart';
|
|
||||||
import '../utils/log.dart';
|
import '../utils/log.dart';
|
||||||
|
import 'board_column/board_column_data.dart';
|
||||||
import 'flex/reorder_flex.dart';
|
import 'flex/reorder_flex.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'phantom/phantom_controller.dart';
|
import 'phantom/phantom_controller.dart';
|
||||||
|
|
||||||
@protected
|
typedef OnMoveColumn = void Function(int fromIndex, int toIndex);
|
||||||
|
|
||||||
|
typedef OnMoveColumnItem = void Function(
|
||||||
|
String columnId,
|
||||||
|
int fromIndex,
|
||||||
|
int toIndex,
|
||||||
|
);
|
||||||
|
|
||||||
|
typedef OnMoveColumnItemToColumn = void Function(
|
||||||
|
String fromColumnId,
|
||||||
|
int fromIndex,
|
||||||
|
String toColumnId,
|
||||||
|
int toIndex,
|
||||||
|
);
|
||||||
|
|
||||||
class BoardDataController extends ChangeNotifier
|
class BoardDataController extends ChangeNotifier
|
||||||
with EquatableMixin, BoardPhantomControllerDelegate, ReoderFlextDataSource {
|
with EquatableMixin, BoardPhantomControllerDelegate, ReoderFlextDataSource {
|
||||||
final List<BoardColumnData> _columnDatas = [];
|
final List<BoardColumnData> _columnDatas = [];
|
||||||
|
final OnMoveColumn? onMoveColumn;
|
||||||
|
final OnMoveColumnItem? onMoveColumnItem;
|
||||||
|
final OnMoveColumnItemToColumn? onMoveColumnItemToColumn;
|
||||||
|
|
||||||
List<BoardColumnData> get columnDatas => _columnDatas;
|
List<BoardColumnData> get columnDatas => _columnDatas;
|
||||||
|
|
||||||
@ -21,9 +38,13 @@ class BoardDataController extends ChangeNotifier
|
|||||||
final LinkedHashMap<String, BoardColumnDataController> _columnControllers =
|
final LinkedHashMap<String, BoardColumnDataController> _columnControllers =
|
||||||
LinkedHashMap();
|
LinkedHashMap();
|
||||||
|
|
||||||
BoardDataController();
|
BoardDataController({
|
||||||
|
this.onMoveColumn,
|
||||||
|
this.onMoveColumnItem,
|
||||||
|
this.onMoveColumnItemToColumn,
|
||||||
|
});
|
||||||
|
|
||||||
void setColumnData(BoardColumnData columnData) {
|
void addColumn(BoardColumnData columnData) {
|
||||||
final controller = BoardColumnDataController(columnData: columnData);
|
final controller = BoardColumnDataController(columnData: columnData);
|
||||||
_columnDatas.add(columnData);
|
_columnDatas.add(columnData);
|
||||||
_columnControllers[columnData.id] = controller;
|
_columnControllers[columnData.id] = controller;
|
||||||
@ -36,6 +57,7 @@ class BoardDataController extends ChangeNotifier
|
|||||||
void moveColumn(int fromIndex, int toIndex) {
|
void moveColumn(int fromIndex, int toIndex) {
|
||||||
final columnData = _columnDatas.removeAt(fromIndex);
|
final columnData = _columnDatas.removeAt(fromIndex);
|
||||||
_columnDatas.insert(toIndex, columnData);
|
_columnDatas.insert(toIndex, columnData);
|
||||||
|
onMoveColumn?.call(fromIndex, toIndex);
|
||||||
notifyListeners();
|
notifyListeners();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,10 +66,12 @@ class BoardDataController extends ChangeNotifier
|
|||||||
assert(columnController != null);
|
assert(columnController != null);
|
||||||
if (columnController != null) {
|
if (columnController != null) {
|
||||||
columnController.move(fromIndex, toIndex);
|
columnController.move(fromIndex, toIndex);
|
||||||
|
onMoveColumnItem?.call(columnId, fromIndex, toIndex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@protected
|
||||||
void swapColumnItem(
|
void swapColumnItem(
|
||||||
String fromColumnId,
|
String fromColumnId,
|
||||||
int fromColumnIndex,
|
int fromColumnIndex,
|
||||||
@ -55,11 +79,17 @@ class BoardDataController extends ChangeNotifier
|
|||||||
int toColumnIndex,
|
int toColumnIndex,
|
||||||
) {
|
) {
|
||||||
final item = columnController(fromColumnId).removeAt(fromColumnIndex);
|
final item = columnController(fromColumnId).removeAt(fromColumnIndex);
|
||||||
|
|
||||||
assert(
|
assert(
|
||||||
columnController(toColumnId).items[toColumnIndex] is PhantomColumnItem);
|
columnController(toColumnId).items[toColumnIndex] is PhantomColumnItem);
|
||||||
|
|
||||||
columnController(toColumnId).replace(toColumnIndex, item);
|
columnController(toColumnId).replace(toColumnIndex, item);
|
||||||
|
|
||||||
|
onMoveColumnItemToColumn?.call(
|
||||||
|
fromColumnId,
|
||||||
|
fromColumnIndex,
|
||||||
|
toColumnId,
|
||||||
|
toColumnIndex,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -80,6 +110,7 @@ class BoardDataController extends ChangeNotifier
|
|||||||
UnmodifiableListView(_columnDatas);
|
UnmodifiableListView(_columnDatas);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@protected
|
||||||
bool removePhantom(String columnId) {
|
bool removePhantom(String columnId) {
|
||||||
final columnController = this.columnController(columnId);
|
final columnController = this.columnController(columnId);
|
||||||
final index = columnController.items.indexWhere((item) => item.isPhantom);
|
final index = columnController.items.indexWhere((item) => item.isPhantom);
|
||||||
@ -95,6 +126,7 @@ class BoardDataController extends ChangeNotifier
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@protected
|
||||||
void updatePhantom(String columnId, int newIndex) {
|
void updatePhantom(String columnId, int newIndex) {
|
||||||
final columnDataController = columnController(columnId);
|
final columnDataController = columnController(columnId);
|
||||||
final index =
|
final index =
|
||||||
@ -111,6 +143,7 @@ class BoardDataController extends ChangeNotifier
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@protected
|
||||||
void insertPhantom(String columnId, int index, PhantomColumnItem item) {
|
void insertPhantom(String columnId, int index, PhantomColumnItem item) {
|
||||||
columnController(columnId).insert(index, item);
|
columnController(columnId).insert(index, item);
|
||||||
}
|
}
|
||||||
|
@ -327,29 +327,16 @@ class _FakeDragTargetState<T extends DragTargetData>
|
|||||||
@override
|
@override
|
||||||
void initState() {
|
void initState() {
|
||||||
widget.insertAnimationController.addStatusListener(
|
widget.insertAnimationController.addStatusListener(
|
||||||
(status) {
|
_onInsertedAnimationStatusChanged,
|
||||||
if (status != AnimationStatus.completed) return;
|
|
||||||
if (!mounted) return;
|
|
||||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
|
||||||
setState(() {
|
|
||||||
simulateDragging = true;
|
|
||||||
widget.deleteAnimationController.reverse(from: 1.0);
|
|
||||||
widget.onWillAccept(widget.eventData.dragTargetData as T);
|
|
||||||
widget.onDragStarted(
|
|
||||||
widget.child,
|
|
||||||
widget.eventData.index,
|
|
||||||
widget.eventData.feedbackSize,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/// Start insert animation
|
||||||
widget.insertAnimationController.forward(from: 0.0);
|
widget.insertAnimationController.forward(from: 0.0);
|
||||||
|
|
||||||
widget.eventTrigger.fakeOnDragEnded(() {
|
widget.eventTrigger.fakeOnDragEnded(() {
|
||||||
if (mounted) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
widget.onDragEnded(widget.eventData.dragTargetData as T);
|
widget.onDragEnded(widget.eventData.dragTargetData as T);
|
||||||
}
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
super.initState();
|
super.initState();
|
||||||
@ -357,17 +344,40 @@ class _FakeDragTargetState<T extends DragTargetData>
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final child = IgnorePointerWidget(
|
if (simulateDragging) {
|
||||||
useIntrinsicSize: !simulateDragging, child: widget.child);
|
return SizeTransitionWithIntrinsicSize(
|
||||||
|
sizeFactor: widget.deleteAnimationController,
|
||||||
|
axis: Axis.vertical,
|
||||||
|
child: IgnorePointerWidget(
|
||||||
|
child: widget.child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
return SizeTransitionWithIntrinsicSize(
|
||||||
|
sizeFactor: widget.insertAnimationController,
|
||||||
|
axis: Axis.vertical,
|
||||||
|
child: IgnorePointerWidget(
|
||||||
|
useIntrinsicSize: true,
|
||||||
|
child: widget.child,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
final animationController = simulateDragging
|
void _onInsertedAnimationStatusChanged(AnimationStatus status) {
|
||||||
? widget.deleteAnimationController
|
if (status != AnimationStatus.completed) return;
|
||||||
: widget.insertAnimationController;
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
|
if (!mounted) return;
|
||||||
return SizeTransitionWithIntrinsicSize(
|
setState(() {
|
||||||
sizeFactor: animationController,
|
simulateDragging = true;
|
||||||
axis: Axis.vertical,
|
widget.deleteAnimationController.reverse(from: 1.0);
|
||||||
child: child,
|
widget.onWillAccept(widget.eventData.dragTargetData as T);
|
||||||
);
|
widget.onDragStarted(
|
||||||
|
widget.child,
|
||||||
|
widget.eventData.index,
|
||||||
|
widget.eventData.feedbackSize,
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,10 @@ mixin ReorderFlexMinxi {
|
|||||||
child: FadeTransition(opacity: animationController, child: child),
|
child: FadeTransition(opacity: animationController, child: child),
|
||||||
);
|
);
|
||||||
|
|
||||||
BoxConstraints contentSizeConstraints = BoxConstraints.loose(draggingFeedbackSize);
|
BoxConstraints contentSizeConstraints =
|
||||||
return ConstrainedBox(constraints: contentSizeConstraints, child: transition);
|
BoxConstraints.loose(draggingFeedbackSize);
|
||||||
|
return ConstrainedBox(
|
||||||
|
constraints: contentSizeConstraints, child: transition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,13 +58,16 @@ mixin ReorderFlexMinxi {
|
|||||||
child: FadeTransition(opacity: animationController, child: child),
|
child: FadeTransition(opacity: animationController, child: child),
|
||||||
);
|
);
|
||||||
|
|
||||||
BoxConstraints contentSizeConstraints = BoxConstraints.loose(draggingFeedbackSize);
|
BoxConstraints contentSizeConstraints =
|
||||||
return ConstrainedBox(constraints: contentSizeConstraints, child: transition);
|
BoxConstraints.loose(draggingFeedbackSize);
|
||||||
|
return ConstrainedBox(
|
||||||
|
constraints: contentSizeConstraints, child: transition);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Animation<double> withCurve(AnimationController animationController, Cubic curve) {
|
Animation<double> withCurve(
|
||||||
|
AnimationController animationController, Cubic curve) {
|
||||||
return CurvedAnimation(
|
return CurvedAnimation(
|
||||||
parent: animationController,
|
parent: animationController,
|
||||||
curve: curve,
|
curve: curve,
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import '../../../flowy_board.dart';
|
|
||||||
import '../../utils/log.dart';
|
import '../../utils/log.dart';
|
||||||
|
import '../board_column/board_column_data.dart';
|
||||||
import '../flex/drag_state.dart';
|
import '../flex/drag_state.dart';
|
||||||
import '../flex/drag_target.dart';
|
import '../flex/drag_target.dart';
|
||||||
import '../flex/drag_target_inteceptor.dart';
|
import '../flex/drag_target_inteceptor.dart';
|
||||||
import 'phantom_state.dart';
|
import 'phantom_state.dart';
|
||||||
|
|
||||||
@protected
|
|
||||||
abstract class BoardPhantomControllerDelegate {
|
abstract class BoardPhantomControllerDelegate {
|
||||||
BoardColumnDataController? controller(String columnId);
|
BoardColumnDataController? controller(String columnId);
|
||||||
|
|
||||||
@ -35,7 +34,6 @@ abstract class BoardPhantomControllerDelegate {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
|
||||||
class BoardPhantomController extends OverlapDragTargetDelegate
|
class BoardPhantomController extends OverlapDragTargetDelegate
|
||||||
with CrossReorderFlexDragTargetDelegate {
|
with CrossReorderFlexDragTargetDelegate {
|
||||||
PhantomRecord? phantomRecord;
|
PhantomRecord? phantomRecord;
|
||||||
@ -95,8 +93,6 @@ class BoardPhantomController extends OverlapDragTargetDelegate
|
|||||||
|
|
||||||
/// Remove the phantom in the column if it contains phantom
|
/// Remove the phantom in the column if it contains phantom
|
||||||
void _removePhantom(String columnId) {
|
void _removePhantom(String columnId) {
|
||||||
// columnsState.notifyDidRemovePhantom(columnId);
|
|
||||||
// columnsState.removeColumnListener(columnId);
|
|
||||||
if (delegate.removePhantom(columnId)) {
|
if (delegate.removePhantom(columnId)) {
|
||||||
columnsState.notifyDidRemovePhantom(columnId);
|
columnsState.notifyDidRemovePhantom(columnId);
|
||||||
columnsState.removeColumnListener(columnId);
|
columnsState.removeColumnListener(columnId);
|
||||||
@ -217,7 +213,6 @@ class BoardPhantomController extends OverlapDragTargetDelegate
|
|||||||
/// [toColumnId] the column that the phantom moves into
|
/// [toColumnId] the column that the phantom moves into
|
||||||
/// [toColumnIndex] the index of the phantom moves into the column
|
/// [toColumnIndex] the index of the phantom moves into the column
|
||||||
///
|
///
|
||||||
@protected
|
|
||||||
class PhantomRecord {
|
class PhantomRecord {
|
||||||
final String fromColumnId;
|
final String fromColumnId;
|
||||||
int fromColumnIndex;
|
int fromColumnIndex;
|
||||||
@ -313,7 +308,6 @@ class PassthroughPhantomContext extends FakeDragTargetEventTrigger
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
|
||||||
class PassthroughPhantomWidget extends PhantomWidget {
|
class PassthroughPhantomWidget extends PhantomWidget {
|
||||||
final PassthroughPhantomContext passthroughPhantomContext;
|
final PassthroughPhantomContext passthroughPhantomContext;
|
||||||
|
|
||||||
@ -328,7 +322,6 @@ class PassthroughPhantomWidget extends PhantomWidget {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
|
||||||
class PhantomDraggableBuilder extends ReorderFlexDraggableTargetBuilder {
|
class PhantomDraggableBuilder extends ReorderFlexDraggableTargetBuilder {
|
||||||
PhantomDraggableBuilder();
|
PhantomDraggableBuilder();
|
||||||
@override
|
@override
|
||||||
|
Reference in New Issue
Block a user