use crate::prelude::*; use image::DynamicImage; pub struct Image { handle: TextureHandle, } impl Widget for Image { fn draw(&mut self, painter: &mut Painter) { painter.texture(&self.handle); } fn desired_width(&mut self, _: &mut SizeCtx) -> Len { Len::abs(self.handle.size().x) } fn desired_height(&mut self, _: &mut SizeCtx) -> Len { Len::abs(self.handle.size().y) } } pub fn image(image: impl LoadableImage) -> impl WidgetFn { 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) } }