您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
273 行
9.7 KiB
273 行
9.7 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.ui;
|
|
|
|
namespace Unity.UIWidgets.rendering {
|
|
public class TableBorder : IEquatable<TableBorder> {
|
|
public TableBorder(
|
|
BorderSide top = null,
|
|
BorderSide right = null,
|
|
BorderSide bottom = null,
|
|
BorderSide left = null,
|
|
BorderSide horizontalInside = null,
|
|
BorderSide verticalInside = null
|
|
) {
|
|
this.top = top ?? BorderSide.none;
|
|
this.right = right ?? BorderSide.none;
|
|
this.bottom = bottom ?? BorderSide.none;
|
|
this.left = left ?? BorderSide.none;
|
|
this.horizontalInside = horizontalInside ?? BorderSide.none;
|
|
this.verticalInside = verticalInside ?? BorderSide.none;
|
|
}
|
|
|
|
public static TableBorder all(
|
|
Color color = null,
|
|
float width = 1.0f,
|
|
BorderStyle style = BorderStyle.solid
|
|
) {
|
|
color = color ?? new Color(0xFF000000);
|
|
BorderSide side = new BorderSide(color: color, width: width, style: style);
|
|
return new TableBorder(
|
|
top: side, right: side, bottom: side, left: side, horizontalInside: side, verticalInside: side);
|
|
}
|
|
|
|
public static TableBorder symmetric(
|
|
BorderSide inside = null,
|
|
BorderSide outside = null
|
|
) {
|
|
inside = inside ?? BorderSide.none;
|
|
outside = outside ?? BorderSide.none;
|
|
return new TableBorder(
|
|
top: outside,
|
|
right: outside,
|
|
bottom: outside,
|
|
left: outside,
|
|
horizontalInside: inside,
|
|
verticalInside: inside
|
|
);
|
|
}
|
|
|
|
public readonly BorderSide top;
|
|
|
|
public readonly BorderSide right;
|
|
|
|
public readonly BorderSide bottom;
|
|
|
|
public readonly BorderSide left;
|
|
|
|
public readonly BorderSide horizontalInside;
|
|
|
|
public readonly BorderSide verticalInside;
|
|
|
|
public EdgeInsets dimensions {
|
|
get {
|
|
return EdgeInsets.fromLTRB(this.left.width,
|
|
this.top.width,
|
|
this.right.width,
|
|
this.bottom.width);
|
|
}
|
|
}
|
|
|
|
public bool isUniform {
|
|
get {
|
|
D.assert(this.top != null);
|
|
D.assert(this.right != null);
|
|
D.assert(this.bottom != null);
|
|
D.assert(this.left != null);
|
|
D.assert(this.horizontalInside != null);
|
|
D.assert(this.verticalInside != null);
|
|
|
|
Color topColor = this.top.color;
|
|
if (this.right.color != topColor ||
|
|
this.bottom.color != topColor ||
|
|
this.left.color != topColor ||
|
|
this.horizontalInside.color != topColor ||
|
|
this.verticalInside.color != topColor) {
|
|
return false;
|
|
}
|
|
|
|
float topWidth = this.top.width;
|
|
if (this.right.width != topWidth ||
|
|
this.bottom.width != topWidth ||
|
|
this.left.width != topWidth ||
|
|
this.horizontalInside.width != topWidth ||
|
|
this.verticalInside.width != topWidth) {
|
|
return false;
|
|
}
|
|
|
|
BorderStyle topStyle = this.top.style;
|
|
if (this.right.style != topStyle ||
|
|
this.bottom.style != topStyle ||
|
|
this.left.style != topStyle ||
|
|
this.horizontalInside.style != topStyle ||
|
|
this.verticalInside.style != topStyle) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|
|
|
|
TableBorder scale(float t) {
|
|
return new TableBorder(
|
|
top: this.top.scale(t),
|
|
right: this.right.scale(t),
|
|
bottom: this.bottom.scale(t),
|
|
left: this.left.scale(t),
|
|
horizontalInside: this.horizontalInside.scale(t),
|
|
verticalInside: this.verticalInside.scale(t)
|
|
);
|
|
}
|
|
|
|
public static TableBorder lerp(TableBorder a, TableBorder b, float t) {
|
|
if (a == null && b == null) {
|
|
return null;
|
|
}
|
|
|
|
if (a == null) {
|
|
return b.scale(t);
|
|
}
|
|
|
|
if (b == null) {
|
|
return a.scale(1.0f - t);
|
|
}
|
|
|
|
return new TableBorder(
|
|
top: BorderSide.lerp(a.top, b.top, t),
|
|
right: BorderSide.lerp(a.right, b.right, t),
|
|
bottom: BorderSide.lerp(a.bottom, b.bottom, t),
|
|
left: BorderSide.lerp(a.left, b.left, t),
|
|
horizontalInside: BorderSide.lerp(a.horizontalInside, b.horizontalInside, t),
|
|
verticalInside: BorderSide.lerp(a.verticalInside, b.verticalInside, t)
|
|
);
|
|
}
|
|
|
|
public void paint(Canvas canvas, Rect rect, List<float> rows, List<float> columns) {
|
|
D.assert(this.top != null);
|
|
D.assert(this.right != null);
|
|
D.assert(this.bottom != null);
|
|
D.assert(this.left != null);
|
|
D.assert(this.horizontalInside != null);
|
|
D.assert(this.verticalInside != null);
|
|
|
|
D.assert(canvas != null);
|
|
D.assert(rect != null);
|
|
D.assert(rows != null);
|
|
D.assert(rows.isEmpty() || (rows.First() >= 0.0f && rows.Last() <= rect.height));
|
|
D.assert(columns != null);
|
|
D.assert(columns.isEmpty() || (columns.First() >= 0.0f && columns.Last() <= rect.width));
|
|
|
|
if (columns.isNotEmpty() || rows.isNotEmpty()) {
|
|
Paint paint = new Paint();
|
|
|
|
if (columns.isNotEmpty()) {
|
|
switch (this.verticalInside.style) {
|
|
case BorderStyle.solid: {
|
|
paint.color = this.verticalInside.color;
|
|
paint.strokeWidth = this.verticalInside.width;
|
|
paint.style = PaintingStyle.stroke;
|
|
Path path = new Path();
|
|
|
|
foreach (float x in columns) {
|
|
path.moveTo(rect.left + x, rect.top);
|
|
path.lineTo(rect.left + x, rect.bottom);
|
|
}
|
|
|
|
canvas.drawPath(path, paint);
|
|
break;
|
|
}
|
|
case BorderStyle.none: {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (rows.isNotEmpty()) {
|
|
switch (this.horizontalInside.style) {
|
|
case BorderStyle.solid: {
|
|
paint.color = this.horizontalInside.color;
|
|
paint.strokeWidth = this.horizontalInside.width;
|
|
paint.style = PaintingStyle.stroke;
|
|
Path path = new Path();
|
|
|
|
foreach (float y in rows) {
|
|
path.moveTo(rect.left, rect.top + y);
|
|
path.lineTo(rect.right, rect.top + y);
|
|
}
|
|
|
|
canvas.drawPath(path, paint);
|
|
break;
|
|
}
|
|
case BorderStyle.none: {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
BorderUtils.paintBorder(canvas, rect, top: this.top, right: this.right, bottom: this.bottom,
|
|
left: this.left);
|
|
}
|
|
}
|
|
|
|
public bool Equals(TableBorder other) {
|
|
if (ReferenceEquals(null, other)) {
|
|
return false;
|
|
}
|
|
|
|
if (ReferenceEquals(this, other)) {
|
|
return true;
|
|
}
|
|
|
|
return other.top == this.top &&
|
|
other.right == this.right &&
|
|
other.bottom == this.bottom &&
|
|
other.left == this.left &&
|
|
other.horizontalInside == this.horizontalInside &&
|
|
other.verticalInside == this.verticalInside;
|
|
}
|
|
|
|
public override bool Equals(object obj) {
|
|
if (ReferenceEquals(null, obj)) {
|
|
return false;
|
|
}
|
|
|
|
if (ReferenceEquals(this, obj)) {
|
|
return true;
|
|
}
|
|
|
|
if (obj.GetType() != this.GetType()) {
|
|
return false;
|
|
}
|
|
|
|
return this.Equals((TableBorder) obj);
|
|
}
|
|
|
|
public static bool operator ==(TableBorder left, TableBorder right) {
|
|
return Equals(left, right);
|
|
}
|
|
|
|
public static bool operator !=(TableBorder left, TableBorder right) {
|
|
return !Equals(left, right);
|
|
}
|
|
|
|
public override int GetHashCode() {
|
|
unchecked {
|
|
var hashCode = this.top.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ this.right.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ this.bottom.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ this.left.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ this.horizontalInside.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ this.verticalInside.GetHashCode();
|
|
return hashCode;
|
|
}
|
|
}
|
|
|
|
public override string ToString() {
|
|
return
|
|
$"TableBorder({this.top}, {this.right}, {this.bottom}, {this.left}, {this.horizontalInside}, {this.verticalInside})";
|
|
}
|
|
}
|
|
}
|