From 7030784e525347dc038191094ff5434e39c99a91 Mon Sep 17 00:00:00 2001 From: "AppFlowy.IO" <86001920+appflowy@users.noreply.github.com> Date: Thu, 6 Jan 2022 14:03:46 +0800 Subject: [PATCH] fix custom checkbox issue (#573) --- lib/src/widgets/text_block.dart | 133 +++++++++----------------------- 1 file changed, 35 insertions(+), 98 deletions(-) diff --git a/lib/src/widgets/text_block.dart b/lib/src/widgets/text_block.dart index 819ebe07..5e08f0f5 100644 --- a/lib/src/widgets/text_block.dart +++ b/lib/src/widgets/text_block.dart @@ -12,37 +12,9 @@ import 'link.dart'; import 'text_line.dart'; import 'text_selection.dart'; -const List arabianRomanNumbers = [ - 1000, - 900, - 500, - 400, - 100, - 90, - 50, - 40, - 10, - 9, - 5, - 4, - 1 -]; - -const List romanNumbers = [ - 'M', - 'CM', - 'D', - 'CD', - 'C', - 'XC', - 'L', - 'XL', - 'X', - 'IX', - 'V', - 'IV', - 'I' -]; +const List arabianRomanNumbers = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1]; + +const List romanNumbers = ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']; class EditableTextBlock extends StatelessWidget { const EditableTextBlock( @@ -102,8 +74,7 @@ class EditableTextBlock extends StatelessWidget { _buildChildren(context, indentLevelCounts)); } - BoxDecoration? _getDecorationForBlock( - Block node, DefaultStyles? defaultStyles) { + BoxDecoration? _getDecorationForBlock(Block node, DefaultStyles? defaultStyles) { final attrs = block.style.attributes; if (attrs.containsKey(Attribute.blockQuote.key)) { return defaultStyles!.quote!.decoration; @@ -114,8 +85,7 @@ class EditableTextBlock extends StatelessWidget { return null; } - List _buildChildren( - BuildContext context, Map indentLevelCounts) { + List _buildChildren(BuildContext context, Map indentLevelCounts) { final defaultStyles = QuillStyles.getStyles(context, false); final count = block.children.length; final children = []; @@ -150,8 +120,7 @@ class EditableTextBlock extends StatelessWidget { return children.toList(growable: false); } - Widget? _buildLeading(BuildContext context, Line line, int index, - Map indentLevelCounts, int count) { + Widget? _buildLeading(BuildContext context, Line line, int index, Map indentLevelCounts, int count) { final defaultStyles = QuillStyles.getStyles(context, false); final attrs = line.style.attributes; if (attrs[Attribute.list.key] == Attribute.ol) { @@ -168,8 +137,7 @@ class EditableTextBlock extends StatelessWidget { if (attrs[Attribute.list.key] == Attribute.ul) { return QuillBulletPoint( - style: - defaultStyles!.leading!.style.copyWith(fontWeight: FontWeight.bold), + style: defaultStyles!.leading!.style.copyWith(fontWeight: FontWeight.bold), width: 32, ); } @@ -180,6 +148,7 @@ class EditableTextBlock extends StatelessWidget { value: true, enabled: !readOnly, onChanged: (checked) => onCheckboxTap(line.documentOffset, checked), + uiBuilder: defaultStyles?.lists?.checkboxUIBuilder, ); } @@ -189,6 +158,7 @@ class EditableTextBlock extends StatelessWidget { value: false, enabled: !readOnly, onChanged: (checked) => onCheckboxTap(line.documentOffset, checked), + uiBuilder: defaultStyles?.lists?.checkboxUIBuilder, ); } @@ -197,8 +167,7 @@ class EditableTextBlock extends StatelessWidget { index: index, indentLevelCounts: indentLevelCounts, count: count, - style: defaultStyles!.code!.style - .copyWith(color: defaultStyles.code!.style.color!.withOpacity(0.4)), + style: defaultStyles!.code!.style.copyWith(color: defaultStyles.code!.style.color!.withOpacity(0.4)), width: 32, attrs: attrs, padding: 16, @@ -223,16 +192,14 @@ class EditableTextBlock extends StatelessWidget { var baseIndent = 0.0; - if (attrs.containsKey(Attribute.list.key) || - attrs.containsKey(Attribute.codeBlock.key)) { + if (attrs.containsKey(Attribute.list.key) || attrs.containsKey(Attribute.codeBlock.key)) { baseIndent = 32.0; } return baseIndent + extraIndent; } - Tuple2 _getSpacingForLine( - Line node, int index, int count, DefaultStyles? defaultStyles) { + Tuple2 _getSpacingForLine(Line node, int index, int count, DefaultStyles? defaultStyles) { var top = 0.0, bottom = 0.0; final attrs = block.style.attributes; @@ -283,8 +250,7 @@ class EditableTextBlock extends StatelessWidget { } } -class RenderEditableTextBlock extends RenderEditableContainerBox - implements RenderEditableBox { +class RenderEditableTextBlock extends RenderEditableContainerBox implements RenderEditableBox { RenderEditableTextBlock({ required Block block, required TextDirection textDirection, @@ -370,8 +336,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox TextPosition getPositionForOffset(Offset offset) { final child = childAtOffset(offset)!; final parentData = child.parentData as BoxParentData; - final localPosition = - child.getPositionForOffset(offset - parentData.offset); + final localPosition = child.getPositionForOffset(offset - parentData.offset); return TextPosition( offset: localPosition.offset + child.getContainer().offset, affinity: localPosition.affinity, @@ -382,8 +347,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox TextRange getWordBoundary(TextPosition position) { final child = childAtPosition(position); final nodeOffset = child.getContainer().offset; - final childWord = child - .getWordBoundary(TextPosition(offset: position.offset - nodeOffset)); + final childWord = child.getWordBoundary(TextPosition(offset: position.offset - nodeOffset)); return TextRange( start: childWord.start + nodeOffset, end: childWord.end + nodeOffset, @@ -395,8 +359,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox assert(position.offset < getContainer().length); final child = childAtPosition(position); - final childLocalPosition = - TextPosition(offset: position.offset - child.getContainer().offset); + final childLocalPosition = TextPosition(offset: position.offset - child.getContainer().offset); final result = child.getPositionAbove(childLocalPosition); if (result != null) { return TextPosition(offset: result.offset + child.getContainer().offset); @@ -408,13 +371,10 @@ class RenderEditableTextBlock extends RenderEditableContainerBox } final caretOffset = child.getOffsetForCaret(childLocalPosition); - final testPosition = - TextPosition(offset: sibling.getContainer().length - 1); + final testPosition = TextPosition(offset: sibling.getContainer().length - 1); final testOffset = sibling.getOffsetForCaret(testPosition); final finalOffset = Offset(caretOffset.dx, testOffset.dy); - return TextPosition( - offset: sibling.getContainer().offset + - sibling.getPositionForOffset(finalOffset).offset); + return TextPosition(offset: sibling.getContainer().offset + sibling.getPositionForOffset(finalOffset).offset); } @override @@ -422,8 +382,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox assert(position.offset < getContainer().length); final child = childAtPosition(position); - final childLocalPosition = - TextPosition(offset: position.offset - child.getContainer().offset); + final childLocalPosition = TextPosition(offset: position.offset - child.getContainer().offset); final result = child.getPositionBelow(childLocalPosition); if (result != null) { return TextPosition(offset: result.offset + child.getContainer().offset); @@ -437,25 +396,20 @@ class RenderEditableTextBlock extends RenderEditableContainerBox final caretOffset = child.getOffsetForCaret(childLocalPosition); final testOffset = sibling.getOffsetForCaret(const TextPosition(offset: 0)); final finalOffset = Offset(caretOffset.dx, testOffset.dy); - return TextPosition( - offset: sibling.getContainer().offset + - sibling.getPositionForOffset(finalOffset).offset); + return TextPosition(offset: sibling.getContainer().offset + sibling.getPositionForOffset(finalOffset).offset); } @override double preferredLineHeight(TextPosition position) { final child = childAtPosition(position); - return child.preferredLineHeight( - TextPosition(offset: position.offset - child.getContainer().offset)); + return child.preferredLineHeight(TextPosition(offset: position.offset - child.getContainer().offset)); } @override TextSelectionPoint getBaseEndpointForSelection(TextSelection selection) { if (selection.isCollapsed) { return TextSelectionPoint( - Offset(0, preferredLineHeight(selection.extent)) + - getOffsetForCaret(selection.extent), - null); + Offset(0, preferredLineHeight(selection.extent)) + getOffsetForCaret(selection.extent), null); } final baseNode = getContainer().queryChild(selection.start, false).node; @@ -468,20 +422,15 @@ class RenderEditableTextBlock extends RenderEditableContainerBox } assert(baseChild != null); - final basePoint = baseChild!.getBaseEndpointForSelection( - localSelection(baseChild.getContainer(), selection, true)); - return TextSelectionPoint( - basePoint.point + (baseChild.parentData as BoxParentData).offset, - basePoint.direction); + final basePoint = baseChild!.getBaseEndpointForSelection(localSelection(baseChild.getContainer(), selection, true)); + return TextSelectionPoint(basePoint.point + (baseChild.parentData as BoxParentData).offset, basePoint.direction); } @override TextSelectionPoint getExtentEndpointForSelection(TextSelection selection) { if (selection.isCollapsed) { return TextSelectionPoint( - Offset(0, preferredLineHeight(selection.extent)) + - getOffsetForCaret(selection.extent), - null); + Offset(0, preferredLineHeight(selection.extent)) + getOffsetForCaret(selection.extent), null); } final extentNode = getContainer().queryChild(selection.end, false).node; @@ -495,11 +444,10 @@ class RenderEditableTextBlock extends RenderEditableContainerBox } assert(extentChild != null); - final extentPoint = extentChild!.getExtentEndpointForSelection( - localSelection(extentChild.getContainer(), selection, true)); + final extentPoint = + extentChild!.getExtentEndpointForSelection(localSelection(extentChild.getContainer(), selection, true)); return TextSelectionPoint( - extentPoint.point + (extentChild.parentData as BoxParentData).offset, - extentPoint.direction); + extentPoint.point + (extentChild.parentData as BoxParentData).offset, extentPoint.direction); } @override @@ -521,12 +469,10 @@ class RenderEditableTextBlock extends RenderEditableContainerBox final decorationPadding = resolvedPadding! - _contentPadding; - final filledConfiguration = - configuration.copyWith(size: decorationPadding.deflateSize(size)); + final filledConfiguration = configuration.copyWith(size: decorationPadding.deflateSize(size)); final debugSaveCount = context.canvas.getSaveCount(); - final decorationOffset = - offset.translate(decorationPadding.left, decorationPadding.top); + final decorationOffset = offset.translate(decorationPadding.left, decorationPadding.top); _painter!.paint(context.canvas, decorationOffset, filledConfiguration); if (debugSaveCount != context.canvas.getSaveCount()) { throw '${_decoration.runtimeType} painter had mismatching save and ' @@ -555,8 +501,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox @override TextPosition globalToLocalPosition(TextPosition position) { - assert(getContainer().containsOffset(position.offset), - 'The provided text position is not in the current node'); + assert(getContainer().containsOffset(position.offset), 'The provided text position is not in the current node'); return TextPosition( offset: position.offset - getContainer().documentOffset, affinity: position.affinity, @@ -575,14 +520,8 @@ class RenderEditableTextBlock extends RenderEditableContainerBox } class _EditableBlock extends MultiChildRenderObjectWidget { - _EditableBlock( - this.block, - this.textDirection, - this.padding, - this.scrollBottomInset, - this.decoration, - this.contentPadding, - List children) + _EditableBlock(this.block, this.textDirection, this.padding, this.scrollBottomInset, this.decoration, + this.contentPadding, List children) : super(children: children); final Block block; @@ -592,8 +531,7 @@ class _EditableBlock extends MultiChildRenderObjectWidget { final Decoration decoration; final EdgeInsets? contentPadding; - EdgeInsets get _padding => - EdgeInsets.only(top: padding.item1, bottom: padding.item2); + EdgeInsets get _padding => EdgeInsets.only(top: padding.item1, bottom: padding.item2); EdgeInsets get _contentPadding => contentPadding ?? EdgeInsets.zero; @@ -610,8 +548,7 @@ class _EditableBlock extends MultiChildRenderObjectWidget { } @override - void updateRenderObject( - BuildContext context, covariant RenderEditableTextBlock renderObject) { + void updateRenderObject(BuildContext context, covariant RenderEditableTextBlock renderObject) { renderObject ..setContainer(block) ..textDirection = textDirection