133 lines
3.3 KiB
Dart
133 lines
3.3 KiB
Dart
|
|
/// 滚动字幕配置参数:速度档位与级别。
|
|||
|
|
///
|
|||
|
|
/// 与 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;
|
|||
|
|
}
|