新主题

This commit is contained in:
2026-08-06 00:41:10 -07:00
parent 7eb9d00a50
commit ac80cd1db4
35 changed files with 1693 additions and 24 deletions
+21
View File
@@ -17,6 +17,7 @@ use crate::{
},
domain::{ComponentMessage, LiveEvent, LiveEventKind, LiveEventPayload},
overlay::normalize_image_url,
typography::{FontFamilyId, default_font_brightness, sanitize_font_brightness},
};
pub const GIFT_MENU_KIND: &str = "gift_menu";
@@ -28,6 +29,7 @@ const MAX_MENU_ITEMS: usize = 100;
pub enum GiftMenuThemeId {
#[default]
JadeBanquet,
MoonlitWater,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash, Deserialize, Serialize)]
@@ -73,6 +75,10 @@ pub struct GiftMenuSettings {
#[serde(default)]
pub theme_id: GiftMenuThemeId,
#[serde(default)]
pub font_family: FontFamilyId,
#[serde(default = "default_font_brightness")]
pub font_brightness: u16,
#[serde(default)]
pub items: Vec<GiftMenuItem>,
pub visible_rows: u8,
pub row_height: u16,
@@ -87,6 +93,8 @@ impl Default for GiftMenuSettings {
fn default() -> Self {
Self {
theme_id: GiftMenuThemeId::default(),
font_family: FontFamilyId::default(),
font_brightness: default_font_brightness(),
items: Vec::new(),
visible_rows: 4,
row_height: 88,
@@ -117,6 +125,7 @@ impl GiftMenuSettings {
}
}
self.visible_rows = self.visible_rows.clamp(1, 20);
self.font_brightness = sanitize_font_brightness(self.font_brightness);
self.row_height = self.row_height.clamp(44, 240);
self.scroll_speed_pixels_per_second = self.scroll_speed_pixels_per_second.min(240);
self.highlight_duration_ms = self.highlight_duration_ms.clamp(600, 12_000);
@@ -314,6 +323,7 @@ mod tests {
PlatformViewer {
uid: "42".into(),
name: "观众".into(),
avatar_url: None,
}
}
@@ -363,6 +373,7 @@ mod tests {
row_height: 1,
scroll_speed_pixels_per_second: u16::MAX,
font_scale: 1,
font_brightness: 1,
..GiftMenuSettings::default()
};
let sanitized = definition
@@ -372,6 +383,7 @@ mod tests {
assert_eq!(sanitized["rowHeight"], 44);
assert_eq!(sanitized["scrollSpeedPixelsPerSecond"], 240);
assert_eq!(sanitized["fontScale"], 50);
assert_eq!(sanitized["fontBrightness"], 70);
}
#[test]
@@ -507,4 +519,13 @@ mod tests {
.is_some()
);
}
#[test]
fn moonlit_water_theme_is_accepted_and_serialized() {
let definition = GiftMenuDefinition;
let mut settings = definition.default_settings();
settings["themeId"] = Value::from("moonlit-water");
let sanitized = definition.validate_settings(settings).unwrap();
assert_eq!(sanitized["themeId"], "moonlit-water");
}
}