From aca52c08dd60d4cb5270f62f24258cc286d4d5b8 Mon Sep 17 00:00:00 2001 From: ZeroLing Date: Mon, 11 Apr 2022 18:14:45 +0800 Subject: [PATCH 1/2] refactor: downgrade to 2.5.x --- .../src/dom/elements/text_form_control.dart | 183 +++----- kraken/lib/src/gesture/monodrag.dart | 8 +- kraken/lib/src/gesture/swipe.dart | 2 +- .../src/rendering/intersection_observer.dart | 4 +- kraken/lib/src/widget/text_control.dart | 430 +++++++++--------- kraken/pubspec.yaml | 4 +- 6 files changed, 279 insertions(+), 352 deletions(-) diff --git a/kraken/lib/src/dom/elements/text_form_control.dart b/kraken/lib/src/dom/elements/text_form_control.dart index 94626d940f..209613369c 100644 --- a/kraken/lib/src/dom/elements/text_form_control.dart +++ b/kraken/lib/src/dom/elements/text_form_control.dart @@ -8,6 +8,7 @@ import 'dart:ui'; import 'package:flutter/animation.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/gestures.dart'; +import 'package:flutter/rendering.dart' hide RenderEditable; import 'package:flutter/rendering.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; @@ -129,56 +130,6 @@ class EditableTextDelegate implements TextSelectionDelegate { void userUpdateTextEditingValue(TextEditingValue value, SelectionChangedCause cause) { _textFormControlElement._formatAndSetValue(value, userInteraction: true, cause: cause); } - - @override - void copySelection(SelectionChangedCause cause) { - if (cause == SelectionChangedCause.toolbar) { - bringIntoView(textEditingValue.selection.extent); - hideToolbar(false); - - switch (defaultTargetPlatform) { - case TargetPlatform.iOS: - break; - case TargetPlatform.macOS: - case TargetPlatform.android: - case TargetPlatform.fuchsia: - case TargetPlatform.linux: - case TargetPlatform.windows: - // Collapse the selection and hide the toolbar and handles. - userUpdateTextEditingValue( - TextEditingValue( - text: textEditingValue.text, - selection: TextSelection.collapsed(offset: textEditingValue.selection.end), - ), - SelectionChangedCause.toolbar, - ); - break; - } - } - } - - @override - void cutSelection(SelectionChangedCause cause) { - if (cause == SelectionChangedCause.toolbar) { - bringIntoView(textEditingValue.selection.extent); - hideToolbar(); - } - } - - @override - Future pasteText(SelectionChangedCause cause) async { - if (cause == SelectionChangedCause.toolbar) { - bringIntoView(textEditingValue.selection.extent); - hideToolbar(); - } - } - - @override - void selectAll(SelectionChangedCause cause) async { - if (cause == SelectionChangedCause.toolbar) { - bringIntoView(textEditingValue.selection.extent); - } - } } class TextFormControlElement extends Element implements TextInputClient, TickerProvider { @@ -191,15 +142,11 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP _textSelectionDelegate = EditableTextDelegate(this); _textInputType = isMultiline ? TextInputType.multiline : TextInputType.text; _scrollable = KrakenScrollable( - axisDirection: isMultiline ? AxisDirection.down : AxisDirection.right + axisDirection: isMultiline ? AxisDirection.down : AxisDirection.right ); scrollOffset = _scrollable.position; } - // The [TextEditableActionTarget] used to apply actions. - // See also widgets/text_control.dart - Object? textEditingActionTarget; - bool isMultiline; int? get _maxLines { if (isMultiline) { @@ -250,9 +197,9 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP TextSpan get placeholderTextSpan { // TODO: support ::placeholder pseudo element return _buildTextSpan( - text: placeholderText, - // The color of placeholder. - color: Color.fromARGB(255, 169, 169, 169) + text: placeholderText, + // The color of placeholder. + color: Color.fromARGB(255, 169, 169, 169) ); } @@ -270,6 +217,7 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP static String obscuringCharacter = '•'; + int get width => int.tryParse(getAttribute('width') ?? '') ?? 0; set width(int value) { if (value < 0) value = 0; @@ -529,18 +477,18 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP void _onStyleChanged(String property, String? original, String present) { // Need to rebuild text span when text related style changed. if (property == COLOR - || property == FONT_WEIGHT - || property == FONT_STYLE - || property == FONT_FAMILY - || property == FONT_SIZE - || property == LINE_HEIGHT - || property == LETTER_SPACING - || property == WORD_SPACING - || property == WHITE_SPACE - || property == TEXT_DECORATION_LINE - || property == TEXT_DECORATION_COLOR - || property == TEXT_DECORATION_STYLE - || property == TEXT_SHADOW + || property == FONT_WEIGHT + || property == FONT_STYLE + || property == FONT_FAMILY + || property == FONT_SIZE + || property == LINE_HEIGHT + || property == LETTER_SPACING + || property == WORD_SPACING + || property == WHITE_SPACE + || property == TEXT_DECORATION_LINE + || property == TEXT_DECORATION_COLOR + || property == TEXT_DECORATION_STYLE + || property == TEXT_SHADOW ) { _rebuildTextSpan(); } @@ -565,12 +513,12 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP TextSpan _buildTextSpan({ String? text, Color? color }) { return CSSTextMixin.createTextSpan(text ?? '', renderStyle, - color: color, - // For multiline editing, lineHeight works for inner text in the element, - // so it needs to set line-height of textSpan for RenderEditable to use. - height: isMultiline && renderStyle.lineHeight != CSSLengthValue.normal - ? renderStyle.lineHeight.computedValue / renderStyle.fontSize.computedValue - : null + color: color, + // For multiline editing, lineHeight works for inner text in the element, + // so it needs to set line-height of textSpan for RenderEditable to use. + height: isMultiline && renderStyle.lineHeight != CSSLengthValue.normal + ? renderStyle.lineHeight.computedValue / renderStyle.fontSize.computedValue + : null ); } @@ -590,14 +538,14 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP // cause RenderEditable does not expose textPainter. Size getTextSize() { TextPainter textPainter = TextPainter( - text: renderEditable!.text, - maxLines: _maxLines, - textDirection: TextDirection.ltr + text: renderEditable!.text, + maxLines: _maxLines, + textDirection: TextDirection.ltr ); double maxWidth = isMultiline - ? renderEditable!.size.width - : double.infinity; + ? renderEditable!.size.width + : double.infinity; textPainter.layout(maxWidth: maxWidth); @@ -613,11 +561,11 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP locale: CSSText.getLocale(), ); TextPainter painter = TextPainter( - text: TextSpan( - text: '0', - style: textStyle, - ), - textDirection: TextDirection.ltr + text: TextSpan( + text: '0', + style: textStyle, + ), + textDirection: TextDirection.ltr ); painter.layout(); @@ -669,7 +617,7 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP // Cache text size on touch start to be used in touch move and touch end. _textSize = getTextSize(); } else if (event.type == EVENT_TOUCH_MOVE || - event.type == EVENT_TOUCH_END + event.type == EVENT_TOUCH_END ) { TouchList touches = (event as TouchEvent).touches; if (touches.length > 1) return; @@ -680,7 +628,7 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP // Disable text selection and enable scrolling when text size is larger than // text form control element size. if ((!isMultiline && (_textSize!.width > renderEditable!.size.width)) - || (isMultiline && (_textSize!.height > renderEditable!.size.height))) { + || (isMultiline && (_textSize!.height > renderEditable!.size.height))) { return; } @@ -737,8 +685,8 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP obscureText: obscureText, autocorrect: autoCorrect, inputAction: _textInputType == TextInputType.multiline - ? TextInputAction.newline - : _textInputAction, + ? TextInputAction.newline + : _textInputAction, textCapitalization: TextCapitalization.none, keyboardAppearance: Brightness.light, ); @@ -842,9 +790,9 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP void performAction(TextInputAction action) { switch (action) { case TextInputAction.newline: - // If this is a multiline EditableText, do nothing for a "newline" - // action; The newline is already inserted. Otherwise, finalize - // editing. + // If this is a multiline EditableText, do nothing for a "newline" + // action; The newline is already inserted. Otherwise, finalize + // editing. if (!isMultiline) blur(); break; @@ -852,37 +800,37 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP blur(); break; case TextInputAction.none: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.unspecified: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.go: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.search: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.send: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.next: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.previous: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.continueAction: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.join: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.route: - // TODO: Handle this case. + // TODO: Handle this case. break; case TextInputAction.emergencyCall: - // TODO: Handle this case. + // TODO: Handle this case. break; } } @@ -958,9 +906,9 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP // changed. Also, the user long pressing should always send a selection change // as well. if (selectionChanged || - (userInteraction && - (cause == SelectionChangedCause.longPress || - cause == SelectionChangedCause.keyboard))) { + (userInteraction && + (cause == SelectionChangedCause.longPress || + cause == SelectionChangedCause.keyboard))) { _handleSelectionChanged(value.selection, cause); } @@ -1108,7 +1056,7 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP @override void updateEditingValue(TextEditingValue value) { - _lastKnownRemoteTextEditingValue = value; + _lastKnownRemoteTextEditingValue = value; if (value == _value) { // This is possible, for example, when the numeric keyboard is input, @@ -1173,7 +1121,7 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP textInputType = TextInputType.text; _enablePassword(); break; - // @TODO: more types. + // @TODO: more types. } } @@ -1292,10 +1240,10 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP if (!isMultiline) { additionalOffset = rect.width >= editableSize.width // Center `rect` if it's oversized. - ? editableSize.width / 2 - rect.center.dx + ? editableSize.width / 2 - rect.center.dx // Valid additional offsets range from (rect.right - size.width) // to (rect.left). Pick the closest one if out of range. - : 0.0.clamp(rect.right - editableSize.width, rect.left); + : 0.0.clamp(rect.right - editableSize.width, rect.left); unitOffset = const Offset(1, 0); } else { // The caret is vertically centered within the line. Expand the caret's @@ -1308,15 +1256,15 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP ); additionalOffset = expandedRect.height >= editableSize.height - ? editableSize.height / 2 - expandedRect.center.dy - : 0.0.clamp(expandedRect.bottom - editableSize.height, expandedRect.top); + ? editableSize.height / 2 - expandedRect.center.dy + : 0.0.clamp(expandedRect.bottom - editableSize.height, expandedRect.top); unitOffset = const Offset(0, 1); } // No over scrolling when encountering tall fonts/scripts that extend past // the ascent. final double targetOffset = (additionalOffset + _scrollable.position!.pixels) - .clamp( + .clamp( _scrollable.position!.minScrollExtent, _scrollable.position!.maxScrollExtent, ); @@ -1415,11 +1363,4 @@ class TextFormControlElement extends Element implements TextInputClient, TickerP // TODO: implement showAutocorrectionPromptRect print('ShowAutocorrectionPromptRect start: $start, end: $end'); } - - @override - void dispose() { - textEditingActionTarget = null; - super.dispose(); - } } - diff --git a/kraken/lib/src/gesture/monodrag.dart b/kraken/lib/src/gesture/monodrag.dart index 880b96e944..3181b6d8e8 100644 --- a/kraken/lib/src/gesture/monodrag.dart +++ b/kraken/lib/src/gesture/monodrag.dart @@ -487,13 +487,13 @@ class ScrollVerticalDragGestureRecognizer extends CompetitiveDragGestureRecogniz @override bool isFlingGesture(VelocityEstimate estimate, PointerDeviceKind kind) { final double minVelocity = minFlingVelocity ?? kMinFlingVelocity; - final double minDistance = minFlingDistance ?? computeHitSlop(kind, gestureSettings); + final double minDistance = minFlingDistance ?? computeHitSlop(kind); return estimate.pixelsPerSecond.dy.abs() > minVelocity && estimate.offset.dy.abs() > minDistance; } @override bool _hasSufficientGlobalDistanceToAccept(PointerDeviceKind pointerDeviceKind) { - return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind, gestureSettings); + return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind); } @override @@ -530,13 +530,13 @@ class ScrollHorizontalDragGestureRecognizer extends CompetitiveDragGestureRecogn @override bool isFlingGesture(VelocityEstimate estimate, PointerDeviceKind kind) { final double minVelocity = minFlingVelocity ?? kMinFlingVelocity; - final double minDistance = minFlingDistance ?? computeHitSlop(kind, gestureSettings); + final double minDistance = minFlingDistance ?? computeHitSlop(kind); return estimate.pixelsPerSecond.dx.abs() > minVelocity && estimate.offset.dx.abs() > minDistance; } @override bool _hasSufficientGlobalDistanceToAccept(PointerDeviceKind pointerDeviceKind) { - return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind, gestureSettings); + return _globalDistanceMoved.abs() > computeHitSlop(pointerDeviceKind); } @override diff --git a/kraken/lib/src/gesture/swipe.dart b/kraken/lib/src/gesture/swipe.dart index ce5f19c83d..449aa929b9 100644 --- a/kraken/lib/src/gesture/swipe.dart +++ b/kraken/lib/src/gesture/swipe.dart @@ -166,7 +166,7 @@ class SwipeGestureRecognizer extends OneSequenceGestureRecognizer { /// inertia, for example. bool isFlingGesture(VelocityEstimate estimate, PointerDeviceKind kind) { final double minVelocity = minFlingVelocity ?? kMinFlingVelocity; - final double minDistance = minFlingDistance ?? computeHitSlop(kind, gestureSettings); + final double minDistance = minFlingDistance ?? computeHitSlop(kind); return ((_direction == DIRECTION_LEFT || _direction == DIRECTION_RIGHT) && (estimate.pixelsPerSecond.dx.abs() > minVelocity && estimate.offset.dx.abs() > minDistance) || (_direction == DIRECTION_UP || _direction == DIRECTION_DOWN) && (estimate.pixelsPerSecond.dy.abs() > minVelocity && estimate.offset.dy.abs() > minDistance)); diff --git a/kraken/lib/src/rendering/intersection_observer.dart b/kraken/lib/src/rendering/intersection_observer.dart index 3add1f60db..ab6f3d7d2d 100644 --- a/kraken/lib/src/rendering/intersection_observer.dart +++ b/kraken/lib/src/rendering/intersection_observer.dart @@ -187,9 +187,9 @@ class IntersectionObserverLayer extends ContainerLayer { /// See [Layer.addToScene]. @override - void addToScene(ui.SceneBuilder builder) { + void addToScene(ui.SceneBuilder builder, [ Offset layerOffset = Offset.zero ]) { _scheduleIntersectionObservationUpdate(); - super.addToScene(builder); + super.addToScene(builder, layerOffset); } /// See [AbstractNode.attach]. diff --git a/kraken/lib/src/widget/text_control.dart b/kraken/lib/src/widget/text_control.dart index 5581c69434..829e1c1299 100644 --- a/kraken/lib/src/widget/text_control.dart +++ b/kraken/lib/src/widget/text_control.dart @@ -1,10 +1,13 @@ /* * Copyright (C) 2019-present The Kraken authors. All rights reserved. */ +import 'dart:ui'; + +import 'package:flutter/foundation.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; -import 'package:flutter/src/services/text_layout_metrics.dart'; +import 'package:flutter/services.dart'; import 'package:kraken/kraken.dart'; import 'package:kraken/rendering.dart'; import 'package:kraken/dom.dart' as dom; @@ -189,13 +192,13 @@ class _KrakenTextControlState extends State { // Handle focus action usually by pressing the [Shift]+[Tab] hotkey in the reverse direction. void _handlePreviousFocus(PreviousFocusIntent intent) { dom.Element rootElement = _findRootElement(); - List focusableElements = _findFocusableElements(rootElement); + List focusableElements = _findFocusableElements(rootElement); if (focusableElements.isNotEmpty) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(focusableElements); + dom.Element? focusedElement = _findFocusedElement(focusableElements); // None editable is focused, focus the last editable. if (focusedElement == null) { _focusNode.requestFocus(); - (focusableElements[focusableElements.length - 1]).focus(); + (focusableElements[focusableElements.length - 1] as dom.TextFormControlElement).focus(); // Some editable is focused, focus the previous editable, if it is the first editable, // then focus the previous widget. @@ -203,11 +206,11 @@ class _KrakenTextControlState extends State { int idx = focusableElements.indexOf(focusedElement); if (idx == 0) { _focusNode.previousFocus(); - (focusableElements[0]).blur(); + (focusableElements[0] as dom.TextFormControlElement).blur(); } else { _focusNode.requestFocus(); - (focusableElements[idx]).blur(); - (focusableElements[idx - 1]).focus(); + (focusableElements[idx] as dom.TextFormControlElement).blur(); + (focusableElements[idx - 1] as dom.TextFormControlElement).focus(); } } // None editable exists, focus the previous widget. @@ -217,331 +220,363 @@ class _KrakenTextControlState extends State { } void _handleDeleteText(DeleteTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .delete(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.delete(SelectionChangedCause.keyboard); + } } } void _handleDeleteByWordText(DeleteByWordTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .deleteByWord(SelectionChangedCause.keyboard, false); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.deleteByWord(SelectionChangedCause.keyboard, false); + } } } void _handleDeleteByLineText(DeleteByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .deleteByLine(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.deleteByLine(SelectionChangedCause.keyboard); + } } } void _handleDeleteForwardText(DeleteForwardTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .deleteForward(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.deleteForward(SelectionChangedCause.keyboard); + } } } void _handleDeleteForwardByWordText(DeleteForwardByWordTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .deleteForwardByWord(SelectionChangedCause.keyboard, false); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.deleteForwardByWord(SelectionChangedCause.keyboard, false); + } } } void _handleDeleteForwardByLineText(DeleteForwardByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .deleteForwardByLine(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.deleteForwardByLine(SelectionChangedCause.keyboard); + } } } void _handleSelectAllText(SelectAllTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .selectAll(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.selectAll(SelectionChangedCause.keyboard); + } } } void _handleCopySelectionText(CopySelectionTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .copySelection(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.copySelection(); + } } } void _handleCutSelectionText(CutSelectionTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .cutSelection(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.cutSelection(SelectionChangedCause.keyboard); + } } } void _handlePasteText(PasteTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .pasteText(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.pasteText(SelectionChangedCause.keyboard); + } } } void _handleMoveSelectionRightByLineText(MoveSelectionRightByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionRightByLine(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionRightByLine(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionLeftByLineText(MoveSelectionLeftByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionLeftByLine(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionLeftByLine(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionRightByWordText(MoveSelectionRightByWordTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionRightByWord(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionRightByWord(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionLeftByWordText(MoveSelectionLeftByWordTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionLeftByWord(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionLeftByWord(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionUpText(MoveSelectionUpTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionUp(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionUp(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionDownText(MoveSelectionDownTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionDown(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionDown(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionLeftText(MoveSelectionLeftTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionLeft(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionLeft(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionRightText(MoveSelectionRightTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionRight(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionRight(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionToEndText(MoveSelectionToEndTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionToEnd(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionToEnd(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleMoveSelectionToStartText(MoveSelectionToStartTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .moveSelectionToStart(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.moveSelectionToStart(SelectionChangedCause.keyboard); + // Make caret visible while moving cursor. + focusedElement.scrollToCaret(); + } } } void _handleExtendSelectionLeftText(ExtendSelectionLeftTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionLeft(SelectionChangedCause.keyboard); - // Make caret visible while moving cursor. - focusedElement.scrollToCaret(); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionLeft(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionRightText(ExtendSelectionRightTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionRight(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionRight(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionUpText(ExtendSelectionUpTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionUp(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionUp(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionDownText(ExtendSelectionDownTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionDown(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionDown(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionToEndText(ExpandSelectionToEndTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .expandSelectionToEnd(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.expandSelectionToEnd(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionToStartText(ExpandSelectionToStartTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .expandSelectionToStart(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.expandSelectionToStart(SelectionChangedCause.keyboard); + } } } void _handleExpandSelectionLeftByLineText(ExpandSelectionLeftByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .expandSelectionLeftByLine(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.expandSelectionLeftByLine(SelectionChangedCause.keyboard); + } } } void _handleExpandSelectionRightByLineText(ExpandSelectionRightByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .expandSelectionRightByLine(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.expandSelectionRightByLine(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionLeftByWordText(ExtendSelectionLeftByWordTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionLeftByWord(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionLeftByWord(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionLeftByLineText(ExtendSelectionLeftByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionLeftByLine(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionLeftByLine(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionLeftByWordAndStopAtReversalText(ExtendSelectionLeftByWordAndStopAtReversalTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionLeftByWord(SelectionChangedCause.keyboard, false, true); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionLeftByWord(SelectionChangedCause.keyboard, false, true); + } } } void _handleExtendSelectionRightByWordText(ExtendSelectionRightByWordTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionRightByWord(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionRightByWord(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionRightByLineText(ExtendSelectionRightByLineTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionRightByLine(SelectionChangedCause.keyboard); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionRightByLine(SelectionChangedCause.keyboard); + } } } void _handleExtendSelectionRightByWordAndStopAtReversalText(ExtendSelectionRightByWordAndStopAtReversalTextIntent intent) { - dom.TextFormControlElement? focusedElement = _findFocusedElement(); + dom.Element? focusedElement = _findFocusedElement(); if (focusedElement != null) { - _ElementTextEditingActionTarget - .fromElement(focusedElement) - .extendSelectionRightByWord(SelectionChangedCause.keyboard, false, true); + RenderEditable? focusedRenderEditable = (focusedElement as dom.TextFormControlElement).renderEditable; + if (focusedRenderEditable != null) { + focusedRenderEditable.extendSelectionRightByWord(SelectionChangedCause.keyboard, false, true); + } } } @@ -588,8 +623,8 @@ class _KrakenTextControlState extends State { } // Find all the focusable elements in the element tree. - List _findFocusableElements(dom.Element element) { - List result = []; + List _findFocusableElements(dom.Element element) { + List result = []; traverseElement(element, (dom.Element child) { // Currently only input element is focusable. if (child is dom.TextFormControlElement) { @@ -600,19 +635,19 @@ class _KrakenTextControlState extends State { } // Find the focused element in the element tree. - dom.TextFormControlElement? _findFocusedElement([List? focusableElements]) { - dom.TextFormControlElement? result; + dom.Element? _findFocusedElement([List? focusableElements]) { + dom.Element? result; if (focusableElements == null) { dom.Element rootElement = _findRootElement(); focusableElements = _findFocusableElements(rootElement); } if (focusableElements.isNotEmpty) { - // Currently only TextFormControlElement is focusable. - for (dom.Element element in focusableElements) { - RenderEditable? renderEditable = (element as dom.TextFormControlElement).renderEditable; + // Currently only input element is focusable. + for (dom.Element inputElement in focusableElements) { + RenderEditable? renderEditable = (inputElement as dom.TextFormControlElement).renderEditable; if (renderEditable != null && renderEditable.hasFocus) { - result = element; + result = inputElement; break; } } @@ -750,52 +785,3 @@ class _KrakenTextControlState extends State { return _selectionControls; } } - -class _ElementTextEditingActionTarget extends TextEditingActionTarget { - factory _ElementTextEditingActionTarget.fromElement(dom.TextFormControlElement element) { - return (element.textEditingActionTarget as _ElementTextEditingActionTarget?) - ?? _ElementTextEditingActionTarget._(element); - } - - _ElementTextEditingActionTarget._(this.element) { - element.textEditingActionTarget = this; - } - - dom.TextFormControlElement element; - - RenderEditable? get _renderEditable => element.renderEditable; - - @override - void debugAssertLayoutUpToDate() { - RenderEditable? editable = _renderEditable; - assert(editable != null); - editable!.debugAssertLayoutUpToDate(); - } - - @override - bool get obscureText => element.obscureText; - - @override - bool get readOnly => element.readOnly; - - @override - bool get selectionEnabled => _renderEditable?.selectionEnabled ?? false; - - @override - void setTextEditingValue(TextEditingValue newValue, SelectionChangedCause cause) { - if (newValue == textEditingValue) { - return; - } - - RenderEditable? renderEditable = _renderEditable; - if (renderEditable != null) { - renderEditable.textSelectionDelegate.userUpdateTextEditingValue(newValue, cause); - } - } - - @override - TextEditingValue get textEditingValue => element.currentTextEditingValue; - - @override - TextLayoutMetrics get textLayoutMetrics => _renderEditable!; -} diff --git a/kraken/pubspec.yaml b/kraken/pubspec.yaml index 2ec620e25e..2d22f438d2 100644 --- a/kraken/pubspec.yaml +++ b/kraken/pubspec.yaml @@ -1,10 +1,10 @@ name: kraken description: A high-performance, web standards-compliant rendering engine. -version: 0.11.0 +version: 0.11.0+flutter-2.5 homepage: https://openkraken.com environment: - sdk: ">=2.15.0 <3.0.0" + sdk: ">=2.14.0 <3.0.0" flutter: ">=2.5.0" dependencies: From 524d2b8a68d817f472f8b1d98f262920fcbbdc44 Mon Sep 17 00:00:00 2001 From: ZeroLing Date: Fri, 6 May 2022 17:19:54 +0800 Subject: [PATCH 2/2] fix: compatible with 2.5 --- kraken/lib/src/dom/elements/text_form_control.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/kraken/lib/src/dom/elements/text_form_control.dart b/kraken/lib/src/dom/elements/text_form_control.dart index 788cce2a7d..6bef3646dd 100644 --- a/kraken/lib/src/dom/elements/text_form_control.dart +++ b/kraken/lib/src/dom/elements/text_form_control.dart @@ -130,6 +130,9 @@ class EditableTextDelegate with TextEditingActionTarget implements TextSelection void userUpdateTextEditingValue(TextEditingValue value, SelectionChangedCause cause) { _textFormControlElement._formatAndSetValue(value, userInteraction: true, cause: cause); } + + @override + RenderEditable get renderEditable => _textFormControlElement.renderEditable!; } class TextFormControlElement extends Element implements TextInputClient, TickerProvider {