Browse Source

Merge pull request #819 from AppFlowy-IO/fix/selection-state-mismatch-2

fix: selection state mismatch
Vincent Chan 2 years ago
parent
commit
9c97a0b635

+ 8 - 4
frontend/app_flowy/packages/flowy_editor/lib/src/editor_state.dart

@@ -21,6 +21,11 @@ class ApplyOptions {
   });
   });
 }
 }
 
 
+enum CursorUpdateReason {
+  uiEvent,
+  others,
+}
+
 class EditorState {
 class EditorState {
   final StateTree document;
   final StateTree document;
 
 
@@ -37,11 +42,10 @@ class EditorState {
   }
   }
 
 
   /// add the set reason in the future, don't use setter
   /// add the set reason in the future, don't use setter
-  updateCursorSelection(Selection? cursorSelection) {
+  updateCursorSelection(Selection? cursorSelection,
+      [CursorUpdateReason reason = CursorUpdateReason.others]) {
     // broadcast to other users here
     // broadcast to other users here
-    if (cursorSelection == null) {
-      service.selectionService.clearSelection();
-    } else {
+    if (reason != CursorUpdateReason.uiEvent) {
       service.selectionService.updateSelection(cursorSelection);
       service.selectionService.updateSelection(cursorSelection);
     }
     }
     _cursorSelection = cursorSelection;
     _cursorSelection = cursorSelection;

+ 13 - 10
frontend/app_flowy/packages/flowy_editor/lib/src/service/selection_service.dart

@@ -52,7 +52,7 @@ abstract class FlowySelectionService {
   /// The editor will update selection area and toolbar area
   /// The editor will update selection area and toolbar area
   /// if the [selection] is not collapsed,
   /// if the [selection] is not collapsed,
   /// otherwise, will update the cursor area.
   /// otherwise, will update the cursor area.
-  void updateSelection(Selection selection);
+  void updateSelection(Selection? selection);
 
 
   /// Clears the selection area, cursor area and the popup list area.
   /// Clears the selection area, cursor area and the popup list area.
   void clearSelection();
   void clearSelection();
@@ -180,21 +180,24 @@ class _FlowySelectionState extends State<FlowySelection>
   }
   }
 
 
   @override
   @override
-  void updateSelection(Selection selection) {
+  void updateSelection(Selection? selection) {
     selectionRects.clear();
     selectionRects.clear();
     clearSelection();
     clearSelection();
 
 
-    if (selection.isCollapsed) {
-      /// updates cursor area.
-      debugPrint('updating cursor');
-      _updateCursorAreas(selection.start);
-    } else {
-      // updates selection area.
-      debugPrint('updating selection');
-      _updateSelectionAreas(selection);
+    if (selection != null) {
+      if (selection.isCollapsed) {
+        /// updates cursor area.
+        debugPrint('updating cursor');
+        _updateCursorAreas(selection.start);
+      } else {
+        // updates selection area.
+        debugPrint('updating selection');
+        _updateSelectionAreas(selection);
+      }
     }
     }
 
 
     currentSelection.value = selection;
     currentSelection.value = selection;
+    editorState.updateCursorSelection(selection, CursorUpdateReason.uiEvent);
   }
   }
 
 
   @override
   @override