Files
CloudHome-Ops/lib/models/marquee_config.dart

133 lines
3.3 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/// 滚动字幕配置参数:速度档位与级别。
///
/// 与 Web 后台 `/views/modules/theme/scrolling-text.data.ts` 保持一致,
/// 移动端仅展示档位文案,落库仍是原始数值,便于与 Web 端互相识别。
///
/// 速度(scrollSpeed,单位 ms/像素,数值越小滚动越快):
/// - 慢 = 200
/// - 较慢 = 100
/// - 中 = 50
/// - 较快 = 30
/// - 快 = 10
///
/// 级别(level):
/// - 危险 = 50
/// - 紧急 = 40
/// - 普通 = 20
class MarqueeConfig {
const MarqueeConfig({
this.speed = MarqueeSpeed.medium,
this.grade = MarqueeGrade.normal,
});
final MarqueeSpeed speed;
final MarqueeGrade grade;
/// 将任意历史 speed 值吸附到最近档位(兼容 Web 端精确值)。
static MarqueeSpeed speedFromValue(int? value) {
if (value == null) return MarqueeSpeed.medium;
final target = MarqueeSpeed.values.fold<MarqueeSpeed>(
MarqueeSpeed.values.first,
(closest, current) {
final diffClosest = (closest.value - value).abs();
final diffCurrent = (current.value - value).abs();
return diffCurrent < diffClosest ? current : closest;
},
);
return target;
}
/// 将任意历史 level 值吸附到最近级别。
static MarqueeGrade gradeFromValue(int? value) {
if (value == null) return MarqueeGrade.normal;
final target = MarqueeGrade.values.fold<MarqueeGrade>(
MarqueeGrade.values.first,
(closest, current) {
final diffClosest = (closest.value - value).abs();
final diffCurrent = (current.value - value).abs();
return diffCurrent < diffClosest ? current : closest;
},
);
return target;
}
MarqueeConfig setSpeed(MarqueeSpeed speed) =>
MarqueeConfig(speed: speed, grade: grade);
MarqueeConfig setGrade(MarqueeGrade grade) =>
MarqueeConfig(speed: speed, grade: grade);
MarqueeConfig copyWith({
MarqueeSpeed? speed,
MarqueeGrade? grade,
}) =>
MarqueeConfig(
speed: speed ?? this.speed,
grade: grade ?? this.grade,
);
}
/// 滚动速度档位。
enum MarqueeSpeed {
slow(200, '慢'),
slower(100, '较慢'),
medium(50, '中'),
faster(30, '较快'),
fast(10, '快');
const MarqueeSpeed(this.value, this.labelZh);
/// 后端落库值。
final int value;
/// 中文展示文案。
final String labelZh;
/// 英文展示文案。
String get labelEn {
switch (this) {
case MarqueeSpeed.slow:
return 'Slow';
case MarqueeSpeed.slower:
return 'Slower';
case MarqueeSpeed.medium:
return 'Medium';
case MarqueeSpeed.faster:
return 'Faster';
case MarqueeSpeed.fast:
return 'Fast';
}
}
String label(bool useEnglish) => useEnglish ? labelEn : labelZh;
}
/// 滚动字幕级别。
enum MarqueeGrade {
danger(50, '危险'),
urgent(40, '紧急'),
normal(20, '普通');
const MarqueeGrade(this.value, this.labelZh);
/// 后端落库值。
final int value;
/// 中文展示文案。
final String labelZh;
/// 英文展示文案。
String get labelEn {
switch (this) {
case MarqueeGrade.danger:
return 'Danger';
case MarqueeGrade.urgent:
return 'Urgent';
case MarqueeGrade.normal:
return 'Normal';
}
}
String label(bool useEnglish) => useEnglish ? labelEn : labelZh;
}