gesture_handler.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import 'package:flutter/gestures.dart';
  2. import 'package:flutter/widgets.dart';
  3. import 'package:xterm/ui/terminal_view.dart';
  4. import 'package:xterm/ui/gesture/gesture_detector.dart';
  5. import 'package:xterm/ui/render.dart';
  6. class TerminalGestureHandler extends StatefulWidget {
  7. const TerminalGestureHandler({
  8. super.key,
  9. required this.terminalView,
  10. this.child,
  11. this.onTapUp,
  12. this.onSingleTapUp,
  13. this.onTapDown,
  14. this.onSecondaryTapDown,
  15. });
  16. final TerminalViewState terminalView;
  17. final Widget? child;
  18. final GestureTapUpCallback? onTapUp;
  19. final GestureTapUpCallback? onSingleTapUp;
  20. final GestureTapDownCallback? onTapDown;
  21. final GestureTapDownCallback? onSecondaryTapDown;
  22. @override
  23. State<TerminalGestureHandler> createState() => _TerminalGestureHandlerState();
  24. }
  25. class _TerminalGestureHandlerState extends State<TerminalGestureHandler> {
  26. TerminalViewState get terminalView => widget.terminalView;
  27. RenderTerminal get renderTerminal => terminalView.renderTerminal;
  28. DragStartDetails? _lastDragStartDetails;
  29. LongPressStartDetails? _lastLongPressStartDetails;
  30. @override
  31. Widget build(BuildContext context) {
  32. return TerminalGestureDetector(
  33. child: widget.child,
  34. onTapUp: widget.onTapUp,
  35. onSingleTapUp: widget.onSingleTapUp,
  36. onTapDown: widget.onTapDown,
  37. onSecondaryTapDown: widget.onSecondaryTapDown,
  38. onLongPressStart: onLongPressStart,
  39. onLongPressMoveUpdate: onLongPressMoveUpdate,
  40. // onLongPressUp: onLongPressUp,
  41. onDragStart: onDragStart,
  42. onDragUpdate: onDragUpdate,
  43. onDoubleTapDown: onDoubleTapDown,
  44. );
  45. }
  46. void onDoubleTapDown(TapDownDetails details) {
  47. renderTerminal.selectWord(
  48. details.globalPosition,
  49. );
  50. }
  51. void onLongPressStart(LongPressStartDetails details) {
  52. _lastLongPressStartDetails = details;
  53. renderTerminal.selectWord(details.globalPosition);
  54. }
  55. void onLongPressMoveUpdate(LongPressMoveUpdateDetails details) {
  56. renderTerminal.selectWord(
  57. _lastLongPressStartDetails!.globalPosition,
  58. details.globalPosition,
  59. );
  60. }
  61. // void onLongPressUp() {}
  62. void onDragStart(DragStartDetails details) {
  63. _lastDragStartDetails = details;
  64. details.kind == PointerDeviceKind.mouse
  65. ? renderTerminal.selectPosition(details.globalPosition)
  66. : renderTerminal.selectWord(details.globalPosition);
  67. }
  68. void onDragUpdate(DragUpdateDetails details) {
  69. renderTerminal.selectPosition(
  70. _lastDragStartDetails!.globalPosition,
  71. details.globalPosition,
  72. );
  73. }
  74. }