您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
157 行
4.9 KiB
157 行
4.9 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.ui;
|
|
using TextStyle = Unity.UIWidgets.painting.TextStyle;
|
|
|
|
namespace Unity.UIWidgets.widgets {
|
|
class WidgetSpan : PlaceholderSpan,IEquatable<WidgetSpan> {
|
|
public WidgetSpan(
|
|
Widget child ,
|
|
TextBaseline baseline = TextBaseline.alphabetic,
|
|
TextStyle style = null,
|
|
PlaceholderAlignment alignment = PlaceholderAlignment.bottom
|
|
) : base(
|
|
alignment: alignment,
|
|
baseline: baseline,
|
|
style: style
|
|
) {
|
|
D.assert(child != null);
|
|
D.assert(baseline != null ||!(
|
|
(alignment == PlaceholderAlignment.aboveBaseline) ||
|
|
(alignment == PlaceholderAlignment.belowBaseline) ||
|
|
(alignment == PlaceholderAlignment.baseline)
|
|
));
|
|
this.child = child;
|
|
}
|
|
|
|
public readonly Widget child;
|
|
|
|
public override void build(
|
|
ParagraphBuilder builder,
|
|
float textScaleFactor = 1.0f,
|
|
List<PlaceholderDimensions> dimensions = null) {
|
|
D.assert(DebugAssertIsValid());
|
|
D.assert(dimensions != null);
|
|
bool hasStyle = style != null;
|
|
if (hasStyle) {
|
|
builder.pushStyle(style.getTextStyle(textScaleFactor: textScaleFactor));
|
|
}
|
|
|
|
D.assert(builder.placeholderCount < dimensions.Count);
|
|
PlaceholderDimensions currentDimensions = dimensions[builder.placeholderCount];
|
|
builder.addPlaceholder(
|
|
currentDimensions.size.width,
|
|
currentDimensions.size.height,
|
|
alignment,
|
|
scale: textScaleFactor,
|
|
baseline: currentDimensions.baseline,
|
|
baselineOffset: currentDimensions.baselineOffset
|
|
);
|
|
if (hasStyle) {
|
|
builder.pop();
|
|
}
|
|
}
|
|
|
|
|
|
public override bool visitChildren(InlineSpanVisitor visitor) {
|
|
return visitor(this);
|
|
}
|
|
|
|
|
|
protected override InlineSpan getSpanForPositionVisitor(TextPosition position, Accumulator offset) {
|
|
if (position.offset == offset.value) {
|
|
return this;
|
|
}
|
|
|
|
offset.increment(1);
|
|
return null;
|
|
}
|
|
|
|
protected override int? codeUnitAtVisitor(int index, Accumulator offset) {
|
|
return null;
|
|
}
|
|
|
|
public override RenderComparison compareTo(InlineSpan other) {
|
|
if (this == other)
|
|
return RenderComparison.identical;
|
|
if (other.GetType() != GetType())
|
|
return RenderComparison.layout;
|
|
if ((style == null) != (other.style == null))
|
|
return RenderComparison.layout;
|
|
WidgetSpan typedOther = other as WidgetSpan;
|
|
if (!child.Equals(typedOther.child) || alignment != typedOther.alignment) {
|
|
return RenderComparison.layout;
|
|
}
|
|
|
|
RenderComparison result = RenderComparison.identical;
|
|
if (style != null) {
|
|
RenderComparison candidate = style.compareTo(other.style);
|
|
if ((int) candidate > (int) result)
|
|
result = candidate;
|
|
if (result == RenderComparison.layout)
|
|
return result;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public override int GetHashCode() {
|
|
unchecked
|
|
{
|
|
return (base.GetHashCode() * 397) ^ (child != null ? child.GetHashCode() : 0);
|
|
}
|
|
}
|
|
|
|
public bool DebugAssertIsValid() {
|
|
return true;
|
|
}
|
|
|
|
public bool Equals(WidgetSpan other)
|
|
{
|
|
if (ReferenceEquals(null, other)) {
|
|
return false;
|
|
}
|
|
|
|
if (ReferenceEquals(this, other)) {
|
|
return true;
|
|
}
|
|
|
|
return base.Equals(other) && Equals(child, other.child);
|
|
}
|
|
|
|
public override bool Equals(object obj)
|
|
{
|
|
if (ReferenceEquals(null, obj)) {
|
|
return false;
|
|
}
|
|
|
|
if (ReferenceEquals(this, obj)) {
|
|
return true;
|
|
}
|
|
|
|
if (obj.GetType() != GetType()) {
|
|
return false;
|
|
}
|
|
|
|
return Equals((WidgetSpan) obj);
|
|
}
|
|
public static bool operator ==(WidgetSpan left, WidgetSpan right) {
|
|
return Equals(left, right);
|
|
}
|
|
|
|
public static bool operator !=(WidgetSpan left, WidgetSpan right) {
|
|
return !Equals(left, right);
|
|
}
|
|
|
|
public override InlineSpan getSpanForPosition(TextPosition position) {
|
|
D.assert(debugAssertIsValid());
|
|
return null;
|
|
}
|
|
|
|
public override bool debugAssertIsValid() {
|
|
return true;
|
|
}
|
|
}
|
|
}
|