Exemplo n.º 1
0
        public void setChildParentData(RenderObject child, SliverConstraints constraints, SliverGeometry geometry)
        {
            var childParentData = (SliverPhysicalParentData)child.parentData;

            switch (GrowthDirectionUtils.applyGrowthDirectionToAxisDirection(constraints.axisDirection,
                                                                             constraints.growthDirection))
            {
            case AxisDirection.up:
                childParentData.paintOffset = new Offset(0.0f,
                                                         -(geometry.scrollExtent - (geometry.paintExtent + constraints.scrollOffset)));
                break;

            case AxisDirection.right:
                childParentData.paintOffset = new Offset(-constraints.scrollOffset, 0.0f);
                break;

            case AxisDirection.down:
                childParentData.paintOffset = new Offset(0.0f, -constraints.scrollOffset);
                break;

            case AxisDirection.left:
                childParentData.paintOffset =
                    new Offset(-(geometry.scrollExtent - (geometry.paintExtent + constraints.scrollOffset)),
                               0.0f);
                break;
            }
        }
        public override void paint(PaintingContext context, Offset offset)
        {
            if (this.child != null && this.geometry.visible)
            {
                switch (GrowthDirectionUtils.applyGrowthDirectionToAxisDirection(this.constraints.axisDirection,
                                                                                 this.constraints.growthDirection))
                {
                case AxisDirection.up:
                    offset += new Offset(0.0f,
                                         this.geometry.paintExtent - this.childMainAxisPosition(this.child) - this.childExtent);
                    break;

                case AxisDirection.down:
                    offset += new Offset(0.0f, this.childMainAxisPosition(this.child));
                    break;

                case AxisDirection.left:
                    offset += new Offset(
                        this.geometry.paintExtent - this.childMainAxisPosition(this.child) - this.childExtent,
                        0.0f);
                    break;

                case AxisDirection.right:
                    offset += new Offset(this.childMainAxisPosition(this.child), 0.0f);
                    break;
                }

                context.paintChild(this.child, offset);
            }
        }
Exemplo n.º 3
0
        public override float?childCrossAxisPosition(RenderObject child)
        {
            child = (RenderSliver)child;
            D.assert(child != null);
            D.assert(child == this.child);
            D.assert(constraints != null);
            D.assert(resolvedPadding != null);
            switch (GrowthDirectionUtils.applyGrowthDirectionToAxisDirection(constraints.axisDirection, constraints.growthDirection))
            {
            case AxisDirection.up:
            case AxisDirection.down:
                return(resolvedPadding.left);

            case AxisDirection.left:
            case AxisDirection.right:
                return(resolvedPadding.top);
            }
            return(null);
        }
Exemplo n.º 4
0
        public override float childCrossAxisPosition(RenderObject child)
        {
            D.assert(child != null);
            D.assert(child == this.child);
            D.assert(this.constraints != null);

            switch (GrowthDirectionUtils.applyGrowthDirectionToAxisDirection(
                        this.constraints.axisDirection, this.constraints.growthDirection))
            {
            case AxisDirection.up:
            case AxisDirection.down:
                return(this._padding.left);

            case AxisDirection.left:
            case AxisDirection.right:
                return(this._padding.top);
            }

            return(0.0f);
        }
