From d058f2d5914b39afb50c4fa6bb70369e9fef0f60 Mon Sep 17 00:00:00 2001 From: "Lucas.Xu" Date: Sun, 31 Jul 2022 17:16:07 +0800 Subject: [PATCH] feat: bold the text by command/control + b/B --- .../lib/service/editor_service.dart | 2 + ...pdate_text_style_by_command_x_handler.dart | 83 +++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/update_text_style_by_command_x_handler.dart diff --git a/frontend/app_flowy/packages/flowy_editor/lib/service/editor_service.dart b/frontend/app_flowy/packages/flowy_editor/lib/service/editor_service.dart index b7a64ffcc7..71143a3ede 100644 --- a/frontend/app_flowy/packages/flowy_editor/lib/service/editor_service.dart +++ b/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 defaultKeyEventHandler = [ flowyDeleteNodesHandler, arrowKeysHandler, enterInEdgeOfTextNodeHandler, + updateTextStyleByCommandXHandler, ]; class FlowyEditor extends StatefulWidget { diff --git a/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/update_text_style_by_command_x_handler.dart b/frontend/app_flowy/packages/flowy_editor/lib/service/internal_key_event_handlers/update_text_style_by_command_x_handler.dart new file mode 100644 index 0000000000..5f13484442 --- /dev/null +++ b/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() + .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 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(); +}