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

This commit is contained in:
Lucas.Xu 2022-07-31 17:16:07 +08:00
parent b577489c2f
commit d058f2d591
2 changed files with 85 additions and 0 deletions

View File

@ -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 {

View File

@ -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();
}