您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
475 行
19 KiB
475 行
19 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using Unity.UIWidgets.foundation;
|
|
using Unity.UIWidgets.material;
|
|
using Unity.UIWidgets.painting;
|
|
using Unity.UIWidgets.rendering;
|
|
using Unity.UIWidgets.service;
|
|
using Unity.UIWidgets.ui;
|
|
using Unity.UIWidgets.widgets;
|
|
using UnityEngine;
|
|
using Color = Unity.UIWidgets.ui.Color;
|
|
|
|
namespace UIWidgetsGallery.gallery {
|
|
public class GalleryOptions : IEquatable<GalleryOptions> {
|
|
public GalleryOptions(
|
|
GalleryTheme theme = null,
|
|
GalleryTextScaleValue textScaleFactor = null,
|
|
float timeDilation = 1.0f,
|
|
RuntimePlatform? platform = null,
|
|
bool showOffscreenLayersCheckerboard = false,
|
|
bool showRasterCacheImagesCheckerboard = false,
|
|
bool showPerformanceOverlay = false
|
|
) {
|
|
D.assert(theme != null);
|
|
D.assert(textScaleFactor != null);
|
|
|
|
this.theme = theme;
|
|
this.textScaleFactor = textScaleFactor;
|
|
this.timeDilation = timeDilation;
|
|
this.platform = platform ?? Application.platform;
|
|
this.showOffscreenLayersCheckerboard = showOffscreenLayersCheckerboard;
|
|
this.showRasterCacheImagesCheckerboard = showRasterCacheImagesCheckerboard;
|
|
this.showPerformanceOverlay = showPerformanceOverlay;
|
|
}
|
|
|
|
public readonly GalleryTheme theme;
|
|
public readonly GalleryTextScaleValue textScaleFactor;
|
|
public readonly float timeDilation;
|
|
public readonly RuntimePlatform platform;
|
|
public readonly bool showPerformanceOverlay;
|
|
public readonly bool showRasterCacheImagesCheckerboard;
|
|
public readonly bool showOffscreenLayersCheckerboard;
|
|
|
|
public GalleryOptions copyWith(
|
|
GalleryTheme theme = null,
|
|
GalleryTextScaleValue textScaleFactor = null,
|
|
float? timeDilation = null,
|
|
RuntimePlatform? platform = null,
|
|
bool? showPerformanceOverlay = null,
|
|
bool? showRasterCacheImagesCheckerboard = null,
|
|
bool? showOffscreenLayersCheckerboard = null
|
|
) {
|
|
return new GalleryOptions(
|
|
theme: theme ?? this.theme,
|
|
textScaleFactor: textScaleFactor ?? this.textScaleFactor,
|
|
timeDilation: timeDilation ?? this.timeDilation,
|
|
platform: platform ?? this.platform,
|
|
showPerformanceOverlay: showPerformanceOverlay ?? this.showPerformanceOverlay,
|
|
showOffscreenLayersCheckerboard:
|
|
showOffscreenLayersCheckerboard ?? this.showOffscreenLayersCheckerboard,
|
|
showRasterCacheImagesCheckerboard: showRasterCacheImagesCheckerboard ??
|
|
this.showRasterCacheImagesCheckerboard
|
|
);
|
|
}
|
|
|
|
public bool Equals(GalleryOptions other) {
|
|
if (ReferenceEquals(null, other)) {
|
|
return false;
|
|
}
|
|
if (ReferenceEquals(this, other)) {
|
|
return true;
|
|
}
|
|
return Equals(this.theme, other.theme) && Equals(this.textScaleFactor, other.textScaleFactor) &&
|
|
this.timeDilation.Equals(other.timeDilation) && this.platform == other.platform &&
|
|
this.showPerformanceOverlay == other.showPerformanceOverlay &&
|
|
this.showRasterCacheImagesCheckerboard == other.showRasterCacheImagesCheckerboard &&
|
|
this.showOffscreenLayersCheckerboard == other.showOffscreenLayersCheckerboard;
|
|
}
|
|
|
|
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((GalleryOptions) obj);
|
|
}
|
|
|
|
public override int GetHashCode() {
|
|
unchecked {
|
|
var hashCode = (this.theme != null ? this.theme.GetHashCode() : 0);
|
|
hashCode = (hashCode * 397) ^ (this.textScaleFactor != null ? this.textScaleFactor.GetHashCode() : 0);
|
|
hashCode = (hashCode * 397) ^ this.timeDilation.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ (int) this.platform;
|
|
hashCode = (hashCode * 397) ^ this.showPerformanceOverlay.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ this.showRasterCacheImagesCheckerboard.GetHashCode();
|
|
hashCode = (hashCode * 397) ^ this.showOffscreenLayersCheckerboard.GetHashCode();
|
|
return hashCode;
|
|
}
|
|
}
|
|
|
|
public static bool operator ==(GalleryOptions left, GalleryOptions right) {
|
|
return Equals(left, right);
|
|
}
|
|
|
|
public static bool operator !=(GalleryOptions left, GalleryOptions right) {
|
|
return !Equals(left, right);
|
|
}
|
|
|
|
public override string ToString() {
|
|
return $"{this.GetType()}({this.theme})";
|
|
}
|
|
}
|
|
|
|
class _OptionsItem : StatelessWidget {
|
|
const float _kItemHeight = 48.0f;
|
|
static readonly EdgeInsets _kItemPadding = EdgeInsets.only(left: 56.0f);
|
|
|
|
public _OptionsItem(Key key = null, Widget child = null) : base(key: key) {
|
|
this.child = child;
|
|
}
|
|
|
|
public readonly Widget child;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
float textScaleFactor = MediaQuery.textScaleFactorOf(context);
|
|
|
|
return new Container(
|
|
constraints: new BoxConstraints(minHeight: _kItemHeight * textScaleFactor),
|
|
padding: _kItemPadding,
|
|
alignment: Alignment.centerLeft,
|
|
child: new DefaultTextStyle(
|
|
style: DefaultTextStyle.of(context).style,
|
|
maxLines: 2,
|
|
overflow: TextOverflow.fade,
|
|
child: new IconTheme(
|
|
data: Theme.of(context).primaryIconTheme,
|
|
child: this.child
|
|
)
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
class _BooleanItem : StatelessWidget {
|
|
public _BooleanItem(string title, bool value, ValueChanged<bool?> onChanged, Key switchKey = null) {
|
|
this.title = title;
|
|
this.value = value;
|
|
this.onChanged = onChanged;
|
|
this.switchKey = switchKey;
|
|
}
|
|
|
|
public readonly string title;
|
|
public readonly bool value;
|
|
public readonly ValueChanged<bool?> onChanged;
|
|
public readonly Key switchKey;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
bool isDark = Theme.of(context).brightness == Brightness.dark;
|
|
return new _OptionsItem(
|
|
child: new Row(
|
|
children: new List<Widget> {
|
|
new Expanded(child: new Text(this.title)),
|
|
new Switch(
|
|
key: this.switchKey,
|
|
value: this.value,
|
|
onChanged: this.onChanged,
|
|
activeColor: new Color(0xFF39CEFD),
|
|
activeTrackColor: isDark ? Colors.white30 : Colors.black26
|
|
)
|
|
}
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
class _ActionItem : StatelessWidget {
|
|
public _ActionItem(string text, VoidCallback onTap) {
|
|
this.text = text;
|
|
this.onTap = onTap;
|
|
}
|
|
|
|
public readonly string text;
|
|
public readonly VoidCallback onTap;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new _OptionsItem(
|
|
child: new _FlatButton(
|
|
onPressed: this.onTap,
|
|
child: new Text(this.text)
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
class _FlatButton : StatelessWidget {
|
|
public _FlatButton(Key key = null, VoidCallback onPressed = null, Widget child = null) : base(key: key) {
|
|
this.onPressed = onPressed;
|
|
this.child = child;
|
|
}
|
|
|
|
public readonly VoidCallback onPressed;
|
|
public readonly Widget child;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new FlatButton(
|
|
padding: EdgeInsets.zero,
|
|
onPressed: this.onPressed,
|
|
child: new DefaultTextStyle(
|
|
style: Theme.of(context).primaryTextTheme.subhead,
|
|
child: this.child
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
class _Heading : StatelessWidget {
|
|
public _Heading(string text) {
|
|
this.text = text;
|
|
}
|
|
|
|
public readonly string text;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
ThemeData theme = Theme.of(context);
|
|
return new _OptionsItem(
|
|
child: new DefaultTextStyle(
|
|
style: theme.textTheme.body1.copyWith(
|
|
fontFamily: "GoogleSans",
|
|
color: theme.accentColor
|
|
),
|
|
child: new Text(this.text)
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
class _ThemeItem : StatelessWidget {
|
|
public _ThemeItem(GalleryOptions options, ValueChanged<GalleryOptions> onOptionsChanged) {
|
|
this.options = options;
|
|
this.onOptionsChanged = onOptionsChanged;
|
|
}
|
|
|
|
public readonly GalleryOptions options;
|
|
public readonly ValueChanged<GalleryOptions> onOptionsChanged;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new _BooleanItem(
|
|
"Dark Theme",
|
|
this.options.theme == GalleryTheme.kDarkGalleryTheme,
|
|
(bool? value) => {
|
|
this.onOptionsChanged(
|
|
this.options.copyWith(
|
|
theme: value == true ? GalleryTheme.kDarkGalleryTheme : GalleryTheme.kLightGalleryTheme
|
|
)
|
|
);
|
|
},
|
|
switchKey: Key.key("dark_theme")
|
|
);
|
|
}
|
|
}
|
|
|
|
class _TextScaleFactorItem : StatelessWidget {
|
|
public _TextScaleFactorItem(GalleryOptions options, ValueChanged<GalleryOptions> onOptionsChanged) {
|
|
this.options = options;
|
|
this.onOptionsChanged = onOptionsChanged;
|
|
}
|
|
|
|
public readonly GalleryOptions options;
|
|
public readonly ValueChanged<GalleryOptions> onOptionsChanged;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new _OptionsItem(
|
|
child: new Row(
|
|
children: new List<Widget> {
|
|
new Expanded(
|
|
child: new Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: new List<Widget> {
|
|
new Text("Text size"),
|
|
new Text(
|
|
this.options.textScaleFactor.label,
|
|
style: Theme.of(context).primaryTextTheme.body1
|
|
),
|
|
}
|
|
)
|
|
),
|
|
new PopupMenuButton<GalleryTextScaleValue>(
|
|
padding: EdgeInsets.only(right: 16.0f),
|
|
icon: new Icon(Icons.arrow_drop_down),
|
|
itemBuilder: _ => {
|
|
return GalleryTextScaleValue.kAllGalleryTextScaleValues.Select(scaleValue =>
|
|
(PopupMenuEntry<GalleryTextScaleValue>) new PopupMenuItem<GalleryTextScaleValue>(
|
|
value: scaleValue,
|
|
child: new Text(scaleValue.label)
|
|
)).ToList();
|
|
},
|
|
onSelected: scaleValue => {
|
|
this.onOptionsChanged(
|
|
this.options.copyWith(textScaleFactor: scaleValue)
|
|
);
|
|
}
|
|
),
|
|
}
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
class _TimeDilationItem : StatelessWidget {
|
|
public _TimeDilationItem(GalleryOptions options, ValueChanged<GalleryOptions> onOptionsChanged) {
|
|
this.options = options;
|
|
this.onOptionsChanged = onOptionsChanged;
|
|
}
|
|
|
|
public readonly GalleryOptions options;
|
|
public readonly ValueChanged<GalleryOptions> onOptionsChanged;
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new _BooleanItem(
|
|
"Slow motion",
|
|
this.options.timeDilation != 1.0f,
|
|
(bool? value) => {
|
|
this.onOptionsChanged(
|
|
this.options.copyWith(
|
|
timeDilation: value == true ? 20.0f : 1.0f
|
|
)
|
|
);
|
|
},
|
|
switchKey: Key.key("slow_motion")
|
|
);
|
|
}
|
|
}
|
|
|
|
class _PlatformItem : StatelessWidget {
|
|
public _PlatformItem(GalleryOptions options, ValueChanged<GalleryOptions> onOptionsChanged) {
|
|
this.options = options;
|
|
this.onOptionsChanged = onOptionsChanged;
|
|
}
|
|
|
|
public readonly GalleryOptions options;
|
|
public readonly ValueChanged<GalleryOptions> onOptionsChanged;
|
|
|
|
string _platformLabel(RuntimePlatform platform) {
|
|
return platform.ToString();
|
|
}
|
|
|
|
public override Widget build(BuildContext context) {
|
|
return new _OptionsItem(
|
|
child: new Row(
|
|
children: new List<Widget> {
|
|
new Expanded(
|
|
child: new Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: new List<Widget> {
|
|
new Text("Platform mechanics"),
|
|
new Text(
|
|
this._platformLabel(this.options.platform),
|
|
style: Theme.of(context).primaryTextTheme.body1
|
|
),
|
|
}
|
|
)
|
|
),
|
|
new PopupMenuButton<RuntimePlatform>(
|
|
padding: EdgeInsets.only(right: 16.0f),
|
|
icon: new Icon(Icons.arrow_drop_down),
|
|
itemBuilder: _ => {
|
|
var values = Enum.GetValues(typeof(RuntimePlatform)).Cast<RuntimePlatform>();
|
|
return values.Select(platform =>
|
|
(PopupMenuEntry<RuntimePlatform>) new PopupMenuItem<RuntimePlatform>(
|
|
value: platform,
|
|
child: new Text(this._platformLabel(platform))
|
|
)).ToList();
|
|
},
|
|
onSelected: platform => {
|
|
this.onOptionsChanged(
|
|
this.options.copyWith(platform: platform)
|
|
);
|
|
}
|
|
),
|
|
}
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
public class GalleryOptionsPage : StatelessWidget {
|
|
public GalleryOptionsPage(
|
|
Key key = null,
|
|
GalleryOptions options = null,
|
|
ValueChanged<GalleryOptions> onOptionsChanged = null,
|
|
VoidCallback onSendFeedback = null
|
|
) : base(key: key) {
|
|
this.options = options;
|
|
this.onOptionsChanged = onOptionsChanged;
|
|
this.onSendFeedback = onSendFeedback;
|
|
}
|
|
|
|
public readonly GalleryOptions options;
|
|
public readonly ValueChanged<GalleryOptions> onOptionsChanged;
|
|
public readonly VoidCallback onSendFeedback;
|
|
|
|
List<Widget> _enabledDiagnosticItems() {
|
|
List<Widget> items = new List<Widget> {
|
|
new Divider(),
|
|
new _Heading("Diagnostics"),
|
|
};
|
|
|
|
items.Add(
|
|
new _BooleanItem(
|
|
"Highlight offscreen layers",
|
|
this.options.showOffscreenLayersCheckerboard,
|
|
(bool? value) => {
|
|
this.onOptionsChanged(this.options.copyWith(showOffscreenLayersCheckerboard: value));
|
|
}
|
|
)
|
|
);
|
|
items.Add(
|
|
new _BooleanItem(
|
|
"Highlight raster cache images",
|
|
this.options.showRasterCacheImagesCheckerboard,
|
|
(bool? value) => {
|
|
this.onOptionsChanged(this.options.copyWith(showRasterCacheImagesCheckerboard: value));
|
|
}
|
|
)
|
|
);
|
|
items.Add(
|
|
new _BooleanItem(
|
|
"Show performance overlay",
|
|
this.options.showPerformanceOverlay,
|
|
(bool? value) => { this.onOptionsChanged(this.options.copyWith(showPerformanceOverlay: value)); }
|
|
)
|
|
);
|
|
|
|
return items;
|
|
}
|
|
|
|
public override Widget build(BuildContext context) {
|
|
ThemeData theme = Theme.of(context);
|
|
|
|
var children = new List<Widget> {
|
|
new _Heading("Display"),
|
|
new _ThemeItem(this.options, this.onOptionsChanged),
|
|
new _TextScaleFactorItem(this.options, this.onOptionsChanged),
|
|
new _TimeDilationItem(this.options, this.onOptionsChanged),
|
|
new Divider(),
|
|
new _Heading("Platform mechanics"),
|
|
new _PlatformItem(this.options, this.onOptionsChanged)
|
|
};
|
|
|
|
children.AddRange(this._enabledDiagnosticItems());
|
|
children.AddRange(new List<Widget> {
|
|
new Divider(),
|
|
new _Heading("UIWidgets Gallery"),
|
|
new _ActionItem("About UIWidgets Gallery", () => {
|
|
/* showGalleryAboutDialog(context); */
|
|
}),
|
|
new _ActionItem("Send feedback", this.onSendFeedback),
|
|
});
|
|
|
|
return new DefaultTextStyle(
|
|
style: theme.primaryTextTheme.subhead,
|
|
child: new ListView(
|
|
padding: EdgeInsets.only(bottom: 124.0f),
|
|
children: children
|
|
));
|
|
}
|
|
}
|
|
}
|