mod custom;
mod image;
mod text;
use std::path::Path;
pub use custom::ContentRenderer;
pub use image::{ImageDisplayOptions, ScaleMode};
pub use text::{TextAlign, TextDisplayOptions};
#[derive(Debug, Clone)]
pub enum Content {
Image {
data: Vec<u8>,
width: u32,
height: u32,
options: ImageDisplayOptions,
},
Text {
text: String,
options: TextDisplayOptions,
},
Custom,
}
impl Default for Content {
fn default() -> Self {
Content::Text { text: String::new(), options: TextDisplayOptions::default() }
}
}
impl Content {
pub fn image(data: Vec<u8>, width: u32, height: u32) -> Self {
Self::Image { data, width, height, options: ImageDisplayOptions::default() }
}
pub fn image_with_options(
data: Vec<u8>,
width: u32,
height: u32,
options: ImageDisplayOptions,
) -> Self {
Self::Image { data, width, height, options }
}
pub fn text(text: impl Into<String>) -> Self {
Self::Text { text: text.into(), options: TextDisplayOptions::default() }
}
pub fn text_with_options(text: impl Into<String>, options: TextDisplayOptions) -> Self {
Self::Text { text: text.into(), options }
}
pub fn from_path(path: impl AsRef<Path>) -> Result<Self, String> {
let loaded = crate::gui::util::load_image(path.as_ref(), None, None)?;
Ok(Self::Image {
data: loaded.data,
width: loaded.width,
height: loaded.height,
options: ImageDisplayOptions::default(),
})
}
pub fn from_path_sized(
path: impl AsRef<Path>,
width: u32,
height: u32,
) -> Result<Self, String> {
let loaded = crate::gui::util::load_image(path.as_ref(), Some(width), Some(height))?;
Ok(Self::Image {
data: loaded.data,
width: loaded.width,
height: loaded.height,
options: ImageDisplayOptions::new().with_scale_mode(ScaleMode::Stretch),
})
}
}