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

467 行
19 KiB

using System;
using System.Collections.Generic;
using Unity.UIWidgets.foundation;
using Unity.UIWidgets.painting;
using Unity.UIWidgets.service;
using Unity.UIWidgets.ui;
using UnityEngine;
using Brightness = Unity.UIWidgets.ui.Brightness;
namespace Unity.UIWidgets.widgets {
public enum Orientation {
portrait,
landscape
}
public class MediaQueryData : IEquatable<MediaQueryData> {
public MediaQueryData(
Size size = null,
float devicePixelRatio = 1.0f,
float textScaleFactor = 1.0f,
Brightness platformBrightness = Brightness.light,
EdgeInsets padding = null,
EdgeInsets viewInsets = null,
EdgeInsets systemGestureInsets = null,
EdgeInsets viewPadding = null,
float physicalDepth = float.MaxValue,
bool alwaysUse24HourFormat = false,
bool accessibleNavigation = false,
bool invertColors = false,
bool highContrast = false,
bool disableAnimations = false,
bool boldText = false
) {
this.size = size ?? Size.zero;
this.devicePixelRatio = devicePixelRatio;
this.textScaleFactor = textScaleFactor;
this.platformBrightness = platformBrightness;
this.viewInsets = viewInsets ?? EdgeInsets.zero;
this.padding = padding ?? EdgeInsets.zero;
this.systemGestureInsets = systemGestureInsets ?? EdgeInsets.zero;
this.viewPadding = viewPadding ?? EdgeInsets.zero;
this.physicalDepth = physicalDepth;
this.alwaysUse24HourFormat = alwaysUse24HourFormat;
this.accessibleNavigation = accessibleNavigation;
this.invertColors = invertColors;
this.highContrast = highContrast;
this.disableAnimations = disableAnimations;
this.boldText = boldText;
}
public static MediaQueryData fromWindow(Window window) {
return new MediaQueryData(
size: window.physicalSize / window.devicePixelRatio,
devicePixelRatio: window.devicePixelRatio,
textScaleFactor: window.textScaleFactor,
platformBrightness: window.platformBrightness, // TODO: remove comment when window.platformBrightness is ready
padding: EdgeInsets.fromWindowPadding(window.padding, window.devicePixelRatio),
viewPadding : EdgeInsets.fromWindowPadding(window.viewPadding, window.devicePixelRatio),
viewInsets: EdgeInsets.fromWindowPadding(window.viewInsets, window.devicePixelRatio),
systemGestureInsets : EdgeInsets.fromWindowPadding(window.systemGestureInsets, window.devicePixelRatio),
physicalDepth : window.physicalDepth,
accessibleNavigation: window.accessibilityFeatures.accessibleNavigation,
invertColors: window.accessibilityFeatures.invertColors,
disableAnimations: window.accessibilityFeatures.disableAnimations,
boldText: window.accessibilityFeatures.boldText,
highContrast : window.accessibilityFeatures.highContrast,
alwaysUse24HourFormat: window.alwaysUse24HourFormat
);
}
public readonly Size size;
public readonly float devicePixelRatio;
public readonly float textScaleFactor;
public readonly Brightness platformBrightness;
public readonly EdgeInsets viewInsets;
public readonly EdgeInsets padding;
public readonly EdgeInsets systemGestureInsets;
public readonly EdgeInsets viewPadding;
public readonly float physicalDepth;
public readonly bool alwaysUse24HourFormat;
public readonly bool accessibleNavigation;
public readonly bool invertColors;
public readonly bool highContrast;
public readonly bool disableAnimations;
public readonly bool boldText;
public Orientation? orientation {
get { return size.width > size.height ? Orientation.landscape : Orientation.portrait; }
}
public MediaQueryData copyWith(
Size size = null,
float? devicePixelRatio = null,
float? textScaleFactor = null,
Brightness? platformBrightness = null,
EdgeInsets padding = null,
EdgeInsets viewPadding = null,
EdgeInsets viewInsets = null,
EdgeInsets systemGestureInsets = null,
float? physicalDepth = null,
bool? alwaysUse24HourFormat = null,
bool? highContrast = null,
bool? disableAnimations = null,
bool? invertColors = null,
bool? accessibleNavigation = null,
bool? boldText = null
) {
return new MediaQueryData(
size: size ?? this.size,
devicePixelRatio: devicePixelRatio ?? this.devicePixelRatio,
textScaleFactor: textScaleFactor ?? this.textScaleFactor,
platformBrightness: platformBrightness ?? this.platformBrightness,
padding: padding ?? this.padding,
viewPadding: viewPadding ?? this.viewPadding,
viewInsets: viewInsets ?? this.viewInsets,
systemGestureInsets: systemGestureInsets ?? this.systemGestureInsets,
physicalDepth: physicalDepth ?? this.physicalDepth,
alwaysUse24HourFormat: alwaysUse24HourFormat ?? this.alwaysUse24HourFormat,
invertColors: invertColors ?? this.invertColors,
highContrast: highContrast ?? this.highContrast,
disableAnimations: disableAnimations ?? this.disableAnimations,
accessibleNavigation: accessibleNavigation ?? this.accessibleNavigation,
boldText: boldText ?? this.boldText
);
}
public MediaQueryData removePadding(
bool removeLeft = false,
bool removeTop = false,
bool removeRight = false,
bool removeBottom = false
) {
if (!(removeLeft || removeTop || removeRight || removeBottom))
return this;
return new MediaQueryData(
size: size,
devicePixelRatio: devicePixelRatio,
textScaleFactor: textScaleFactor,
platformBrightness: platformBrightness,
padding: padding.copyWith(
left: removeLeft ? (float?)0.0f : null,
top: removeTop ?(float?) 0.0f : null,
right: removeRight ? (float?)0.0f : null,
bottom: removeBottom ?(float?) 0.0f : null
),
viewPadding: viewPadding.copyWith(
left: removeLeft ? (float?)Mathf.Max(0.0f, viewPadding.left - padding.left) : null,
top: removeTop ? (float?)Mathf.Max(0.0f, viewPadding.top - padding.top) : null,
right: removeRight ? (float?)Mathf.Max(0.0f, viewPadding.right - padding.right) : null,
bottom: removeBottom ? (float?)Mathf.Max(0.0f, viewPadding.bottom - padding.bottom) : null
),
viewInsets: viewInsets,
alwaysUse24HourFormat: alwaysUse24HourFormat,
highContrast: highContrast,
disableAnimations: disableAnimations,
invertColors: invertColors,
accessibleNavigation: accessibleNavigation,
boldText: boldText
);
}
public MediaQueryData removeViewInsets(
bool removeLeft = false,
bool removeTop = false,
bool removeRight = false,
bool removeBottom = false
) {
if (!(removeLeft || removeTop || removeRight || removeBottom)) {
return this;
}
return new MediaQueryData(
size: size,
devicePixelRatio: devicePixelRatio,
textScaleFactor: textScaleFactor,
platformBrightness: platformBrightness,
padding: padding,
viewPadding: viewPadding.copyWith(
left: removeLeft ? (float?)Mathf.Max(0.0f, viewPadding.left - viewInsets.left) : null,
top: removeTop ? (float?)Mathf.Max(0.0f, viewPadding.top - viewInsets.top) : null,
right: removeRight ? (float?)Mathf.Max(0.0f, viewPadding.right - viewInsets.right) : null,
bottom: removeBottom ? (float?)Mathf.Max(0.0f, viewPadding.bottom - viewInsets.bottom) : null
),
viewInsets: viewInsets.copyWith(
left: removeLeft ? (float?) 0.0f : null,
top: removeTop ? (float?) 0.0f : null,
right: removeRight ? (float?) 0.0f : null,
bottom: removeBottom ? (float?) 0.0f : null
),
alwaysUse24HourFormat: alwaysUse24HourFormat,
highContrast: highContrast,
disableAnimations: disableAnimations,
invertColors: invertColors,
accessibleNavigation: accessibleNavigation,
boldText: boldText
);
}
public MediaQueryData removeViewPadding(
bool removeLeft = false,
bool removeTop = false,
bool removeRight = false,
bool removeBottom = false
) {
if (!(removeLeft || removeTop || removeRight || removeBottom))
return this;
return new MediaQueryData(
size: size,
devicePixelRatio: devicePixelRatio,
textScaleFactor: textScaleFactor,
platformBrightness: platformBrightness,
padding: padding.copyWith(
left: removeLeft ?(float?) 0.0f : null,
top: removeTop ? (float?) 0.0f : null,
right: removeRight ? (float?) 0.0f : null,
bottom: removeBottom ?(float?)0.0f : null
),
viewInsets: viewInsets,
viewPadding: viewPadding.copyWith(
left: removeLeft ? (float?) 0.0f : null,
top: removeTop ? (float?) 0.0f : null,
right: removeRight ? (float?) 0.0f : null,
bottom: removeBottom ? (float?) 0.0f : null
),
alwaysUse24HourFormat: alwaysUse24HourFormat,
highContrast: highContrast,
disableAnimations: disableAnimations,
invertColors: invertColors,
accessibleNavigation: accessibleNavigation,
boldText: boldText
);
}
public bool Equals(MediaQueryData other) {
if (ReferenceEquals(null, other)) {
return false;
}
if (ReferenceEquals(this, other)) {
return true;
}
return other is MediaQueryData
&& Equals(size, other.size)
&& devicePixelRatio.Equals(other.devicePixelRatio)
&& textScaleFactor.Equals(other.textScaleFactor)
&& Equals(platformBrightness, other.platformBrightness)
&& Equals(padding, other.padding)
&& Equals(viewPadding, other.viewPadding)
&& Equals(viewInsets, other.viewInsets)
&& Equals(physicalDepth,other.physicalDepth)
&& alwaysUse24HourFormat == other.alwaysUse24HourFormat
&& highContrast == other.highContrast
&& accessibleNavigation == other.accessibleNavigation
&& invertColors == other.invertColors
&& disableAnimations == other.disableAnimations
&& boldText == other.boldText;
}
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((MediaQueryData) obj);
}
public override int GetHashCode() {
unchecked {
var hashCode = (size != null ? size.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ devicePixelRatio.GetHashCode();
hashCode = (hashCode * 397) ^ textScaleFactor.GetHashCode();
hashCode = (hashCode * 397) ^ platformBrightness.GetHashCode();
hashCode = (hashCode * 397) ^ (viewInsets != null ? viewInsets.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (viewPadding != null ? viewPadding.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ (padding != null ? padding.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ physicalDepth.GetHashCode() ;
hashCode = (hashCode * 397) ^ alwaysUse24HourFormat.GetHashCode();
hashCode = (hashCode * 397) ^ highContrast.GetHashCode() ;
hashCode = (hashCode * 397) ^ accessibleNavigation.GetHashCode();
hashCode = (hashCode * 397) ^ invertColors.GetHashCode();
hashCode = (hashCode * 397) ^ disableAnimations.GetHashCode();
hashCode = (hashCode * 397) ^ boldText.GetHashCode();
return hashCode;
}
}
public static bool operator ==(MediaQueryData left, MediaQueryData right) {
return Equals(left, right);
}
public static bool operator !=(MediaQueryData left, MediaQueryData right) {
return !Equals(left, right);
}
public override string ToString() {
return $"{GetType()}(" +
$"size: {size}, " +
$"devicePixelRatio: {devicePixelRatio:F1}, " +
$"textScaleFactor: {textScaleFactor:F1}, " +
$"platformBrightness: {platformBrightness}, " +
$"padding: {padding}, " +
$"viewInsets: {viewInsets}, " +
$"viewPadding: {viewPadding}, " +
$"physicalDepth: {physicalDepth}, " +
$"alwaysUse24HourFormat: {alwaysUse24HourFormat}, " +
$"accessibleNavigation: {accessibleNavigation}" +
$"highContrast: {highContrast}, " +
$"disableAnimations: {disableAnimations}" +
$"invertColors: {invertColors}" +
$"boldText: {boldText}" +
")";
}
}
public class MediaQuery : InheritedWidget {
public MediaQuery(
Key key = null,
MediaQueryData data = null,
Widget child = null
) : base(key, child) {
D.assert(child != null);
D.assert(data != null);
this.data = data;
}
public static MediaQuery removePadding(
Key key = null,
BuildContext context = null,
bool removeLeft = false,
bool removeTop = false,
bool removeRight = false,
bool removeBottom = false,
Widget child = null
) {
D.assert(context != null);
return new MediaQuery(
key: key,
data: of(context).removePadding(
removeLeft: removeLeft,
removeTop: removeTop,
removeRight: removeRight,
removeBottom: removeBottom
),
child: child
);
}
public static MediaQuery removeViewInsets(
Key key = null,
BuildContext context = null,
bool removeLeft = false,
bool removeTop = false,
bool removeRight = false,
bool removeBottom = false,
Widget child = null
) {
D.assert(context != null);
return new MediaQuery(
key: key,
data: of(context).removeViewInsets(
removeLeft: removeLeft,
removeTop: removeTop,
removeRight: removeRight,
removeBottom: removeBottom
),
child: child
);
}
public static MediaQuery removeViewPadding(
Key key = null,
BuildContext context = null,
bool removeLeft = false,
bool removeTop = false,
bool removeRight = false,
bool removeBottom = false,
Widget child = null
) {
return new MediaQuery(
key: key,
data: of(context).removeViewPadding(
removeLeft: removeLeft,
removeTop: removeTop,
removeRight: removeRight,
removeBottom: removeBottom
),
child: child
);
}
public readonly MediaQueryData data;
public static MediaQueryData of(BuildContext context, bool nullOk = false) {
D.assert(context != null);
MediaQuery query = (MediaQuery) context.dependOnInheritedWidgetOfExactType<MediaQuery>();
if (query != null) {
return query.data;
}
if (nullOk) {
return null;
}
throw new UIWidgetsError(new List<DiagnosticsNode>{
new ErrorSummary("MediaQuery.of() called with a context that does not contain a MediaQuery."),
new ErrorDescription(
"No MediaQuery ancestor could be found starting from the context that was passed " +
"to MediaQuery.of(). This can happen because you do not have a WidgetsApp or " +
"MaterialApp widget (those widgets introduce a MediaQuery), or it can happen " +
"if the context you use comes from a widget above those widgets."
),
context.describeElement("The context used was")
});
}
public static float textScaleFactorOf(BuildContext context) {
return of(context, nullOk: true)?.textScaleFactor ?? 1.0f;
}
public static Brightness platformBrightnessOf(BuildContext context) {
return of(context, nullOk: true)?.platformBrightness ?? Brightness.light;
}
public static bool boldTextOverride(BuildContext context) {
return of(context, nullOk: true)?.boldText ?? false;
}
public override bool updateShouldNotify(InheritedWidget oldWidget) {
return data != ((MediaQuery) oldWidget).data;
}
public override void debugFillProperties(DiagnosticPropertiesBuilder properties) {
base.debugFillProperties(properties);
properties.add(new DiagnosticsProperty<MediaQueryData>("data", data, showName: false));
}
}
}