RenderListWheelViewport class

Render, onto a wheel, a bigger sequential set of objects inside this viewport.

Takes a scrollable set of fixed sized RenderBoxes and renders them sequentially from top down on a vertical scrolling axis.

It starts with the first scrollable item in the center of the main axis and ends with the last scrollable item in the center of the main axis. This is in contrast to typical lists that start with the first scrollable item at the start of the main axis and ends with the last scrollable item at the end of the main axis.

Instead of rendering its children on a flat plane, it renders them as if each child is broken into its own plane and that plane is perpendicularly fixed onto a cylinder which rotates along the scrolling axis.

This class works in 3 coordinate systems:

  1. The scrollable layout coordinates. This coordinate system is used to communicate with ViewportOffset and describes its children's abstract offset from the beginning of the scrollable list at (0.0, 0.0).

    The list is scrollable from the start of the first child item to the start of the last child item.

    Children's layout coordinates don't change as the viewport scrolls.

  2. The untransformed plane's viewport painting coordinates. Children are not painted in this coordinate system. It's an abstract intermediary used before transforming into the next cylindrical coordinate system.

    This system is the scrollable layout coordinates translated by the scroll offset such that (0.0, 0.0) is the top left corner of the viewport.

    Because the viewport is centered at the scrollable list's scroll offset instead of starting at the scroll offset, there are paintable children ~1/2 viewport length before and after the scroll offset instead of ~1 viewport length after the scroll offset.

    Children's visibility inclusion in the viewport is determined in this system regardless of the cylinder's properties such as diameterRatio or perspective. In other words, a 100px long viewport will always paint 10-11 visible 10px children if there are enough children in the viewport.

  3. The transformed cylindrical space viewport painting coordinates. Children from system 2 get their positions transformed into a cylindrical projection matrix instead of its cartesian offset with respect to the scroll offset.

    Children in this coordinate system are painted.

    The wheel's size and the maximum and minimum visible angles are both controlled by diameterRatio. Children visible in the untransformed plane's viewport painting coordinates's viewport will be radially evenly laid out between the maximum and minimum angles determined by intersecting the viewport's main axis length with a cylinder whose diameter is diameterRatio times longer, as long as those angles are between -pi/2 and pi/2.

    For example, if diameterRatio is 2.0 and this RenderListWheelViewport is 100.0px in the main axis, then the diameter is 200.0. And children will be evenly laid out between that cylinder's -arcsin(1/2) and arcsin(1/2) angles.

    The cylinder's 0 degree side is always centered in the RenderListWheelViewport. The transformation from untransformed plane's viewport painting coordinates is also done such that the child in the center of that plane will be mostly untransformed with children above and below it being transformed more as the angle increases.

Inheritance
Implements
Mixes-in

Constructors

RenderListWheelViewport({@required ListWheelChildManager childManager, @required ViewportOffset offset, double diameterRatio: defaultDiameterRatio, double perspective: defaultPerspective, double offAxisFraction: 0.0, bool useMagnifier: false, double magnification: 1.0, @required double itemExtent, bool clipToSize: true, bool renderChildrenOutsideViewport: false, List<RenderBox> children })
Creates a RenderListWheelViewport which renders children on a wheel. [...]

Properties