Exemplo n.º 5
0
        internal Size getAbsoluteSizeRelativeToOrigin()
        {
            D.assert(geometry != null);
            D.assert(!debugNeedsLayout);

            switch (GrowthDirectionUtils.applyGrowthDirectionToAxisDirection(
                        constraints.axisDirection, constraints.growthDirection))
            {
            case AxisDirection.up:
                return(new Size(constraints.crossAxisExtent, -geometry.paintExtent));

            case AxisDirection.right:
                return(new Size(geometry.paintExtent, constraints.crossAxisExtent));

            case AxisDirection.down:
                return(new Size(constraints.crossAxisExtent, geometry.paintExtent));

            case AxisDirection.left:
                return(new Size(-geometry.paintExtent, constraints.crossAxisExtent));
            }
            return(null);
        }
        public override void paint(PaintingContext context, Offset offset)
        {
            if (this.firstChild == null)
            {
                return;
            }

            Offset mainAxisUnit = null, crossAxisUnit = null, originOffset = null;
            bool   addExtent = false;

            switch (GrowthDirectionUtils.applyGrowthDirectionToAxisDirection(this.constraints.axisDirection,
                                                                             this.constraints.growthDirection))
            {
            case AxisDirection.up:
                mainAxisUnit  = new Offset(0.0f, -1.0f);
                crossAxisUnit = new Offset(1.0f, 0.0f);
                originOffset  = offset + new Offset(0.0f, this.geometry.paintExtent);
                addExtent     = true;
                break;

            case AxisDirection.right:
                mainAxisUnit  = new Offset(1.0f, 0.0f);
                crossAxisUnit = new Offset(0.0f, 1.0f);
                originOffset  = offset;
                addExtent     = false;
                break;

            case AxisDirection.down:
                mainAxisUnit  = new Offset(0.0f, 1.0f);
                crossAxisUnit = new Offset(1.0f, 0.0f);
                originOffset  = offset;
                addExtent     = false;
                break;

            case AxisDirection.left:
                mainAxisUnit  = new Offset(-1.0f, 0.0f);
                crossAxisUnit = new Offset(0.0f, 1.0f);
                originOffset  = offset + new Offset(this.geometry.paintExtent, 0.0f);
                addExtent     = true;
                break;
            }

            RenderBox child = this.firstChild;

            while (child != null)
            {
                float  mainAxisDelta  = this.childMainAxisPosition(child);
                float  crossAxisDelta = this.childCrossAxisPosition(child);
                Offset childOffset    = new Offset(
                    originOffset.dx + mainAxisUnit.dx * mainAxisDelta + crossAxisUnit.dx * crossAxisDelta,
                    originOffset.dy + mainAxisUnit.dy * mainAxisDelta + crossAxisUnit.dy * crossAxisDelta
                    );
                if (addExtent)
                {
                    childOffset += mainAxisUnit * this.paintExtentOf(child);
                }

                if (mainAxisDelta < this.constraints.remainingPaintExtent &&
                    mainAxisDelta + this.paintExtentOf(child) > 0)
                {
                    context.paintChild(child, childOffset);
                }

                child = this.childAfter(child);
            }
        }
