From dc018bc7e494e0e5a38d22c838e89c375c2f7c38 Mon Sep 17 00:00:00 2001 From: "Lucas.Xu" Date: Mon, 8 Aug 2022 16:08:01 +0800 Subject: [PATCH] fix: could not delete character when using IME --- .../lib/service/input_service.dart | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/frontend/app_flowy/packages/flowy_editor/lib/service/input_service.dart b/frontend/app_flowy/packages/flowy_editor/lib/service/input_service.dart index 9d6e0f7470..329cd8ed6d 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/service/input_service.dart +++ b/frontend/app_flowy/packages/flowy_editor/lib/service/input_service.dart @@ -2,8 +2,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flowy_editor/document/node.dart'; -import 'package:flowy_editor/document/path.dart'; -import 'package:flowy_editor/document/position.dart'; import 'package:flowy_editor/document/selection.dart'; import 'package:flowy_editor/editor_state.dart'; import 'package:flowy_editor/extensions/node_extensions.dart'; @@ -83,22 +81,29 @@ class _FlowyInputState extends State void apply(List deltas) { // TODO: implement the detail for (final delta in deltas) { - if (delta is TextEditingDeltaInsertion) { - if (_composingTextRange != null) { - _composingTextRange = TextRange( - start: _composingTextRange!.start, - end: delta.composing.end, - ); - } else { - _composingTextRange = delta.composing; - } + _updateComposing(delta); + if (delta is TextEditingDeltaInsertion) { _applyInsert(delta); } else if (delta is TextEditingDeltaDeletion) { + _applyDelete(delta); } else if (delta is TextEditingDeltaReplacement) { _applyReplacement(delta); - } else if (delta is TextEditingDeltaNonTextUpdate) { - _composingTextRange = null; + } else if (delta is TextEditingDeltaNonTextUpdate) {} + } + } + + void _updateComposing(TextEditingDelta delta) { + if (delta is! TextEditingDeltaNonTextUpdate) { + if (_composingTextRange != null && + delta.composing.end != -1 && + _composingTextRange!.start != -1) { + _composingTextRange = TextRange( + start: _composingTextRange!.start, + end: delta.composing.end, + ); + } else { + _composingTextRange = delta.composing; } } } @@ -123,6 +128,23 @@ class _FlowyInputState extends State } } + void _applyDelete(TextEditingDeltaDeletion delta) { + final selectionService = _editorState.service.selectionService; + final currentSelection = selectionService.currentSelection.value; + if (currentSelection == null) { + return; + } + if (currentSelection.isSingle) { + final textNode = selectionService.currentSelectedNodes.first as TextNode; + final length = delta.deletedRange.end - delta.deletedRange.start; + TransactionBuilder(_editorState) + ..deleteText(textNode, delta.deletedRange.start, length) + ..commit(); + } else { + // TODO: implement + } + } + void _applyReplacement(TextEditingDeltaReplacement delta) { final selectionService = _editorState.service.selectionService; final currentSelection = selectionService.currentSelection.value;