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()) } } } } }