您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

164 行
6.4 KiB

using System;
using System.Collections.Generic;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.rendering;
using Unity.UIWidgets.ui;
using UnityEngine;
namespace Unity.UIWidgets.widgets {
public class NavigationToolbar : StatelessWidget {
public NavigationToolbar(Key key = null, Widget leading = null, Widget middle = null,
Widget trailing = null, bool centerMiddle = true, float middleSpacing = kMiddleSpacing) : base(key) {
this.leading = leading;
this.middle = middle;
this.trailing = trailing;
this.centerMiddle = centerMiddle;
this.middleSpacing = middleSpacing;
}
public const float kMiddleSpacing = 16.0f;
public readonly Widget leading;
public readonly Widget middle;
public readonly Widget trailing;
public readonly bool centerMiddle;
public readonly float middleSpacing;
public override Widget build(BuildContext context) {
D.assert(WidgetsD.debugCheckHasDirectionality(context));
List<Widget> children = new List<Widget>();
if (this.leading != null) {
children.Add(new LayoutId(id: _ToolbarSlot.leading, child: this.leading));
}
if (this.middle != null) {
children.Add(new LayoutId(id: _ToolbarSlot.middle, child: this.middle));
}
if (this.trailing != null) {
children.Add(new LayoutId(id: _ToolbarSlot.trailing, child: this.trailing));
}
TextDirection textDirection = Directionality.of(context);
return new CustomMultiChildLayout(
layoutDelegate: new _ToolbarLayout(
centerMiddle: this.centerMiddle,
middleSpacing: this.middleSpacing,
textDirection: textDirection
),
children: children
);
}
}
enum _ToolbarSlot {
leading,
middle,
trailing,
}
class _ToolbarLayout : MultiChildLayoutDelegate {
public _ToolbarLayout(
bool? centerMiddle = true,
float? middleSpacing = null,
TextDirection? textDirection = null
) {
D.assert(textDirection != null);
D.assert(middleSpacing != null);
this.centerMiddle = centerMiddle ?? true;
this.middleSpacing = middleSpacing ?? 0.0f;
this.textDirection = textDirection ?? TextDirection.ltr;
}
public readonly bool centerMiddle;
public readonly float middleSpacing;
public readonly TextDirection textDirection;
public override void performLayout(Size size) {
float leadingWidth = 0.0f;
float trailingWidth = 0.0f;
if (this.hasChild(_ToolbarSlot.leading)) {
BoxConstraints constraints = new BoxConstraints(
minWidth: 0.0f,
maxWidth: size.width / 3.0f,
minHeight: size.height,
maxHeight: size.height
);
leadingWidth = this.layoutChild(_ToolbarSlot.leading, constraints).width;
float leadingX = 0.0f;
switch (this.textDirection) {
case TextDirection.rtl:
leadingX = size.width - leadingWidth;
break;
case TextDirection.ltr:
leadingX = 0.0f;
break;
}
this.positionChild(_ToolbarSlot.leading, new Offset(leadingX, 0.0f));
}
if (this.hasChild(_ToolbarSlot.trailing)) {
BoxConstraints constraints = BoxConstraints.loose(size);
Size trailingSize = this.layoutChild(_ToolbarSlot.trailing, constraints);
float trailingX = 0.0f;
switch (this.textDirection) {
case TextDirection.rtl:
trailingX = 0.0f;
break;
case TextDirection.ltr:
trailingX = size.width - trailingSize.width;
break;
}
float trailingY = (size.height - trailingSize.height) / 2.0f;
trailingWidth = trailingSize.width;
this.positionChild(_ToolbarSlot.trailing, new Offset(trailingX, trailingY));
}
if (this.hasChild(_ToolbarSlot.middle)) {
float maxWidth = Mathf.Max(size.width - leadingWidth - trailingWidth - this.middleSpacing * 2.0f, 0.0f);
BoxConstraints constraints = BoxConstraints.loose(size).copyWith(maxWidth: maxWidth);
Size middleSize = this.layoutChild(_ToolbarSlot.middle, constraints);
float middleStartMargin = leadingWidth + this.middleSpacing;
float middleStart = middleStartMargin;
float middleY = (size.height - middleSize.height) / 2.0f;
// If the centered middle will not fit between the leading and trailing
// widgets, then align its left or right edge with the adjacent boundary.
if (this.centerMiddle) {
middleStart = (size.width - middleSize.width) / 2.0f;
if (middleStart + middleSize.width > size.width - trailingWidth) {
middleStart = size.width - trailingWidth - middleSize.width;
}
else if (middleStart < middleStartMargin) {
middleStart = middleStartMargin;
}
}
float middleX = 0.0f;
switch (this.textDirection) {
case TextDirection.rtl:
middleX = size.width - middleSize.width - middleStart;
break;
case TextDirection.ltr:
middleX = middleStart;
break;
}
this.positionChild(_ToolbarSlot.middle, new Offset(middleX, middleY));
}
}
public override bool shouldRelayout(MultiChildLayoutDelegate oldDelegate) {
return ((_ToolbarLayout) oldDelegate).centerMiddle != this.centerMiddle
|| ((_ToolbarLayout) oldDelegate).middleSpacing != this.middleSpacing
|| ((_ToolbarLayout) oldDelegate).textDirection != this.textDirection;
}
}
}