Exemplo n.º 7
0
        protected override void performLayout()
        {
            float beforePadding    = this.beforePadding;
            float afterPadding     = this.afterPadding;
            float mainAxisPadding  = this.mainAxisPadding;
            float crossAxisPadding = this.crossAxisPadding;

            if (this.child == null)
            {
                this.geometry = new SliverGeometry(
                    scrollExtent: mainAxisPadding,
                    paintExtent: Mathf.Min(mainAxisPadding, this.constraints.remainingPaintExtent),
                    maxPaintExtent: mainAxisPadding
                    );
                return;
            }

            this.child.layout(
                this.constraints.copyWith(
                    scrollOffset: Mathf.Max(0.0f, this.constraints.scrollOffset - beforePadding),
                    cacheOrigin: Mathf.Min(0.0f, this.constraints.cacheOrigin + beforePadding),
                    overlap: 0.0f,
                    remainingPaintExtent: this.constraints.remainingPaintExtent -
                    this.calculatePaintOffset(this.constraints, from: 0.0f, to: beforePadding),
                    remainingCacheExtent: this.constraints.remainingCacheExtent -
                    this.calculateCacheOffset(this.constraints, from: 0.0f, to: beforePadding),
                    crossAxisExtent: Mathf.Max(0.0f, this.constraints.crossAxisExtent - crossAxisPadding)
                    ),
                parentUsesSize: true
                );

            SliverGeometry childLayoutGeometry = this.child.geometry;

            if (childLayoutGeometry.scrollOffsetCorrection != null)
            {
                this.geometry = new SliverGeometry(
                    scrollOffsetCorrection: childLayoutGeometry.scrollOffsetCorrection
                    );
                return;
            }

            float beforePaddingPaintExtent = this.calculatePaintOffset(
                this.constraints,
                from: 0.0f,
                to: beforePadding
                );

            float afterPaddingPaintExtent = this.calculatePaintOffset(
                this.constraints,
                from: beforePadding + childLayoutGeometry.scrollExtent,
                to: mainAxisPadding + childLayoutGeometry.scrollExtent
                );

            float mainAxisPaddingPaintExtent = beforePaddingPaintExtent + afterPaddingPaintExtent;
            float beforePaddingCacheExtent   = this.calculateCacheOffset(
                this.constraints,
                from: 0.0f,
                to: beforePadding
                );
            float afterPaddingCacheExtent = this.calculateCacheOffset(
                this.constraints,
                from: beforePadding + childLayoutGeometry.scrollExtent,
                to: mainAxisPadding + childLayoutGeometry.scrollExtent
                );

            float mainAxisPaddingCacheExtent = afterPaddingCacheExtent + beforePaddingCacheExtent;
            float paintExtent = Mathf.Min(
                beforePaddingPaintExtent + Mathf.Max(childLayoutGeometry.paintExtent,
                                                     childLayoutGeometry.layoutExtent + afterPaddingPaintExtent),
                this.constraints.remainingPaintExtent
                );

            this.geometry = new SliverGeometry(
                scrollExtent: mainAxisPadding + childLayoutGeometry.scrollExtent,
                paintExtent: paintExtent,
                layoutExtent: Mathf.Min(mainAxisPaddingPaintExtent + childLayoutGeometry.layoutExtent,
                                        paintExtent),
                cacheExtent: Mathf.Min(mainAxisPaddingCacheExtent + childLayoutGeometry.cacheExtent,
                                       this.constraints.remainingCacheExtent),
                maxPaintExtent: mainAxisPadding + childLayoutGeometry.maxPaintExtent,
                hitTestExtent: Mathf.Max(
                    mainAxisPaddingPaintExtent + childLayoutGeometry.paintExtent,
                    beforePaddingPaintExtent + childLayoutGeometry.hitTestExtent
                    ),
                hasVisualOverflow: childLayoutGeometry.hasVisualOverflow
                );

            var childParentData = (SliverPhysicalParentData)this.child.parentData;

            switch (GrowthDirectionUtils.applyGrowthDirectionToAxisDirection(this.constraints.axisDirection,
                                                                             this.constraints.growthDirection))
            {
            case AxisDirection.up:
                childParentData.paintOffset = new Offset(this._padding.left,
                                                         this.calculatePaintOffset(this.constraints,
                                                                                   from: this._padding.bottom + childLayoutGeometry.scrollExtent,
                                                                                   to: this._padding.bottom + childLayoutGeometry.scrollExtent + this._padding.top));
                break;

            case AxisDirection.right:
                childParentData.paintOffset =
                    new Offset(this.calculatePaintOffset(this.constraints, from: 0.0f, to: this._padding.left),
                               this._padding.top);
                break;

            case AxisDirection.down:
                childParentData.paintOffset = new Offset(this._padding.left,
                                                         this.calculatePaintOffset(this.constraints, from: 0.0f, to: this._padding.top));
                break;

            case AxisDirection.left:
                childParentData.paintOffset = new Offset(
                    this.calculatePaintOffset(this.constraints,
                                              from: this._padding.right + childLayoutGeometry.scrollExtent,
                                              to: this._padding.right + childLayoutGeometry.scrollExtent + this._padding.left),
                    this._padding.top);
                break;
            }

            D.assert(childParentData.paintOffset != null);
            D.assert(beforePadding == this.beforePadding);
            D.assert(afterPadding == this.afterPadding);
            D.assert(mainAxisPadding == this.mainAxisPadding);
            D.assert(crossAxisPadding == this.crossAxisPadding);
        }