From c4e8dee1fd2d5a0af7b0d2aadb13505aabee980b Mon Sep 17 00:00:00 2001 From: Aleksander Date: Fri, 26 Dec 2025 13:58:12 +0100 Subject: [PATCH] Placeholder cover arts [skip ci] --- .../assets/dashboard/placeholder_cover.png | Bin 0 -> 45538 bytes dash-frontend/src/views/game_list.rs | 139 ++++++++++++++---- 2 files changed, 110 insertions(+), 29 deletions(-) create mode 100644 dash-frontend/assets/dashboard/placeholder_cover.png diff --git a/dash-frontend/assets/dashboard/placeholder_cover.png b/dash-frontend/assets/dashboard/placeholder_cover.png new file mode 100644 index 0000000000000000000000000000000000000000..3e002438f0b4401f7154e07bdfd219a4e82f6faa GIT binary patch literal 45538 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
kp1!TD?6Z}hIFg=VtKrC@KjXN{ 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 { struct Cell { image_parent: WidgetID, + manifest: AppManifest, } pub struct View { @@ -66,6 +70,7 @@ pub struct View { steam_utils: steam_utils::SteamUtils, cells: HashMap, + img_placeholder: Option, } impl View { @@ -93,6 +98,7 @@ impl View { id_list_parent: list_parent.id, steam_utils, cells: HashMap::new(), + img_placeholder: None, }) } @@ -180,6 +186,8 @@ fn construct_game_cover( height: percent(1.0), }, padding: taffy::Rect::length(2.0), + align_items: Some(AlignItems::Center), + justify_content: Some(JustifyContent::Center), ..Default::default() }, )?; @@ -257,6 +265,7 @@ fn construct_game_cover( button, Cell { image_parent: image_parent.id, + manifest: manifest.clone(), }, )) } @@ -353,36 +362,22 @@ impl View { Ok(()) } - fn action_set_cover_art( - &mut self, - layout: &mut Layout, - app_id: &AppID, - cover_art: Rc, - ) -> anyhow::Result<()> { - if cover_art.compressed_image_data.is_empty() { - return Ok(()); // do nothing + fn get_placeholder_image(&mut self) -> anyhow::Result<&CustomGlyphData> { + if self.img_placeholder.is_none() { + let c = CustomGlyphData::new(CustomGlyphContent::from_assets( + &self.globals, + AssetPath::BuiltIn("dashboard/placeholder_cover.png"), + )?); + self.img_placeholder = Some(c); } - let Some(cell) = self.cells.get(app_id) else { - debug_assert!(false); // this shouldn't happen - return Ok(()); - }; - - let glyph_content = match CustomGlyphContent::from_bin_raster(&cover_art.compressed_image_data) { - Ok(c) => c, - Err(e) => { - log::warn!( - "failed to decode cover art image for AppID {} ({:?}), skipping", - app_id, - e - ); - return Ok(()); - } - }; + Ok(self.img_placeholder.as_ref().unwrap()) // safe + } + fn mount_image(layout: &mut Layout, cell: &Cell, glyph: &CustomGlyphData) -> anyhow::Result<()> { let image = WidgetImage::create(WidgetImageParams { round: WLength::Units(12.0), - glyph_data: Some(CustomGlyphData::new(glyph_content)), + glyph_data: Some(glyph.clone()), ..Default::default() }); @@ -401,4 +396,90 @@ impl View { Ok(()) } + + fn mount_placeholder_text( + globals: &WguiGlobals, + layout: &mut Layout, + parent: WidgetID, + text: &str, + ) -> anyhow::Result<()> { + let label = WidgetLabel::create( + &mut globals.get(), + WidgetLabelParams { + content: Translation::from_raw_text(text), + style: TextStyle { + weight: Some(FontWeight::Bold), + wrap: true, + size: Some(16.0), + align: Some(HorizontalAlign::Center), + shadow: Some(TextShadow { + color: drawing::Color::new(0.0, 0.0, 0.0, 0.5), + x: 2.0, + y: 2.0, + }), + ..Default::default() + }, + }, + ); + + layout.add_child( + parent, + label, + taffy::Style { + position: taffy::Position::Absolute, + align_self: Some(AlignSelf::Baseline), + justify_self: Some(JustifySelf::Center), + margin: taffy::Rect { + top: length(32.0), + bottom: auto(), + left: auto(), + right: auto(), + }, + ..Default::default() + }, + )?; + Ok(()) + } + + fn action_set_cover_art( + &mut self, + layout: &mut Layout, + app_id: &AppID, + cover_art: Rc, + ) -> anyhow::Result<()> { + if cover_art.compressed_image_data.is_empty() { + // mount placeholder + let img = self.get_placeholder_image()?.clone(); + + let Some(cell) = self.cells.get(app_id) else { + debug_assert!(false); // this shouldn't happen + return Ok(()); + }; + + View::mount_image(layout, cell, &img)?; + View::mount_placeholder_text(&self.globals, layout, cell.image_parent, &cell.manifest.name)?; + } else { + // mount image + + let Some(cell) = self.cells.get(app_id) else { + debug_assert!(false); // this shouldn't happen + return Ok(()); + }; + + let glyph = match CustomGlyphContent::from_bin_raster(&cover_art.compressed_image_data) { + Ok(c) => c, + Err(e) => { + log::warn!( + "failed to decode cover art image for AppID {} ({:?}), skipping", + app_id, + e + ); + return Ok(()); + } + }; + View::mount_image(layout, cell, &CustomGlyphData::new(glyph))?; + } + + Ok(()) + } }