mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
feat: bold the text by command/control + b/B
This commit is contained in:
parent
b577489c2f
commit
d058f2d591
@ -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/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:flutter/material.dart';
|
||||||
|
|
||||||
import 'package:flowy_editor/editor_state.dart';
|
import 'package:flowy_editor/editor_state.dart';
|
||||||
@ -36,6 +37,7 @@ List<FlowyKeyEventHandler> defaultKeyEventHandler = [
|
|||||||
flowyDeleteNodesHandler,
|
flowyDeleteNodesHandler,
|
||||||
arrowKeysHandler,
|
arrowKeysHandler,
|
||||||
enterInEdgeOfTextNodeHandler,
|
enterInEdgeOfTextNodeHandler,
|
||||||
|
updateTextStyleByCommandXHandler,
|
||||||
];
|
];
|
||||||
|
|
||||||
class FlowyEditor extends StatefulWidget {
|
class FlowyEditor extends StatefulWidget {
|
||||||
|
@ -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();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user