2023-12-21 09:14:40 +00:00
|
|
|
|
/// Created by Haoyi on 2022/5/26
|
|
|
|
|
|
|
|
|
|
|
|
part of 'design_spec.dart';
|
|
|
|
|
|
|
|
|
|
|
|
class SpecMode {
|
|
|
|
|
|
static const useGet = 0; // XX.get()
|
|
|
|
|
|
static const useContext = 1; // XX.of(context)
|
|
|
|
|
|
static const useSize = 2; // XX.from(size)
|
|
|
|
|
|
static const nested = 3; // XX.create(size)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class DesignSpec {
|
|
|
|
|
|
final double width;
|
|
|
|
|
|
final double height;
|
|
|
|
|
|
final int specMode;
|
|
|
|
|
|
@Deprecated("在2.0.5之后,该参数将会移除,使用SpecMode中的useNested代替")
|
|
|
|
|
|
final bool nestedSpec;
|
2024-03-07 03:46:50 +00:00
|
|
|
|
final double? textScaleFactor;
|
2023-12-21 09:14:40 +00:00
|
|
|
|
|
|
|
|
|
|
const DesignSpec(
|
|
|
|
|
|
{required this.width,
|
|
|
|
|
|
required this.height,
|
|
|
|
|
|
this.specMode = SpecMode.useGet,
|
2024-03-07 03:46:50 +00:00
|
|
|
|
this.nestedSpec = false,
|
|
|
|
|
|
this.textScaleFactor});
|
2023-12-21 09:14:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
abstract class SpecField {}
|
|
|
|
|
|
|
|
|
|
|
|
abstract class SpecValueField implements SpecField {}
|
|
|
|
|
|
|
|
|
|
|
|
abstract class SpecUiField implements SpecField {}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecOrigin implements SpecValueField {
|
|
|
|
|
|
final double value;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecOrigin(this.value);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecHeight implements SpecValueField {
|
|
|
|
|
|
final double height;
|
|
|
|
|
|
final bool consistent;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecHeight(this.height, {this.consistent = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecVertical implements SpecValueField {
|
|
|
|
|
|
final double vertical;
|
|
|
|
|
|
final bool relative;
|
|
|
|
|
|
final bool consistent;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecVertical(this.vertical, {this.relative = false, this.consistent = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecWidth implements SpecValueField {
|
|
|
|
|
|
final double width;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecWidth(this.width);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecHorizontal implements SpecValueField {
|
|
|
|
|
|
final double horizontal;
|
|
|
|
|
|
final bool relative;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecHorizontal(this.horizontal, {this.relative = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecList implements SpecUiField {
|
|
|
|
|
|
final List<SpecValueField> list;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecList(this.list);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecFontSize implements SpecValueField {
|
|
|
|
|
|
final double fontSize;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecFontSize(this.fontSize);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecAbsoluteFontSize implements SpecValueField {
|
|
|
|
|
|
final double fontSize;
|
|
|
|
|
|
final bool consistent;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecAbsoluteFontSize(this.fontSize, {this.consistent = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecStatusBarHeight implements SpecValueField {
|
|
|
|
|
|
final double ifAbsent;
|
|
|
|
|
|
final bool wrappedInSafeArea;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecStatusBarHeight(this.ifAbsent, {this.wrappedInSafeArea = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecNavigationBarHeight implements SpecValueField {
|
|
|
|
|
|
final double ifAbsent;
|
|
|
|
|
|
final bool wrappedInSafeArea;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecNavigationBarHeight(this.ifAbsent, {this.wrappedInSafeArea = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class CombinedSpec implements SpecValueField {
|
|
|
|
|
|
final SpecValueField spec1;
|
|
|
|
|
|
final SpecValueField spec2;
|
|
|
|
|
|
|
|
|
|
|
|
const CombinedSpec(this.spec1, this.spec2);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecOffset implements SpecUiField {
|
|
|
|
|
|
final SpecValueField dx;
|
|
|
|
|
|
final SpecValueField dy;
|
|
|
|
|
|
final bool relative;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecOffset(this.dx, this.dy, {this.relative = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecSize implements SpecUiField {
|
|
|
|
|
|
final SpecValueField width;
|
|
|
|
|
|
final SpecValueField height;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecSize(this.width, this.height);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecAspectHeightSize implements SpecUiField {
|
|
|
|
|
|
final double height;
|
|
|
|
|
|
final double aspectRatio;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecAspectHeightSize(this.height, this.aspectRatio);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecAspectWidthSize implements SpecUiField {
|
|
|
|
|
|
final double width;
|
|
|
|
|
|
final double aspectRatio;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecAspectWidthSize(this.width, this.aspectRatio);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecRect implements SpecUiField {
|
|
|
|
|
|
final SpecValueField left;
|
|
|
|
|
|
final SpecValueField top;
|
|
|
|
|
|
final SpecValueField? width;
|
|
|
|
|
|
final SpecValueField? height;
|
|
|
|
|
|
final SpecValueField? right;
|
|
|
|
|
|
final SpecValueField? bottom;
|
|
|
|
|
|
final bool relative;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRect.fromLTRB(this.left, this.top, this.right, this.bottom, {this.relative = false})
|
|
|
|
|
|
: width = null,
|
|
|
|
|
|
height = null;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRect.fromLTWH(this.left, this.top, this.width, this.height, {this.relative = false})
|
|
|
|
|
|
: right = null,
|
|
|
|
|
|
bottom = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecRRect implements SpecUiField {
|
|
|
|
|
|
final SpecValueField left;
|
|
|
|
|
|
final SpecValueField top;
|
|
|
|
|
|
final SpecValueField? right;
|
|
|
|
|
|
final SpecValueField? bottom;
|
|
|
|
|
|
final SpecValueField? width;
|
|
|
|
|
|
final SpecValueField? height;
|
|
|
|
|
|
final SpecRadius radius;
|
|
|
|
|
|
final bool relative;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRRect.fromLTRBR(this.left, this.top, this.right, this.bottom, this.radius,
|
|
|
|
|
|
{this.relative = false})
|
|
|
|
|
|
: width = null,
|
|
|
|
|
|
height = null;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRRect.fromLTWHR(this.left, this.top, this.width, this.height, this.radius,
|
|
|
|
|
|
{this.relative = false})
|
|
|
|
|
|
: right = null,
|
|
|
|
|
|
bottom = null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecRadius implements SpecUiField {
|
|
|
|
|
|
final SpecValueField topStart;
|
|
|
|
|
|
|
|
|
|
|
|
final SpecValueField topEnd;
|
|
|
|
|
|
|
|
|
|
|
|
final SpecValueField bottomStart;
|
|
|
|
|
|
|
|
|
|
|
|
final SpecValueField bottomEnd;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRadius.circular(SpecValueField radius)
|
|
|
|
|
|
: topStart = radius,
|
|
|
|
|
|
topEnd = radius,
|
|
|
|
|
|
bottomStart = radius,
|
|
|
|
|
|
bottomEnd = radius;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRadius.vertical(
|
|
|
|
|
|
{SpecValueField top = const SpecOrigin(0), SpecValueField bottom = const SpecOrigin(0)})
|
|
|
|
|
|
: topStart = top,
|
|
|
|
|
|
topEnd = top,
|
|
|
|
|
|
bottomStart = bottom,
|
|
|
|
|
|
bottomEnd = bottom;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRadius.horizontal(
|
|
|
|
|
|
{SpecValueField start = const SpecOrigin(0), SpecValueField end = const SpecOrigin(0)})
|
|
|
|
|
|
: topStart = start,
|
|
|
|
|
|
topEnd = end,
|
|
|
|
|
|
bottomStart = start,
|
|
|
|
|
|
bottomEnd = end;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecRadius.only(
|
|
|
|
|
|
{this.topStart = const SpecOrigin(0),
|
|
|
|
|
|
this.topEnd = const SpecOrigin(0),
|
|
|
|
|
|
this.bottomStart = const SpecOrigin(0),
|
|
|
|
|
|
this.bottomEnd = const SpecOrigin(0)});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class SpecEdgeInsets implements SpecUiField {
|
|
|
|
|
|
final SpecValueField start;
|
|
|
|
|
|
final SpecValueField end;
|
|
|
|
|
|
final SpecValueField top;
|
|
|
|
|
|
final SpecValueField bottom;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecEdgeInsets.only(
|
|
|
|
|
|
{this.start = const SpecOrigin(0),
|
|
|
|
|
|
this.end = const SpecOrigin(0),
|
|
|
|
|
|
this.top = const SpecOrigin(0),
|
|
|
|
|
|
this.bottom = const SpecOrigin(0)});
|
|
|
|
|
|
|
|
|
|
|
|
const SpecEdgeInsets.symmetric(
|
|
|
|
|
|
{SpecValueField vertical = const SpecOrigin(0),
|
|
|
|
|
|
SpecValueField horizontal = const SpecOrigin(0)})
|
|
|
|
|
|
: start = horizontal,
|
|
|
|
|
|
end = horizontal,
|
|
|
|
|
|
top = vertical,
|
|
|
|
|
|
bottom = vertical;
|
|
|
|
|
|
|
|
|
|
|
|
const SpecEdgeInsets.all(SpecValueField value)
|
|
|
|
|
|
: start = value,
|
|
|
|
|
|
end = value,
|
|
|
|
|
|
top = value,
|
|
|
|
|
|
bottom = value;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class NestedSpec {
|
|
|
|
|
|
final double designWidth;
|
|
|
|
|
|
final double designHeight;
|
|
|
|
|
|
final double widthUpperLimit;
|
|
|
|
|
|
final double widthLowerLimit; // 真实最大尺寸
|
|
|
|
|
|
final double heightUpperLimit;
|
|
|
|
|
|
final double heightLowerLimit; // 真实最大尺寸
|
|
|
|
|
|
final bool consistentWidth;
|
|
|
|
|
|
final bool consistentHeight;
|
|
|
|
|
|
|
|
|
|
|
|
const NestedSpec(this.designWidth, this.designHeight,
|
|
|
|
|
|
{this.widthUpperLimit = 0xFFFFFFFF,
|
|
|
|
|
|
this.widthLowerLimit = 0,
|
|
|
|
|
|
this.heightUpperLimit = 0xFFFFFFFF,
|
|
|
|
|
|
this.heightLowerLimit = 0,
|
|
|
|
|
|
this.consistentWidth = false,
|
|
|
|
|
|
this.consistentHeight = false});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class NestedAspectSpec {
|
|
|
|
|
|
final double aspectRatio;
|
|
|
|
|
|
final double relativeWidthScale;
|
|
|
|
|
|
final double widthUpperLimit;
|
|
|
|
|
|
final double widthLowerLimit; // 真实最大尺寸
|
|
|
|
|
|
|
|
|
|
|
|
const NestedAspectSpec(this.aspectRatio, this.relativeWidthScale,
|
|
|
|
|
|
{this.widthUpperLimit = 0xFFFFFFFF, this.widthLowerLimit = 0});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class NestedAspectHeightSpec {
|
|
|
|
|
|
final double height;
|
|
|
|
|
|
final double aspectRatio;
|
|
|
|
|
|
|
|
|
|
|
|
const NestedAspectHeightSpec(this.height, this.aspectRatio);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class NestedAspectWidthSpec {
|
|
|
|
|
|
final double width;
|
|
|
|
|
|
final double aspectRatio;
|
|
|
|
|
|
|
|
|
|
|
|
const NestedAspectWidthSpec(this.width, this.aspectRatio);
|
|
|
|
|
|
}
|