mirror of
https://github.com/AppFlowy-IO/AppFlowy.git
synced 2024-08-30 18:12:39 +00:00
feat: remove subtype render
This commit is contained in:
parent
d200371002
commit
eb97141859
@ -6,10 +6,15 @@
|
||||
{
|
||||
"type": "text",
|
||||
"delta": [
|
||||
{ "insert": "👋 Welcome to AppFlowy!", "attributes": { "href": "https://www.appflowy.io/", "heading": "h1" } }
|
||||
{
|
||||
"insert": "👋 Welcome to AppFlowy!",
|
||||
"attributes": {
|
||||
"href": "https://www.appflowy.io/",
|
||||
"heading": "h1"
|
||||
}
|
||||
}
|
||||
],
|
||||
"attributes": {
|
||||
"subtype": "with-heading",
|
||||
"heading": "h1"
|
||||
}
|
||||
},
|
||||
@ -19,33 +24,34 @@
|
||||
{ "insert": "Here are the basics", "attributes": { "heading": "h2" } }
|
||||
],
|
||||
"attributes": {
|
||||
"subtype": "with-heading",
|
||||
"heading": "h2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"delta": [
|
||||
{ "insert": "Click anywhere and just start typing." }
|
||||
],
|
||||
"delta": [{ "insert": "Click anywhere and just start typing." }],
|
||||
"attributes": {
|
||||
"subtype": "with-checkbox",
|
||||
"checkbox": true
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"delta": [
|
||||
{ "insert": "Highlight", "attributes": { "highlight": "0xFFFFFF00" } },
|
||||
{
|
||||
"insert": "Highlight",
|
||||
"attributes": { "highlight": "0xFFFFFF00" }
|
||||
},
|
||||
{ "insert": " Click anywhere and just start typing" },
|
||||
{ "insert": " any text, and use the menu at the bottom to " },
|
||||
{ "insert": "style", "attributes": { "italic": true } },
|
||||
{ "insert": " your ", "attributes": { "bold": true } },
|
||||
{ "insert": "writing", "attributes": { "underline": true } },
|
||||
{ "insert": " howeverv you like.", "attributes": { "strikethrough": true } }
|
||||
{
|
||||
"insert": " howeverv you like.",
|
||||
"attributes": { "strikethrough": true }
|
||||
}
|
||||
],
|
||||
"attributes": {
|
||||
"subtype": "with-checkbox",
|
||||
"checkbox": false
|
||||
}
|
||||
},
|
||||
@ -55,17 +61,18 @@
|
||||
{ "insert": "Have a question? ", "attributes": { "heading": "h2" } }
|
||||
],
|
||||
"attributes": {
|
||||
"subtype": "with-heading",
|
||||
"heading": "h2"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "text",
|
||||
"delta": [
|
||||
{ "insert": "Click the '?' at the bottom right for help and support."}
|
||||
{
|
||||
"insert": "Click the '?' at the bottom right for help and support."
|
||||
}
|
||||
],
|
||||
"attributes": {}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -20,6 +20,7 @@ class SelectedTextNodeBuilder extends NodeWidgetBuilder {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext buildContext) {
|
||||
print('key -> $key');
|
||||
return _SelectedTextNodeWidget(
|
||||
key: key,
|
||||
node: node,
|
||||
@ -100,9 +101,20 @@ class _SelectedTextNodeWidgetState extends State<_SelectedTextNodeWidget>
|
||||
// TODO: just handle upforward delete.
|
||||
if (textSelection != null) {
|
||||
if (textSelection.isCollapsed) {
|
||||
print(node.toRawString());
|
||||
print('is empty ${node.toRawString().isEmpty}');
|
||||
if (textSelection.baseOffset == 0 && node.toRawString().isEmpty) {
|
||||
TransactionBuilder(editorState)
|
||||
..deleteNode(node)
|
||||
..commit();
|
||||
} else {
|
||||
TransactionBuilder(editorState)
|
||||
..deleteText(node, textSelection.start - 1, 1)
|
||||
..commit();
|
||||
final rect = _computeCursorRect(textSelection.baseOffset - 1);
|
||||
editorState.tapOffset = rect.center;
|
||||
editorState.updateCursor();
|
||||
}
|
||||
} else {
|
||||
TransactionBuilder(editorState)
|
||||
..deleteText(node, textSelection.start,
|
||||
@ -117,6 +129,7 @@ class _SelectedTextNodeWidgetState extends State<_SelectedTextNodeWidget>
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
print('text rebuild $this');
|
||||
Widget richText;
|
||||
if (kDebugMode) {
|
||||
richText = DebuggableRichText(text: node.toTextSpan(), textKey: _textKey);
|
||||
@ -127,7 +140,10 @@ class _SelectedTextNodeWidgetState extends State<_SelectedTextNodeWidget>
|
||||
return Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
richText,
|
||||
SizedBox(
|
||||
width: MediaQuery.of(context).size.width,
|
||||
child: richText,
|
||||
),
|
||||
if (node.children.isNotEmpty)
|
||||
...node.children.map(
|
||||
(e) => editorState.renderPlugins.buildWidget(
|
||||
@ -163,7 +179,8 @@ class _SelectedTextNodeWidgetState extends State<_SelectedTextNodeWidget>
|
||||
final position = TextPosition(offset: offset);
|
||||
var cursorOffset = _renderParagraph.getOffsetForCaret(position, Rect.zero);
|
||||
cursorOffset = _renderParagraph.localToGlobal(cursorOffset);
|
||||
final cursorHeight = _renderParagraph.getFullHeightForCaret(position)!;
|
||||
final cursorHeight = _renderParagraph.getFullHeightForCaret(position);
|
||||
if (cursorHeight != null) {
|
||||
const cursorWidth = 2;
|
||||
return Rect.fromLTWH(
|
||||
cursorOffset.dx - (cursorWidth / 2),
|
||||
@ -171,6 +188,9 @@ class _SelectedTextNodeWidgetState extends State<_SelectedTextNodeWidget>
|
||||
cursorWidth.toDouble(),
|
||||
cursorHeight.toDouble(),
|
||||
);
|
||||
} else {
|
||||
return Rect.zero;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,6 @@ class __TextNodeWidgetState extends State<_TextNodeWidget>
|
||||
textCapitalization: TextCapitalization.sentences,
|
||||
),
|
||||
);
|
||||
debugPrint('selection: $selection');
|
||||
editorState.cursorSelection = _localSelectionToGlobal(node, selection);
|
||||
_textInputConnection
|
||||
?..show()
|
||||
@ -182,9 +181,7 @@ class __TextNodeWidgetState extends State<_TextNodeWidget>
|
||||
}
|
||||
|
||||
@override
|
||||
void performAction(TextInputAction action) {
|
||||
debugPrint('action:$action');
|
||||
}
|
||||
void performAction(TextInputAction action) {}
|
||||
|
||||
@override
|
||||
void performPrivateCommand(String action, Map<String, dynamic> data) {
|
||||
@ -207,13 +204,10 @@ class __TextNodeWidgetState extends State<_TextNodeWidget>
|
||||
}
|
||||
|
||||
@override
|
||||
void updateEditingValue(TextEditingValue value) {
|
||||
debugPrint('offset: ${value.selection}');
|
||||
}
|
||||
void updateEditingValue(TextEditingValue value) {}
|
||||
|
||||
@override
|
||||
void updateEditingValueWithDeltas(List<TextEditingDelta> textEditingDeltas) {
|
||||
debugPrint(textEditingDeltas.toString());
|
||||
for (final textDelta in textEditingDeltas) {
|
||||
if (textDelta is TextEditingDeltaInsertion) {
|
||||
TransactionBuilder(editorState)
|
||||
|
@ -186,8 +186,6 @@ class TextNode extends Node {
|
||||
return map;
|
||||
}
|
||||
|
||||
String toRawString() => _delta.operations
|
||||
.whereType<TextInsert>()
|
||||
.map((op) => op.content)
|
||||
.toString();
|
||||
String toRawString() =>
|
||||
_delta.operations.whereType<TextInsert>().map((op) => op.content).join();
|
||||
}
|
||||
|
@ -63,6 +63,10 @@ class EditorState {
|
||||
List<OverlayEntry> selectionOverlays = [];
|
||||
|
||||
void updateCursor() {
|
||||
selectionOverlays
|
||||
..forEach((element) => element.remove())
|
||||
..clear();
|
||||
|
||||
if (tapOffset == null) {
|
||||
return;
|
||||
}
|
||||
|
@ -51,6 +51,7 @@ class RenderPlugins {
|
||||
_nodeWidgetBuilders.removeWhere((key, _) => key == name);
|
||||
}
|
||||
|
||||
@protected
|
||||
Widget buildWidget({
|
||||
required NodeWidgetContext context,
|
||||
bool withSubtype = true,
|
||||
|
Loading…
Reference in New Issue
Block a user