56 lines
1.3 KiB
Rust
56 lines
1.3 KiB
Rust
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<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<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)
|
|
}
|
|
}
|