From 106e54c3fcd901979a9d498ec74780d96a2064ff Mon Sep 17 00:00:00 2001 From: Xun Gong Date: Fri, 9 Apr 2021 01:19:07 -0700 Subject: [PATCH] add scrollBottomInset --- lib/widgets/editor.dart | 33 +++++++++++++++++++++++++-------- lib/widgets/raw_editor.dart | 8 ++++++++ lib/widgets/text_block.dart | 11 ++++++++++- 3 files changed, 43 insertions(+), 9 deletions(-) diff --git a/lib/widgets/editor.dart b/lib/widgets/editor.dart index d11653a1..53540eb4 100644 --- a/lib/widgets/editor.dart +++ b/lib/widgets/editor.dart @@ -119,6 +119,7 @@ class QuillEditor extends StatefulWidget { required this.focusNode, required this.scrollController, required this.scrollable, + required this.scrollBottomInset, required this.padding, required this.autoFocus, required this.readOnly, @@ -133,7 +134,12 @@ class QuillEditor extends StatefulWidget { this.keyboardAppearance = Brightness.light, this.scrollPhysics, this.onLaunchUrl, - this.embedBuilder = _defaultEmbedBuilder, + this.onTapDown, + this.onTapUp, + this.onSingleLongTapStart, + this.onSingleLongTapMoveUpdate, + this.onSingleLongTapEnd, + this.embedBuilder = _defaultEmbedBuilder }); factory QuillEditor.basic({ @@ -148,6 +154,7 @@ class QuillEditor extends StatefulWidget { autoFocus: true, readOnly: readOnly, expands: false, + scrollBottomInset: 0, padding: EdgeInsets.zero); } @@ -155,6 +162,7 @@ class QuillEditor extends StatefulWidget { final FocusNode focusNode; final ScrollController scrollController; final bool scrollable; + final double scrollBottomInset; final EdgeInsetsGeometry padding; final bool autoFocus; final bool? showCursor; @@ -249,6 +257,7 @@ class _QuillEditorState extends State widget.focusNode, widget.scrollController, widget.scrollable, + widget.scrollBottomInset, widget.padding, widget.readOnly, widget.placeholder, @@ -282,11 +291,6 @@ class _QuillEditorState extends State widget.keyboardAppearance, widget.enableInteractiveSelection, widget.scrollPhysics, - widget.onTapDown, - widget.onTapUp, - widget.onSingleLongTapStart, - widget.onSingleLongTapMoveUpdate, - widget.onSingleLongTapEnd, widget.embedBuilder), ); } @@ -569,6 +573,7 @@ class RenderEditor extends RenderEditableContainerBox RenderEditor( List? children, TextDirection textDirection, + double scrollBottomInset, EdgeInsetsGeometry padding, this.document, this.selection, @@ -581,6 +586,7 @@ class RenderEditor extends RenderEditableContainerBox children, document.root, textDirection, + scrollBottomInset, padding, ); @@ -639,6 +645,14 @@ class RenderEditor extends RenderEditableContainerBox markNeedsPaint(); } + void setScrollBottomInset(double value) { + if (scrollBottomInset == value) { + return; + } + scrollBottomInset = value; + markNeedsPaint(); + } + @override List getEndpointsForSelection( TextSelection textSelection) { @@ -911,8 +925,9 @@ class RenderEditor extends RenderEditableContainerBox child.preferredLineHeight(TextPosition( offset: selection.extentOffset - child.getContainer().offset)) - kMargin + - offsetInViewport; - final caretBottom = endpoint.point.dy + kMargin + offsetInViewport; + offsetInViewport + + scrollBottomInset; + final caretBottom = endpoint.point.dy + kMargin + offsetInViewport + scrollBottomInset; double? dy; if (caretTop < scrollOffset) { dy = caretTop; @@ -939,6 +954,7 @@ class RenderEditableContainerBox extends RenderBox List? children, this._container, this.textDirection, + this.scrollBottomInset, this._padding, ) : assert(_padding.isNonNegative) { addAll(children); @@ -947,6 +963,7 @@ class RenderEditableContainerBox extends RenderBox container_node.Container _container; TextDirection textDirection; EdgeInsetsGeometry _padding; + double scrollBottomInset; EdgeInsets? _resolvedPadding; container_node.Container getContainer() { diff --git a/lib/widgets/raw_editor.dart b/lib/widgets/raw_editor.dart index 0ae9e82d..1627ebc3 100644 --- a/lib/widgets/raw_editor.dart +++ b/lib/widgets/raw_editor.dart @@ -34,6 +34,7 @@ class RawEditor extends StatefulWidget { this.focusNode, this.scrollController, this.scrollable, + this.scrollBottomInset, this.padding, this.readOnly, this.placeholder, @@ -65,6 +66,7 @@ class RawEditor extends StatefulWidget { final FocusNode focusNode; final ScrollController scrollController; final bool scrollable; + final double scrollBottomInset; final EdgeInsetsGeometry padding; final bool readOnly; final String? placeholder; @@ -527,6 +529,7 @@ class RawEditorState extends EditorState startHandleLayerLink: _startHandleLayerLink, endHandleLayerLink: _endHandleLayerLink, onSelectionChanged: _handleSelectionChanged, + scrollBottomInset: widget.scrollBottomInset, padding: widget.padding, children: _buildChildren(_doc, context), ), @@ -588,6 +591,7 @@ class RawEditorState extends EditorState final editableTextBlock = EditableTextBlock( node, _textDirection, + widget.scrollBottomInset, _getVerticalSpacingForBlock(node, _styles), widget.controller.selection, widget.selectionColor, @@ -1137,6 +1141,7 @@ class _Editor extends MultiChildRenderObjectWidget { required this.startHandleLayerLink, required this.endHandleLayerLink, required this.onSelectionChanged, + required this.scrollBottomInset, this.padding = EdgeInsets.zero, }) : super(key: key, children: children); @@ -1147,6 +1152,7 @@ class _Editor extends MultiChildRenderObjectWidget { final LayerLink startHandleLayerLink; final LayerLink endHandleLayerLink; final TextSelectionChangedHandler onSelectionChanged; + final double scrollBottomInset; final EdgeInsetsGeometry padding; @override @@ -1154,6 +1160,7 @@ class _Editor extends MultiChildRenderObjectWidget { return RenderEditor( null, textDirection, + scrollBottomInset, padding, document, selection, @@ -1177,6 +1184,7 @@ class _Editor extends MultiChildRenderObjectWidget { ..setStartHandleLayerLink(startHandleLayerLink) ..setEndHandleLayerLink(endHandleLayerLink) ..onSelectionChanged = onSelectionChanged + ..setScrollBottomInset(scrollBottomInset) ..setPadding(padding); } } diff --git a/lib/widgets/text_block.dart b/lib/widgets/text_block.dart index 1c81f1ac..d826c9e5 100644 --- a/lib/widgets/text_block.dart +++ b/lib/widgets/text_block.dart @@ -50,6 +50,7 @@ class EditableTextBlock extends StatelessWidget { const EditableTextBlock( this.block, this.textDirection, + this.scrollBottomInset, this.verticalSpacing, this.textSelection, this.color, @@ -64,6 +65,7 @@ class EditableTextBlock extends StatelessWidget { final Block block; final TextDirection textDirection; + final double scrollBottomInset; final Tuple2 verticalSpacing; final TextSelection textSelection; final Color color; @@ -84,6 +86,7 @@ class EditableTextBlock extends StatelessWidget { block, textDirection, verticalSpacing as Tuple2, + scrollBottomInset, _getDecorationForBlock(block, defaultStyles) ?? const BoxDecoration(), contentPadding, _buildChildren(context, indentLevelCounts)); @@ -256,6 +259,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox required Block block, required TextDirection textDirection, required EdgeInsetsGeometry padding, + required double scrollBottomInset, required Decoration decoration, List? children, ImageConfiguration configuration = ImageConfiguration.empty, @@ -268,6 +272,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox children, block, textDirection, + scrollBottomInset, padding.add(contentPadding), ); @@ -512,14 +517,16 @@ class _EditableBlock extends MultiChildRenderObjectWidget { this.block, this.textDirection, this.padding, + this.scrollBottomInset, this.decoration, this.contentPadding, - List children, + List children ) : super(children: children); final Block block; final TextDirection textDirection; final Tuple2 padding; + final double scrollBottomInset; final Decoration decoration; final EdgeInsets? contentPadding; @@ -534,6 +541,7 @@ class _EditableBlock extends MultiChildRenderObjectWidget { block: block, textDirection: textDirection, padding: _padding, + scrollBottomInset: scrollBottomInset, decoration: decoration, contentPadding: _contentPadding, ); @@ -545,6 +553,7 @@ class _EditableBlock extends MultiChildRenderObjectWidget { renderObject ..setContainer(block) ..textDirection = textDirection + ..scrollBottomInset = scrollBottomInset ..setPadding(_padding) ..decoration = decoration ..contentPadding = _contentPadding;