From 023900bb99275985a3fc6d782cbae7bc6fbf520d Mon Sep 17 00:00:00 2001 From: Nick Fisher Date: Thu, 15 Feb 2024 13:47:59 +0800 Subject: [PATCH] use Timer in EntityControllerMouseWidget for pointer hover --- .../entity_controller_mouse_widget.dart | 39 ++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/lib/widgets/entity_controller_mouse_widget.dart b/lib/widgets/entity_controller_mouse_widget.dart index bd692976..5aeb897e 100644 --- a/lib/widgets/entity_controller_mouse_widget.dart +++ b/lib/widgets/entity_controller_mouse_widget.dart @@ -1,5 +1,7 @@ +import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; import 'package:flutter_filament/entities/entity_transform_controller.dart'; +import 'dart:async'; /// /// A widget that translates mouse gestures to zoom/pan/rotate actions. @@ -8,16 +10,41 @@ class EntityTransformMouseControllerWidget extends StatelessWidget { final EntityTransformController? transformController; final Widget? child; - const EntityTransformMouseControllerWidget( + EntityTransformMouseControllerWidget( {Key? key, required this.transformController, this.child}) : super(key: key); + Timer? _timer; @override Widget build(BuildContext context) { - return Listener( - onPointerHover: (event) { - transformController?.look(event.delta.dx); - }, - child: child); + return LayoutBuilder( + builder: (BuildContext context, BoxConstraints constraints) { + return Listener( + onPointerDown: (event) { + if (kPrimaryMouseButton & event.buttons != 0) { + transformController?.mouse1Down(); + } + }, + onPointerUp: (event) { + if (kPrimaryMouseButton & event.buttons != 0) { + transformController?.mouse1Up(); + } + }, + onPointerHover: (event) { + _timer?.cancel(); + if (event.position.dx < 10) { + _timer = Timer.periodic(const Duration(milliseconds: 17), (_) { + transformController?.look(-30); + }); + } else if (event.position.dx > constraints.maxWidth - 10) { + _timer = Timer.periodic(const Duration(milliseconds: 17), (_) { + transformController?.look(30); + }); + } else { + transformController?.look(event.delta.dx); + } + }, + child: child); + }); } }