Commit 3cbb20d1 authored by Adam Barth's avatar Adam Barth Committed by GitHub

Just use SemanticAnnotator instead of Iterable<SemanticAnnotator> (#4813)

parent 839def55
......@@ -423,14 +423,14 @@ class _RenderSlider extends RenderConstrainedBox implements SemanticActionHandle
}
@override
bool get hasSemantics => isInteractive;
bool get isSemanticBoundary => isInteractive;
@override
Iterable<SemanticAnnotator> getSemanticAnnotators() sync* {
yield (SemanticsNode semantics) {
if (isInteractive)
semantics.addAdjustmentActions();
};
SemanticAnnotator get semanticAnnotator => _annotate;
void _annotate(SemanticsNode semantics) {
if (isInteractive)
semantics.addAdjustmentActions();
}
@override
......
......@@ -263,17 +263,17 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic
}
@override
bool get hasSemantics => isInteractive;
bool get isSemanticBoundary => isInteractive;
@override
Iterable<SemanticAnnotator> getSemanticAnnotators() sync* {
yield (SemanticsNode semantics) {
semantics
..hasCheckedState = true
..isChecked = _value;
if (isInteractive)
semantics.addAction(SemanticAction.tap);
};
SemanticAnnotator get semanticAnnotator => _annotate;
void _annotate(SemanticsNode semantics) {
semantics
..hasCheckedState = true
..isChecked = _value;
if (isInteractive)
semantics.addAction(SemanticAction.tap);
}
@override
......
......@@ -508,13 +508,11 @@ class _SemanticsGeometry {
abstract class _SemanticsFragment {
_SemanticsFragment({
RenderObject renderObjectOwner,
Iterable<SemanticAnnotator> annotators,
this.annotator,
List<_SemanticsFragment> children
}) {
assert(renderObjectOwner != null);
_ancestorChain = <RenderObject>[renderObjectOwner];
if (annotators != null)
addAnnotators(annotators);
assert(() {
if (children == null)
return true;
......@@ -526,6 +524,8 @@ abstract class _SemanticsFragment {
_children = children ?? const <_SemanticsFragment>[];
}
final SemanticAnnotator annotator;
List<RenderObject> _ancestorChain;
void addAncestor(RenderObject ancestor) {
_ancestorChain.add(ancestor);
......@@ -533,14 +533,6 @@ abstract class _SemanticsFragment {
RenderObject get renderObjectOwner => _ancestorChain.first;
List<SemanticAnnotator> _annotators;
void addAnnotators(Iterable<SemanticAnnotator> moreAnnotators) {
if (_annotators == null)
_annotators = moreAnnotators is List<SemanticAnnotator> ? moreAnnotators : moreAnnotators.toList();
else
_annotators.addAll(moreAnnotators);
}
List<_SemanticsFragment> _children;
bool _debugCompiled = false;
......@@ -579,9 +571,9 @@ class _CleanSemanticsFragment extends _SemanticsFragment {
abstract class _InterestingSemanticsFragment extends _SemanticsFragment {
_InterestingSemanticsFragment({
RenderObject renderObjectOwner,
Iterable<SemanticAnnotator> annotators,
SemanticAnnotator annotator,
Iterable<_SemanticsFragment> children
}) : super(renderObjectOwner: renderObjectOwner, annotators: annotators, children: children);
}) : super(renderObjectOwner: renderObjectOwner, annotator: annotator, children: children);
bool get haveConcreteNode => true;
......@@ -590,7 +582,7 @@ abstract class _InterestingSemanticsFragment extends _SemanticsFragment {
assert(!_debugCompiled);
assert(() { _debugCompiled = true; return true; });
SemanticsNode node = establishSemanticsNode(geometry, currentSemantics, parentSemantics);
for (SemanticAnnotator annotator in _annotators)
if (annotator != null)
annotator(node);
for (_SemanticsFragment child in _children) {
assert(child._ancestorChain.last == renderObjectOwner);
......@@ -613,9 +605,9 @@ abstract class _InterestingSemanticsFragment extends _SemanticsFragment {
class _RootSemanticsFragment extends _InterestingSemanticsFragment {
_RootSemanticsFragment({
RenderObject renderObjectOwner,
Iterable<SemanticAnnotator> annotators,
SemanticAnnotator annotator,
Iterable<_SemanticsFragment> children
}) : super(renderObjectOwner: renderObjectOwner, annotators: annotators, children: children);
}) : super(renderObjectOwner: renderObjectOwner, annotator: annotator, children: children);
@override
SemanticsNode establishSemanticsNode(_SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics) {
......@@ -643,9 +635,9 @@ class _RootSemanticsFragment extends _InterestingSemanticsFragment {
class _ConcreteSemanticsFragment extends _InterestingSemanticsFragment {
_ConcreteSemanticsFragment({
RenderObject renderObjectOwner,
Iterable<SemanticAnnotator> annotators,
SemanticAnnotator annotator,
Iterable<_SemanticsFragment> children
}) : super(renderObjectOwner: renderObjectOwner, annotators: annotators, children: children);
}) : super(renderObjectOwner: renderObjectOwner, annotator: annotator, children: children);
@override
SemanticsNode establishSemanticsNode(_SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics) {
......@@ -671,9 +663,9 @@ class _ConcreteSemanticsFragment extends _InterestingSemanticsFragment {
class _ImplicitSemanticsFragment extends _InterestingSemanticsFragment {
_ImplicitSemanticsFragment({
RenderObject renderObjectOwner,
Iterable<SemanticAnnotator> annotators,
SemanticAnnotator annotator,
Iterable<_SemanticsFragment> children
}) : super(renderObjectOwner: renderObjectOwner, annotators: annotators, children: children);
}) : super(renderObjectOwner: renderObjectOwner, annotator: annotator, children: children);
@override
bool get haveConcreteNode => _haveConcreteNode;
......@@ -683,7 +675,7 @@ class _ImplicitSemanticsFragment extends _InterestingSemanticsFragment {
SemanticsNode establishSemanticsNode(_SemanticsGeometry geometry, SemanticsNode currentSemantics, SemanticsNode parentSemantics) {
SemanticsNode node;
assert(_haveConcreteNode == null);
_haveConcreteNode = currentSemantics == null && _annotators.isNotEmpty;
_haveConcreteNode = currentSemantics == null && annotator != null;
if (haveConcreteNode) {
renderObjectOwner._semantics ??= new SemanticsNode(
handler: renderObjectOwner is SemanticActionHandler ? renderObjectOwner as dynamic : null
......@@ -758,10 +750,9 @@ class _ForkingSemanticsFragment extends _SemanticsFragment {
/// 3. [flushPaint] visites any render objects that need to paint. During this
/// phase, render objects get a chance to record painting commands into
/// [PictureLayer]s and construct other composited [Layer]s.
/// 4. Finally, if [SemanticsNode.hasListeners] is true, [flushSemantics] will
/// compile the semantics for the render objects. This semantic information
/// is used by assistive technology to improve the accessibility of the
/// render tree.
/// 4. Finally, if semantics are enabled, [flushSemantics] will compile the
/// semantics for the render objects. This semantic information is used by
/// assistive technology to improve the accessibility of the render tree.
///
/// The [RendererBinding] holds the pipeline owner for the render objects that
/// are visible on screen. You can create other pipeline owners to manage
......@@ -1197,7 +1188,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
_needsPaint = false;
markNeedsPaint();
}
if (_needsSemanticsUpdate && hasSemantics) {
if (_needsSemanticsUpdate && isSemanticBoundary) {
// Don't enter this block if we've never updated semantics at all;
// scheduleInitialSemantics() will handle it
_needsSemanticsUpdate = false;
......@@ -1900,7 +1891,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
}
/// Whether this RenderObject introduces a new box for accessibility purposes.
bool get hasSemantics => false;
bool get isSemanticBoundary => false;
/// The bounding box, in the local coordinate system, of this
/// object, for accessibility purposes.
......@@ -2024,7 +2015,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
_SemanticsFragment _getSemanticsFragment() {
// early-exit if we're not dirty and have our own semantics
if (!_needsSemanticsUpdate && hasSemantics) {
if (!_needsSemanticsUpdate && isSemanticBoundary) {
assert(_semantics != null);
return new _CleanSemanticsFragment(renderObjectOwner: this);
}
......@@ -2047,13 +2038,13 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
});
_needsSemanticsUpdate = false;
_needsSemanticsGeometryUpdate = false;
Iterable<SemanticAnnotator> annotators = getSemanticAnnotators();
SemanticAnnotator annotator = semanticAnnotator;
if (parent is! RenderObject)
return new _RootSemanticsFragment(renderObjectOwner: this, annotators: annotators, children: children);
if (hasSemantics)
return new _ConcreteSemanticsFragment(renderObjectOwner: this, annotators: annotators, children: children);
if (annotators.isNotEmpty)
return new _ImplicitSemanticsFragment(renderObjectOwner: this, annotators: annotators, children: children);
return new _RootSemanticsFragment(renderObjectOwner: this, annotator: annotator, children: children);
if (isSemanticBoundary)
return new _ConcreteSemanticsFragment(renderObjectOwner: this, annotator: annotator, children: children);
if (annotator != null)
return new _ImplicitSemanticsFragment(renderObjectOwner: this, annotator: annotator, children: children);
_semantics = null;
if (children == null)
return null;
......@@ -2098,7 +2089,7 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
/// non-zero, and hasSemantics isn't true, then the associated call
/// to markNeedsSemanticsUpdate() must not have 'onlyChanges' set, as
/// it is possible that the node should be entirely removed.
Iterable<SemanticAnnotator> getSemanticAnnotators() sync* { }
SemanticAnnotator get semanticAnnotator => null;
// EVENTS
......
......@@ -231,10 +231,10 @@ class RenderParagraph extends RenderBox {
}
@override
Iterable<SemanticAnnotator> getSemanticAnnotators() sync* {
yield (SemanticsNode node) {
node.label = text.toPlainText();
};
SemanticAnnotator get semanticAnnotator => _annotate;
void _annotate(SemanticsNode node) {
node.label = text.toPlainText();
}
@override
......
......@@ -2054,11 +2054,11 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
set onTap(GestureTapCallback value) {
if (_onTap == value)
return;
bool didHaveSemantics = hasSemantics;
bool wasSemanticBoundary = isSemanticBoundary;
bool hadHandler = _onTap != null;
_onTap = value;
if ((value != null) != hadHandler)
markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics);
markNeedsSemanticsUpdate(onlyChanges: isSemanticBoundary == wasSemanticBoundary);
}
/// Called when the user presses on the render object for a long period of time.
......@@ -2067,11 +2067,11 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
set onLongPress(GestureLongPressCallback value) {
if (_onLongPress == value)
return;
bool didHaveSemantics = hasSemantics;
bool wasSemanticBoundary = isSemanticBoundary;
bool hadHandler = _onLongPress != null;
_onLongPress = value;
if ((value != null) != hadHandler)
markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics);
markNeedsSemanticsUpdate(onlyChanges: isSemanticBoundary == wasSemanticBoundary);
}
/// Called when the user scrolls to the left or to the right.
......@@ -2080,11 +2080,11 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
set onHorizontalDragUpdate(GestureDragUpdateCallback value) {
if (_onHorizontalDragUpdate == value)
return;
bool didHaveSemantics = hasSemantics;
bool wasSemanticBoundary = isSemanticBoundary;
bool hadHandler = _onHorizontalDragUpdate != null;
_onHorizontalDragUpdate = value;
if ((value != null) != hadHandler)
markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics);
markNeedsSemanticsUpdate(onlyChanges: isSemanticBoundary == wasSemanticBoundary);
}
/// Called when the user scrolls up or down.
......@@ -2093,11 +2093,11 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
set onVerticalDragUpdate(GestureDragUpdateCallback value) {
if (_onVerticalDragUpdate == value)
return;
bool didHaveSemantics = hasSemantics;
bool wasSemanticBoundary = isSemanticBoundary;
bool hadHandler = _onVerticalDragUpdate != null;
_onVerticalDragUpdate = value;
if ((value != null) != hadHandler)
markNeedsSemanticsUpdate(onlyChanges: hasSemantics == didHaveSemantics);
markNeedsSemanticsUpdate(onlyChanges: isSemanticBoundary == wasSemanticBoundary);
}
/// The fraction of the dimension of this render box to use when
......@@ -2108,7 +2108,7 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
double scrollFactor;
@override
bool get hasSemantics {
bool get isSemanticBoundary {
return onTap != null
|| onLongPress != null
|| onHorizontalDragUpdate != null
......@@ -2116,19 +2116,17 @@ class RenderSemanticsGestureHandler extends RenderProxyBox implements SemanticAc
}
@override
Iterable<SemanticAnnotator> getSemanticAnnotators() sync* {
if (hasSemantics) {
yield (SemanticsNode semantics) {
if (onTap != null)
semantics.addAction(SemanticAction.tap);
if (onLongPress != null)
semantics.addAction(SemanticAction.longPress);
if (onHorizontalDragUpdate != null)
semantics.addHorizontalScrollingActions();
if (onVerticalDragUpdate != null)
semantics.addVerticalScrollingActions();
};
}
SemanticAnnotator get semanticAnnotator => isSemanticBoundary ? _annotate : null;
void _annotate(SemanticsNode node) {
if (onTap != null)
node.addAction(SemanticAction.tap);
if (onLongPress != null)
node.addAction(SemanticAction.longPress);
if (onHorizontalDragUpdate != null)
node.addHorizontalScrollingActions();
if (onVerticalDragUpdate != null)
node.addVerticalScrollingActions();
}
@override
......@@ -2243,21 +2241,19 @@ class RenderSemanticAnnotations extends RenderProxyBox {
}
@override
bool get hasSemantics => container;
bool get isSemanticBoundary => container;
@override
Iterable<SemanticAnnotator> getSemanticAnnotators() sync* {
SemanticAnnotator get semanticAnnotator => checked != null || label != null ? _annotate : null;
void _annotate(SemanticsNode node) {
if (checked != null) {
yield (SemanticsNode semantics) {
semantics.hasCheckedState = true;
semantics.isChecked = checked;
};
}
if (label != null) {
yield (SemanticsNode semantics) {
semantics.label = label;
};
node
..hasCheckedState = true
..isChecked = checked;
}
if (label != null)
node.label = label;
}
}
......@@ -2273,8 +2269,10 @@ class RenderMergeSemantics extends RenderProxyBox {
RenderMergeSemantics({ RenderBox child }) : super(child);
@override
Iterable<SemanticAnnotator> getSemanticAnnotators() sync* {
yield (SemanticsNode node) { node.mergeAllDescendantsIntoThisNode = true; };
SemanticAnnotator get semanticAnnotator => _annotate;
void _annotate(SemanticsNode node) {
node.mergeAllDescendantsIntoThisNode = true;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment