From 91c62cb0aea30b43d8e27d76b29ac51028897ea4 Mon Sep 17 00:00:00 2001
From: Vincent Chan <okcdz@diverse.space>
Date: Mon, 8 Aug 2022 15:33:16 +0800
Subject: [PATCH] feat: add default impl for image node

---
 .../example/lib/plugin/image_node_widget.dart  | 18 ++++--------------
 .../lib/plugin/youtube_link_node_widget.dart   | 17 ++++++-----------
 .../render/rich_text/default_selectable.dart   |  4 ++--
 .../lib/render/rich_text/flowy_rich_text.dart  |  2 +-
 .../lib/render/selection/selectable.dart       |  4 +++-
 .../lib/service/input_service.dart             |  8 +++++---
 .../slash_handler.dart                         |  3 +++
 7 files changed, 24 insertions(+), 32 deletions(-)

diff --git a/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/image_node_widget.dart b/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/image_node_widget.dart
index 417d1ce11c..7a47802163 100644
--- a/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/image_node_widget.dart
+++ b/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/image_node_widget.dart
@@ -55,26 +55,22 @@ class _ImageNodeWidgetState extends State<ImageNodeWidget> with Selectable {
 
   @override
   Position end() {
-    // TODO: implement end
-    throw UnimplementedError();
+    return Position(path: node.path, offset: 0);
   }
 
   @override
   Position start() {
-    // TODO: implement start
-    throw UnimplementedError();
+    return Position(path: node.path, offset: 0);
   }
 
   @override
   List<Rect> getRectsInSelection(Selection selection) {
-    // TODO: implement getRectsInSelection
-    throw UnimplementedError();
+    return [];
   }
 
   @override
   Selection getSelectionInRange(Offset start, Offset end) {
-    // TODO: implement getSelectionInRange
-    throw UnimplementedError();
+    return Selection.collapsed(Position(path: node.path, offset: 0));
   }
 
   @override
@@ -82,12 +78,6 @@ class _ImageNodeWidgetState extends State<ImageNodeWidget> with Selectable {
     throw UnimplementedError();
   }
 
-  @override
-  Rect getCursorRectInPosition(Position position) {
-    // TODO: implement getCursorRectInPosition
-    throw UnimplementedError();
-  }
-
   @override
   Position getPositionInOffset(Offset start) {
     return Position(path: node.path, offset: 0);
diff --git a/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart b/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart
index 10787db2a7..fd79077912 100644
--- a/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart
+++ b/frontend/app_flowy/packages/flowy_editor/example/lib/plugin/youtube_link_node_widget.dart
@@ -32,7 +32,8 @@ class LinkNodeWidget extends StatefulWidget {
   State<LinkNodeWidget> createState() => _YouTubeLinkNodeWidgetState();
 }
 
-class _YouTubeLinkNodeWidgetState extends State<LinkNodeWidget> with Selectable {
+class _YouTubeLinkNodeWidgetState extends State<LinkNodeWidget>
+    with Selectable {
   Node get node => widget.node;
   EditorState get editorState => widget.editorState;
   String get src => widget.node.attributes['youtube_link'] as String;
@@ -66,12 +67,6 @@ class _YouTubeLinkNodeWidgetState extends State<LinkNodeWidget> with Selectable
     throw UnimplementedError();
   }
 
-  @override
-  Rect getCursorRectInPosition(Position position) {
-    // TODO: implement getCursorRectInPosition
-    throw UnimplementedError();
-  }
-
   @override
   Position getPositionInOffset(Offset start) {
     // TODO: implement getPositionInOffset
@@ -85,16 +80,16 @@ class _YouTubeLinkNodeWidgetState extends State<LinkNodeWidget> with Selectable
 
   late final PodPlayerController controller;
 
-@override
+  @override
   void initState() {
     controller = PodPlayerController(
       playVideoFrom: PlayVideoFrom.network(
-       src,
+        src,
       ),
     )..initialise();
-    super.initState();   
+    super.initState();
   }
-  
+
   Widget _build(BuildContext context) {
     return Column(
       children: [
diff --git a/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/default_selectable.dart b/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/default_selectable.dart
index 21cc5108f3..e218fdcaf6 100644
--- a/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/default_selectable.dart
+++ b/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/default_selectable.dart
@@ -11,8 +11,8 @@ mixin DefaultSelectable {
   Position getPositionInOffset(Offset start) =>
       forward.getPositionInOffset(start);
 
-  Rect getCursorRectInPosition(Position position) =>
-      forward.getCursorRectInPosition(position).shift(baseOffset);
+  Rect? getCursorRectInPosition(Position position) =>
+      forward.getCursorRectInPosition(position)?.shift(baseOffset);
 
   List<Rect> getRectsInSelection(Selection selection) => forward
       .getRectsInSelection(selection)
diff --git a/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/flowy_rich_text.dart b/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/flowy_rich_text.dart
index dbf4e5f63c..20ce401f2e 100644
--- a/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/flowy_rich_text.dart
+++ b/frontend/app_flowy/packages/flowy_editor/lib/render/rich_text/flowy_rich_text.dart
@@ -76,7 +76,7 @@ class _FlowyRichTextState extends State<FlowyRichText> with Selectable {
       path: widget.textNode.path, offset: widget.textNode.toRawString().length);
 
   @override
-  Rect getCursorRectInPosition(Position position) {
+  Rect? getCursorRectInPosition(Position position) {
     final textPosition = TextPosition(offset: position.offset);
     final cursorOffset =
         _renderParagraph.getOffsetForCaret(textPosition, Rect.zero);
diff --git a/frontend/app_flowy/packages/flowy_editor/lib/render/selection/selectable.dart b/frontend/app_flowy/packages/flowy_editor/lib/render/selection/selectable.dart
index bc32706aa0..58377dcc02 100644
--- a/frontend/app_flowy/packages/flowy_editor/lib/render/selection/selectable.dart
+++ b/frontend/app_flowy/packages/flowy_editor/lib/render/selection/selectable.dart
@@ -25,7 +25,9 @@ mixin Selectable<T extends StatefulWidget> on State<T> {
     return null;
   }
 
-  Rect getCursorRectInPosition(Position position);
+  Rect? getCursorRectInPosition(Position position) {
+    return null;
+  }
 
   Offset localToGlobal(Offset offset);
 
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..a183930dc8 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
@@ -246,9 +246,11 @@ class _FlowyInputState extends State<FlowyInput>
       final size = renderBox.size;
       final transform = renderBox.getTransformTo(null);
       final rect = selectable.getCursorRectInPosition(selection.end);
-      _textInputConnection
-        ?..setEditableSizeAndTransform(size, transform)
-        ..setCaretRect(rect);
+      if (rect != null) {
+        _textInputConnection
+          ?..setEditableSizeAndTransform(size, transform)
+          ..setCaretRect(rect);
+      }
     }
   }
 }
diff --git a/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/slash_handler.dart b/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/slash_handler.dart
index 68bcdca7a6..f4894a08c0 100644
--- a/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/slash_handler.dart
+++ b/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/slash_handler.dart
@@ -71,6 +71,9 @@ FlowyKeyEventHandler slashShortcutHandler = (editorState, event) {
   }
 
   final rect = selectable.getCursorRectInPosition(selection.start);
+  if (rect == null) {
+    return KeyEventResult.ignored;
+  }
   final offset = selectable.localToGlobal(rect.topLeft);
   if (!selection.isCollapsed) {
     TransactionBuilder(editorState)