Forráskód Böngészése

fix: could not delete character when using IME

Lucas.Xu 2 éve
szülő
commit
dc018bc7e4

+ 35 - 13
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<FlowyInput>
   void apply(List<TextEditingDelta> 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<FlowyInput>
     }
   }
 
+  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;