您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
370 行
14 KiB
370 行
14 KiB
using System.Collections.Generic;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.rendering;
|
|
|
|
namespace Unity.UIWidgets.widgets {
|
|
public abstract class SliverPersistentHeaderDelegate {
|
|
public SliverPersistentHeaderDelegate() {
|
|
}
|
|
|
|
public abstract Widget build(BuildContext context, float shrinkOffset, bool overlapsContent);
|
|
|
|
public abstract float? minExtent { get; }
|
|
|
|
public abstract float? maxExtent { get; }
|
|
|
|
public virtual FloatingHeaderSnapConfiguration snapConfiguration {
|
|
get { return null; }
|
|
}
|
|
|
|
public abstract bool shouldRebuild(SliverPersistentHeaderDelegate oldDelegate);
|
|
}
|
|
|
|
public class SliverPersistentHeader : StatelessWidget {
|
|
public SliverPersistentHeader(
|
|
Key key = null,
|
|
SliverPersistentHeaderDelegate del = null,
|
|
bool pinned = false,
|
|
bool floating = false
|
|
) : base(key: key) {
|
|
D.assert(del != null);
|
|
this.layoutDelegate = del;
|
|
this.pinned = pinned;
|
|
this.floating = floating;
|
|
}
|
|
|
|
public readonly SliverPersistentHeaderDelegate layoutDelegate;
|
|
|
|
public readonly bool pinned;
|
|
|
|
public readonly bool floating;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
if (this.floating && this.pinned) {
|
|
return new _SliverFloatingPinnedPersistentHeader(layoutDelegate: this.layoutDelegate);
|
|
}
|
|
|
|
if (this.pinned) {
|
|
return new _SliverPinnedPersistentHeader(layoutDelegate: this.layoutDelegate);
|
|
}
|
|
|
|
if (this.floating) {
|
|
return new _SliverFloatingPersistentHeader(layoutDelegate: this.layoutDelegate);
|
|
}
|
|
|
|
return new _SliverScrollingPersistentHeader(layoutDelegate: this.layoutDelegate);
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
base.debugFillProperties(properties);
|
|
properties.add(new DiagnosticsProperty<SliverPersistentHeaderDelegate>("layoutDelegate", this.layoutDelegate));
|
|
List<string> flags = new List<string> { };
|
|
if (this.pinned) {
|
|
flags.Add("pinned");
|
|
}
|
|
|
|
if (this.floating) {
|
|
flags.Add("floating");
|
|
}
|
|
|
|
if (flags.isEmpty()) {
|
|
flags.Add("normal");
|
|
}
|
|
|
|
properties.add(new EnumerableProperty<string>("mode", flags));
|
|
}
|
|
}
|
|
|
|
class _SliverPersistentHeaderElement : RenderObjectElement {
|
|
public _SliverPersistentHeaderElement(_SliverPersistentHeaderRenderObjectWidget widget) : base(widget) {
|
|
}
|
|
|
|
public new _SliverPersistentHeaderRenderObjectWidget widget {
|
|
get { return (_SliverPersistentHeaderRenderObjectWidget) base.widget; }
|
|
}
|
|
|
|
public override RenderObject renderObject {
|
|
get { return base.renderObject; }
|
|
}
|
|
|
|
public override void mount(Element parent, object newSlot) {
|
|
base.mount(parent, newSlot);
|
|
(this.renderObject as _RenderSliverPersistentHeaderForWidgetsMixin)._element = this;
|
|
}
|
|
|
|
public override void unmount() {
|
|
base.unmount();
|
|
(this.renderObject as _RenderSliverPersistentHeaderForWidgetsMixin)._element = null;
|
|
}
|
|
|
|
public override void update(Widget _newWidget) {
|
|
base.update(_newWidget);
|
|
_SliverPersistentHeaderRenderObjectWidget newWidget =
|
|
_newWidget as _SliverPersistentHeaderRenderObjectWidget;
|
|
_SliverPersistentHeaderRenderObjectWidget oldWidget = this.widget;
|
|
SliverPersistentHeaderDelegate newDelegate = newWidget.layoutDelegate;
|
|
SliverPersistentHeaderDelegate oldDelegate = oldWidget.layoutDelegate;
|
|
if (newDelegate != oldDelegate &&
|
|
(newDelegate.GetType() != oldDelegate.GetType() || newDelegate.shouldRebuild(oldDelegate))) {
|
|
(this.renderObject as _RenderSliverPersistentHeaderForWidgetsMixin).triggerRebuild();
|
|
}
|
|
}
|
|
|
|
protected override void performRebuild() {
|
|
base.performRebuild();
|
|
(this.renderObject as _RenderSliverPersistentHeaderForWidgetsMixin).triggerRebuild();
|
|
}
|
|
|
|
Element child;
|
|
|
|
public void _build(float shrinkOffset, bool overlapsContent) {
|
|
this.owner.buildScope(this,
|
|
() => {
|
|
this.child = this.updateChild(this.child,
|
|
this.widget.layoutDelegate.build(this, shrinkOffset, overlapsContent), null);
|
|
});
|
|
}
|
|
|
|
protected override void forgetChild(Element child) {
|
|
D.assert(child == this.child);
|
|
this.child = null;
|
|
}
|
|
|
|
protected override void insertChildRenderObject(RenderObject child, object slot) {
|
|
D.assert((bool) (this.renderObject as RenderSliverPersistentHeader).debugValidateChild(child));
|
|
(this.renderObject as RenderSliverPersistentHeader).child = (RenderBox) child;
|
|
}
|
|
|
|
protected override void moveChildRenderObject(RenderObject child, object slot) {
|
|
D.assert(false);
|
|
}
|
|
|
|
protected override void removeChildRenderObject(RenderObject child) {
|
|
(this.renderObject as RenderSliverPersistentHeader).child = null;
|
|
}
|
|
|
|
public override void visitChildren(ElementVisitor visitor) {
|
|
if (this.child != null) {
|
|
visitor(this.child);
|
|
}
|
|
}
|
|
}
|
|
|
|
abstract class _SliverPersistentHeaderRenderObjectWidget : RenderObjectWidget {
|
|
public _SliverPersistentHeaderRenderObjectWidget(
|
|
Key key = null,
|
|
SliverPersistentHeaderDelegate layoutDelegate = null
|
|
) : base(key: key) {
|
|
D.assert(layoutDelegate != null);
|
|
this.layoutDelegate = layoutDelegate;
|
|
}
|
|
|
|
public readonly SliverPersistentHeaderDelegate layoutDelegate;
|
|
|
|
public override Element createElement() {
|
|
return new _SliverPersistentHeaderElement(this);
|
|
}
|
|
|
|
public abstract override RenderObject createRenderObject(BuildContext context);
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder description) {
|
|
base.debugFillProperties(description);
|
|
description.add(new DiagnosticsProperty<SliverPersistentHeaderDelegate>("layoutDelegate", this.layoutDelegate));
|
|
}
|
|
}
|
|
|
|
interface _RenderSliverPersistentHeaderForWidgetsMixin {
|
|
_SliverPersistentHeaderElement _element { get; set; }
|
|
|
|
float? minExtent { get; }
|
|
|
|
float? maxExtent { get; }
|
|
|
|
void triggerRebuild();
|
|
}
|
|
|
|
class _SliverScrollingPersistentHeader : _SliverPersistentHeaderRenderObjectWidget {
|
|
public _SliverScrollingPersistentHeader(
|
|
Key key = null,
|
|
SliverPersistentHeaderDelegate layoutDelegate = null
|
|
) : base(key: key, layoutDelegate: layoutDelegate) {
|
|
}
|
|
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
return new _RenderSliverScrollingPersistentHeaderForWidgets();
|
|
}
|
|
}
|
|
|
|
abstract class _RenderSliverScrollingPersistentHeader : RenderSliverScrollingPersistentHeader {
|
|
}
|
|
|
|
class _RenderSliverScrollingPersistentHeaderForWidgets : _RenderSliverScrollingPersistentHeader,
|
|
_RenderSliverPersistentHeaderForWidgetsMixin {
|
|
public _SliverPersistentHeaderElement _element {
|
|
get { return this._ele; }
|
|
set { this._ele = value; }
|
|
}
|
|
|
|
_SliverPersistentHeaderElement _ele;
|
|
|
|
public override float? minExtent {
|
|
get { return this._element.widget.layoutDelegate.minExtent; }
|
|
}
|
|
|
|
public override float? maxExtent {
|
|
get { return this._element.widget.layoutDelegate.maxExtent; }
|
|
}
|
|
|
|
protected override void updateChild(float shrinkOffset, bool overlapsContent) {
|
|
D.assert(this._element != null);
|
|
this._element._build(shrinkOffset, overlapsContent);
|
|
}
|
|
|
|
public void triggerRebuild() {
|
|
this.markNeedsLayout();
|
|
}
|
|
}
|
|
|
|
class _SliverPinnedPersistentHeader : _SliverPersistentHeaderRenderObjectWidget {
|
|
public _SliverPinnedPersistentHeader(
|
|
Key key = null,
|
|
SliverPersistentHeaderDelegate layoutDelegate = null
|
|
) : base(key: key, layoutDelegate: layoutDelegate) {
|
|
}
|
|
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
return new _RenderSliverPinnedPersistentHeaderForWidgets();
|
|
}
|
|
}
|
|
|
|
abstract class _RenderSliverPinnedPersistentHeader : RenderSliverPinnedPersistentHeader {
|
|
}
|
|
|
|
class _RenderSliverPinnedPersistentHeaderForWidgets : _RenderSliverPinnedPersistentHeader,
|
|
_RenderSliverPersistentHeaderForWidgetsMixin {
|
|
public _SliverPersistentHeaderElement _element {
|
|
get { return this._ele; }
|
|
set { this._ele = value; }
|
|
}
|
|
|
|
_SliverPersistentHeaderElement _ele;
|
|
|
|
public override float? minExtent {
|
|
get { return this._element.widget.layoutDelegate.minExtent; }
|
|
}
|
|
|
|
public override float? maxExtent {
|
|
get { return this._element.widget.layoutDelegate.maxExtent; }
|
|
}
|
|
|
|
protected override void updateChild(float shrinkOffset, bool overlapsContent) {
|
|
D.assert(this._element != null);
|
|
this._element._build(shrinkOffset, overlapsContent);
|
|
}
|
|
|
|
public void triggerRebuild() {
|
|
this.markNeedsLayout();
|
|
}
|
|
}
|
|
|
|
class _SliverFloatingPersistentHeader : _SliverPersistentHeaderRenderObjectWidget {
|
|
public _SliverFloatingPersistentHeader(
|
|
Key key = null,
|
|
SliverPersistentHeaderDelegate layoutDelegate = null
|
|
) : base(key: key, layoutDelegate: layoutDelegate) {
|
|
}
|
|
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
_RenderSliverFloatingPersistentHeaderForWidgets ret = new _RenderSliverFloatingPersistentHeaderForWidgets();
|
|
ret.snapConfiguration = this.layoutDelegate.snapConfiguration;
|
|
return ret;
|
|
}
|
|
|
|
public override void updateRenderObject(BuildContext context, RenderObject _renderObject) {
|
|
_RenderSliverFloatingPersistentHeaderForWidgets renderObject =
|
|
_renderObject as _RenderSliverFloatingPersistentHeaderForWidgets;
|
|
renderObject.snapConfiguration = this.layoutDelegate.snapConfiguration;
|
|
}
|
|
}
|
|
|
|
abstract class _RenderSliverFloatingPinnedPersistentHeader : RenderSliverFloatingPinnedPersistentHeader {
|
|
}
|
|
|
|
class _RenderSliverFloatingPinnedPersistentHeaderForWidgets : _RenderSliverFloatingPinnedPersistentHeader,
|
|
_RenderSliverPersistentHeaderForWidgetsMixin {
|
|
public _SliverPersistentHeaderElement _element {
|
|
get { return this._ele; }
|
|
set { this._ele = value; }
|
|
}
|
|
|
|
_SliverPersistentHeaderElement _ele;
|
|
|
|
public override float? minExtent {
|
|
get { return this._element.widget.layoutDelegate.minExtent; }
|
|
}
|
|
|
|
public override float? maxExtent {
|
|
get { return this._element.widget.layoutDelegate.maxExtent; }
|
|
}
|
|
|
|
protected override void updateChild(float shrinkOffset, bool overlapsContent) {
|
|
D.assert(this._element != null);
|
|
this._element._build(shrinkOffset, overlapsContent);
|
|
}
|
|
|
|
public void triggerRebuild() {
|
|
this.markNeedsLayout();
|
|
}
|
|
}
|
|
|
|
class _SliverFloatingPinnedPersistentHeader : _SliverPersistentHeaderRenderObjectWidget {
|
|
public _SliverFloatingPinnedPersistentHeader(
|
|
Key key = null,
|
|
SliverPersistentHeaderDelegate layoutDelegate = null
|
|
) : base(key: key, layoutDelegate: layoutDelegate) {
|
|
}
|
|
|
|
public override RenderObject createRenderObject(BuildContext context) {
|
|
_RenderSliverFloatingPinnedPersistentHeaderForWidgets ret =
|
|
new _RenderSliverFloatingPinnedPersistentHeaderForWidgets();
|
|
ret.snapConfiguration = this.layoutDelegate.snapConfiguration;
|
|
return ret;
|
|
}
|
|
|
|
public override void updateRenderObject(BuildContext context, RenderObject _renderObject) {
|
|
_RenderSliverFloatingPinnedPersistentHeaderForWidgets renderObject =
|
|
_renderObject as _RenderSliverFloatingPinnedPersistentHeaderForWidgets;
|
|
renderObject.snapConfiguration = this.layoutDelegate.snapConfiguration;
|
|
}
|
|
}
|
|
|
|
abstract class _RenderSliverFloatingPersistentHeader : RenderSliverFloatingPersistentHeader {
|
|
}
|
|
|
|
class _RenderSliverFloatingPersistentHeaderForWidgets : _RenderSliverFloatingPersistentHeader,
|
|
_RenderSliverPersistentHeaderForWidgetsMixin {
|
|
public _SliverPersistentHeaderElement _element {
|
|
get { return this._ele; }
|
|
set { this._ele = value; }
|
|
}
|
|
|
|
_SliverPersistentHeaderElement _ele;
|
|
|
|
public override float? minExtent {
|
|
get { return this._element.widget.layoutDelegate.minExtent; }
|
|
}
|
|
|
|
public override float? maxExtent {
|
|
get { return this._element.widget.layoutDelegate.maxExtent; }
|
|
}
|
|
|
|
protected override void updateChild(float shrinkOffset, bool overlapsContent) {
|
|
D.assert(this._element != null);
|
|
this._element._build(shrinkOffset, overlapsContent);
|
|
}
|
|
|
|
public void triggerRebuild() {
|
|
this.markNeedsLayout();
|
|
}
|
|
}
|
|
}
|