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