mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
feat: implement handler - press the enter key in the edge of text node
This commit is contained in:
parent
84eed9e340
commit
445ff561b5
@ -1,6 +1,7 @@
|
|||||||
import 'dart:collection';
|
import 'dart:collection';
|
||||||
import 'package:flowy_editor/document/path.dart';
|
import 'package:flowy_editor/document/path.dart';
|
||||||
import 'package:flowy_editor/document/text_delta.dart';
|
import 'package:flowy_editor/document/text_delta.dart';
|
||||||
|
import 'package:flowy_editor/operation/operation.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import './attributes.dart';
|
import './attributes.dart';
|
||||||
|
|
||||||
@ -172,6 +173,14 @@ class TextNode extends Node {
|
|||||||
required Delta delta,
|
required Delta delta,
|
||||||
}) : _delta = delta;
|
}) : _delta = delta;
|
||||||
|
|
||||||
|
TextNode.empty()
|
||||||
|
: _delta = Delta([TextInsert('')]),
|
||||||
|
super(
|
||||||
|
type: 'text',
|
||||||
|
children: LinkedList(),
|
||||||
|
attributes: {},
|
||||||
|
);
|
||||||
|
|
||||||
Delta get delta {
|
Delta get delta {
|
||||||
return _delta;
|
return _delta;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
import 'dart:math';
|
|
||||||
|
|
||||||
import 'package:flowy_editor/document/node.dart';
|
import 'package:flowy_editor/document/node.dart';
|
||||||
import 'package:flowy_editor/document/selection.dart';
|
import 'package:flowy_editor/document/selection.dart';
|
||||||
import 'package:flowy_editor/extensions/object_extensions.dart';
|
import 'package:flowy_editor/extensions/object_extensions.dart';
|
||||||
|
@ -22,4 +22,15 @@ extension PathExtensions on Path {
|
|||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Path get next {
|
||||||
|
Path nextPath = Path.from(this, growable: true);
|
||||||
|
if (isEmpty) {
|
||||||
|
return nextPath;
|
||||||
|
}
|
||||||
|
final last = nextPath.last;
|
||||||
|
return nextPath
|
||||||
|
..removeLast()
|
||||||
|
..add(last + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,7 +31,7 @@ class NodeWidgetBuilder<T extends Node> {
|
|||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
|
|
||||||
/// TODO: refactore this part.
|
/// TODO: refactore this part.
|
||||||
/// return widget embeded with ChangeNotifier and widget itself.
|
/// return widget embedded with ChangeNotifier and widget itself.
|
||||||
Widget call(
|
Widget call(
|
||||||
BuildContext buildContext,
|
BuildContext buildContext,
|
||||||
) {
|
) {
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import 'package:flowy_editor/render/selection/floating_shortcut_widget.dart';
|
import 'package:flowy_editor/render/selection/floating_shortcut_widget.dart';
|
||||||
import 'package:flowy_editor/service/input_service.dart';
|
import 'package:flowy_editor/service/input_service.dart';
|
||||||
|
import 'package:flowy_editor/service/internal_key_event_handlers/enter_in_edge_of_text_node_handler.dart';
|
||||||
import 'package:flowy_editor/service/shortcut_service.dart';
|
import 'package:flowy_editor/service/shortcut_service.dart';
|
||||||
import 'package:flowy_editor/service/internal_key_event_handlers/arrow_keys_handler.dart';
|
import 'package:flowy_editor/service/internal_key_event_handlers/arrow_keys_handler.dart';
|
||||||
import 'package:flowy_editor/service/internal_key_event_handlers/delete_nodes_handler.dart';
|
import 'package:flowy_editor/service/internal_key_event_handlers/delete_nodes_handler.dart';
|
||||||
@ -47,6 +48,7 @@ class _FlowyEditorState extends State<FlowyEditor> {
|
|||||||
flowyDeleteNodesHandler,
|
flowyDeleteNodesHandler,
|
||||||
deleteSingleTextNodeHandler,
|
deleteSingleTextNodeHandler,
|
||||||
arrowKeysHandler,
|
arrowKeysHandler,
|
||||||
|
enterInEdgeOfTextNodeHandler,
|
||||||
...widget.keyEventHandlers,
|
...widget.keyEventHandlers,
|
||||||
],
|
],
|
||||||
editorState: editorState,
|
editorState: editorState,
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
|
import 'package:flowy_editor/document/position.dart';
|
||||||
|
import 'package:flowy_editor/document/selection.dart';
|
||||||
import 'package:flowy_editor/editor_state.dart';
|
import 'package:flowy_editor/editor_state.dart';
|
||||||
import 'package:flowy_editor/document/node.dart';
|
import 'package:flowy_editor/document/node.dart';
|
||||||
|
import 'package:flowy_editor/operation/transaction_builder.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
@ -86,7 +89,18 @@ class _FlowyInputState extends State<FlowyInput>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void apply(List<TextEditingDelta> deltas) {}
|
void apply(List<TextEditingDelta> deltas) {
|
||||||
|
// TODO: implement the detail
|
||||||
|
for (final delta in deltas) {
|
||||||
|
if (delta is TextEditingDeltaInsertion) {
|
||||||
|
} else if (delta is TextEditingDeltaDeletion) {
|
||||||
|
} else if (delta is TextEditingDeltaReplacement) {
|
||||||
|
} else if (delta is TextEditingDeltaNonTextUpdate) {
|
||||||
|
// We don't need to care the [TextEditingDeltaNonTextUpdate].
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void close() {
|
void close() {
|
||||||
|
@ -0,0 +1,46 @@
|
|||||||
|
import 'package:flowy_editor/document/node.dart';
|
||||||
|
import 'package:flowy_editor/document/position.dart';
|
||||||
|
import 'package:flowy_editor/document/selection.dart';
|
||||||
|
import 'package:flowy_editor/operation/transaction_builder.dart';
|
||||||
|
import 'package:flowy_editor/service/keyboard_service.dart';
|
||||||
|
import 'package:flowy_editor/extensions/path_extensions.dart';
|
||||||
|
import 'package:flowy_editor/extensions/node_extensions.dart';
|
||||||
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:flutter/services.dart';
|
||||||
|
|
||||||
|
FlowyKeyEventHandler enterInEdgeOfTextNodeHandler = (editorState, event) {
|
||||||
|
if (event.logicalKey != LogicalKeyboardKey.enter) {
|
||||||
|
return KeyEventResult.ignored;
|
||||||
|
}
|
||||||
|
|
||||||
|
final nodes = editorState.service.selectionService.currentSelectedNodes.value;
|
||||||
|
final selection = editorState.service.selectionService.currentSelection;
|
||||||
|
if (selection == null ||
|
||||||
|
nodes.length != 1 ||
|
||||||
|
nodes.first is! TextNode ||
|
||||||
|
!selection.isCollapsed) {
|
||||||
|
return KeyEventResult.ignored;
|
||||||
|
}
|
||||||
|
|
||||||
|
final textNode = nodes.first as TextNode;
|
||||||
|
|
||||||
|
if (textNode.selectable!.end() == selection.end) {
|
||||||
|
TransactionBuilder(editorState)
|
||||||
|
..insertNode(
|
||||||
|
textNode.path.next,
|
||||||
|
TextNode.empty(),
|
||||||
|
)
|
||||||
|
..commit();
|
||||||
|
return KeyEventResult.handled;
|
||||||
|
} else if (textNode.selectable!.start() == selection.start) {
|
||||||
|
TransactionBuilder(editorState)
|
||||||
|
..insertNode(
|
||||||
|
textNode.path,
|
||||||
|
TextNode.empty(),
|
||||||
|
)
|
||||||
|
..commit();
|
||||||
|
return KeyEventResult.handled;
|
||||||
|
}
|
||||||
|
|
||||||
|
return KeyEventResult.ignored;
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user