Browse Source

feat: bold the text by command/control + b/B

Lucas.Xu 2 years ago
parent
commit
d058f2d591

+ 2 - 0
frontend/app_flowy/packages/flowy_editor/lib/service/editor_service.dart

@@ -1,4 +1,5 @@
 import 'package:flowy_editor/service/internal_key_event_handlers/delele_text_handler.dart';
+import 'package:flowy_editor/service/internal_key_event_handlers/update_text_style_by_command_x_handler.dart';
 import 'package:flutter/material.dart';
 
 import 'package:flowy_editor/editor_state.dart';
@@ -36,6 +37,7 @@ List<FlowyKeyEventHandler> defaultKeyEventHandler = [
   flowyDeleteNodesHandler,
   arrowKeysHandler,
   enterInEdgeOfTextNodeHandler,
+  updateTextStyleByCommandXHandler,
 ];
 
 class FlowyEditor extends StatefulWidget {

+ 83 - 0
frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/update_text_style_by_command_x_handler.dart

@@ -0,0 +1,83 @@
+import 'package:flowy_editor/document/node.dart';
+import 'package:flowy_editor/document/selection.dart';
+import 'package:flowy_editor/editor_state.dart';
+import 'package:flowy_editor/operation/transaction_builder.dart';
+import 'package:flowy_editor/service/keyboard_service.dart';
+import 'package:flowy_editor/render/rich_text/rich_text_style.dart';
+import 'package:flutter/material.dart';
+
+FlowyKeyEventHandler updateTextStyleByCommandXHandler = (editorState, event) {
+  if (!event.isMetaPressed || event.character == null) {
+    return KeyEventResult.ignored;
+  }
+
+  final selection = editorState.service.selectionService.currentSelection;
+  final nodes = editorState.service.selectionService.currentSelectedNodes.value
+      .whereType<TextNode>()
+      .toList();
+
+  if (selection == null || nodes.isEmpty) {
+    return KeyEventResult.ignored;
+  }
+
+  switch (event.character!) {
+    // bold
+    case 'B':
+    case 'b':
+      _makeBold(editorState, nodes, selection);
+      return KeyEventResult.handled;
+    default:
+      break;
+  }
+
+  return KeyEventResult.ignored;
+};
+
+// TODO: implement unBold.
+void _makeBold(
+    EditorState editorState, List<TextNode> nodes, Selection selection) {
+  final builder = TransactionBuilder(editorState);
+  if (nodes.length == 1) {
+    builder.formatText(
+      nodes.first,
+      selection.start.offset,
+      selection.end.offset - selection.start.offset,
+      {
+        'bold': true,
+      },
+    );
+  } else {
+    for (var i = 0; i < nodes.length; i++) {
+      final node = nodes[i];
+      if (i == 0) {
+        builder.formatText(
+          node,
+          selection.start.offset,
+          node.toRawString().length - selection.start.offset,
+          {
+            'bold': true,
+          },
+        );
+      } else if (i == nodes.length - 1) {
+        builder.formatText(
+          node,
+          0,
+          selection.end.offset,
+          {
+            'bold': true,
+          },
+        );
+      } else {
+        builder.formatText(
+          node,
+          0,
+          node.toRawString().length,
+          {
+            'bold': true,
+          },
+        );
+      }
+    }
+  }
+  builder.commit();
+}