Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 63 additions & 17 deletions packages/flet/lib/src/controls/gesture_detector.dart
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ class _GestureDetectorControlState extends State<GestureDetectorControl> {
bool _rightPanActive = false;
int _rightPanTimestamp = DateTime.now().millisecondsSinceEpoch;
Offset _rightPanStart = Offset.zero;
TapDownDetails? _lastTapDownDetails;
TapDownDetails? _lastSecondaryTapDownDetails;
TapDownDetails? _lastDoubleTapDownDetails;

@override
void initState() {
Expand Down Expand Up @@ -68,13 +71,21 @@ class _GestureDetectorControlState extends State<GestureDetectorControl> {
widget.control.getBool("on_secondary_tap_down", false)!;
var onSecondaryTapUp =
widget.control.getBool("on_secondary_tap_up", false)!;
var onTertiaryTapDown =
widget.control.getBool("on_tertiary_tap_down", false)!;
var onTertiaryTapUp =
widget.control.getBool("on_tertiary_tap_up", false)!;
var onLongPressStart =
widget.control.getBool("on_long_press_start", false)!;
var onLongPressEnd = widget.control.getBool("on_long_press_end", false)!;
var onSecondaryLongPressStart =
widget.control.getBool("on_secondary_long_press_start", false)!;
var onSecondaryLongPressEnd =
widget.control.getBool("on_secondary_long_press_end", false)!;
var onTertiaryLongPressStart =
widget.control.getBool("on_tertiary_long_press_start", false)!;
var onTertiaryLongPressEnd =
widget.control.getBool("on_tertiary_long_press_end", false)!;
var onDoubleTap = widget.control.getBool("on_double_tap", false)!;
var onDoubleTapDown = widget.control.getBool("on_double_tap_down", false)!;
var onHorizontalDragStart =
Expand Down Expand Up @@ -185,10 +196,14 @@ class _GestureDetectorControlState extends State<GestureDetectorControl> {
onSecondaryTap |
onSecondaryTapDown |
onSecondaryTapUp |
onTertiaryTapDown |
onTertiaryTapUp |
onLongPressStart |
onLongPressEnd |
onSecondaryLongPressStart |
onSecondaryLongPressEnd |
onTertiaryLongPressStart |
onTertiaryLongPressEnd |
onDoubleTap |
onDoubleTapDown |
onHorizontalDragStart |
Expand Down Expand Up @@ -217,30 +232,48 @@ class _GestureDetectorControlState extends State<GestureDetectorControl> {
.nonNulls
.toSet();
}(),
onTap: onTap ? () => widget.control.triggerEvent("tap") : null,
onTapDown: onTapDown
? (TapDownDetails details) {
widget.control.triggerEvent("tap_down", details.toMap());
}
onTap: onTap
? () => widget.control
.triggerEvent("tap", _lastTapDownDetails?.toMap())
: null,
onTapDown: (TapDownDetails details) {
if (onTapDown) {
widget.control.triggerEvent("tap_down", details.toMap());
}
_lastTapDownDetails = details;
},
onTapUp: onTapUp
? (TapUpDetails details) {
widget.control.triggerEvent("tap_up", details.toMap());
}
: null,
onSecondaryTap: onSecondaryTap
? () => widget.control.triggerEvent("secondary_tap")
? () => widget.control.triggerEvent(
"secondary_tap", _lastSecondaryTapDownDetails?.toMap())
: null,
onSecondaryTapDown: onSecondaryTapDown
? (TapDownDetails details) {
onSecondaryTapDown: (TapDownDetails details) {
if (onSecondaryTapDown) {
widget.control
.triggerEvent("secondary_tap_down", details.toMap());
}
_lastSecondaryTapDownDetails = details;
},
onSecondaryTapUp: onSecondaryTapUp
? (TapUpDetails details) {
widget.control
.triggerEvent("secondary_tap_down", details.toMap());
.triggerEvent("secondary_tap_up", details.toMap());
}
: null,
onSecondaryTapUp: onSecondaryTapUp
onTertiaryTapDown: (TapDownDetails details) {
if (onTertiaryTapDown) {
widget.control
.triggerEvent("tertiary_tap_down", details.toMap());
}
},
onTertiaryTapUp: onTertiaryTapUp
? (TapUpDetails details) {
widget.control
.triggerEvent("secondary_tap_up", details.toMap());
.triggerEvent("tertiary_tap_up", details.toMap());
}
: null,
onLongPressStart: onLongPressStart
Expand All @@ -267,15 +300,28 @@ class _GestureDetectorControlState extends State<GestureDetectorControl> {
"secondary_long_press_end", details.toMap());
}
: null,
onDoubleTap: onDoubleTap
? () => widget.control.triggerEvent("double_tap")
onTertiaryLongPressStart: onTertiaryLongPressStart
? (LongPressStartDetails details) {
widget.control.triggerEvent(
"tertiary_long_press_start", details.toMap());
}
: null,
onDoubleTapDown: onDoubleTapDown
? (TapDownDetails details) {
widget.control
.triggerEvent("double_tap_down", details.toMap());
onTertiaryLongPressEnd: onTertiaryLongPressEnd
? (LongPressEndDetails details) {
widget.control.triggerEvent(
"tertiary_long_press_end", details.toMap());
}
: null,
onDoubleTap: onDoubleTap
? () => widget.control.triggerEvent(
"double_tap", _lastDoubleTapDownDetails?.toMap())
: null,
onDoubleTapDown: (TapDownDetails details) {
if (onDoubleTapDown) {
widget.control.triggerEvent("double_tap_down", details.toMap());
}
_lastDoubleTapDownDetails = details;
},
onHorizontalDragStart:
(onHorizontalDragStart || onHorizontalDragUpdate)
? handleHorizontalDragStart
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class _ScatterChartControlState extends State<ScatterChartControl> {
// Build list of ScatterSpotData
final spotsAsControls = widget.control.children('spots');
final spots = spotsAsControls.map((spot) {
spot.notifyParent = true;
var x = spot.getDouble('x', 0)!;
var y = spot.getDouble('y', 0)!;
return ScatterSpot(x, y,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,16 +51,17 @@ class RadarChartEventData extends Equatable {

RadarDataSet parseRadarDataSet(
Control dataSet, ThemeData theme, BuildContext context) {
dataSet.notifyParent = true;
final fillColor = dataSet.getColor("fill_color", context, Colors.cyan)!;
final fillGradient = dataSet.getGradient("fill_gradient", theme);
final borderColor = dataSet.getColor("border_color", context, Colors.cyan)!;
final borderWidth = dataSet.getDouble("border_width", 2.0)!;
final entryRadius = dataSet.getDouble("entry_radius", 5.0)!;

final entries = dataSet
.children("entries")
.map((entry) => RadarEntry(value: entry.getDouble("value", 0)!))
.toList();
final entries = dataSet.children("entries").map((entry) {
entry.notifyParent = true;
return RadarEntry(value: entry.getDouble("value", 0)!);
}).toList();

return RadarDataSet(
dataEntries: entries,
Expand All @@ -74,6 +75,7 @@ RadarDataSet parseRadarDataSet(

RadarChartTitle parseRadarChartTitle(
Control title, ThemeData theme, double defaultAngle) {
title.notifyParent = true;
final spansValue = title.get("text_spans");
final spans = spansValue != null
? parseTextSpans(spansValue, theme, (control, eventName, [eventData]) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,18 @@ class GestureDetector(LayoutControl, AdaptiveControl):
contacting the screen at a particular location.
"""

on_tertiary_tap_down: Optional[EventHandler[TapEvent["GestureDetector"]]] = None
"""
Called when a pointer that might cause a tap with a tertiary button has contacted
the screen at a particular location.
"""

on_tertiary_tap_up: Optional[EventHandler[TapEvent["GestureDetector"]]] = None
"""
Called when a pointer that will trigger a tap with a tertiary button has stopped
contacting the screen at a particular location.
"""

on_long_press_start: Optional[
EventHandler[LongPressStartEvent["GestureDetector"]]
] = None
Expand Down Expand Up @@ -164,6 +176,24 @@ class GestureDetector(LayoutControl, AdaptiveControl):
stopped contacting the screen.
"""

on_tertiary_long_press_start: Optional[
EventHandler[LongPressStartEvent["GestureDetector"]]
] = None
"""
Called when a long press gesture with a tertiary button has been recognized.

Triggered when a pointer has remained in contact with the screen at the same
location for a long period of time.
"""

on_tertiary_long_press_end: Optional[
EventHandler[LongPressEndEvent["GestureDetector"]]
] = None
"""
Called when a pointer that has triggered a long-press with a tertiary button has
stopped contacting the screen.
"""

on_double_tap: Optional[EventHandler[TapEvent["GestureDetector"]]] = None
"""
The user has tapped the screen with a primary button at the same location twice
Expand Down
Loading