childManager ListWheelChildManager
The delegate that manages the children of this object.
final
clipToSize ↔ bool
read / write
diameterRatio ↔ double
read / write
isRepaintBoundary → bool
Whether this render object repaints separately from its parent. [...]
read-only
itemExtent ↔ double
read / write
magnification ↔ double
read / write
offAxisFraction ↔ double
read / write
offset ViewportOffset
The associated ViewportOffset object for the viewport describing the part of the content inside that's visible. [...]
read / write
perspective ↔ double
read / write
renderChildrenOutsideViewport ↔ bool
read / write
sizedByParent → bool
Whether the constraints are the only input to the sizing algorithm (in particular, child nodes have no impact). [...]
read-only
useMagnifier ↔ bool
read / write
alwaysNeedsCompositing → bool
Whether this render object always needs compositing. [...]
@protected, read-only, inherited
attached → bool
Whether this node is in a tree whose root is attached to something. [...]
read-only, inherited
childCount → int
The number of children.
read-only, inherited
constraints BoxConstraints
The box constraints most recently received from the parent.
read-only, inherited
debugCanParentUseSize → bool
Whether the parent render object is permitted to use this render object's size. [...]
read-only, inherited
debugCreator ↔ dynamic
The object responsible for creating this render object. [...]
read / write, inherited
debugDoingThisLayout → bool
Whether performLayout for this render object is currently running. [...]
read-only, inherited
debugDoingThisPaint → bool
Whether paint for this render object is currently running. [...]
read-only, inherited
debugDoingThisResize → bool
Whether performResize for this render object is currently running. [...]
read-only, inherited
debugLayer OffsetLayer
In debug mode, the compositing layer that this render object uses to repaint. [...]
read-only, inherited
debugNeedsLayout → bool
Whether this render object's layout information is dirty. [...]
read-only, inherited
debugNeedsPaint → bool
Whether this render object's paint information is dirty. [...]
read-only, inherited
debugSemantics SemanticsNode
The semantics of this render object. [...]
read-only, inherited
depth → int
The depth of this node in the tree. [...]
read-only, inherited
firstChild RenderBox
The first child in the child list.
read-only, inherited
hashCode → int
The hash code for this object. [...]
read-only, inherited
hasSize → bool
Whether this render object has undergone layout and has a size.
read-only, inherited
lastChild RenderBox
The last child in the child list.
read-only, inherited
layer OffsetLayer
The compositing layer that this render object uses to repaint. [...]
read-only, inherited
needsCompositing → bool
Whether we or one of our descendants has a compositing layer. [...]
read-only, inherited
owner PipelineOwner
The owner for this node (null if unattached). [...]
read-only, inherited
paintBounds Rect
Returns a rectangle that contains all the pixels painted by this box. [...]
read-only, inherited
parent AbstractNode
The parent of this node in the tree.
read-only, inherited
parentData ParentData
Data for use by the parent render object. [...]
read / write, inherited
runtimeType → Type
A representation of the runtime type of the object.
read-only, inherited
semanticBounds Rect
The bounding box, in the local coordinate system, of this object, for accessibility purposes.
read-only, inherited
size Size
The size of this render box computed during layout. [...]
@protected, read / write, inherited

Methods

