use crate::prelude::*; use image::DynamicImage; pub struct Image { handle: TextureHandle, } impl Widget for Image { fn draw(&mut self, painter: &mut Painter) -> Size { painter.primitive(&self.handle); Size::px(self.handle.size()) } fn size_hint(&self, axis: Axis) -> Option { Some(LayoutLen::px(self.handle.size().axis(axis))) } } pub fn image(image: impl LoadableImage) -> impl WidgetFn { let image = image.get_image().expect("Failed to load image"); move |state| Image { handle: state.ui_mut().textures.add(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) } }