Reviewed-on: iris/iris#16 Reviewed-by: iris <2+iris@noreply.localhost> Co-authored-by: iris-ai <4+iris-ai@noreply.localhost>
57 lines
1.4 KiB
Rust
57 lines
1.4 KiB
Rust
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::abs(self.handle.size())
|
|
}
|
|
|
|
fn size_hint(&self, axis: Axis) -> Option<Len> {
|
|
Some(Len::abs(self.handle.size().axis(axis)))
|
|
}
|
|
|
|
fn on_resize(&self, _: Axis) -> OnResize {
|
|
OnResize::Scale
|
|
}
|
|
}
|
|
|
|
pub fn image<State: UiRsc>(image: impl LoadableImage) -> impl WidgetFn<State, Image> {
|
|
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<DynamicImage, String>;
|
|
}
|
|
|
|
impl LoadableImage for &str {
|
|
fn get_image(self) -> Result<DynamicImage, String> {
|
|
image::open(self).map_err(|e| format!("{e:?}"))
|
|
}
|
|
}
|
|
|
|
impl LoadableImage for String {
|
|
fn get_image(self) -> Result<DynamicImage, String> {
|
|
image::open(self).map_err(|e| format!("{e:?}"))
|
|
}
|
|
}
|
|
|
|
impl<const LEN: usize> LoadableImage for &[u8; LEN] {
|
|
fn get_image(self) -> Result<DynamicImage, String> {
|
|
image::load_from_memory(self).map_err(|e| format!("{e:?}"))
|
|
}
|
|
}
|
|
|
|
impl LoadableImage for DynamicImage {
|
|
fn get_image(self) -> Result<DynamicImage, String> {
|
|
Ok(self)
|
|
}
|
|
}
|