diff --git a/lib/widgets/editor.dart b/lib/widgets/editor.dart index a564f6a9..5d2d6122 100644 --- a/lib/widgets/editor.dart +++ b/lib/widgets/editor.dart @@ -3,6 +3,9 @@ import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:flutter_quill/models/documents/document.dart'; +import 'package:flutter_quill/models/documents/nodes/container.dart' + as container; +import 'package:flutter_quill/models/documents/nodes/node.dart'; import 'package:flutter_quill/utils/diff_delta.dart'; import 'package:flutter_quill/widgets/text_selection.dart'; @@ -778,9 +781,7 @@ class RawEditorState extends EditorState // TODO } - _showCaretOnScreen() { - - } + _showCaretOnScreen() {} @override RenderEditor getRenderEditor() { @@ -827,8 +828,7 @@ class RawEditorState extends EditorState @override setTextEditingValue(TextEditingValue value) { - widget.controller - .updateSelection(value.selection, ChangeSource.LOCAL); + widget.controller.updateSelection(value.selection, ChangeSource.LOCAL); } @override @@ -949,10 +949,12 @@ class RenderEditableContainerBox extends RenderBox EditableContainerParentData>, RenderBoxContainerDefaultsMixin { - Container _container; + container.Container _container; TextDirection _textDirection; + EdgeInsetsGeometry _padding; + EdgeInsets _resolvedPadding; - setContainer(Container c) { + setContainer(container.Container c) { assert(c != null); if (_container == c) { return; @@ -968,9 +970,70 @@ class RenderEditableContainerBox extends RenderBox _textDirection = t; } - RenderEditableBox childAtPosition(TextPosition originPosition) { - // TODO - return null; + EdgeInsetsGeometry getPadding() => _padding; + + setPadding(EdgeInsetsGeometry value) { + assert(value != null); + assert(value.isNonNegative); + if (_padding == value) { + return; + } + _padding = value; + _markNeedsPaddingResolution(); + } + + _resolvePadding() { + if (_resolvedPadding != null) { + return; + } + _resolvedPadding = _padding.resolve(_textDirection); + _resolvedPadding = _resolvedPadding.copyWith(left: _resolvedPadding.left); + + assert(_resolvedPadding.isNonNegative); + } + + RenderEditableBox childAtPosition(TextPosition position) { + assert(firstChild != null); + + Node targetNode = _container.queryChild(position.offset, false).node; + + var targetChild = firstChild; + while (targetChild != null) { + if (targetChild.getContainer() == targetNode) { + break; + } + targetChild = childAfter(targetChild); + } + assert(targetChild != null); + return targetChild; + } + + _markNeedsPaddingResolution() { + _resolvedPadding = null; + markNeedsLayout(); + } + + RenderEditableBox childAtOffset(Offset offset) { + assert(firstChild != null); + _resolvePadding(); + + if (offset.dy <= _resolvedPadding.top) { + return firstChild; + } + if (offset.dy >= size.height - _resolvedPadding.bottom) { + return lastChild; + } + + var child = firstChild; + double dx = -offset.dx, dy = _resolvedPadding.top; + while (child != null) { + if (child.size.contains(offset.translate(dx, -dy))) { + return child; + } + dy += child.size.height; + child = childAfter(child); + } + throw ('No child'); } }