Files
Luan Nico 46bd385675 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.
2025-10-06 11:11:31 -04:00

148 lines
5.4 KiB
Dart

import 'package:dashbook/dashbook.dart';
import 'package:examples/commons/commons.dart';
import 'package:examples/stories/input/advanced_button_example.dart';
import 'package:examples/stories/input/double_tap_callbacks_example.dart';
import 'package:examples/stories/input/drag_callbacks_example.dart';
import 'package:examples/stories/input/gesture_hitboxes_example.dart';
import 'package:examples/stories/input/hardware_keyboard_example.dart';
import 'package:examples/stories/input/hover_callbacks_example.dart';
import 'package:examples/stories/input/joystick_advanced_example.dart';
import 'package:examples/stories/input/joystick_example.dart';
import 'package:examples/stories/input/keyboard_example.dart';
import 'package:examples/stories/input/keyboard_listener_component_example.dart';
import 'package:examples/stories/input/mouse_cursor_example.dart';
import 'package:examples/stories/input/mouse_movement_example.dart';
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';
void addInputStories(Dashbook dashbook) {
dashbook.storiesOf('Input')
..add(
'TapCallbacks',
(_) => GameWidget(game: TapCallbacksExample()),
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) {
return GameWidget(
game: DragCallbacksExample(
zoom: context.listProperty('zoom', 1, [0.5, 1, 1.5]),
),
);
},
codeLink: baseLink('input/drag_callbacks_example.dart'),
info: DragCallbacksExample.description,
)
..add(
'Double Tap (Component)',
(context) {
return GameWidget(
game: DoubleTapCallbacksExample(),
);
},
codeLink: baseLink('input/double_tap_callbacks_example.dart'),
info: DoubleTapCallbacksExample.description,
)
..add(
'HoverCallbacks',
(_) => GameWidget(game: HoverCallbacksExample()),
codeLink: baseLink('input/hover_callbacks_example.dart'),
info: HoverCallbacksExample.description,
)
..add(
'Keyboard',
(_) => GameWidget(game: KeyboardExample()),
codeLink: baseLink('input/keyboard_example.dart'),
info: KeyboardExample.description,
)
..add(
'Keyboard (Component)',
(_) => GameWidget(game: KeyboardListenerComponentExample()),
codeLink: baseLink('input/keyboard_listener_component_example.dart'),
info: KeyboardListenerComponentExample.description,
)
..add(
'Hardware Keyboard',
(_) => GameWidget(game: HardwareKeyboardExample()),
codeLink: baseLink('input/hardware_keyboard_example.dart'),
info: HardwareKeyboardExample.description,
)
..add(
'Mouse Movement',
(_) => GameWidget(game: MouseMovementExample()),
codeLink: baseLink('input/mouse_movement_example.dart'),
info: MouseMovementExample.description,
)
..add(
'Mouse Cursor',
(_) => GameWidget(
game: MouseCursorExample(),
mouseCursor: SystemMouseCursors.move,
),
codeLink: baseLink('input/mouse_cursor_example.dart'),
info: MouseCursorExample.description,
)
..add(
'Scroll',
(_) => GameWidget(game: ScrollExample()),
codeLink: baseLink('input/scroll_example.dart'),
info: ScrollExample.description,
)
..add(
'Multitap',
(_) => GameWidget(game: MultitapExample()),
codeLink: baseLink('input/multitap_example.dart'),
info: MultitapExample.description,
)
..add(
'Multitap Advanced',
(_) => GameWidget(game: MultitapAdvancedExample()),
codeLink: baseLink('input/multitap_advanced_example.dart'),
info: MultitapAdvancedExample.description,
)
..add(
'Overlapping TapCallbacks',
(_) => GameWidget(game: OverlappingTapCallbacksExample()),
codeLink: baseLink('input/overlapping_tap_callbacks_example.dart'),
info: OverlappingTapCallbacksExample.description,
)
..add(
'Gesture Hitboxes',
(_) => GameWidget(game: GestureHitboxesExample()),
codeLink: baseLink('input/gesture_hitboxes_example.dart'),
info: GestureHitboxesExample.description,
)
..add(
'Joystick',
(_) => GameWidget(game: JoystickExample()),
codeLink: baseLink('input/joystick_example.dart'),
info: JoystickExample.description,
)
..add(
'Joystick Advanced',
(_) => GameWidget(game: JoystickAdvancedExample()),
codeLink: baseLink('input/joystick_advanced_example.dart'),
info: JoystickAdvancedExample.description,
)
..add(
'Advanced Button',
(_) => GameWidget(game: AdvancedButtonExample()),
codeLink: baseLink('input/advanced_button_example.dart'),
info: AdvancedButtonExample.description,
);
}