use Timer in EntityControllerMouseWidget for pointer hover

This commit is contained in:
Nick Fisher
2024-02-15 13:47:59 +08:00
parent aba9d8e6a6
commit 023900bb99

View File

@@ -1,5 +1,7 @@
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_filament/entities/entity_transform_controller.dart'; import 'package:flutter_filament/entities/entity_transform_controller.dart';
import 'dart:async';
/// ///
/// A widget that translates mouse gestures to zoom/pan/rotate actions. /// A widget that translates mouse gestures to zoom/pan/rotate actions.
@@ -8,16 +10,41 @@ class EntityTransformMouseControllerWidget extends StatelessWidget {
final EntityTransformController? transformController; final EntityTransformController? transformController;
final Widget? child; final Widget? child;
const EntityTransformMouseControllerWidget( EntityTransformMouseControllerWidget(
{Key? key, required this.transformController, this.child}) {Key? key, required this.transformController, this.child})
: super(key: key); : super(key: key);
Timer? _timer;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Listener( return LayoutBuilder(
onPointerHover: (event) { builder: (BuildContext context, BoxConstraints constraints) {
transformController?.look(event.delta.dx); return Listener(
}, onPointerDown: (event) {
child: child); 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);
});
} }
} }