From af2835dda1593af99b46bebd42b6b118b86619b2 Mon Sep 17 00:00:00 2001 From: Kevin Reid Date: Sat, 21 Sep 2024 19:08:36 -0700 Subject: [PATCH] ui: Remove `ButtonIcon::Text`. The about button now has an icon. This removes one of the direct uses of `embedded_graphics`. See . --- all-is-cubes-ui/src/vui/blocks.rs | 46 +++++-------- all-is-cubes-ui/src/vui/icons/button-help.png | Bin 0 -> 548 bytes all-is-cubes-ui/src/vui/widgets/button.rs | 64 +++++++----------- .../expected/ui/session_initial_state-all.png | Bin 12884 -> 12913 bytes .../expected/ui/session_page_pause-all.png | Bin 13732 -> 13771 bytes 5 files changed, 42 insertions(+), 68 deletions(-) create mode 100644 all-is-cubes-ui/src/vui/icons/button-help.png diff --git a/all-is-cubes-ui/src/vui/blocks.rs b/all-is-cubes-ui/src/vui/blocks.rs index a043c5200..b811b3fdf 100644 --- a/all-is-cubes-ui/src/vui/blocks.rs +++ b/all-is-cubes-ui/src/vui/blocks.rs @@ -2,7 +2,6 @@ use core::fmt; use exhaust::Exhaust; -use all_is_cubes::drawing::embedded_graphics::mono_font::iso_8859_1 as font; use all_is_cubes::include_image; use all_is_cubes::linking::{BlockModule, BlockProvider}; use all_is_cubes::universe::UniverseTransaction; @@ -72,90 +71,79 @@ impl UiBlocks { txn, "Back", ButtonIcon::Icon(include_image!("icons/button-back.png")), - )? - .build(), + )?, - UiBlocks::AboutButtonLabel => { - make_button_label_block(txn, "About", ButtonIcon::Text(&font::FONT_10X20, "?"))? - .build() - } + UiBlocks::AboutButtonLabel => make_button_label_block( + txn, + "About", + ButtonIcon::Icon(include_image!("icons/button-help.png")), + )?, UiBlocks::PauseButtonLabel => make_button_label_block( txn, "Pause", ButtonIcon::Icon(include_image!("icons/button-pause.png")), - )? - .build(), + )?, UiBlocks::SaveButtonLabel => make_button_label_block( txn, "Save", ButtonIcon::Icon(include_image!("icons/button-save.png")), - )? - .build(), + )?, UiBlocks::OptionsButtonLabel => make_button_label_block( txn, "Options", ButtonIcon::Icon(include_image!("icons/button-options.png")), - )? - .build(), + )?, UiBlocks::MouselookButtonLabel => make_button_label_block( txn, "Mouselook", ButtonIcon::Icon(include_image!("icons/button-mouselook.png")), - )? - .build(), + )?, UiBlocks::FullscreenButtonLabel => make_button_label_block( txn, "Fullscreen", ButtonIcon::Icon(include_image!("icons/button-fullscreen.png")), - )? - .build(), + )?, UiBlocks::AntialiasButtonLabel => make_button_label_block( txn, "Antialiasing", ButtonIcon::Icon(include_image!("icons/button-antialias.png")), - )? - .build(), + )?, UiBlocks::DebugInfoTextButtonLabel => make_button_label_block( txn, "Debug: Info Text", ButtonIcon::Icon(include_image!("icons/button-debug-info-text.png")), - )? - .build(), + )?, UiBlocks::DebugChunkBoxesButtonLabel => make_button_label_block( txn, "Debug: Chunk Boxes", ButtonIcon::Icon(include_image!("icons/button-debug-chunk-boxes.png")), - )? - .build(), + )?, UiBlocks::DebugBehaviorsButtonLabel => make_button_label_block( txn, "Debug: Behaviors", ButtonIcon::Icon(include_image!("icons/button-debug-behaviors.png")), - )? - .build(), + )?, UiBlocks::DebugCollisionBoxesButtonLabel => make_button_label_block( txn, "Debug: Collision Boxes", ButtonIcon::Icon(include_image!("icons/button-debug-collision-boxes.png")), - )? - .build(), + )?, UiBlocks::DebugLightRaysButtonLabel => make_button_label_block( txn, "Debug: Light Rays at Cursor", ButtonIcon::Icon(include_image!("icons/button-debug-light-rays.png")), - )? - .build(), + )?, }) }) .await diff --git a/all-is-cubes-ui/src/vui/icons/button-help.png b/all-is-cubes-ui/src/vui/icons/button-help.png new file mode 100644 index 0000000000000000000000000000000000000000..1c5a8e6ed70426b58b55933214afd3141b0adbd9 GIT binary patch literal 548 zcmV+<0^9wGP)EX>4Tx04R}tkv&MmKpe$iTct%Rigplj$WUFhAS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RRjDw_ypovrW+RV2J!T! zrE}gVj1R49>SV4yx=f&yIP=rV8tbQuJfSP2FuxHyLObP>mJ m5Mc?@0dBi-yOvbvQV0OHjsSsBcj_1b0000( pub(crate) enum ButtonIcon<'a> { Icon(&'a DecodedPng), - Text(&'a MonoFont<'a>, &'a str), } /// TODO: document, refine, and make public @@ -499,41 +494,32 @@ pub(crate) fn make_button_label_block( txn: &mut UniverseTransaction, name: &str, icon: ButtonIcon<'_>, -) -> Result, InGenError> { - let mut space = Space::builder(GridAab::from_lower_size( - [0, 0, 0], - [theme::RESOLUTION.into(), theme::RESOLUTION.into(), 1], - )) - .physics(SpacePhysics::DEFAULT_FOR_BLOCK) - .build(); - let mut draw_target = draw_target_for_button_label(&mut space); - - match icon { +) -> Result { + Ok(match icon { ButtonIcon::Icon(icon) => { - let id = &PngAdapter::adapt(icon, &default_srgb); - EgImage::new(&id, -id.bounding_box().center() - Point::new(1, 1)) - .draw(&mut draw_target)?; - } - ButtonIcon::Text(font, text) => { - Text::with_text_style( - text, - Point::new(-1, -1), - MonoTextStyle::new( - font, - &VoxelBrush::single(color_block!(palette::BUTTON_LABEL)), - ), - TextStyleBuilder::new() - .baseline(Baseline::Middle) - .alignment(Alignment::Center) - .build(), - ) - .draw(&mut draw_target)?; + let mut space = Space::builder(GridAab::from_lower_size( + [0, 0, 0], + [theme::RESOLUTION.into(), theme::RESOLUTION.into(), 1], + )) + .physics(SpacePhysics::DEFAULT_FOR_BLOCK) + .build(); + + // TODO: replace this with space_from_image() + { + let mut draw_target = draw_target_for_button_label(&mut space); + + let id = &PngAdapter::adapt(icon, &default_srgb); + EgImage::new(&id, -id.bounding_box().center() - Point::new(1, 1)) + .draw(&mut draw_target)?; + } + + let space = txn.insert_anonymous(space); + Block::builder() + .display_name(name.to_owned()) + .voxels_handle(theme::RESOLUTION, space) + .build() } - } - let space = txn.insert_anonymous(space); - Ok(Block::builder() - .display_name(name.to_owned()) - .voxels_handle(theme::RESOLUTION, space)) + }) } /// Common constants for button shapes. diff --git a/test-renderers/expected/ui/session_initial_state-all.png b/test-renderers/expected/ui/session_initial_state-all.png index e2925508e946bf46ba5cf4f3df114afb5acad4ab..1c628c308327b5ac726674d7d49cd9546596105c 100644 GIT binary patch literal 12913 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 literal 12884 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 diff --git a/test-renderers/expected/ui/session_page_pause-all.png b/test-renderers/expected/ui/session_page_pause-all.png index 3f3c2860de40ebe2b934200aaf77d40f9e7d59d6..16c3fd9b8214db5a33fa829113afdc422b6eba83 100644 GIT binary patch literal 13771 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 literal 13732 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