Skip to main content

blockworx_egui/
icons.rs

1//! Embedded monochrome UI icons (SVG), drawn through the canvas image pipeline.
2//!
3//! Like block images, an icon's SVG is registered once with the
4//! [`ImageRegistry`] to mint an [`ImageHandle`]; a replay then draws it by
5//! `uri`. Registration happens once at startup ([`Icons::register`]) and the
6//! [`View`](crate::View) keeps the handles.
7//!
8//! Nothing draws one yet: they are kept for the planned conversion of the
9//! toolbar's text buttons to icons.
10
11use blockworx_doc::block_model::Asset;
12use blockworx_paint::ImageHandle;
13
14use crate::image::ImageRegistry;
15
16/// Register an embedded SVG icon, returning its handle (or `None` if it fails to
17/// parse/register).
18fn register_svg(
19    ctx: &egui::Context,
20    registry: &mut ImageRegistry,
21    svg: &str,
22) -> Option<ImageHandle> {
23    registry
24        .register(ctx, &Asset::Svg(svg.as_bytes().into()))
25        .ok()
26}
27
28pub const VIEW_VISIBLE: &str = include_str!("../../../icons/icon-view-visible.svg");
29pub const VIEW_HIDDEN: &str = include_str!("../../../icons/icon-view-hidden.svg");
30pub const ADD: &str = include_str!("../../../icons/icon-add.svg");
31
32/// Which UI icon to draw.
33#[derive(Clone, Copy)]
34pub enum Icon {
35    ViewVisible,
36    ViewHidden,
37    Add,
38}
39
40/// The registered handles for the embedded icons. `None` for any that failed to
41/// register (the caller simply draws nothing). Cloning is cheap (a few `Arc`s).
42#[derive(Clone, Default)]
43pub struct Icons {
44    view_visible: Option<ImageHandle>,
45    view_hidden: Option<ImageHandle>,
46    add: Option<ImageHandle>,
47}
48
49impl Icons {
50    /// Register every embedded icon, returning their handles. Call once at
51    /// startup (needs the `egui::Context` for the image loader).
52    pub fn register(ctx: &egui::Context, registry: &mut ImageRegistry) -> Self {
53        Self {
54            view_visible: register_svg(ctx, registry, VIEW_VISIBLE),
55            view_hidden: register_svg(ctx, registry, VIEW_HIDDEN),
56            add: register_svg(ctx, registry, ADD),
57        }
58    }
59
60    pub fn get(&self, icon: Icon) -> Option<&ImageHandle> {
61        match icon {
62            Icon::ViewVisible => self.view_visible.as_ref(),
63            Icon::ViewHidden => self.view_hidden.as_ref(),
64            Icon::Add => self.add.as_ref(),
65        }
66    }
67}