use maud::{Markup, Render, html};
use crate::ui::UIWidget;
pub struct Aspect {
kind: u8,
inner: Box,
}
impl Aspect {
pub fn auto(inner: T) -> Self {
Self {
kind: 0,
inner: Box::new(inner),
}
}
pub fn square(inner: T) -> Self {
Self {
kind: 1,
inner: Box::new(inner),
}
}
pub fn video(inner: T) -> Self {
Self {
kind: 2,
inner: Box::new(inner),
}
}
}
impl Render for Aspect {
fn render(&self) -> Markup {
self.render_with_class("")
}
}
impl UIWidget for Aspect {
fn can_inherit(&self) -> bool {
true
}
fn base_class(&self) -> Vec {
let class = match self.kind {
0 => "aspect-auto",
1 => "aspect-square",
2 => "aspect-video",
_ => "",
};
vec![class.to_string()]
}
fn extended_class(&self) -> Vec {
let mut c = self.base_class();
c.extend_from_slice(&self.inner.extended_class());
c
}
fn render_with_class(&self, class: &str) -> Markup {
if self.inner.as_ref().can_inherit() {
html! {
(self.inner.as_ref().render_with_class(&format!("{class} {}", self.base_class().join(" "))))
}
} else {
html! {
div class=(format!("{class} {}", self.base_class().join(" "))) {
(self.inner.as_ref())
}
}
}
}
}