Skip to content

Commit c71c695

Browse files
committed
feat: Support Text Selection
1 parent 1da2373 commit c71c695

File tree

6 files changed

+827
-32
lines changed

6 files changed

+827
-32
lines changed

webf/lib/src/dom/text_node.dart

+20-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ const String TAB_CHAR = '\t';
1515
class TextNode extends CharacterData {
1616
static const String NORMAL_SPACE = '\u0020';
1717

18-
TextNode(this._data, [BindingContext? context]) : super(NodeType.TEXT_NODE, context);
18+
TextNode(this._data, [BindingContext? context])
19+
: super(NodeType.TEXT_NODE, context);
1920

2021
// Must be existed after text node is attached, and all text update will after text attached.
2122
RenderTextBox? _renderTextBox;
@@ -58,12 +59,16 @@ class TextNode extends CharacterData {
5859
_renderTextBox!.renderStyle = _parentElement.renderStyle;
5960
_renderTextBox!.data = data;
6061

61-
WebFRenderParagraph renderParagraph = _renderTextBox!.child as WebFRenderParagraph;
62+
WebFRenderParagraph renderParagraph =
63+
_renderTextBox!.child as WebFRenderParagraph;
6264
renderParagraph.markNeedsLayout();
6365

64-
RenderLayoutBox parentRenderLayoutBox = _parentElement.renderBoxModel as RenderLayoutBox;
65-
parentRenderLayoutBox = parentRenderLayoutBox.renderScrollingContent ?? parentRenderLayoutBox;
66-
_setTextSizeType(parentRenderLayoutBox.widthSizeType, parentRenderLayoutBox.heightSizeType);
66+
RenderLayoutBox parentRenderLayoutBox =
67+
_parentElement.renderBoxModel as RenderLayoutBox;
68+
parentRenderLayoutBox =
69+
parentRenderLayoutBox.renderScrollingContent ?? parentRenderLayoutBox;
70+
_setTextSizeType(parentRenderLayoutBox.widthSizeType,
71+
parentRenderLayoutBox.heightSizeType);
6772
}
6873
}
6974

@@ -84,8 +89,10 @@ class TextNode extends CharacterData {
8489
// If element attach WidgetElement, render object should be attach to render tree when mount.
8590
if (parent.renderObjectManagerType == RenderObjectManagerType.WEBF_NODE &&
8691
parent.renderBoxModel is RenderLayoutBox) {
87-
RenderLayoutBox parentRenderLayoutBox = parent.renderBoxModel as RenderLayoutBox;
88-
parentRenderLayoutBox = parentRenderLayoutBox.renderScrollingContent ?? parentRenderLayoutBox;
92+
RenderLayoutBox parentRenderLayoutBox =
93+
parent.renderBoxModel as RenderLayoutBox;
94+
parentRenderLayoutBox =
95+
parentRenderLayoutBox.renderScrollingContent ?? parentRenderLayoutBox;
8996
parentRenderLayoutBox.insert(_renderTextBox!, after: after);
9097
}
9198

@@ -96,7 +103,8 @@ class TextNode extends CharacterData {
96103
void _detachRenderTextBox() {
97104
if (isRendererAttached) {
98105
RenderTextBox renderTextBox = _renderTextBox!;
99-
ContainerRenderObjectMixin parent = renderTextBox.parent as ContainerRenderObjectMixin;
106+
ContainerRenderObjectMixin parent =
107+
renderTextBox.parent as ContainerRenderObjectMixin;
100108
parent.remove(renderTextBox);
101109
}
102110
}
@@ -115,7 +123,10 @@ class TextNode extends CharacterData {
115123

116124
@override
117125
RenderBox createRenderer() {
118-
return _renderTextBox = RenderTextBox(data, renderStyle: parentElement!.renderStyle);
126+
return _renderTextBox = RenderTextBox(data,
127+
renderStyle: parentElement!.renderStyle,
128+
registrar: ownerDocument.controller.registrar,
129+
selectionColor: ownerDocument.controller.selectionColor);
119130
}
120131

121132
@override

webf/lib/src/gesture/scroll_position.dart

+1-1
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ abstract class ScrollPosition extends ViewportOffset with ScrollMetrics {
487487
ScrollPositionAlignmentPolicy alignmentPolicy = ScrollPositionAlignmentPolicy.explicit,
488488
}) {
489489
assert(object.attached);
490-
final RenderAbstractViewport viewport = RenderAbstractViewport.of(object)!;
490+
final RenderAbstractViewport viewport = RenderAbstractViewport.of(object);
491491

492492
double? target;
493493
switch (alignmentPolicy) {

webf/lib/src/launcher/controller.dart

+6
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,10 @@ class WebFController {
767767
_name = value;
768768
}
769769

770+
final SelectionRegistrar? registrar;
771+
772+
late Color? selectionColor;
773+
770774
final GestureListener? _gestureListener;
771775

772776
// The kraken view entrypoint bundle.
@@ -793,6 +797,8 @@ class WebFController {
793797
this.devToolsService,
794798
this.uriParser,
795799
this.initialCookies,
800+
this.registrar,
801+
this.selectionColor
796802
}) : _name = name,
797803
_entrypoint = entrypoint,
798804
_gestureListener = gestureListener {

0 commit comments

Comments
 (0)