您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
239 行
8.0 KiB
239 行
8.0 KiB
using System;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.ui;
|
|
using UnityEngine;
|
|
using Canvas = Unity.UIWidgets.ui.Canvas;
|
|
using Color = Unity.UIWidgets.ui.Color;
|
|
using Rect = Unity.UIWidgets.ui.Rect;
|
|
using TextStyle = Unity.UIWidgets.painting.TextStyle;
|
|
|
|
namespace Unity.UIWidgets.widgets {
|
|
class BannerConstants {
|
|
public const float _kOffset = 40.0f;
|
|
public const float _kHeight = 12.0f;
|
|
public const float _kBottomOffset = _kOffset + 0.707f * _kHeight;
|
|
public static readonly Rect _kRect = Rect.fromLTWH(-_kOffset, _kOffset - _kHeight, _kOffset * 2.0f, _kHeight);
|
|
|
|
public static readonly Color _kColor = new Color(0xA0B71C1C);
|
|
|
|
public static readonly TextStyle _kTextStyle = new TextStyle(
|
|
color: new Color(0xFFFFFFFF),
|
|
fontSize: _kHeight * 0.85f,
|
|
fontWeight: FontWeight.w700,
|
|
height: 1.0f
|
|
);
|
|
}
|
|
|
|
public enum BannerLocation {
|
|
topStart,
|
|
|
|
topEnd,
|
|
|
|
bottomStart,
|
|
|
|
bottomEnd,
|
|
}
|
|
|
|
public class BannerPainter : AbstractCustomPainter {
|
|
public BannerPainter(
|
|
string message,
|
|
BannerLocation? location,
|
|
Color color = null,
|
|
TextStyle textStyle = null
|
|
) {
|
|
D.assert(message != null);
|
|
D.assert(location != null);
|
|
this.color = color ?? BannerConstants._kColor;
|
|
this.message = message;
|
|
this.location = location;
|
|
this.textStyle = textStyle ?? BannerConstants._kTextStyle;
|
|
}
|
|
|
|
public readonly string message;
|
|
|
|
public readonly BannerLocation? location;
|
|
|
|
public readonly Color color;
|
|
|
|
public readonly TextStyle textStyle;
|
|
|
|
readonly BoxShadow _shadow = new BoxShadow(
|
|
color: new Color(0x7F000000),
|
|
blurRadius: 6.0f
|
|
);
|
|
|
|
bool _prepared = false;
|
|
TextPainter _textPainter;
|
|
Paint _paintShadow;
|
|
Paint _paintBanner;
|
|
|
|
void _prepare() {
|
|
this._paintShadow = this._shadow.toPaint();
|
|
this._paintBanner = new Paint();
|
|
this._paintBanner.color = this.color;
|
|
this._textPainter = new TextPainter(
|
|
text: new TextSpan(style: this.textStyle, text: this.message),
|
|
textAlign: TextAlign.center
|
|
);
|
|
this._prepared = true;
|
|
}
|
|
|
|
public override void paint(Canvas canvas, Size size) {
|
|
if (!this._prepared) {
|
|
this._prepare();
|
|
}
|
|
|
|
canvas.translate(this._translationX(size.width), this._translationY(size.height));
|
|
canvas.rotate(this._rotation);
|
|
canvas.drawRect(BannerConstants._kRect, this._paintShadow);
|
|
canvas.drawRect(BannerConstants._kRect, this._paintBanner);
|
|
const float width = BannerConstants._kOffset * 2.0f;
|
|
this._textPainter.layout(minWidth: width, maxWidth: width);
|
|
this._textPainter.paint(canvas,
|
|
BannerConstants._kRect.topLeft + new Offset(0.0f,
|
|
(BannerConstants._kRect.height - this._textPainter.height) / 2.0f));
|
|
}
|
|
|
|
public override bool shouldRepaint(CustomPainter _oldDelegate) {
|
|
BannerPainter oldDelegate = _oldDelegate as BannerPainter;
|
|
return this.message != oldDelegate.message
|
|
|| this.location != oldDelegate.location
|
|
|| this.color != oldDelegate.color
|
|
|| this.textStyle != oldDelegate.textStyle;
|
|
}
|
|
|
|
public override bool? hitTest(Offset position) {
|
|
return false;
|
|
}
|
|
|
|
float _translationX(float width) {
|
|
switch (this.location) {
|
|
case BannerLocation.bottomEnd:
|
|
return width - BannerConstants._kBottomOffset;
|
|
case BannerLocation.topEnd:
|
|
return width;
|
|
case BannerLocation.bottomStart:
|
|
return BannerConstants._kBottomOffset;
|
|
case BannerLocation.topStart:
|
|
return 0.0f;
|
|
default:
|
|
throw new Exception("Unknown location: " + this.location);
|
|
}
|
|
}
|
|
|
|
float _translationY(float height) {
|
|
D.assert(this.location != null);
|
|
switch (this.location) {
|
|
case BannerLocation.bottomStart:
|
|
case BannerLocation.bottomEnd:
|
|
return height - BannerConstants._kBottomOffset;
|
|
case BannerLocation.topStart:
|
|
case BannerLocation.topEnd:
|
|
return 0.0f;
|
|
default:
|
|
throw new Exception("Unknown location: " + this.location);
|
|
}
|
|
}
|
|
|
|
float _rotation {
|
|
get {
|
|
switch (this.location) {
|
|
case BannerLocation.bottomStart:
|
|
case BannerLocation.topEnd:
|
|
return Mathf.PI / 4.0f;
|
|
case BannerLocation.bottomEnd:
|
|
case BannerLocation.topStart:
|
|
return -Mathf.PI / 4.0f;
|
|
default:
|
|
throw new Exception("Unknown location: " + this.location);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public class Banner : StatelessWidget {
|
|
public Banner(
|
|
Key key = null,
|
|
Widget child = null,
|
|
string message = null,
|
|
BannerLocation? location = null,
|
|
Color color = null,
|
|
TextStyle textStyle = null
|
|
) : base(key: key) {
|
|
D.assert(message != null);
|
|
this.child = child;
|
|
this.message = message;
|
|
this.location = location;
|
|
this.color = color ?? BannerConstants._kColor;
|
|
this.textStyle = textStyle ?? BannerConstants._kTextStyle;
|
|
}
|
|
|
|
public readonly Widget child;
|
|
|
|
public readonly string message;
|
|
|
|
public readonly BannerLocation? location;
|
|
|
|
public readonly Color color;
|
|
|
|
public readonly TextStyle textStyle;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
D.assert(WidgetsD.debugCheckHasDirectionality(context));
|
|
return new CustomPaint(
|
|
foregroundPainter: new BannerPainter(
|
|
message: this.message,
|
|
location: this.location,
|
|
color: this.color,
|
|
textStyle: this.textStyle
|
|
),
|
|
child: this.child
|
|
);
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
base.debugFillProperties(properties);
|
|
properties.add(new StringProperty("message", this.message, showName: false));
|
|
properties.add(new EnumProperty<BannerLocation?>("location", this.location));
|
|
properties.add(new DiagnosticsProperty<Color>("color", this.color, showName: false));
|
|
this.textStyle?.debugFillProperties(properties);
|
|
}
|
|
}
|
|
|
|
public class CheckedModeBanner : StatelessWidget {
|
|
public CheckedModeBanner(
|
|
Key key = null,
|
|
Widget child = null
|
|
) : base(key: key) {
|
|
D.assert(child != null);
|
|
this.child = child;
|
|
}
|
|
|
|
|
|
public readonly Widget child;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
Widget result = this.child;
|
|
D.assert(() => {
|
|
result = new Banner(
|
|
child: result,
|
|
message: "DEBUG",
|
|
location: BannerLocation.topEnd
|
|
);
|
|
return true;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
|
|
base.debugFillProperties(properties);
|
|
string message = "disabled";
|
|
D.assert(() => {
|
|
message = "'DEBUG'";
|
|
return true;
|
|
});
|
|
properties.add(DiagnosticsNode.message(message));
|
|
}
|
|
}
|
|
}
|