use image::DynamicImage; use crate::{Color, Painter, TextureHandle, Widget, WidgetFnRet, render::RectPrimitive}; pub struct Image { handle: Option, } impl Widget for Image { fn draw(&self, painter: &mut Painter) { if let Some(handle) = &self.handle { painter.draw_texture(handle); } else { painter.write(RectPrimitive { color: Color::MAGENTA, inner_radius: 0.0, radius: 0.0, thickness: 0.0, }); } } } pub fn image(image: impl LoadableImage) -> WidgetFnRet!(Image, Ctx) { let image = match image.get_image() { Ok(image) => Some(image), Err(e) => { println!("Failed to load image: {e}"); None } }; move |ui| Image { handle: image.map(|image| ui.add_texture(image)), } } pub trait LoadableImage { fn get_image(self) -> Result; } impl LoadableImage for &str { fn get_image(self) -> Result { image::open(self).map_err(|e| format!("{e:?}")) } } impl LoadableImage for String { fn get_image(self) -> Result { image::open(self).map_err(|e| format!("{e:?}")) } } impl LoadableImage for &[u8; LEN] { fn get_image(self) -> Result { image::load_from_memory(self).map_err(|e| format!("{e:?}")) } } impl LoadableImage for DynamicImage { fn get_image(self) -> Result { Ok(self) } }