import 'package:flutter/gestures.dart'; import 'package:flutter/widgets.dart'; import 'package:xterm/ui/terminal_view.dart'; import 'package:xterm/ui/gesture/gesture_detector.dart'; import 'package:xterm/ui/render.dart'; class TerminalGestureHandler extends StatefulWidget { const TerminalGestureHandler({ super.key, required this.terminalView, this.child, this.onTapUp, this.onSingleTapUp, this.onTapDown, this.onSecondaryTapDown, }); final TerminalViewState terminalView; final Widget? child; final GestureTapUpCallback? onTapUp; final GestureTapUpCallback? onSingleTapUp; final GestureTapDownCallback? onTapDown; final GestureTapDownCallback? onSecondaryTapDown; @override State createState() => _TerminalGestureHandlerState(); } class _TerminalGestureHandlerState extends State { TerminalViewState get terminalView => widget.terminalView; RenderTerminal get renderTerminal => terminalView.renderTerminal; DragStartDetails? _lastDragStartDetails; LongPressStartDetails? _lastLongPressStartDetails; @override Widget build(BuildContext context) { return TerminalGestureDetector( child: widget.child, onTapUp: widget.onTapUp, onSingleTapUp: widget.onSingleTapUp, onTapDown: widget.onTapDown, onSecondaryTapDown: widget.onSecondaryTapDown, onLongPressStart: onLongPressStart, onLongPressMoveUpdate: onLongPressMoveUpdate, // onLongPressUp: onLongPressUp, onDragStart: onDragStart, onDragUpdate: onDragUpdate, onDoubleTapDown: onDoubleTapDown, ); } void onDoubleTapDown(TapDownDetails details) { renderTerminal.selectWord( details.globalPosition, ); } void onLongPressStart(LongPressStartDetails details) { _lastLongPressStartDetails = details; renderTerminal.selectWord(details.globalPosition); } void onLongPressMoveUpdate(LongPressMoveUpdateDetails details) { renderTerminal.selectWord( _lastLongPressStartDetails!.globalPosition, details.globalPosition, ); } // void onLongPressUp() {} void onDragStart(DragStartDetails details) { _lastDragStartDetails = details; details.kind == PointerDeviceKind.mouse ? renderTerminal.selectPosition(details.globalPosition) : renderTerminal.selectWord(details.globalPosition); } void onDragUpdate(DragUpdateDetails details) { renderTerminal.selectPosition( _lastDragStartDetails!.globalPosition, details.globalPosition, ); } }