applyAdvancedGesturesDetectors function

Widget applyAdvancedGesturesDetectors(
  1. Stage stage,
  2. Widget child
)

Implementation

Widget applyAdvancedGesturesDetectors(Stage stage, Widget child) {
  final isDraggableMixin = stage is HasDraggablesMixin;

  if (!isDraggableMixin) return child;

  final Map<Type, GestureRecognizerFactory> gestures = {};
  int lastGeneratedDragId = 0;

  void addAndConfigureRecognizer<T extends GestureRecognizer>(
    T Function() ts,
    void Function(T) bindHandlers,
  ) {
    gestures[T] = GestureRecognizerFactoryWithHandlers<T>(ts, bindHandlers);
  }

  void addDragRecognizer(Stage stage, Drag Function(int, DragStartInfo) config) {
    addAndConfigureRecognizer(
      () => ImmediateMultiDragGestureRecognizer(),
      (ImmediateMultiDragGestureRecognizer instance) {
        instance.onStart = (Offset o) {
          final pointerId = lastGeneratedDragId++;

          final global = o;
          final local = stage.convertGlobalToLocalCoordinate(global.toVector2()).toOffset();
          final details = DragStartDetails(
            localPosition: local,
            globalPosition: global,
          );

          return config(pointerId, DragStartInfo.fromDetails(stage, details));
        };
      },
    );
  }

  if (isDraggableMixin) {
    addDragRecognizer(stage, (int pointerId, DragStartInfo position) {
      stage.onDragStart(pointerId, position);
      return _DragEvent(
        stage,
        onUpdate: (details) => stage.onDragUpdate(pointerId, details),
        onEnd: (details) => stage.onDragEnd(pointerId, details),
        onCancel: () => stage.onDragCancel(pointerId),
      );
    });
  }

  return RawGestureDetector(
    gestures: gestures,
    behavior: HitTestBehavior.opaque,
    child: child,
  );
}