-
Notifications
You must be signed in to change notification settings - Fork 29.1k
Support keyboard selection in SelectabledRegion #112584
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
1a5fc69
to
320c071
Compare
5fc78e3
to
041e208
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think I need to understand how seletable region works before I can do a full review.
SelectionResult _handleDirectionallyExtendSelection(double horizontalBaseline, bool isExtent, DirectionalMovement movement) { | ||
final Matrix4 transform = paragraph.getTransformTo(null); | ||
transform.invert(); | ||
final double baselineInParagraphCoordinates = MatrixUtils.transformPoint(transform, Offset(horizontalBaseline, 0)).dx; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Check the coordinates are finite?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it can be infinite, i add a check to make sure it is not nan
@@ -830,6 +840,64 @@ class _SelectableRegionState extends State<SelectableRegion> with TextSelectionD | |||
await Clipboard.setData(ClipboardData(text: data.plainText)); | |||
} | |||
|
|||
bool? _adjustingSelectionExtent; | |||
bool _determineIsAdjustingSelectionExtend(bool forward) { | |||
if (_adjustingSelectionExtent != null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
why do we need to cache the result? the computation doesn't seem to be very expensive? Also the method takes a parameter so shouldn't the method first check if the cache is valid?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The cache is here so that we will be moving the same selection handle once decided until user starts a new selection(a clear selection will be called).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah ok I see now. But since start
can be larger than end
, shouldn't end
always represent the active edge?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not sure if I understand. why end always represent the active edge given that start can be larger or smaller?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
According to https://api.flutter.dev/flutter/services/TextSelection/extent.html
When the user uses the arrow keys to adjust the selection, this is the value that changes.
Does it make sense to do the same here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is the document up to date? I thought even for TextField this may not be the case, it will pick the one that will expand the selection?
f28374e
to
35542b4
Compare
Thanks @LongCatIsLooong I addressed all the comments, PTAL |
a friendly bump |
nextLine, | ||
|
||
/// Extends the selection to by moving the selection edges forward to a | ||
/// certain horizontal offset in the same line. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
maybe: Extends a selection edge toward the writing direction of the text under that selection edge? It may not be the same line.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I can't think of a case it would be in a different line. I can add more description.
} else if (start.localPosition.dy < end.localPosition.dy) { | ||
isReversed = false; | ||
} else { | ||
isReversed = start.localPosition.dx > end.localPosition.dx; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This doesn't work for RTL text? forward
means move towards the writing direction right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just tested with chrome, regardless of the text direction, forward=true will always move the selection handle that are lower in screen order. forward =false move the one one higher in screen order. so the logic here should sill hold.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah ok, I think macOS does the same for bidi when moving the caret (but that may not be true for deletion). Maybe rename this to left/right instead of forward/backward? I think in editable text land I used forward/backward for logical direction. When we unify the API it will be nice to make that consistent.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I renamed extent to end. I am using start and end to describe the handles. Do you think this is good enough? If you meant the input parameter forward
I think that is accurate since it represent arrow right/arrow down.
@@ -830,6 +840,64 @@ class _SelectableRegionState extends State<SelectableRegion> with TextSelectionD | |||
await Clipboard.setData(ClipboardData(text: data.plainText)); | |||
} | |||
|
|||
bool? _adjustingSelectionExtent; | |||
bool _determineIsAdjustingSelectionExtend(bool forward) { | |||
if (_adjustingSelectionExtent != null) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah ok I see now. But since start
can be larger than end
, shouldn't end
always represent the active edge?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Reading this really makes me wish that we could unify the selection code here and in RenderEditable. I think this logic is partially duplicated in EditableText's Action handlers. Maybe the core problem is the RenderEditable/RenderParagraph divide. It is nice that this can receive the same Intents from DefaultTextEditingShortcuts at least, though.
It's also hard to be confident that our text selection keyboard shortcuts work identically in EditableText and SelectableRegion. I wonder if it would be possible to write a test that could be reused by both? Like sending keyboard keys should be the same for both, and both could produce a TextSelection where the same expect
s could be used. Then you could write a test that goes through all of typical keyboard shortcuts for modifying selection (not editing) and use it for both.
I'm just daydreaming though, it might not be feasible to write something like that in this PR...
/// | ||
/// The [GranularlyExtendSelectionEvent] uses this enum to describe how | ||
/// [Selectable] should extend their selection. | ||
enum TextGranularity { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
CC @Renzo-Olivares since this reminds me of your work on longpress dragging by word and triple click dragging by line.
TextSelection getLineAtOffset(TextPosition position) { | ||
final TextRange line = paragraph._getLineAtOffset(position); | ||
final int start = line.start.clamp(range.start, range.end); // ignore_clamp_double_lint | ||
final int end = line.end.clamp(range.start, range.end); // ignore_clamp_double_lint |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why can't you use clampDouble for these?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is int type, so we should not use clampDouble.
the purpose of this ignore_clamp_double_lint is to make sure we DON'T use the .clamp method on double
. The problem is that our current lint can't distinguish between .clamp called on int
or double
or any num
subclass. So the current suggestion is to add this ignore if you are sure the clamp is called on non-double data type.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ah I missed that, thanks for the explanation!
@@ -830,6 +840,61 @@ class _SelectableRegionState extends State<SelectableRegion> with TextSelectionD | |||
await Clipboard.setData(ClipboardData(text: data.plainText)); | |||
} | |||
|
|||
bool? _adjustingSelectionExtent; | |||
bool _determineIsAdjustingSelectionExtend(bool forward) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"Extend" => "Extent"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I renamed it to End which is more accurate
), | ||
); | ||
selectable.dispatchSelectionEvent( | ||
SelectionEdgeUpdateEvent.forEnd( | ||
globalPosition: paragraph.getOffsetForCaret(end, Rect.zero), | ||
globalPosition: paragraph.getOffsetForCaret(end, Rect.zero) + const Offset(0, 5), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why did you need to add that small y offset?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
originally it was selecting right at the edge which can select across line if there is multi line text. It was ok because there was no multi line test in this file prior
), | ||
); | ||
selection = paragraph.selections[0]; | ||
expect(selection.start, 4); // how `ar`e you |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think elsewhere in our tests I have seen how [ar]e you
or how |ar|e you
. Maybe we should standardize at some point.
No action needed though, just thinking out loud.
const SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): const ExtendSelectionToLineBreakIntent(forward: false, collapseSelection: false, collapseAtReversal: true), | ||
const SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): const ExtendSelectionToLineBreakIntent(forward: true, collapseSelection: false, collapseAtReversal: true), | ||
const SingleActivator(LogicalKeyboardKey.arrowUp, shift: true, alt: true): const ExtendSelectionVerticallyToAdjacentLineIntent(forward: false, collapseSelection: false), | ||
const SingleActivator(LogicalKeyboardKey.arrowDown, shift: true, alt: true): const ExtendSelectionVerticallyToAdjacentLineIntent(forward: true, collapseSelection: false), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess this was incorrect?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
no they were not
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ok same behavior, different Intent 👍
@@ -11,6 +11,27 @@ import 'package:flutter_test/flutter_test.dart'; | |||
|
|||
import 'clipboard_utils.dart'; | |||
|
|||
Future<void> sendKeyCombination( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Maybe we should get rid of sendKeys
in editable_text_test and just use this. I like the idea of just using a SingleActivator.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I see that you added a copy of this function to another test file. It looks like this is already public though, maybe just add it to a shared _utils.dart file?
That is my plan once the selectable region is at least feature on part with the EditableText. |
e425b28
to
55d4d18
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM 👍
Thanks for the updates.
TextPosition _getTextPositionAbove(TextPosition position) { | ||
// The caret offset gives a location in the upper left hand corner of | ||
// the caret so the middle of the line above is a half line above that | ||
// point and the line below is 1.5 lines below that point. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Super nit here and below: You mention the caret here, but there's nothing in this method directly related to the caret (I see that you're using getOffsetForCaret in _getTextPositionVertical, but it's not obvious looking only at this method why you mention the caret).
Also similarly, it's not clear in this method why you're trying to find a point in the middle of the line (I guess you just need a point that's going to give you what you want from getPositionForOffset).
final TextGranularity granularity; | ||
} | ||
|
||
/// The directional to extend a selection. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"directional" => "direction"
import 'package:flutter/widgets.dart'; | ||
import 'package:flutter_test/flutter_test.dart'; | ||
|
||
Future<void> sendKeyCombination( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good, thank you for taking the time to make this reusable!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM for the most part.
Question: what order are selectables
in? I guess what I don't understand is that why we can hand the event to the next selectable in the list instead of having to look for the next closest selectable in that direction?
if (result == SelectionResult.previous) { | ||
if (targetIndex > 0) { | ||
targetIndex -= 1; | ||
dispatchSelectionEventToChild( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it possible for the result returned to not be .end
? The previous selectable, if exists, is guaranteed to be able to handle the event by itself?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
for instance what if the command was "extend to document boundary"?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The event is DirectionallyExtendSelectionEvent with SelectionExtendDirection.backward
it must not return anything other than end
. I will add some more check and documentation
The selectables are in screen order by default. |
auto label is removed for flutter/flutter, pr: 112584, due to - The status or check suite Mac tool_tests_commands has failed. Please fix the issues identified (or deflake) before re-applying this label. |
8819728
to
2371fd7
Compare
* 77d6ecb 805b145d7 [web] Improve line breaker test exceptions (flutter/engine#37244) (flutter/flutter#114688) * 5233fd9 Roll Plugins from 5c11747 to a279b9d (6 revisions) (flutter/flutter#114689) * e1166e4 287a3ab59 Roll Skia from c901cb6ae66f to 1272b520c082 (1 revision) (flutter/engine#37314) (flutter/flutter#114691) * 48457d7 WidgetController.startGesture trackpad support (flutter/flutter#114631) * c1d2b85 Change some required nullable parameters in tool to non-null (flutter/flutter#114115) * cfb2f15 Roll Flutter Engine from 287a3ab59269 to e947833ceb5b (2 revisions) (flutter/flutter#114696) * 80bf355 Support keyboard selection in SelectabledRegion (flutter/flutter#112584) * be83c98 5117e858e Fix typo in overlay platform view iOS test (flutter/engine#37262) (flutter/flutter#114705) * 6ea01e6 Roll Flutter Engine from 5117e858ed1e to 6950689ed775 (3 revisions) (flutter/flutter#114710) * b187bc4 Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (flutter/flutter#114637) * 01507ba Revert "Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (#114637)" (flutter/flutter#114715) * 91a56cf roll packages (flutter/flutter#114366) * d68af26 Roll Flutter Engine from 6950689ed775 to 0933ca485a07 (3 revisions) (flutter/flutter#114714) * 4fd0a92 Remove auto_cleanup of xcode caches. (flutter/flutter#114719) * 96f9ca8 Roll Flutter Engine from 0933ca485a07 to 28e1ea0cc5b1 (4 revisions) (flutter/flutter#114720) * 1aada6f [New Feature]Support mouse wheel event on the scrollbar widget (flutter/flutter#109659) * 6265610 Roll Flutter Engine from 28e1ea0cc5b1 to ba390f2a7b7d (3 revisions) (flutter/flutter#114728) * 140a57e Roll Flutter Engine from ba390f2a7b7d to 223a485ceb02 (3 revisions) (flutter/flutter#114732) * 06ded49 Roll Flutter Engine from 223a485ceb02 to cf56eb5565e2 (3 revisions) (flutter/flutter#114735) * e0e7027 9c45b0ebe Roll Fuchsia Mac SDK from jAKH68TYoKUA5HNS2... to Ua8Jtf8Zka9uxIVdl... (flutter/engine#37345) (flutter/flutter#114746)
* 77d6ecb 805b145d7 [web] Improve line breaker test exceptions (flutter/engine#37244) (flutter/flutter#114688) * 5233fd9 Roll Plugins from 5c11747 to a279b9d (6 revisions) (flutter/flutter#114689) * e1166e4 287a3ab59 Roll Skia from c901cb6ae66f to 1272b520c082 (1 revision) (flutter/engine#37314) (flutter/flutter#114691) * 48457d7 WidgetController.startGesture trackpad support (flutter/flutter#114631) * c1d2b85 Change some required nullable parameters in tool to non-null (flutter/flutter#114115) * cfb2f15 Roll Flutter Engine from 287a3ab59269 to e947833ceb5b (2 revisions) (flutter/flutter#114696) * 80bf355 Support keyboard selection in SelectabledRegion (flutter/flutter#112584) * be83c98 5117e858e Fix typo in overlay platform view iOS test (flutter/engine#37262) (flutter/flutter#114705) * 6ea01e6 Roll Flutter Engine from 5117e858ed1e to 6950689ed775 (3 revisions) (flutter/flutter#114710) * b187bc4 Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (flutter/flutter#114637) * 01507ba Revert "Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (#114637)" (flutter/flutter#114715) * 91a56cf roll packages (flutter/flutter#114366) * d68af26 Roll Flutter Engine from 6950689ed775 to 0933ca485a07 (3 revisions) (flutter/flutter#114714) * 4fd0a92 Remove auto_cleanup of xcode caches. (flutter/flutter#114719) * 96f9ca8 Roll Flutter Engine from 0933ca485a07 to 28e1ea0cc5b1 (4 revisions) (flutter/flutter#114720) * 1aada6f [New Feature]Support mouse wheel event on the scrollbar widget (flutter/flutter#109659) * 6265610 Roll Flutter Engine from 28e1ea0cc5b1 to ba390f2a7b7d (3 revisions) (flutter/flutter#114728) * 140a57e Roll Flutter Engine from ba390f2a7b7d to 223a485ceb02 (3 revisions) (flutter/flutter#114732) * 06ded49 Roll Flutter Engine from 223a485ceb02 to cf56eb5565e2 (3 revisions) (flutter/flutter#114735) * e0e7027 9c45b0ebe Roll Fuchsia Mac SDK from jAKH68TYoKUA5HNS2... to Ua8Jtf8Zka9uxIVdl... (flutter/engine#37345) (flutter/flutter#114746)
* 77d6ecb 805b145d7 [web] Improve line breaker test exceptions (flutter/engine#37244) (flutter/flutter#114688) * 5233fd9 Roll Plugins from 5c11747 to a279b9d (6 revisions) (flutter/flutter#114689) * e1166e4 287a3ab59 Roll Skia from c901cb6ae66f to 1272b520c082 (1 revision) (flutter/engine#37314) (flutter/flutter#114691) * 48457d7 WidgetController.startGesture trackpad support (flutter/flutter#114631) * c1d2b85 Change some required nullable parameters in tool to non-null (flutter/flutter#114115) * cfb2f15 Roll Flutter Engine from 287a3ab59269 to e947833ceb5b (2 revisions) (flutter/flutter#114696) * 80bf355 Support keyboard selection in SelectabledRegion (flutter/flutter#112584) * be83c98 5117e858e Fix typo in overlay platform view iOS test (flutter/engine#37262) (flutter/flutter#114705) * 6ea01e6 Roll Flutter Engine from 5117e858ed1e to 6950689ed775 (3 revisions) (flutter/flutter#114710) * b187bc4 Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (flutter/flutter#114637) * 01507ba Revert "Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (#114637)" (flutter/flutter#114715) * 91a56cf roll packages (flutter/flutter#114366) * d68af26 Roll Flutter Engine from 6950689ed775 to 0933ca485a07 (3 revisions) (flutter/flutter#114714) * 4fd0a92 Remove auto_cleanup of xcode caches. (flutter/flutter#114719) * 96f9ca8 Roll Flutter Engine from 0933ca485a07 to 28e1ea0cc5b1 (4 revisions) (flutter/flutter#114720) * 1aada6f [New Feature]Support mouse wheel event on the scrollbar widget (flutter/flutter#109659) * 6265610 Roll Flutter Engine from 28e1ea0cc5b1 to ba390f2a7b7d (3 revisions) (flutter/flutter#114728) * 140a57e Roll Flutter Engine from ba390f2a7b7d to 223a485ceb02 (3 revisions) (flutter/flutter#114732) * 06ded49 Roll Flutter Engine from 223a485ceb02 to cf56eb5565e2 (3 revisions) (flutter/flutter#114735) * e0e7027 9c45b0ebe Roll Fuchsia Mac SDK from jAKH68TYoKUA5HNS2... to Ua8Jtf8Zka9uxIVdl... (flutter/engine#37345) (flutter/flutter#114746)
* 77d6ecb 805b145d7 [web] Improve line breaker test exceptions (flutter/engine#37244) (flutter/flutter#114688) * 5233fd9 Roll Plugins from 5c11747 to a279b9d (6 revisions) (flutter/flutter#114689) * e1166e4 287a3ab59 Roll Skia from c901cb6ae66f to 1272b520c082 (1 revision) (flutter/engine#37314) (flutter/flutter#114691) * 48457d7 WidgetController.startGesture trackpad support (flutter/flutter#114631) * c1d2b85 Change some required nullable parameters in tool to non-null (flutter/flutter#114115) * cfb2f15 Roll Flutter Engine from 287a3ab59269 to e947833ceb5b (2 revisions) (flutter/flutter#114696) * 80bf355 Support keyboard selection in SelectabledRegion (flutter/flutter#112584) * be83c98 5117e858e Fix typo in overlay platform view iOS test (flutter/engine#37262) (flutter/flutter#114705) * 6ea01e6 Roll Flutter Engine from 5117e858ed1e to 6950689ed775 (3 revisions) (flutter/flutter#114710) * b187bc4 Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (flutter/flutter#114637) * 01507ba Revert "Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (#114637)" (flutter/flutter#114715) * 91a56cf roll packages (flutter/flutter#114366) * d68af26 Roll Flutter Engine from 6950689ed775 to 0933ca485a07 (3 revisions) (flutter/flutter#114714) * 4fd0a92 Remove auto_cleanup of xcode caches. (flutter/flutter#114719) * 96f9ca8 Roll Flutter Engine from 0933ca485a07 to 28e1ea0cc5b1 (4 revisions) (flutter/flutter#114720) * 1aada6f [New Feature]Support mouse wheel event on the scrollbar widget (flutter/flutter#109659) * 6265610 Roll Flutter Engine from 28e1ea0cc5b1 to ba390f2a7b7d (3 revisions) (flutter/flutter#114728) * 140a57e Roll Flutter Engine from ba390f2a7b7d to 223a485ceb02 (3 revisions) (flutter/flutter#114732) * 06ded49 Roll Flutter Engine from 223a485ceb02 to cf56eb5565e2 (3 revisions) (flutter/flutter#114735) * e0e7027 9c45b0ebe Roll Fuchsia Mac SDK from jAKH68TYoKUA5HNS2... to Ua8Jtf8Zka9uxIVdl... (flutter/engine#37345) (flutter/flutter#114746)
* Support keyboard selection in selectable region * fix some comments * addressing comments
* Support keyboard selection in selectable region * fix some comments * addressing comments
* 77d6ecb 805b145d7 [web] Improve line breaker test exceptions (flutter/engine#37244) (flutter/flutter#114688) * 5233fd9 Roll Plugins from 5c11747 to a279b9d (6 revisions) (flutter/flutter#114689) * e1166e4 287a3ab59 Roll Skia from c901cb6ae66f to 1272b520c082 (1 revision) (flutter/engine#37314) (flutter/flutter#114691) * 48457d7 WidgetController.startGesture trackpad support (flutter/flutter#114631) * c1d2b85 Change some required nullable parameters in tool to non-null (flutter/flutter#114115) * cfb2f15 Roll Flutter Engine from 287a3ab59269 to e947833ceb5b (2 revisions) (flutter/flutter#114696) * 80bf355 Support keyboard selection in SelectabledRegion (flutter/flutter#112584) * be83c98 5117e858e Fix typo in overlay platform view iOS test (flutter/engine#37262) (flutter/flutter#114705) * 6ea01e6 Roll Flutter Engine from 5117e858ed1e to 6950689ed775 (3 revisions) (flutter/flutter#114710) * b187bc4 Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (flutter/flutter#114637) * 01507ba Revert "Switch the way we retrieve the vm_service_port from /hub to iquery, on device. (#114637)" (flutter/flutter#114715) * 91a56cf roll packages (flutter/flutter#114366) * d68af26 Roll Flutter Engine from 6950689ed775 to 0933ca485a07 (3 revisions) (flutter/flutter#114714) * 4fd0a92 Remove auto_cleanup of xcode caches. (flutter/flutter#114719) * 96f9ca8 Roll Flutter Engine from 0933ca485a07 to 28e1ea0cc5b1 (4 revisions) (flutter/flutter#114720) * 1aada6f [New Feature]Support mouse wheel event on the scrollbar widget (flutter/flutter#109659) * 6265610 Roll Flutter Engine from 28e1ea0cc5b1 to ba390f2a7b7d (3 revisions) (flutter/flutter#114728) * 140a57e Roll Flutter Engine from ba390f2a7b7d to 223a485ceb02 (3 revisions) (flutter/flutter#114732) * 06ded49 Roll Flutter Engine from 223a485ceb02 to cf56eb5565e2 (3 revisions) (flutter/flutter#114735) * e0e7027 9c45b0ebe Roll Fuchsia Mac SDK from jAKH68TYoKUA5HNS2... to Ua8Jtf8Zka9uxIVdl... (flutter/engine#37345) (flutter/flutter#114746)
fixes #104541
added two new selection events, and implement the handling method in renderparagraph and SelectionContainerDelegate.
GranularlyExtendSelectionEvent: handles shift+modifier+left/right
DirectionallyExtendSelectionEvent: handles shift + up/down
Pre-launch Checklist
///
).If you need help, consider asking for advice on the #hackers-new channel on Discord.