use maud::{Markup, Render, html}; use crate::ui::UIWidget; #[allow(non_snake_case)] pub fn Hover(inherit: I) -> HoverWrapper { HoverWrapper(None, Box::new(inherit)) } pub struct HoverWrapper(Option>, Box); impl HoverWrapper { fn hovered_class(&self) -> Vec { self.1 .extended_class() .into_iter() .filter(|x| !x.is_empty()) .map(|x| format!("hover:{x}")) .collect::>() } pub fn on(mut self, inner: T) -> Self { self.0 = Some(Box::new(inner)); self } } impl Render for HoverWrapper { fn render(&self) -> Markup { self.render_with_class("") } } impl UIWidget for HoverWrapper { fn can_inherit(&self) -> bool { true } fn base_class(&self) -> Vec { self.hovered_class() } fn extended_class(&self) -> Vec { let mut ret = self.base_class(); if let Some(inner) = &self.0 { ret.extend_from_slice(&inner.extended_class()); } ret } fn render_with_class(&self, class: &str) -> Markup { if self.0.as_ref().unwrap().can_inherit() { self.0 .as_ref() .unwrap() .render_with_class(&format!("{} {class}", self.hovered_class().join(" "))) } else { html! { div class=(format!("{} {class}", self.hovered_class().join(" "))) { (self.0.as_ref().unwrap()) } } } } }