From 8ca1cc0a21c602fc9e702aa0ebc001c9039df258 Mon Sep 17 00:00:00 2001 From: appflowy Date: Fri, 5 Aug 2022 23:53:50 +0800 Subject: [PATCH] chore: add documentation --- .../flowy_board/lib/src/widgets/board.dart | 10 +-- .../lib/src/widgets/flex/drag_state.dart | 22 +++--- .../lib/src/widgets/flex/drag_target.dart | 52 ++++--------- .../widgets/flex/drag_target_inteceptor.dart | 40 ++++++---- .../lib/src/widgets/flex/reorder_flex.dart | 77 ++++++++++--------- .../widgets/phantom/phantom_controller.dart | 35 +++++---- .../src/widgets/phantom/phantom_state.dart | 6 -- 7 files changed, 114 insertions(+), 128 deletions(-) diff --git a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/board.dart b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/board.dart index 2f27734e54..3cce2b8b99 100644 --- a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/board.dart +++ b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/board.dart @@ -95,7 +95,7 @@ class BoardContent extends StatefulWidget { /// final BoardColumnFooterBuilder? footBuilder; - final OverlapReorderFlexDragTargetDelegate delegate; + final OverlapDragTargetDelegate delegate; final BoardPhantomController phantomController; @@ -122,15 +122,14 @@ class BoardContent extends StatefulWidget { } class _BoardContentState extends State { - final GlobalKey _columnContainerOverlayKey = - GlobalKey(debugLabel: '$BoardContent overlay key'); + final GlobalKey _columnContainerOverlayKey = GlobalKey(debugLabel: '$BoardContent overlay key'); late BoardOverlayEntry _overlayEntry; @override void initState() { _overlayEntry = BoardOverlayEntry( builder: (BuildContext context) { - final interceptor = OverlapReorderFlexDragTargetInteceptor( + final interceptor = OverlappingDragTargetInteceptor( reorderFlexId: widget.dataController.identifier, acceptedReorderFlexId: widget.dataController.columnIds, delegate: widget.delegate, @@ -216,8 +215,7 @@ class _BoardColumnDataSourceImpl extends BoardColumnDataDataSource { }); @override - BoardColumnData get columnData => - dataController.columnController(columnId).columnData; + BoardColumnData get columnData => dataController.columnController(columnId).columnData; @override List get acceptedColumnIds => dataController.columnIds; diff --git a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_state.dart b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_state.dart index 8c4d8af4ce..f5f7250834 100644 --- a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_state.dart +++ b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_state.dart @@ -46,16 +46,12 @@ class DraggingState { final String id; /// The member of widget.children currently being dragged. - /// - /// Null if no drag is underway. Widget? _draggingWidget; Widget? get draggingWidget => _draggingWidget; /// The last computed size of the feedback widget being dragged. - Size? _draggingFeedbackSize = Size.zero; - - Size? get feedbackSize => _draggingFeedbackSize; + Size? feedbackSize = Size.zero; /// The location that the dragging widget occupied before it started to drag. int dragStartIndex = -1; @@ -79,15 +75,17 @@ class DraggingState { DraggingState(this.id); Size get dropAreaSize { - if (_draggingFeedbackSize == null) { + if (feedbackSize == null) { return Size.zero; } - return _draggingFeedbackSize! + - const Offset(_dropAreaMargin, _dropAreaMargin); + return feedbackSize! + const Offset(_dropAreaMargin, _dropAreaMargin); } - void startDragging(Widget draggingWidget, int draggingWidgetIndex, - Size? draggingWidgetSize) { + void startDragging( + Widget draggingWidget, + int draggingWidgetIndex, + Size? draggingWidgetSize, + ) { /// assert(draggingWidgetIndex >= 0); @@ -95,7 +93,7 @@ class DraggingState { phantomIndex = draggingWidgetIndex; dragStartIndex = draggingWidgetIndex; currentIndex = draggingWidgetIndex; - _draggingFeedbackSize = draggingWidgetSize; + feedbackSize = draggingWidgetSize; } void endDragging() { @@ -130,12 +128,10 @@ class DraggingState { /// Set the currentIndex to nextIndex void moveDragTargetToNext() { - Log.trace('moveDragTargetToNext: $nextIndex'); currentIndex = nextIndex; } void updateNextIndex(int index) { - assert(index >= 0); Log.trace('updateNextIndex: $index'); nextIndex = index; } diff --git a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target.dart b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target.dart index ed44d20c14..44a177ab8f 100644 --- a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target.dart +++ b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target.dart @@ -5,24 +5,18 @@ abstract class DragTargetData { } abstract class ReorderFlexDraggableTargetBuilder { - Widget? build( - BuildContext context, - Widget child, - DragTargetOnStarted onDragStarted, - DragTargetOnEnded onDragEnded, - DragTargetWillAccpet onWillAccept); + Widget? build(BuildContext context, Widget child, DragTargetOnStarted onDragStarted, + DragTargetOnEnded onDragEnded, DragTargetWillAccpet onWillAccept); } /// -typedef DragTargetWillAccpet = bool Function( - T dragTargetData); +typedef DragTargetWillAccpet = bool Function(T dragTargetData); /// typedef DragTargetOnStarted = void Function(Widget, int, Size?); /// -typedef DragTargetOnEnded = void Function( - T dragTargetData); +typedef DragTargetOnEnded = void Function(T dragTargetData); /// [ReorderDragTarget] is a [DragTarget] that carries the index information of /// the child. @@ -75,8 +69,7 @@ class ReorderDragTarget extends StatefulWidget { State> createState() => _ReorderDragTargetState(); } -class _ReorderDragTargetState - extends State> { +class _ReorderDragTargetState extends State> { /// Returns the dragTarget's size Size? _draggingFeedbackSize = Size.zero; @@ -108,8 +101,7 @@ class _ReorderDragTargetState List rejectedCandidates, ) { Widget feedbackBuilder = Builder(builder: (BuildContext context) { - BoxConstraints contentSizeConstraints = - BoxConstraints.loose(_draggingFeedbackSize!); + BoxConstraints contentSizeConstraints = BoxConstraints.loose(_draggingFeedbackSize!); return _buildDraggableFeedback( context, contentSizeConstraints, @@ -149,21 +141,19 @@ class _ReorderDragTargetState /// When the drag does not end inside a DragTarget widget, the /// drag fails, but we still reorder the widget to the last position it /// had been dragged to. - onDraggableCanceled: (Velocity velocity, Offset offset) => - widget.onDragEnded(widget.dragTargetData), + onDraggableCanceled: (Velocity velocity, Offset offset) => widget.onDragEnded(widget.dragTargetData), child: widget.child, ); return draggableWidget; } - Widget _buildDraggableFeedback( - BuildContext context, BoxConstraints constraints, Widget child) { + Widget _buildDraggableFeedback(BuildContext context, BoxConstraints constraints, Widget child) { return Transform( transform: Matrix4.rotationZ(0), alignment: FractionalOffset.topLeft, child: Material( - elevation: 6.0, + elevation: 2.0, color: Colors.transparent, borderRadius: BorderRadius.zero, clipBehavior: Clip.hardEdge, @@ -177,10 +167,6 @@ class DragAnimationController { // How long an animation to reorder an element in the list takes. final Duration reorderAnimationDuration; - // How long an animation to scroll to an off-screen element in the - // list takes. - final Duration scrollAnimationDuration; - // This controls the entrance of the dragging widget into a new place. late AnimationController entranceController; @@ -190,14 +176,11 @@ class DragAnimationController { DragAnimationController({ required this.reorderAnimationDuration, - required this.scrollAnimationDuration, required TickerProvider vsync, required void Function(AnimationStatus) entranceAnimateStatusChanged, }) { - entranceController = AnimationController( - value: 1.0, vsync: vsync, duration: reorderAnimationDuration); - phantomController = AnimationController( - value: 0, vsync: vsync, duration: reorderAnimationDuration); + entranceController = AnimationController(value: 1.0, vsync: vsync, duration: reorderAnimationDuration); + phantomController = AnimationController(value: 0, vsync: vsync, duration: reorderAnimationDuration); entranceController.addStatusListener(entranceAnimateStatusChanged); } @@ -234,9 +217,7 @@ class IgnorePointerWidget extends StatelessWidget { @override Widget build(BuildContext context) { - final sizedChild = useIntrinsicSize - ? child - : SizedBox(width: 0.0, height: 0.0, child: child); + final sizedChild = useIntrinsicSize ? child : SizedBox(width: 0.0, height: 0.0, child: child); return IgnorePointer( ignoring: true, child: Opacity( @@ -276,10 +257,8 @@ class PhantomAnimateContorller { required this.reorderAnimationDuration, required void Function(AnimationStatus) appearAnimateStatusChanged, }) { - appearController = AnimationController( - value: 1.0, vsync: vsync, duration: reorderAnimationDuration); - disappearController = AnimationController( - value: 0, vsync: vsync, duration: reorderAnimationDuration); + appearController = AnimationController(value: 1.0, vsync: vsync, duration: reorderAnimationDuration); + disappearController = AnimationController(value: 0, vsync: vsync, duration: reorderAnimationDuration); appearController.addStatusListener(appearAnimateStatusChanged); } @@ -333,8 +312,7 @@ class FakeDragTarget extends StatefulWidget { State> createState() => _FakeDragTargetState(); } -class _FakeDragTargetState - extends State> { +class _FakeDragTargetState extends State> { bool isDragging = false; @override diff --git a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target_inteceptor.dart b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target_inteceptor.dart index 776722b05d..9f0f4eb984 100644 --- a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target_inteceptor.dart +++ b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/drag_target_inteceptor.dart @@ -5,9 +5,13 @@ import 'drag_state.dart'; import 'drag_target.dart'; import 'reorder_flex.dart'; -abstract class ReorderFlexDragTargetInterceptor { +/// [DragTargetInterceptor] is used to intercept the [DragTarget]'s +/// [onWillAccept], [OnAccept], and [onLeave] event. +abstract class DragTargetInterceptor { + /// Returns [yes] to receive the [DragTarget]'s event. bool canHandler(FlexDragTargetData dragTargetData); + /// Handle the [DragTarget]'s [onWillAccept] event. bool onWillAccept({ required BuildContext context, required ReorderFlexState reorderFlexState, @@ -16,29 +20,36 @@ abstract class ReorderFlexDragTargetInterceptor { required int dragTargetIndex, }); + /// Handle the [DragTarget]'s [onAccept] event. void onAccept(FlexDragTargetData dragTargetData) {} + /// Handle the [DragTarget]'s [onLeave] event. void onLeave(FlexDragTargetData dragTargetData) {} ReorderFlexDraggableTargetBuilder? get draggableTargetBuilder => null; } -abstract class OverlapReorderFlexDragTargetDelegate { - void dragTargetDidDisappear(); - bool acceptNewDragTargetData( +abstract class OverlapDragTargetDelegate { + void didReturnOriginalDragTarget(); + void didCrossOtherDragTarget( String reorderFlexId, FlexDragTargetData dragTargetData, int dragTargetIndex, ); } -class OverlapReorderFlexDragTargetInteceptor - extends ReorderFlexDragTargetInterceptor { +/// [OverlappingDragTargetInteceptor] is used to receive the overlapping +/// [DragTarget] event. If a [DragTarget] child is [DragTarget], it will +/// receive the [DragTarget] event when being dragged. +/// +/// Receive the [DragTarget] event if the [acceptedReorderFlexId] contains +/// the passed in dragTarget' reorderFlexId. +class OverlappingDragTargetInteceptor extends DragTargetInterceptor { final String reorderFlexId; final List acceptedReorderFlexId; - final OverlapReorderFlexDragTargetDelegate delegate; + final OverlapDragTargetDelegate delegate; - OverlapReorderFlexDragTargetInteceptor({ + OverlappingDragTargetInteceptor({ required this.delegate, required this.reorderFlexId, required this.acceptedReorderFlexId, @@ -57,9 +68,9 @@ class OverlapReorderFlexDragTargetInteceptor required String dragTargetId, required int dragTargetIndex}) { if (dragTargetId == dragTargetData.reorderFlexId) { - delegate.dragTargetDidDisappear(); + delegate.didReturnOriginalDragTarget(); } else { - delegate.acceptNewDragTargetData( + delegate.didCrossOtherDragTarget( dragTargetId, dragTargetData, dragTargetIndex, @@ -84,8 +95,7 @@ abstract class CrossReorderFlexDragTargetDelegate { ); } -class CrossReorderFlexDragTargetInterceptor - extends ReorderFlexDragTargetInterceptor { +class CrossReorderFlexDragTargetInterceptor extends DragTargetInterceptor { final String reorderFlexId; final List acceptedReorderFlexIds; final CrossReorderFlexDragTargetDelegate delegate; @@ -117,14 +127,12 @@ class CrossReorderFlexDragTargetInterceptor @override void onAccept(FlexDragTargetData dragTargetData) { - Log.trace( - '[$CrossReorderFlexDragTargetInterceptor] Column$reorderFlexId on onAccept'); + Log.trace('[$CrossReorderFlexDragTargetInterceptor] Column$reorderFlexId on onAccept'); } @override void onLeave(FlexDragTargetData dragTargetData) { - Log.trace( - '[$CrossReorderFlexDragTargetInterceptor] Column$reorderFlexId on leave'); + Log.trace('[$CrossReorderFlexDragTargetInterceptor] Column$reorderFlexId on leave'); } @override diff --git a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/reorder_flex.dart b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/reorder_flex.dart index 89aa00de8d..fb861ae3ba 100644 --- a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/reorder_flex.dart +++ b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/flex/reorder_flex.dart @@ -14,26 +14,34 @@ typedef OnDragEnded = void Function(); typedef OnReorder = void Function(int fromIndex, int toIndex); typedef OnDeleted = void Function(int deletedIndex); typedef OnInserted = void Function(int insertedIndex); -typedef OnReveivePassedInPhantom = void Function( - FlexDragTargetData dragTargetData, int phantomIndex); +typedef OnReveivePassedInPhantom = void Function(FlexDragTargetData dragTargetData, int phantomIndex); abstract class ReoderFlextDataSource { + /// [identifier] represents the id the [ReorderFlex]. It must be unique. String get identifier; + + /// The number of [ReoderFlexItem]s will be displaied in the [ReorderFlex]. UnmodifiableListView get items; } +/// Each item displaied in the [ReorderFlex] required to implement the [ReoderFlexItem]. abstract class ReoderFlexItem { - /// [id] is used to identify the item + /// [id] is used to identify the item. It must be unique. String get id; } class ReorderFlexConfig { - final bool needsLongPressDraggable = true; + /// The opacity of the dragging widget final double draggingWidgetOpacity = 0.2; + + // How long an animation to reorder an element final Duration reorderAnimationDuration = const Duration(milliseconds: 250); + + // How long an animation to scroll to an off-screen element final Duration scrollAnimationDuration = const Duration(milliseconds: 250); final double? spacing; + const ReorderFlexConfig({this.spacing}); } @@ -42,17 +50,25 @@ class ReorderFlex extends StatefulWidget { final List children; final EdgeInsets? padding; + + /// [direction] How to place the children, default is Axis.vertical final Axis direction; final MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start; + final ScrollController? scrollController; + /// [onDragStarted] is called when start dragging final OnDragStarted? onDragStarted; + + /// [onReorder] is called when dragTarget did end dragging final OnReorder onReorder; + + /// [onDragEnded] is called when dragTarget did end dragging final OnDragEnded? onDragEnded; final ReoderFlextDataSource dataSource; - final ReorderFlexDragTargetInterceptor? interceptor; + final DragTargetInterceptor? interceptor; const ReorderFlex({ Key? key, @@ -74,16 +90,20 @@ class ReorderFlex extends StatefulWidget { String get reorderFlexId => dataSource.identifier; } -class ReorderFlexState extends State - with ReorderFlexMinxi, TickerProviderStateMixin { +class ReorderFlexState extends State with ReorderFlexMinxi, TickerProviderStateMixin { /// Controls scrolls and measures scroll progress. late ScrollController _scrollController; + + /// Records the position of the [Scrollable] ScrollPosition? _attachedScrollPosition; /// Whether or not we are currently scrolling this view to show a widget. bool _scrolling = false; + /// [dragState] records the dragging state including dragStartIndex, and phantomIndex, etc. late DraggingState dragState; + + /// [_dragAnimationController] controls the dragging animations late DragAnimationController _dragAnimationController; @override @@ -92,7 +112,6 @@ class ReorderFlexState extends State _dragAnimationController = DragAnimationController( reorderAnimationDuration: widget.config.reorderAnimationDuration, - scrollAnimationDuration: widget.config.scrollAnimationDuration, entranceAnimateStatusChanged: (status) { if (status == AnimationStatus.completed) { setState(() => _requestAnimationToNextIndex()); @@ -111,9 +130,7 @@ class ReorderFlexState extends State _attachedScrollPosition = null; } - _scrollController = widget.scrollController ?? - PrimaryScrollController.of(context) ?? - ScrollController(); + _scrollController = widget.scrollController ?? PrimaryScrollController.of(context) ?? ScrollController(); if (_scrollController.hasClients) { _attachedScrollPosition = Scrollable.of(context)?.position; @@ -235,9 +252,7 @@ class ReorderFlexState extends State ]); } else if (childIndex == dragPhantomIndex) { return _buildDraggingContainer( - children: shiftedIndex <= childIndex - ? [dragTarget, disappearSpace] - : [disappearSpace, dragTarget]); + children: shiftedIndex <= childIndex ? [dragTarget, disappearSpace] : [disappearSpace, dragTarget]); } } @@ -258,9 +273,7 @@ class ReorderFlexState extends State ]); } else if (childIndex == dragPhantomIndex) { return _buildDraggingContainer( - children: shiftedIndex >= childIndex - ? [disappearSpace, dragTarget] - : [dragTarget, disappearSpace]); + children: shiftedIndex >= childIndex ? [disappearSpace, dragTarget] : [dragTarget, disappearSpace]); } } @@ -286,8 +299,7 @@ class ReorderFlexState extends State Widget child, int dragTargetIndex, ) { - final ReoderFlexItem reorderFlexItem = - widget.dataSource.items[dragTargetIndex]; + final ReoderFlexItem reorderFlexItem = widget.dataSource.items[dragTargetIndex]; return ReorderDragTarget( dragTargetData: FlexDragTargetData( draggingIndex: dragTargetIndex, @@ -297,14 +309,12 @@ class ReorderFlexState extends State dragTargetId: reorderFlexItem.id, ), onDragStarted: (draggingWidget, draggingIndex, size) { - Log.debug( - "[DragTarget] Column${widget.dataSource.identifier} start dragging"); + Log.debug("[DragTarget] Column${widget.dataSource.identifier} start dragging"); _startDragging(draggingWidget, draggingIndex, size); widget.onDragStarted?.call(draggingIndex); }, onDragEnded: (dragTargetData) { - Log.debug( - "[DragTarget]: Column${widget.dataSource.identifier} end dragging"); + Log.debug("[DragTarget]: Column${widget.dataSource.identifier} end dragging"); setState(() { _onReordered( @@ -352,7 +362,7 @@ class ReorderFlexState extends State bool _interceptDragTarget( FlexDragTargetData dragTargetData, - void Function(ReorderFlexDragTargetInterceptor) callback, + void Function(DragTargetInterceptor) callback, ) { final interceptor = widget.interceptor; if (interceptor != null && interceptor.canHandler(dragTargetData)) { @@ -401,8 +411,7 @@ class ReorderFlexState extends State Log.trace( '[$ReorderDragTarget] ${widget.dataSource.identifier} on will accept, dragIndex:$dragIndex, dragTargetIndex:$dragTargetIndex, count: ${widget.dataSource.items.length}'); - bool willAccept = - dragState.dragStartIndex == dragIndex && dragIndex != dragTargetIndex; + bool willAccept = dragState.dragStartIndex == dragIndex && dragIndex != dragTargetIndex; setState(() { if (willAccept) { int shiftedIndex = dragState.calculateShiftedIndex(dragTargetIndex); @@ -429,8 +438,7 @@ class ReorderFlexState extends State } Widget _wrapScrollView({required Widget child}) { - if (widget.scrollController != null && - PrimaryScrollController.of(context) == null) { + if (widget.scrollController != null && PrimaryScrollController.of(context) == null) { return child; } else { return SingleChildScrollView( @@ -484,14 +492,12 @@ class ReorderFlexState extends State void _scrollTo(BuildContext context) { if (_scrolling) return; final RenderObject contextObject = context.findRenderObject()!; - final RenderAbstractViewport viewport = - RenderAbstractViewport.of(contextObject)!; + final RenderAbstractViewport viewport = RenderAbstractViewport.of(contextObject)!; // If and only if the current scroll offset falls in-between the offsets // necessary to reveal the selected context at the top or bottom of the // screen, then it is already on-screen. - final double margin = widget.direction == Axis.horizontal - ? dragState.dropAreaSize.width - : dragState.dropAreaSize.height; + final double margin = + widget.direction == Axis.horizontal ? dragState.dropAreaSize.width : dragState.dropAreaSize.height; if (_scrollController.hasClients) { final double scrollOffset = _scrollController.offset; final double topOffset = max( @@ -502,8 +508,7 @@ class ReorderFlexState extends State _scrollController.position.maxScrollExtent, viewport.getOffsetToReveal(contextObject, 1.0).offset + margin, ); - final bool onScreen = - scrollOffset <= topOffset && scrollOffset >= bottomOffset; + final bool onScreen = scrollOffset <= topOffset && scrollOffset >= bottomOffset; // If the context is off screen, then we request a scroll to make it visible. if (!onScreen) { @@ -511,7 +516,7 @@ class ReorderFlexState extends State _scrollController.position .animateTo( scrollOffset < bottomOffset ? bottomOffset : topOffset, - duration: _dragAnimationController.scrollAnimationDuration, + duration: widget.config.scrollAnimationDuration, curve: Curves.easeInOut, ) .then((void value) { diff --git a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_controller.dart b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_controller.dart index 69f9fd85aa..aa2d9550d3 100644 --- a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_controller.dart +++ b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_controller.dart @@ -34,8 +34,7 @@ abstract class BoardPhantomControllerDelegate { ); } -class BoardPhantomController extends OverlapReorderFlexDragTargetDelegate - with CrossReorderFlexDragTargetDelegate { +class BoardPhantomController extends OverlapDragTargetDelegate with CrossReorderFlexDragTargetDelegate { PhantomRecord? phantomRecord; final BoardPhantomControllerDelegate delegate; final columnsState = ColumnPhantomStateController(); @@ -117,8 +116,7 @@ class BoardPhantomController extends OverlapReorderFlexDragTargetDelegate WidgetsBinding.instance.addPostFrameCallback((_) { Future.delayed(const Duration(milliseconds: 100), () { - Log.debug( - '[$BoardPhantomController] notify $toColumnId to insert phantom'); + Log.debug('[$BoardPhantomController] notify $toColumnId to insert phantom'); columnsState.notifyDidInsertPhantom(toColumnId); }); }); @@ -185,7 +183,7 @@ class BoardPhantomController extends OverlapReorderFlexDragTargetDelegate } @override - void dragTargetDidDisappear() { + void didReturnOriginalDragTarget() { if (phantomRecord == null) { return; } @@ -193,6 +191,19 @@ class BoardPhantomController extends OverlapReorderFlexDragTargetDelegate _removePhantom(phantomRecord!.toColumnId); phantomRecord = null; } + + @override + void didCrossOtherDragTarget( + String reorderFlexId, + FlexDragTargetData dragTargetData, + int dragTargetIndex, + ) { + acceptNewDragTargetData( + reorderFlexId, + dragTargetData, + dragTargetIndex, + ); + } } /// Use [PhantomRecord] to record where to remove the column item and where to @@ -221,8 +232,7 @@ class PhantomRecord { if (fromColumnIndex == index) { return; } - Log.debug( - '[$PhantomRecord] Update Column$fromColumnId remove position to $index'); + Log.debug('[$PhantomRecord] Update Column$fromColumnId remove position to $index'); fromColumnIndex = index; } @@ -231,8 +241,7 @@ class PhantomRecord { return; } - Log.debug( - '[$PhantomRecord] Column$toColumnId update position $toColumnIndex -> $index'); + Log.debug('[$PhantomRecord] Column$toColumnId update position $toColumnIndex -> $index'); toColumnIndex = index; } @@ -245,8 +254,7 @@ class PhantomRecord { class PhantomColumnItem extends ColumnItem { final PassthroughPhantomContext phantomContext; - PhantomColumnItem(PassthroughPhantomContext insertedPhantom) - : phantomContext = insertedPhantom; + PhantomColumnItem(PassthroughPhantomContext insertedPhantom) : phantomContext = insertedPhantom; @override bool get isPhantom => true; @@ -256,9 +264,8 @@ class PhantomColumnItem extends ColumnItem { Size? get feedbackSize => phantomContext.feedbackSize; - Widget get draggingWidget => phantomContext.draggingWidget == null - ? const SizedBox() - : phantomContext.draggingWidget!; + Widget get draggingWidget => + phantomContext.draggingWidget == null ? const SizedBox() : phantomContext.draggingWidget!; @override String toString() { diff --git a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_state.dart b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_state.dart index f26cc26f11..d33b53500d 100644 --- a/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_state.dart +++ b/frontend/app_flowy/packages/flowy_board/lib/src/widgets/phantom/phantom_state.dart @@ -97,13 +97,7 @@ class PhantomInsertNotifier extends ChangeNotifier { } class PhantomDeleteNotifier extends ChangeNotifier { - // int deletedIndex = -1; - void remove() { - // if (this.deletedIndex != deletedIndex) { - // this.deletedIndex = deletedIndex; - // notifyListeners(); - // } notifyListeners(); } }