您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
204 行
7.6 KiB
204 行
7.6 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.rendering;
|
|
using Unity.UIWidgets.ui;
|
|
|
|
namespace Unity.UIWidgets.widgets {
|
|
public class SliverFillViewport : StatelessWidget {
|
|
public SliverFillViewport(
|
|
Key key = null,
|
|
SliverChildDelegate _delegate = null,
|
|
float viewportFraction = 1.0f,
|
|
bool padEnds = true
|
|
) : base(key: key) {
|
|
D.assert(viewportFraction > 0.0);
|
|
this._delegate = _delegate;
|
|
this.viewportFraction = viewportFraction;
|
|
this.padEnds = padEnds;
|
|
}
|
|
|
|
public readonly float viewportFraction;
|
|
public readonly bool padEnds;
|
|
public readonly SliverChildDelegate _delegate;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new _SliverFractionalPadding(
|
|
viewportFraction: padEnds ? ((int)(1 - viewportFraction).clamp(0f, 1f) / 2) : 0,
|
|
sliver: new _SliverFillViewportRenderObjectWidget(
|
|
viewportFraction: viewportFraction,
|
|
_delegate: _delegate
|
|
)
|
|
);
|
|
}
|
|
}
|
|
public class _SliverFillViewportRenderObjectWidget : SliverMultiBoxAdaptorWidget {
|
|
public _SliverFillViewportRenderObjectWidget(
|
|
Key key = null,
|
|
SliverChildDelegate _delegate = null,
|
|
float viewportFraction = 1.0f
|
|
) :base(key: key, del: _delegate) {
|
|
D.assert(viewportFraction > 0.0);
|
|
this.viewportFraction = viewportFraction;
|
|
|
|
}
|
|
|
|
public readonly float viewportFraction;
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
SliverMultiBoxAdaptorElement element = context as SliverMultiBoxAdaptorElement;
|
|
return new RenderSliverFillViewport(childManager: element, viewportFraction: viewportFraction);
|
|
}
|
|
public override void updateRenderObject(BuildContext context, RenderObject renderObject) {
|
|
renderObject = (RenderSliverFillViewport) renderObject;
|
|
((RenderSliverFillViewport)renderObject).viewportFraction = viewportFraction;
|
|
}
|
|
}
|
|
public class _SliverFractionalPadding : SingleChildRenderObjectWidget {
|
|
public _SliverFractionalPadding(
|
|
int viewportFraction = 0,
|
|
Widget sliver = null
|
|
) : base(child: sliver) {
|
|
D.assert(viewportFraction >= 0);
|
|
D.assert(viewportFraction <= 0.5);
|
|
this.viewportFraction = viewportFraction;
|
|
}
|
|
|
|
public readonly float viewportFraction;
|
|
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
return new _RenderSliverFractionalPadding(viewportFraction: viewportFraction);
|
|
}
|
|
|
|
public override void updateRenderObject(BuildContext context, RenderObject renderObject) {
|
|
renderObject = (_RenderSliverFractionalPadding) renderObject;
|
|
((_RenderSliverFractionalPadding)renderObject).viewportFraction = viewportFraction;
|
|
}
|
|
}
|
|
public class _RenderSliverFractionalPadding : RenderSliverEdgeInsetsPadding {
|
|
public _RenderSliverFractionalPadding(
|
|
float viewportFraction = 0
|
|
) {
|
|
D.assert(viewportFraction != null);
|
|
D.assert(viewportFraction <= 0.5);
|
|
D.assert(viewportFraction >= 0);
|
|
_viewportFraction = viewportFraction;
|
|
}
|
|
|
|
SliverConstraints _lastResolvedConstraints;
|
|
|
|
public float viewportFraction {
|
|
get {return _viewportFraction; }
|
|
set {
|
|
D.assert(value != null);
|
|
if (_viewportFraction == value)
|
|
return;
|
|
_viewportFraction = value;
|
|
_markNeedsResolution();
|
|
}
|
|
}
|
|
float _viewportFraction;
|
|
|
|
|
|
protected override EdgeInsets resolvedPadding {
|
|
get {
|
|
return _resolvedPadding;
|
|
}
|
|
}
|
|
EdgeInsets _resolvedPadding;
|
|
void _markNeedsResolution() {
|
|
_resolvedPadding = null;
|
|
markNeedsLayout();
|
|
}
|
|
void _resolve() {
|
|
if (_resolvedPadding != null && _lastResolvedConstraints == constraints)
|
|
return;
|
|
|
|
D.assert(constraints.axis != null);
|
|
float paddingValue = constraints.viewportMainAxisExtent * viewportFraction;
|
|
_lastResolvedConstraints = constraints;
|
|
switch (constraints.axis) {
|
|
case Axis.horizontal:
|
|
_resolvedPadding = EdgeInsets.symmetric(horizontal: paddingValue);
|
|
break;
|
|
case Axis.vertical:
|
|
_resolvedPadding = EdgeInsets.symmetric(vertical: paddingValue);
|
|
break;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
protected override void performLayout() {
|
|
_resolve();
|
|
base.performLayout();
|
|
}
|
|
}
|
|
public class SliverFillRemaining : StatelessWidget {
|
|
public SliverFillRemaining(
|
|
Key key = null,
|
|
Widget child = null,
|
|
bool hasScrollBody = true,
|
|
bool fillOverscroll = false) : base(key: key) {
|
|
this.child = child;
|
|
this.hasScrollBody = hasScrollBody;
|
|
this.fillOverscroll = fillOverscroll;
|
|
}
|
|
public readonly Widget child;
|
|
public readonly bool hasScrollBody;
|
|
public readonly bool fillOverscroll;
|
|
public override Widget build(BuildContext context) {
|
|
if (hasScrollBody)
|
|
return new _SliverFillRemainingWithScrollable(child: child);
|
|
if (!fillOverscroll)
|
|
return new _SliverFillRemainingWithoutScrollable(child: child);
|
|
return new _SliverFillRemainingAndOverscroll(child: child);
|
|
}
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
base.debugFillProperties(properties);
|
|
properties.add(new DiagnosticsProperty<Widget>("child", child));
|
|
List<string> flags = new List<string>();
|
|
if (hasScrollBody)
|
|
flags.Add("scrollable");
|
|
if (fillOverscroll)
|
|
flags.Add("fillOverscroll");
|
|
if (flags.isEmpty())
|
|
flags.Add("nonscrollable");
|
|
properties.add(new EnumerableProperty<string>("mode", flags));
|
|
}
|
|
}
|
|
|
|
public class _SliverFillRemainingWithScrollable : SingleChildRenderObjectWidget {
|
|
public _SliverFillRemainingWithScrollable(
|
|
Key key = null,
|
|
Widget child = null) : base(key: key, child: child) {
|
|
}
|
|
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
return new RenderSliverFillRemainingWithScrollable();
|
|
}
|
|
}
|
|
|
|
class _SliverFillRemainingWithoutScrollable : SingleChildRenderObjectWidget {
|
|
public _SliverFillRemainingWithoutScrollable(
|
|
Key key = null,
|
|
Widget child = null) : base(key: key, child: child) {
|
|
}
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
return new RenderSliverFillRemaining();
|
|
}
|
|
}
|
|
class _SliverFillRemainingAndOverscroll : SingleChildRenderObjectWidget {
|
|
public _SliverFillRemainingAndOverscroll(
|
|
Key key = null,
|
|
Widget child = null
|
|
) : base(key: key, child: child) {
|
|
|
|
}
|
|
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
return new RenderSliverFillRemainingAndOverscroll();
|
|
}
|
|
}
|
|
|
|
}
|