applyPaintTransform(RenderBox child, Matrix4 transform) → void
This returns the matrices relative to the untransformed plane's viewport painting coordinates system.
attach(PipelineOwner owner) → void
computeMaxIntrinsicHeight(double width) → double
Computes the value returned by getMaxIntrinsicHeight. Do not call this function directly, instead, call getMaxIntrinsicHeight. [...]
computeMaxIntrinsicWidth(double height) → double
Computes the value returned by getMaxIntrinsicWidth. Do not call this function directly, instead, call getMaxIntrinsicWidth. [...]
computeMinIntrinsicHeight(double width) → double
Computes the value returned by getMinIntrinsicHeight. Do not call this function directly, instead, call getMinIntrinsicHeight. [...]
computeMinIntrinsicWidth(double height) → double
Computes the value returned by getMinIntrinsicWidth. Do not call this function directly, instead, call getMinIntrinsicWidth. [...]
describeApproximatePaintClip(RenderObject child) Rect
Returns a rect in this object's coordinate system that describes the approximate bounding box of the clip rect that would be applied to the given child during the paint phase, if any. [...]
detach() → void
getOffsetToReveal(RenderObject target, double alignment, { Rect rect }) RevealedOffset
Returns the offset that would be needed to reveal the target RenderObject. [...]
hitTestChildren(HitTestResult result, { Offset position }) → bool
Override this method to check whether any children are located at the given position. [...]
indexOf(RenderBox child) → int
Gets the index of a child by looking at its parentData.
indexToScrollOffset(int index) → double
Returns the scroll offset of the child with the given index.
paint(PaintingContext context, Offset offset) → void
Paint this render object into the given context at the given offset. [...]
performLayout() → void
Performs layout based on how childManager provides children. [...]
performResize() → void
scrollOffsetToIndex(double scrollOffset) → int
Returns the index of the child at the given offset.
setupParentData(RenderObject child) → void
showOnScreen({RenderObject descendant, Rect rect, Duration duration: Duration.zero, Curve curve: Curves.ease }) → void
Attempt to make (a portion of) this or a descendant RenderObject visible on screen. [...]
add(RenderBox child) → void
Append child to the end of this render object's child list.
inherited
addAll(List<RenderBox> children) → void
Add all the children to the end of this render object's child list.
inherited
adoptChild(RenderObject child) → void
Called by subclasses when they decide a render object is a child. [...]
inherited
assembleSemanticsNode(SemanticsNode node, SemanticsConfiguration config, Iterable<SemanticsNode> children) → void
Assemble the SemanticsNode for this RenderObject. [...]
inherited
childAfter(RenderBox child) RenderBox
The next child after the given child in the child list.
inherited
childBefore(RenderBox child) RenderBox
The previous child before the given child in the child list.
inherited
clearSemantics() → void
Removes all semantics from this render object and its descendants. [...]
@mustCallSuper, inherited
computeDistanceToActualBaseline(TextBaseline baseline) → double
Returns the distance from the y-coordinate of the position of the box to the y-coordinate of the first given baseline in the box's contents, if any, or null otherwise. [...]
@protected, inherited
debugAdoptSize(Size value) Size
Claims ownership of the given Size. [...]
inherited
debugAssertDoesMeetConstraints() → void
Verify that the object's constraints are being met. Override this function in a subclass to verify that your state matches the constraints object. This function is only called in checked mode and only when needsLayout is false. If the constraints are not met, it should assert or throw an exception.
inherited
debugDescribeChildren() → List<DiagnosticsNode>
inherited
debugFillProperties(DiagnosticPropertiesBuilder properties) → void
inherited
debugHandleEvent(PointerEvent event, HitTestEntry entry) → bool
Implements the debugPaintPointersEnabled debugging feature. [...]
inherited
debugPaint(PaintingContext context, Offset offset) → void
Override this method to paint debugging information.
inherited
debugPaintBaselines(PaintingContext context, Offset offset) → void
In debug mode, paints a line for each baseline. [...]
@protected, inherited
debugPaintPointers(PaintingContext context, Offset offset) → void
In debug mode, paints a rectangle if this render box has counted more pointer downs than pointer up events. [...]
@protected, inherited
debugPaintSize(PaintingContext context, Offset offset) → void
In debug mode, paints a border around this render box. [...]
@protected, inherited
debugRegisterRepaintBoundaryPaint({bool includedParent: true, bool includedChild: false }) → void
Called, in checked mode, if isRepaintBoundary is true, when either the this render object or its parent attempt to paint. [...]
inherited
debugResetSize() → void
If a subclass has a "size" (the state controlled by parentUsesSize, whatever it is in the subclass, e.g. the actual size property of RenderBox), and the subclass verifies that in checked mode this "size" property isn't used when debugCanParentUseSize isn't set, then that subclass should override debugResetSize to reapply the current values of debugCanParentUseSize to that state.
inherited
debugValidateChild(RenderObject child) → bool
Checks whether the given render object has the correct runtimeType to be a child of this render object. [...]
inherited
describeSemanticsClip(RenderObject child) Rect
Returns a rect in this object's coordinate system that describes which SemanticsNodes produced by the child should be included in the semantics tree. SemanticsNodes from the child that are positioned outside of this rect will be dropped. Child SemanticsNodes that are positioned inside this rect, but outside of describeApproximatePaintClip will be included in the tree marked as hidden. Child SemanticsNodes that are inside of both rect will be included in the tree as regular nodes. [...]
inherited
describeSemanticsConfiguration(SemanticsConfiguration config) → void
Report the semantics of this node, for example for accessibility purposes. [...]
@protected, inherited
dropChild(RenderObject child) → void
Called by subclasses when they decide a render object is no longer a child. [...]
inherited
getDistanceToActualBaseline(TextBaseline baseline) → double
Calls computeDistanceToActualBaseline and caches the result. [...]
@mustCallSuper, @protected, inherited
getDistanceToBaseline(TextBaseline baseline, { bool onlyReal: false }) → double
Returns the distance from the y-coordinate of the position of the box to the y-coordinate of the first given baseline in the box's contents. [...]
inherited
getMaxIntrinsicHeight(double width) → double
Returns the smallest height beyond which increasing the height never decreases the preferred width. The preferred width is the value that would be returned by getMinIntrinsicWidth for that height. [...]
@mustCallSuper, inherited
getMaxIntrinsicWidth(double height) → double
Returns the smallest width beyond which increasing the width never decreases the preferred height. The preferred height is the value that would be returned by getMinIntrinsicHeight for that width. [...]
@mustCallSuper, inherited
getMinIntrinsicHeight(double width) → double
Returns the minimum height that this box could be without failing to correctly paint its contents within itself, without clipping. [...]
@mustCallSuper, inherited
getMinIntrinsicWidth(double height) → double
Returns the minimum width that this box could be without failing to correctly paint its contents within itself, without clipping. [...]
@mustCallSuper, inherited
getTransformTo(RenderObject ancestor) Matrix4
Applies the paint transform up the tree to ancestor. [...]
inherited
globalToLocal(Offset point, { RenderObject ancestor }) Offset
Convert the given point from the global coordinate system in logical pixels to the local coordinate system for this box. [...]
inherited
handleEvent(PointerEvent event, BoxHitTestEntry entry) → void
Override this method to handle pointer events that hit this render object. [...]
inherited
hitTest(HitTestResult result, { Offset position }) → bool
Determines the set of render objects located at the given position. [...]
inherited
hitTestSelf(Offset position) → bool
Override this method if this render object can be hit even if its children were not hit. [...]
@protected, inherited
insert(RenderBox child, { RenderBox after }) → void
Insert child into this render object's child list after the given child. [...]
inherited
invokeLayoutCallback<T extends Constraints>(LayoutCallback<T> callback) → void
Allows mutations to be made to this object's child list (and any descendants) as well as to any other dirty nodes in the render tree owned by the same PipelineOwner as this object. The callback argument is invoked synchronously, and the mutations are allowed only during that callback's execution. [...]
@protected, inherited
layout(Constraints constraints, { bool parentUsesSize: false }) → void
Compute the layout for this render object. [...]
inherited
localToGlobal(Offset point, { RenderObject ancestor }) Offset
Convert the given point from the local coordinate system for this box to the global coordinate system in logical pixels. [...]
inherited
markNeedsCompositingBitsUpdate() → void
Mark the compositing state for this render object as dirty. [...]
inherited
markNeedsLayout() → void
Mark this render object's layout information as dirty, and either register this object with its PipelineOwner, or defer to the parent, depending on whether this object is a relayout boundary or not respectively. [...]
inherited
markNeedsLayoutForSizedByParentChange() → void
Mark this render object's layout information as dirty (like markNeedsLayout), and additionally also handle any necessary work to handle the case where sizedByParent has changed value. [...]
inherited
markNeedsPaint() → void
Mark this render object as having changed its visual appearance. [...]
inherited
markNeedsSemanticsUpdate() → void
Mark this node as needing an update to its semantics description. [...]
inherited
markParentNeedsLayout() → void
Mark this render object's layout information as dirty, and then defer to the parent. [...]
@protected, inherited
move(RenderBox child, { RenderBox after }) → void
Move this child in the child list to be before the given child. [...]
inherited
noSuchMethod(Invocation invocation) → dynamic
Invoked when a non-existent method or property is accessed. [...]
inherited
reassemble() → void
Cause the entire subtree rooted at the given RenderObject to be marked dirty for layout, paint, etc, so that the effects of a hot reload can be seen, or so that the effect of changing a global debug flag (such as debugPaintSizeEnabled) can be applied. [...]
inherited
redepthChild(AbstractNode child) → void
Adjust the depth of the given child to be greater than this node's own depth. [...]
@protected, inherited
redepthChildren() → void
Adjust the depth of this node's children, if any. [...]
inherited
remove(RenderBox child) → void
Remove this child from the child list. [...]
inherited
removeAll() → void
Remove all their children from this render object's child list. [...]
inherited
replaceRootLayer(OffsetLayer rootLayer) → void
Replace the layer. This is only valid for the root of a render object subtree (whatever object scheduleInitialPaint was called on). [...]
inherited
rotate({int oldAngle, int newAngle, Duration time }) → void
Rotate this render object (not yet implemented).
inherited
scheduleInitialLayout() → void
Bootstrap the rendering pipeline by scheduling the very first layout. [...]
inherited
scheduleInitialPaint(ContainerLayer rootLayer) → void
Bootstrap the rendering pipeline by scheduling the very first paint. [...]
inherited
scheduleInitialSemantics() → void
Bootstrap the semantics reporting mechanism by marking this node as needing a semantics update. [...]
inherited
sendSemanticsEvent(SemanticsEvent semanticsEvent) → void
Sends a SemanticsEvent associated with this render object's SemanticsNode. [...]
inherited
toDiagnosticsNode({String name, DiagnosticsTreeStyle style }) DiagnosticsNode
inherited
toString({DiagnosticLevel minLevel }) → String
inherited
toStringDeep({String prefixLineOne: '', String prefixOtherLines: '', DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String
Returns a description of the tree rooted at this node. If the prefix argument is provided, then every line in the output will be prefixed by that string.
inherited
toStringShallow({String joiner: '; ', DiagnosticLevel minLevel: DiagnosticLevel.debug }) → String
Returns a one-line detailed description of the render object. This description is often somewhat long. [...]
inherited
toStringShort() → String
Returns a human understandable name.
inherited
visitChildren(RenderObjectVisitor visitor) → void
Calls visitor for each immediate child of this render object. [...]
inherited
visitChildrenForSemantics(RenderObjectVisitor visitor) → void
Called when collecting the semantics of this node. [...]
inherited

Operators

operator ==(dynamic other) → bool
The equality operator. [...]
inherited

Constants

clipToSizeAndRenderChildrenOutsideViewportConflict → const String
An error message to show when clipToSize and renderChildrenOutsideViewport are set to conflicting values.
'Cannot renderChildrenOutsideViewport and clipToSize since children ' 'rendered outside will be clipped anyway.'
defaultDiameterRatio → const double
An arbitrary but aesthetically reasonable default value for diameterRatio.
2.0
defaultPerspective → const double
An arbitrary but aesthetically reasonable default value for perspective.
0.003
diameterRatioZeroMessage → const String
An error message to show when the provided diameterRatio is zero.
"You can't set a diameterRatio " 'of 0 or of a negative number. It would imply a cylinder of 0 in diameter ' 'in which case nothing will be drawn.'
perspectiveTooHighMessage → const String
An error message to show when the perspective value is too high.
'A perspective too high will ' 'be clipped in the z-axis and therefore not renderable. Value must be ' 'between 0 and 0.01.'