From 06a159a465cef559037f165bb5f4631cfd46b9b8 Mon Sep 17 00:00:00 2001 From: Bruno Leroux Date: Wed, 5 Oct 2022 08:47:51 +0200 Subject: [PATCH] [simplistic_editor] - Fix delete key on desktop and backspace key on Web (#1458) * Do not propagate to default text intent * Add support for backward and forward delete (desktop) * Update for nice auto-format * Fix using delete key throws if at the end of the text Co-authored-by: Bruno Leroux --- .../lib/basic_text_input_client.dart | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/simplistic_editor/lib/basic_text_input_client.dart b/simplistic_editor/lib/basic_text_input_client.dart index ae601f82b..7190d5555 100644 --- a/simplistic_editor/lib/basic_text_input_client.dart +++ b/simplistic_editor/lib/basic_text_input_client.dart @@ -299,7 +299,7 @@ class BasicTextInputClientState extends State TextSelection get _selection => _value.selection; late final Map> _actions = >{ DeleteCharacterIntent: CallbackAction( - onInvoke: (intent) => _delete(), + onInvoke: (intent) => _delete(intent.forward), ), ExtendSelectionByCharacterIntent: CallbackAction( @@ -315,22 +315,35 @@ class BasicTextInputClientState extends State PasteTextIntent: CallbackAction( onInvoke: (intent) => pasteText(intent.cause), ), + DoNothingAndStopPropagationTextIntent: DoNothingAction( + consumesKey: false, + ), }; - void _delete() { + void _delete(bool forward) { if (_value.text.isEmpty) return; late final TextRange deletedRange; late final TextRange newComposing; - final int deletedLength = - _value.text.substring(0, _selection.baseOffset).characters.last.length; + late final String deletedText; + final int offset = _selection.baseOffset; if (_selection.isCollapsed) { - if (_selection.baseOffset == 0) return; - deletedRange = TextRange( - start: _selection.baseOffset - deletedLength, - end: _selection.baseOffset, - ); + if (forward) { + if (_selection.baseOffset == _value.text.length) return; + deletedText = _value.text.substring(offset).characters.first; + deletedRange = TextRange( + start: offset, + end: offset + deletedText.length, + ); + } else { + if (_selection.baseOffset == 0) return; + deletedText = _value.text.substring(0, offset).characters.last; + deletedRange = TextRange( + start: offset - deletedText.length, + end: offset, + ); + } } else { deletedRange = _selection; }