use crate::prelude::*; use image::DynamicImage; pub struct Image { handle: TextureHandle, } impl Widget for Image { fn draw(&mut self, painter: &mut Painter) { painter.draw_texture(&self.handle); } fn get_size(&mut self, _: &mut SizeCtx) -> Vec2 { self.handle.size() } } pub fn image(image: impl LoadableImage) -> WidgetFn!(Image) { let image = image.get_image().expect("Failed to load image"); move |ui| Image { handle: 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) } }