Skip to content

Commit b98e0a0

Browse files
feat: Throttle InteractiveViewer update events (flet-dev#4704)
* initial commit * update pubspec.lock * rename to interaction_update_interval * reformat --------- Co-authored-by: Feodor Fitsner <feodor@appveyor.com>
1 parent 5ac5753 commit b98e0a0

File tree

2 files changed

+36
-16
lines changed

2 files changed

+36
-16
lines changed

packages/flet/lib/src/controls/interactive_viewer.dart

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ class _InteractiveViewerControlState extends State<InteractiveViewerControl>
4141
late AnimationController _animationController;
4242
Animation<Matrix4>? _animation;
4343
Matrix4? _savedMatrix;
44+
int _interactionUpdateTimestamp = DateTime.now().millisecondsSinceEpoch;
4445

4546
@override
4647
void initState() {
@@ -158,22 +159,30 @@ class _InteractiveViewerControlState extends State<InteractiveViewerControl>
158159
: null,
159160
onInteractionUpdate: !disabled
160161
? (ScaleUpdateDetails details) {
161-
debugPrint(
162-
"InteractiveViewer ${widget.control.id} onInteractionUpdate");
163-
widget.backend.triggerControlEvent(
164-
widget.control.id,
165-
"interaction_update",
166-
jsonEncode({
167-
"pc": details.pointerCount,
168-
"fp_x": details.focalPoint.dx,
169-
"fp_y": details.focalPoint.dy,
170-
"lfp_x": details.localFocalPoint.dx,
171-
"lfp_y": details.localFocalPoint.dy,
172-
"s": details.scale,
173-
"hs": details.horizontalScale,
174-
"vs": details.verticalScale,
175-
"rot": details.rotation,
176-
}));
162+
var interactionUpdateInterval =
163+
widget.control.attrInt("interactionUpdateInterval", 0)!;
164+
var now = DateTime.now().millisecondsSinceEpoch;
165+
if (now - _interactionUpdateTimestamp >
166+
interactionUpdateInterval) {
167+
debugPrint(
168+
"InteractiveViewer ${widget.control.id} onInteractionUpdate");
169+
_interactionUpdateTimestamp = now;
170+
widget.backend.triggerControlEvent(
171+
widget.control.id,
172+
"interaction_update",
173+
jsonEncode({
174+
"pc": details.pointerCount,
175+
"fp_x": details.focalPoint.dx,
176+
"fp_y": details.focalPoint.dy,
177+
"lfp_x": details.localFocalPoint.dx,
178+
"lfp_y": details.localFocalPoint.dy,
179+
"s": details.scale,
180+
"hs": details.horizontalScale,
181+
"vs": details.verticalScale,
182+
"rot": details.rotation,
183+
}));
184+
;
185+
}
177186
}
178187
: null,
179188
child: contentCtrls.isNotEmpty

sdk/python/packages/flet/src/flet/core/interactive_viewer.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def __init__(
7979
clip_behavior: Optional[ClipBehavior] = None,
8080
alignment: Optional[Alignment] = None,
8181
boundary_margin: Optional[MarginValue] = None,
82+
interaction_update_interval: Optional[int] = None,
8283
on_interaction_start: Optional[
8384
Callable[[InteractiveViewerInteractionStartEvent], None]
8485
] = None,
@@ -189,6 +190,7 @@ def __init__(
189190
self.on_interaction_start = on_interaction_start
190191
self.on_interaction_end = on_interaction_end
191192
self.on_interaction_update = on_interaction_update
193+
self.interaction_update_interval = interaction_update_interval
192194

193195
def _get_control_name(self):
194196
return "interactiveviewer"
@@ -228,6 +230,15 @@ def min_scale(self) -> float:
228230
def min_scale(self, value: OptionalNumber):
229231
self._set_attr("minScale", value)
230232

233+
# interaction_update_interval
234+
@property
235+
def interaction_update_interval(self) -> int:
236+
return self._get_attr("interactionUpdateInterval", data_type="int", def_value=0)
237+
238+
@interaction_update_interval.setter
239+
def interaction_update_interval(self, value: Optional[int]):
240+
self._set_attr("interactionUpdateInterval", value)
241+
231242
# max_scale
232243
@property
233244
def max_scale(self) -> float:

0 commit comments

Comments
 (0)