add scrollBottomInset

pull/142/head
Xun Gong 4 years ago
parent fe6ab738c0
commit 106e54c3fc
  1. 33
      lib/widgets/editor.dart
  2. 8
      lib/widgets/raw_editor.dart
  3. 11
      lib/widgets/text_block.dart

@ -119,6 +119,7 @@ class QuillEditor extends StatefulWidget {
required this.focusNode, required this.focusNode,
required this.scrollController, required this.scrollController,
required this.scrollable, required this.scrollable,
required this.scrollBottomInset,
required this.padding, required this.padding,
required this.autoFocus, required this.autoFocus,
required this.readOnly, required this.readOnly,
@ -133,7 +134,12 @@ class QuillEditor extends StatefulWidget {
this.keyboardAppearance = Brightness.light, this.keyboardAppearance = Brightness.light,
this.scrollPhysics, this.scrollPhysics,
this.onLaunchUrl, this.onLaunchUrl,
this.embedBuilder = _defaultEmbedBuilder, this.onTapDown,
this.onTapUp,
this.onSingleLongTapStart,
this.onSingleLongTapMoveUpdate,
this.onSingleLongTapEnd,
this.embedBuilder = _defaultEmbedBuilder
}); });
factory QuillEditor.basic({ factory QuillEditor.basic({
@ -148,6 +154,7 @@ class QuillEditor extends StatefulWidget {
autoFocus: true, autoFocus: true,
readOnly: readOnly, readOnly: readOnly,
expands: false, expands: false,
scrollBottomInset: 0,
padding: EdgeInsets.zero); padding: EdgeInsets.zero);
} }
@ -155,6 +162,7 @@ class QuillEditor extends StatefulWidget {
final FocusNode focusNode; final FocusNode focusNode;
final ScrollController scrollController; final ScrollController scrollController;
final bool scrollable; final bool scrollable;
final double scrollBottomInset;
final EdgeInsetsGeometry padding; final EdgeInsetsGeometry padding;
final bool autoFocus; final bool autoFocus;
final bool? showCursor; final bool? showCursor;
@ -249,6 +257,7 @@ class _QuillEditorState extends State<QuillEditor>
widget.focusNode, widget.focusNode,
widget.scrollController, widget.scrollController,
widget.scrollable, widget.scrollable,
widget.scrollBottomInset,
widget.padding, widget.padding,
widget.readOnly, widget.readOnly,
widget.placeholder, widget.placeholder,
@ -282,11 +291,6 @@ class _QuillEditorState extends State<QuillEditor>
widget.keyboardAppearance, widget.keyboardAppearance,
widget.enableInteractiveSelection, widget.enableInteractiveSelection,
widget.scrollPhysics, widget.scrollPhysics,
widget.onTapDown,
widget.onTapUp,
widget.onSingleLongTapStart,
widget.onSingleLongTapMoveUpdate,
widget.onSingleLongTapEnd,
widget.embedBuilder), widget.embedBuilder),
); );
} }
@ -569,6 +573,7 @@ class RenderEditor extends RenderEditableContainerBox
RenderEditor( RenderEditor(
List<RenderEditableBox>? children, List<RenderEditableBox>? children,
TextDirection textDirection, TextDirection textDirection,
double scrollBottomInset,
EdgeInsetsGeometry padding, EdgeInsetsGeometry padding,
this.document, this.document,
this.selection, this.selection,
@ -581,6 +586,7 @@ class RenderEditor extends RenderEditableContainerBox
children, children,
document.root, document.root,
textDirection, textDirection,
scrollBottomInset,
padding, padding,
); );
@ -639,6 +645,14 @@ class RenderEditor extends RenderEditableContainerBox
markNeedsPaint(); markNeedsPaint();
} }
void setScrollBottomInset(double value) {
if (scrollBottomInset == value) {
return;
}
scrollBottomInset = value;
markNeedsPaint();
}
@override @override
List<TextSelectionPoint> getEndpointsForSelection( List<TextSelectionPoint> getEndpointsForSelection(
TextSelection textSelection) { TextSelection textSelection) {
@ -911,8 +925,9 @@ class RenderEditor extends RenderEditableContainerBox
child.preferredLineHeight(TextPosition( child.preferredLineHeight(TextPosition(
offset: selection.extentOffset - child.getContainer().offset)) - offset: selection.extentOffset - child.getContainer().offset)) -
kMargin + kMargin +
offsetInViewport; offsetInViewport +
final caretBottom = endpoint.point.dy + kMargin + offsetInViewport; scrollBottomInset;
final caretBottom = endpoint.point.dy + kMargin + offsetInViewport + scrollBottomInset;
double? dy; double? dy;
if (caretTop < scrollOffset) { if (caretTop < scrollOffset) {
dy = caretTop; dy = caretTop;
@ -939,6 +954,7 @@ class RenderEditableContainerBox extends RenderBox
List<RenderEditableBox>? children, List<RenderEditableBox>? children,
this._container, this._container,
this.textDirection, this.textDirection,
this.scrollBottomInset,
this._padding, this._padding,
) : assert(_padding.isNonNegative) { ) : assert(_padding.isNonNegative) {
addAll(children); addAll(children);
@ -947,6 +963,7 @@ class RenderEditableContainerBox extends RenderBox
container_node.Container _container; container_node.Container _container;
TextDirection textDirection; TextDirection textDirection;
EdgeInsetsGeometry _padding; EdgeInsetsGeometry _padding;
double scrollBottomInset;
EdgeInsets? _resolvedPadding; EdgeInsets? _resolvedPadding;
container_node.Container getContainer() { container_node.Container getContainer() {

@ -34,6 +34,7 @@ class RawEditor extends StatefulWidget {
this.focusNode, this.focusNode,
this.scrollController, this.scrollController,
this.scrollable, this.scrollable,
this.scrollBottomInset,
this.padding, this.padding,
this.readOnly, this.readOnly,
this.placeholder, this.placeholder,
@ -65,6 +66,7 @@ class RawEditor extends StatefulWidget {
final FocusNode focusNode; final FocusNode focusNode;
final ScrollController scrollController; final ScrollController scrollController;
final bool scrollable; final bool scrollable;
final double scrollBottomInset;
final EdgeInsetsGeometry padding; final EdgeInsetsGeometry padding;
final bool readOnly; final bool readOnly;
final String? placeholder; final String? placeholder;
@ -527,6 +529,7 @@ class RawEditorState extends EditorState
startHandleLayerLink: _startHandleLayerLink, startHandleLayerLink: _startHandleLayerLink,
endHandleLayerLink: _endHandleLayerLink, endHandleLayerLink: _endHandleLayerLink,
onSelectionChanged: _handleSelectionChanged, onSelectionChanged: _handleSelectionChanged,
scrollBottomInset: widget.scrollBottomInset,
padding: widget.padding, padding: widget.padding,
children: _buildChildren(_doc, context), children: _buildChildren(_doc, context),
), ),
@ -588,6 +591,7 @@ class RawEditorState extends EditorState
final editableTextBlock = EditableTextBlock( final editableTextBlock = EditableTextBlock(
node, node,
_textDirection, _textDirection,
widget.scrollBottomInset,
_getVerticalSpacingForBlock(node, _styles), _getVerticalSpacingForBlock(node, _styles),
widget.controller.selection, widget.controller.selection,
widget.selectionColor, widget.selectionColor,
@ -1137,6 +1141,7 @@ class _Editor extends MultiChildRenderObjectWidget {
required this.startHandleLayerLink, required this.startHandleLayerLink,
required this.endHandleLayerLink, required this.endHandleLayerLink,
required this.onSelectionChanged, required this.onSelectionChanged,
required this.scrollBottomInset,
this.padding = EdgeInsets.zero, this.padding = EdgeInsets.zero,
}) : super(key: key, children: children); }) : super(key: key, children: children);
@ -1147,6 +1152,7 @@ class _Editor extends MultiChildRenderObjectWidget {
final LayerLink startHandleLayerLink; final LayerLink startHandleLayerLink;
final LayerLink endHandleLayerLink; final LayerLink endHandleLayerLink;
final TextSelectionChangedHandler onSelectionChanged; final TextSelectionChangedHandler onSelectionChanged;
final double scrollBottomInset;
final EdgeInsetsGeometry padding; final EdgeInsetsGeometry padding;
@override @override
@ -1154,6 +1160,7 @@ class _Editor extends MultiChildRenderObjectWidget {
return RenderEditor( return RenderEditor(
null, null,
textDirection, textDirection,
scrollBottomInset,
padding, padding,
document, document,
selection, selection,
@ -1177,6 +1184,7 @@ class _Editor extends MultiChildRenderObjectWidget {
..setStartHandleLayerLink(startHandleLayerLink) ..setStartHandleLayerLink(startHandleLayerLink)
..setEndHandleLayerLink(endHandleLayerLink) ..setEndHandleLayerLink(endHandleLayerLink)
..onSelectionChanged = onSelectionChanged ..onSelectionChanged = onSelectionChanged
..setScrollBottomInset(scrollBottomInset)
..setPadding(padding); ..setPadding(padding);
} }
} }

@ -50,6 +50,7 @@ class EditableTextBlock extends StatelessWidget {
const EditableTextBlock( const EditableTextBlock(
this.block, this.block,
this.textDirection, this.textDirection,
this.scrollBottomInset,
this.verticalSpacing, this.verticalSpacing,
this.textSelection, this.textSelection,
this.color, this.color,
@ -64,6 +65,7 @@ class EditableTextBlock extends StatelessWidget {
final Block block; final Block block;
final TextDirection textDirection; final TextDirection textDirection;
final double scrollBottomInset;
final Tuple2 verticalSpacing; final Tuple2 verticalSpacing;
final TextSelection textSelection; final TextSelection textSelection;
final Color color; final Color color;
@ -84,6 +86,7 @@ class EditableTextBlock extends StatelessWidget {
block, block,
textDirection, textDirection,
verticalSpacing as Tuple2<double, double>, verticalSpacing as Tuple2<double, double>,
scrollBottomInset,
_getDecorationForBlock(block, defaultStyles) ?? const BoxDecoration(), _getDecorationForBlock(block, defaultStyles) ?? const BoxDecoration(),
contentPadding, contentPadding,
_buildChildren(context, indentLevelCounts)); _buildChildren(context, indentLevelCounts));
@ -256,6 +259,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox
required Block block, required Block block,
required TextDirection textDirection, required TextDirection textDirection,
required EdgeInsetsGeometry padding, required EdgeInsetsGeometry padding,
required double scrollBottomInset,
required Decoration decoration, required Decoration decoration,
List<RenderEditableBox>? children, List<RenderEditableBox>? children,
ImageConfiguration configuration = ImageConfiguration.empty, ImageConfiguration configuration = ImageConfiguration.empty,
@ -268,6 +272,7 @@ class RenderEditableTextBlock extends RenderEditableContainerBox
children, children,
block, block,
textDirection, textDirection,
scrollBottomInset,
padding.add(contentPadding), padding.add(contentPadding),
); );
@ -512,14 +517,16 @@ class _EditableBlock extends MultiChildRenderObjectWidget {
this.block, this.block,
this.textDirection, this.textDirection,
this.padding, this.padding,
this.scrollBottomInset,
this.decoration, this.decoration,
this.contentPadding, this.contentPadding,
List<Widget> children, List<Widget> children
) : super(children: children); ) : super(children: children);
final Block block; final Block block;
final TextDirection textDirection; final TextDirection textDirection;
final Tuple2<double, double> padding; final Tuple2<double, double> padding;
final double scrollBottomInset;
final Decoration decoration; final Decoration decoration;
final EdgeInsets? contentPadding; final EdgeInsets? contentPadding;
@ -534,6 +541,7 @@ class _EditableBlock extends MultiChildRenderObjectWidget {
block: block, block: block,
textDirection: textDirection, textDirection: textDirection,
padding: _padding, padding: _padding,
scrollBottomInset: scrollBottomInset,
decoration: decoration, decoration: decoration,
contentPadding: _contentPadding, contentPadding: _contentPadding,
); );
@ -545,6 +553,7 @@ class _EditableBlock extends MultiChildRenderObjectWidget {
renderObject renderObject
..setContainer(block) ..setContainer(block)
..textDirection = textDirection ..textDirection = textDirection
..scrollBottomInset = scrollBottomInset
..setPadding(_padding) ..setPadding(_padding)
..decoration = decoration ..decoration = decoration
..contentPadding = _contentPadding; ..contentPadding = _contentPadding;

Loading…
Cancel
Save