actions.dart 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import 'package:flutter/services.dart';
  2. import 'package:flutter/widgets.dart';
  3. import 'package:xterm/src/terminal.dart';
  4. import 'package:xterm/src/ui/controller.dart';
  5. import 'package:xterm/src/ui/selection_mode.dart';
  6. class TerminalActions extends StatelessWidget {
  7. const TerminalActions({
  8. super.key,
  9. required this.terminal,
  10. required this.controller,
  11. required this.child,
  12. });
  13. final Terminal terminal;
  14. final TerminalController controller;
  15. final Widget child;
  16. @override
  17. Widget build(BuildContext context) {
  18. return Actions(
  19. actions: {
  20. PasteTextIntent: CallbackAction<PasteTextIntent>(
  21. onInvoke: (intent) async {
  22. final data = await Clipboard.getData(Clipboard.kTextPlain);
  23. final text = data?.text;
  24. if (text != null) {
  25. terminal.paste(text);
  26. controller.clearSelection();
  27. }
  28. return null;
  29. },
  30. ),
  31. CopySelectionTextIntent: CallbackAction<CopySelectionTextIntent>(
  32. onInvoke: (intent) async {
  33. final selection = controller.selection;
  34. if (selection == null) {
  35. return;
  36. }
  37. final text = terminal.buffer.getText(selection);
  38. await Clipboard.setData(ClipboardData(text: text));
  39. return null;
  40. },
  41. ),
  42. SelectAllTextIntent: CallbackAction<SelectAllTextIntent>(
  43. onInvoke: (intent) {
  44. controller.setSelection(
  45. terminal.buffer.createAnchor(
  46. 0,
  47. terminal.buffer.height - terminal.viewHeight,
  48. ),
  49. terminal.buffer.createAnchor(
  50. terminal.viewWidth,
  51. terminal.buffer.height - 1,
  52. ),
  53. mode: SelectionMode.line,
  54. );
  55. return null;
  56. },
  57. ),
  58. },
  59. child: child,
  60. );
  61. }
  62. }