feat!: Support secondary taps (right click) on new callbacks system (#3741)

Support secondary taps (right click) on new callbacks system.

In order to follow through with our [event system
migration](https://docs.google.com/document/d/1nBUup9QCPioVwWL1zs79z1hWF882tAYfNywFMdye2Qc),
we need to make sure the new system is equipped to support all use
cases; also changes the existing TapCallbacks to be primary-only.

I noticed that we don't support "secondary taps" (i.e. right clicks), so
I am adding this. I honestly really dislike the fact that this is
considered a completely different event from the left click, instead of
just a property on the click event. But I kept this structure to
replicate what Flutter does, so this is more familiar for users. I think
that is worth the slight verbosity of having yet another detector. Also,
it plays well this way with Flutter because that underlying events are a
bit different (for example, the secondary ones don't support `pointId`).

Note: this is a slight breaking change because the existing detector
works for BOTH left and right click, but there is NO WAY of
distinguishing them because the `buttons` property is not propagated in
the Flutter end (massive oversight I believe - might put a PR later).
Since this provides the secondary as a solution, it also removes
secondary clicks from triggering the primary. I think this is more
versatile than having tap detector=`(primary OR secondary)` and
secondary=`(secondary only)`.

I don't think this should affect basically any users because (1) desktop
only and (2) this acceptance of right clicks was probably a bug anyway
(for example, on the example it would rotate the square and also open
the context menu, which is jarring).

However I am happy to add an option or pursue a different approach, I
believe this is the best path forward, IMO.
This commit is contained in:
Luan Nico
2025-10-06 08:11:31 -07:00
committed by GitHub
parent 8534a55740
commit 46bd385675
12 changed files with 593 additions and 1 deletions

View File

@ -16,6 +16,7 @@ import 'package:examples/stories/input/multitap_advanced_example.dart';
import 'package:examples/stories/input/multitap_example.dart';
import 'package:examples/stories/input/overlapping_tap_callbacks_example.dart';
import 'package:examples/stories/input/scroll_example.dart';
import 'package:examples/stories/input/secondary_tap_callbacks_example.dart';
import 'package:examples/stories/input/tap_callbacks_example.dart';
import 'package:flame/game.dart';
import 'package:flutter/material.dart';
@ -28,6 +29,12 @@ void addInputStories(Dashbook dashbook) {
codeLink: baseLink('input/tap_callbacks_example.dart'),
info: TapCallbacksExample.description,
)
..add(
'SecondaryTapCallbacks',
(_) => GameWidget(game: SecondaryTapCallbacksExample()),
codeLink: baseLink('input/secondary_tap_callbacks_example.dart'),
info: SecondaryTapCallbacksExample.description,
)
..add(
'DragCallbacks',
(context) {