您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
311 行
10 KiB
311 行
10 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using Unity.UIWidgets.animation;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.gestures;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.ui;
|
|
|
|
namespace Unity.UIWidgets.rendering
|
|
{
|
|
public abstract class RenderProxySliver : RenderSliver, RenderObjectWithChildMixin<RenderSliver>
|
|
{
|
|
public RenderProxySliver(RenderSliver child = null)
|
|
{
|
|
this.child = child;
|
|
}
|
|
|
|
RenderSliver _child;
|
|
public RenderSliver child
|
|
{
|
|
get { return _child; }
|
|
set
|
|
{
|
|
if (_child != null)
|
|
dropChild(_child);
|
|
_child = value;
|
|
if (_child != null)
|
|
adoptChild(_child);
|
|
}
|
|
}
|
|
public override void setupParentData(RenderObject child)
|
|
{
|
|
if (!(child.parentData is SliverPhysicalParentData))
|
|
child.parentData = new SliverPhysicalParentData();
|
|
}
|
|
|
|
protected override void performLayout()
|
|
{
|
|
D.assert(child != null);
|
|
child.layout(constraints, parentUsesSize: true);
|
|
geometry = child.geometry;
|
|
}
|
|
public override void paint(PaintingContext context, Offset offset)
|
|
{
|
|
if (child != null)
|
|
context.paintChild(child, offset);
|
|
}
|
|
|
|
protected override bool hitTestChildren(SliverHitTestResult result, float mainAxisPosition = 0, float crossAxisPosition = 0)
|
|
{
|
|
return child != null
|
|
&& child.geometry.hitTestExtent > 0
|
|
&& child.hitTest(
|
|
result,
|
|
mainAxisPosition: mainAxisPosition,
|
|
crossAxisPosition: crossAxisPosition);
|
|
}
|
|
public override float? childMainAxisPosition(RenderObject child)
|
|
{
|
|
child = (RenderSliver)child;
|
|
D.assert(child != null);
|
|
D.assert(child == this.child);
|
|
return 0.0f;
|
|
}
|
|
public override void applyPaintTransform(RenderObject child, Matrix4 transform)
|
|
{
|
|
D.assert(child != null);
|
|
SliverPhysicalParentData childParentData = child.parentData as SliverPhysicalParentData;
|
|
childParentData.applyPaintTransform(transform);
|
|
}
|
|
|
|
public bool debugValidateChild(RenderObject child)
|
|
{
|
|
D.assert(() =>
|
|
{
|
|
if (!(child is RenderSliver))
|
|
{
|
|
string result = "";
|
|
result += new ErrorDescription(
|
|
$"A {GetType()} expected a child of type $ChildType but received a " +
|
|
$"child of type {child.GetType()}.");
|
|
result += new ErrorDescription(
|
|
"RenderObjects expect specific types of children because they " +
|
|
"coordinate with their children during layout and paint. For " +
|
|
"example, a RenderSliver cannot be the child of a RenderBox because " +
|
|
"a RenderSliver does not understand the RenderBox layout protocol."
|
|
);
|
|
result += new ErrorSpacer();
|
|
result += new DiagnosticsProperty<dynamic>(
|
|
$"The {GetType()} that expected a $ChildType child was created by",
|
|
debugCreator,
|
|
style: DiagnosticsTreeStyle.errorProperty
|
|
);
|
|
result += new ErrorSpacer();
|
|
result += new DiagnosticsProperty<dynamic>(
|
|
$"The {child.GetType()} that did not match the expected child type " +
|
|
"was created by",
|
|
child.debugCreator,
|
|
style: DiagnosticsTreeStyle.errorProperty
|
|
);
|
|
throw new UIWidgetsError(result);
|
|
}
|
|
|
|
return true;
|
|
});
|
|
return true;
|
|
|
|
}
|
|
|
|
RenderObject RenderObjectWithChildMixin.child
|
|
{
|
|
get { return child; }
|
|
set { child = (RenderSliver)value; }
|
|
}
|
|
}
|
|
public class RenderSliverAnimatedOpacity : RenderAnimatedOpacityMixinRenderSliver<RenderSliver>
|
|
{
|
|
public RenderSliverAnimatedOpacity(
|
|
Animation<float> opacity,
|
|
RenderSliver sliver = null
|
|
)
|
|
{
|
|
D.assert(opacity != null);
|
|
this.opacity = opacity;
|
|
child = sliver;
|
|
}
|
|
}
|
|
public class RenderSliverOpacity : RenderProxySliver
|
|
{
|
|
public RenderSliverOpacity(
|
|
RenderSliver sliver = null,
|
|
float opacity = 1.0f
|
|
) : base(child: sliver)
|
|
{
|
|
D.assert(opacity >= 0.0 && opacity <= 1.0);
|
|
_opacity = opacity;
|
|
_alpha = ui.Color.getAlphaFromOpacity(opacity);
|
|
}
|
|
|
|
|
|
bool alwaysNeedsCompositing
|
|
{
|
|
get { return child != null && (_alpha != 0 && _alpha != 255); }
|
|
}
|
|
int _alpha;
|
|
|
|
public float opacity
|
|
{
|
|
get { return _opacity; }
|
|
set
|
|
{
|
|
D.assert(value >= 0.0 && value <= 1.0);
|
|
if (_opacity == value)
|
|
return;
|
|
bool didNeedCompositing = alwaysNeedsCompositing;
|
|
bool wasVisible = _alpha != 0;
|
|
_opacity = value;
|
|
_alpha = ui.Color.getAlphaFromOpacity(_opacity);
|
|
if (didNeedCompositing != alwaysNeedsCompositing)
|
|
markNeedsCompositingBitsUpdate();
|
|
markNeedsPaint();
|
|
}
|
|
}
|
|
float _opacity;
|
|
|
|
public override void paint(PaintingContext context, Offset offset)
|
|
{
|
|
if (child != null && child.geometry.visible)
|
|
{
|
|
if (_alpha == 0)
|
|
{
|
|
layer = null;
|
|
return;
|
|
}
|
|
if (_alpha == 255)
|
|
{
|
|
layer = null;
|
|
context.paintChild(child, offset);
|
|
return;
|
|
}
|
|
D.assert(needsCompositing);
|
|
layer = context.pushOpacity(
|
|
offset,
|
|
_alpha,
|
|
base.paint,
|
|
oldLayer: layer as OpacityLayer
|
|
);
|
|
}
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties)
|
|
{
|
|
base.debugFillProperties(properties);
|
|
properties.add(new FloatProperty("opacity", opacity));
|
|
}
|
|
}
|
|
|
|
public class RenderSliverIgnorePointer : RenderProxySliver
|
|
{
|
|
public RenderSliverIgnorePointer(
|
|
RenderSliver sliver = null,
|
|
bool ignoring = true
|
|
)
|
|
{
|
|
_ignoring = ignoring;
|
|
child = sliver;
|
|
}
|
|
|
|
|
|
public bool ignoring
|
|
{
|
|
get { return _ignoring; }
|
|
set
|
|
{
|
|
if (value == _ignoring)
|
|
return;
|
|
_ignoring = value;
|
|
}
|
|
}
|
|
bool _ignoring;
|
|
|
|
public override bool hitTest(SliverHitTestResult result, float mainAxisPosition = 0, float crossAxisPosition = 0)
|
|
{
|
|
return !ignoring && base.hitTest(
|
|
result,
|
|
mainAxisPosition: mainAxisPosition,
|
|
crossAxisPosition: crossAxisPosition
|
|
);
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties)
|
|
{
|
|
base.debugFillProperties(properties);
|
|
properties.add(new DiagnosticsProperty<bool>("ignoring", ignoring));
|
|
}
|
|
}
|
|
public class RenderSliverOffstage : RenderProxySliver
|
|
{
|
|
public RenderSliverOffstage(
|
|
RenderSliver sliver = null,
|
|
bool offstage = true) : base(child: sliver)
|
|
{
|
|
_offstage = offstage;
|
|
}
|
|
|
|
public bool offstage
|
|
{
|
|
get { return _offstage; }
|
|
set
|
|
{
|
|
if (value == _offstage)
|
|
return;
|
|
_offstage = value;
|
|
markNeedsLayoutForSizedByParentChange();
|
|
}
|
|
}
|
|
bool _offstage;
|
|
|
|
protected override void performLayout()
|
|
{
|
|
D.assert(child != null);
|
|
child.layout(constraints, parentUsesSize: true);
|
|
if (!offstage)
|
|
geometry = child.geometry;
|
|
else
|
|
geometry = new SliverGeometry(
|
|
scrollExtent: 0.0f,
|
|
visible: false,
|
|
maxPaintExtent: 0.0f);
|
|
}
|
|
public override bool hitTest(SliverHitTestResult result, float mainAxisPosition = 0, float crossAxisPosition = 0)
|
|
{
|
|
return !offstage && base.hitTest(result, mainAxisPosition: mainAxisPosition, crossAxisPosition: crossAxisPosition);
|
|
}
|
|
protected override bool hitTestChildren(SliverHitTestResult result, float mainAxisPosition = 0, float crossAxisPosition = 0)
|
|
{
|
|
return !offstage
|
|
&& child != null
|
|
&& child.geometry.hitTestExtent > 0
|
|
&& child.hitTest(
|
|
result,
|
|
mainAxisPosition: mainAxisPosition,
|
|
crossAxisPosition: crossAxisPosition
|
|
);
|
|
}
|
|
public override void paint(PaintingContext context, Offset offset)
|
|
{
|
|
if (offstage)
|
|
return;
|
|
context.paintChild(child, offset);
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties)
|
|
{
|
|
base.debugFillProperties(properties);
|
|
properties.add(new DiagnosticsProperty<bool>("offstage", offstage));
|
|
}
|
|
public override List<DiagnosticsNode> debugDescribeChildren()
|
|
{
|
|
if (child == null)
|
|
return new List<DiagnosticsNode>();
|
|
return new List<DiagnosticsNode>{
|
|
child.toDiagnosticsNode(
|
|
name: "child",
|
|
style: offstage ? DiagnosticsTreeStyle.offstage : DiagnosticsTreeStyle.sparse
|
|
),
|
|
};
|
|
}
|
|
}
|
|
|
|
}
|