feat: Add isDragged in DragCallbacks mixin (#2472)

Adding a isDragged state for DragCallbacks mixin. This was available in the Draggable mixin.
This commit is contained in:
DevKage
2023-04-07 17:09:28 +05:30
committed by GitHub
parent e7ebf8e55a
commit de630a1c3a
8 changed files with 76 additions and 33 deletions

View File

@ -74,6 +74,7 @@ class DragTarget extends PositionComponent with DragCallbacks {
@override @override
void onDragStart(DragStartEvent event) { void onDragStart(DragStartEvent event) {
super.onDragStart(event);
final trail = Trail(event.localPosition); final trail = Trail(event.localPosition);
_trails[event.pointerId] = trail; _trails[event.pointerId] = trail;
add(trail); add(trail);
@ -86,11 +87,13 @@ class DragTarget extends PositionComponent with DragCallbacks {
@override @override
void onDragEnd(DragEndEvent event) { void onDragEnd(DragEndEvent event) {
super.onDragEnd(event);
_trails.remove(event.pointerId)!.end(); _trails.remove(event.pointerId)!.end();
} }
@override @override
void onDragCancel(DragCancelEvent event) { void onDragCancel(DragCancelEvent event) {
super.onDragCancel(event);
_trails.remove(event.pointerId)!.cancel(); _trails.remove(event.pointerId)!.cancel();
} }
} }
@ -203,7 +206,6 @@ class Star extends PositionComponent with DragCallbacks {
..color = const Color(0xFF000000) ..color = const Color(0xFF000000)
..maskFilter = const MaskFilter.blur(BlurStyle.normal, 4.0); ..maskFilter = const MaskFilter.blur(BlurStyle.normal, 4.0);
late final Path _path; late final Path _path;
bool _isDragged = false;
@override @override
bool containsLocalPoint(Vector2 point) { bool containsLocalPoint(Vector2 point) {
@ -212,7 +214,7 @@ class Star extends PositionComponent with DragCallbacks {
@override @override
void render(Canvas canvas) { void render(Canvas canvas) {
if (_isDragged) { if (isDragged) {
_paint.color = color.withOpacity(0.5); _paint.color = color.withOpacity(0.5);
canvas.drawPath(_path, _paint); canvas.drawPath(_path, _paint);
canvas.drawPath(_path, _borderPaint); canvas.drawPath(_path, _borderPaint);
@ -225,13 +227,13 @@ class Star extends PositionComponent with DragCallbacks {
@override @override
void onDragStart(DragStartEvent event) { void onDragStart(DragStartEvent event) {
_isDragged = true; super.onDragStart(event);
priority = 10; priority = 10;
} }
@override @override
void onDragEnd(DragEndEvent event) { void onDragEnd(DragEndEvent event) {
_isDragged = false; super.onDragEnd(event);
priority = 0; priority = 0;
} }

View File

@ -222,6 +222,7 @@ class Card extends PositionComponent with DragCallbacks {
@override @override
void onDragStart(DragStartEvent event) { void onDragStart(DragStartEvent event) {
super.onDragStart(event);
if (pile?.canMoveCard(this) ?? false) { if (pile?.canMoveCard(this) ?? false) {
_isDragging = true; _isDragging = true;
priority = 100; priority = 100;
@ -252,6 +253,7 @@ class Card extends PositionComponent with DragCallbacks {
@override @override
void onDragEnd(DragEndEvent event) { void onDragEnd(DragEndEvent event) {
super.onDragEnd(event);
if (!_isDragging) { if (!_isDragging) {
return; return;
} }

View File

@ -90,7 +90,6 @@ abstract class MyCollidable extends PositionComponent
late final Paint _dragIndicatorPaint; late final Paint _dragIndicatorPaint;
final ScreenHitbox screenHitbox; final ScreenHitbox screenHitbox;
ShapeHitbox? hitbox; ShapeHitbox? hitbox;
bool isDragged = false;
MyCollidable( MyCollidable(
Vector2 position, Vector2 position,
@ -154,14 +153,9 @@ abstract class MyCollidable extends PositionComponent
} }
@override @override
void onDragStart(DragStartEvent info) { void onDragEnd(DragEndEvent event) {
isDragged = true; super.onDragEnd(event);
} velocity.setFrom(event.velocity / 10);
@override
void onDragEnd(DragEndEvent info) {
velocity.setFrom(info.velocity / 10);
isDragged = false;
} }
} }

View File

@ -28,7 +28,6 @@ class DraggablesExample extends FlameGame {
class DraggableEmber extends Ember with DragCallbacks { class DraggableEmber extends Ember with DragCallbacks {
@override @override
bool debugMode = true; bool debugMode = true;
bool isDragged = false;
DraggableEmber({Vector2? position}) DraggableEmber({Vector2? position})
: super( : super(
@ -45,23 +44,13 @@ class DraggableEmber extends Ember with DragCallbacks {
} }
@override @override
void onDragStart(_) { void onDragUpdate(DragUpdateEvent event) {
isDragged = true;
}
@override
void onDragUpdate(DragUpdateEvent info) {
if (parent is! DraggablesExample) { if (parent is! DraggablesExample) {
info.continuePropagation = true; event.continuePropagation = true;
return; return;
} }
position.add(info.localPosition); position.add(event.localPosition);
info.continuePropagation = false; event.continuePropagation = false;
}
@override
void onDragEnd(_) {
isDragged = false;
} }
} }

View File

@ -106,6 +106,7 @@ class JoystickComponent extends HudMarginComponent with DragCallbacks {
@override @override
bool onDragStart(DragStartEvent info) { bool onDragStart(DragStartEvent info) {
super.onDragStart(info);
return false; return false;
} }
@ -117,12 +118,14 @@ class JoystickComponent extends HudMarginComponent with DragCallbacks {
@override @override
bool onDragEnd(_) { bool onDragEnd(_) {
super.onDragEnd(_);
onDragStop(); onDragStop();
return false; return false;
} }
@override @override
bool onDragCancel(_) { bool onDragCancel(_) {
super.onDragCancel(_);
onDragStop(); onDragStop();
return false; return false;
} }

View File

@ -17,6 +17,11 @@ import 'package:meta/meta.dart';
/// ///
/// This mixin is intended as a replacement of the [Draggable] mixin. /// This mixin is intended as a replacement of the [Draggable] mixin.
mixin DragCallbacks on Component { mixin DragCallbacks on Component {
bool _isDragged = false;
/// Returns true while the component is being dragged.
bool get isDragged => _isDragged;
/// The user initiated a drag gesture on top of this component. /// The user initiated a drag gesture on top of this component.
/// ///
/// By default, only one component will receive a drag event. However, setting /// By default, only one component will receive a drag event. However, setting
@ -28,7 +33,10 @@ mixin DragCallbacks on Component {
/// will be delivered to the same component. If multiple components have /// will be delivered to the same component. If multiple components have
/// received the initial [onDragStart] event, then all of them will be /// received the initial [onDragStart] event, then all of them will be
/// receiving the follow-up events. /// receiving the follow-up events.
void onDragStart(DragStartEvent event) {} @mustCallSuper
void onDragStart(DragStartEvent event) {
_isDragged = true;
}
/// The user has moved the pointer that initiated the drag gesture. /// The user has moved the pointer that initiated the drag gesture.
/// ///
@ -43,12 +51,16 @@ mixin DragCallbacks on Component {
/// This event will be delivered to the component(s) that captured the initial /// This event will be delivered to the component(s) that captured the initial
/// [onDragStart], even if the point of touch moves outside of the boundaries /// [onDragStart], even if the point of touch moves outside of the boundaries
/// of the component. /// of the component.
void onDragEnd(DragEndEvent event) {} @mustCallSuper
void onDragEnd(DragEndEvent event) {
_isDragged = false;
}
/// The drag was cancelled. /// The drag was cancelled.
/// ///
/// This is a very rare event, so we provide a default implementation that /// This is a very rare event, so we provide a default implementation that
/// converts it into an [onDragEnd] event. /// converts it into an [onDragEnd] event.
@mustCallSuper
void onDragCancel(DragCancelEvent event) => onDragEnd(event.toDragEnd()); void onDragCancel(DragCancelEvent event) => onDragEnd(event.toDragEnd());
@override @override

View File

@ -160,6 +160,25 @@ void main() {
expect(game.dragCancelEvent, equals(0)); expect(game.dragCancelEvent, equals(0));
}, },
); );
testWidgets(
'isDragged is changed',
(tester) async {
final component = _DragCallbacksComponent()..size = Vector2.all(100);
final game = FlameGame(children: [component]);
await tester.pumpWidget(GameWidget(game: game));
await tester.pump();
await tester.pump();
// Inside component
await tester.dragFrom(const Offset(10, 10), const Offset(90, 90));
expect(component.isDraggedStateChange, equals(2));
// Outside component
await tester.dragFrom(const Offset(101, 101), const Offset(110, 110));
expect(component.isDraggedStateChange, equals(2));
},
);
}); });
} }
@ -168,11 +187,19 @@ mixin _DragCounter on DragCallbacks {
int dragUpdateEvent = 0; int dragUpdateEvent = 0;
int dragEndEvent = 0; int dragEndEvent = 0;
int dragCancelEvent = 0; int dragCancelEvent = 0;
int isDraggedStateChange = 0;
bool _wasDragged = false;
@override @override
void onDragStart(DragStartEvent event) { void onDragStart(DragStartEvent event) {
super.onDragStart(event);
event.handled = true; event.handled = true;
dragStartEvent++; dragStartEvent++;
if (_wasDragged != isDragged) {
++isDraggedStateChange;
_wasDragged = isDragged;
}
} }
@override @override
@ -183,12 +210,18 @@ mixin _DragCounter on DragCallbacks {
@override @override
void onDragEnd(DragEndEvent event) { void onDragEnd(DragEndEvent event) {
super.onDragEnd(event);
event.handled = true; event.handled = true;
dragEndEvent++; dragEndEvent++;
if (_wasDragged != isDragged) {
++isDraggedStateChange;
_wasDragged = isDragged;
}
} }
@override @override
void onDragCancel(DragCancelEvent event) { void onDragCancel(DragCancelEvent event) {
super.onDragCancel(event);
event.handled = true; event.handled = true;
dragCancelEvent++; dragCancelEvent++;
} }

View File

@ -181,13 +181,21 @@ class _DragCallbacksComponent extends PositionComponent with DragCallbacks {
final void Function(DragEndEvent)? _onDragEnd; final void Function(DragEndEvent)? _onDragEnd;
@override @override
void onDragStart(DragStartEvent event) => _onDragStart?.call(event); void onDragStart(DragStartEvent event) {
super.onDragStart(event);
return _onDragStart?.call(event);
}
@override @override
void onDragUpdate(DragUpdateEvent event) => _onDragUpdate?.call(event); void onDragUpdate(DragUpdateEvent event) {
return _onDragUpdate?.call(event);
}
@override @override
void onDragEnd(DragEndEvent event) => _onDragEnd?.call(event); void onDragEnd(DragEndEvent event) {
super.onDragEnd(event);
return _onDragEnd?.call(event);
}
} }
class _SimpleDragCallbacksComponent extends PositionComponent class _SimpleDragCallbacksComponent extends PositionComponent