66 lines
1.6 KiB
Rust
66 lines
1.6 KiB
Rust
use maud::{Markup, Render, html};
|
|
|
|
use crate::ui::UIWidget;
|
|
|
|
#[allow(non_snake_case)]
|
|
pub fn Hover<I: UIWidget + 'static>(inherit: I) -> HoverWrapper {
|
|
HoverWrapper(None, Box::new(inherit))
|
|
}
|
|
|
|
pub struct HoverWrapper(Option<Box<dyn UIWidget>>, Box<dyn UIWidget>);
|
|
|
|
impl HoverWrapper {
|
|
fn hovered_class(&self) -> Vec<String> {
|
|
self.1
|
|
.extended_class()
|
|
.into_iter()
|
|
.filter(|x| !x.is_empty())
|
|
.map(|x| format!("hover:{x}"))
|
|
.collect::<Vec<_>>()
|
|
}
|
|
|
|
pub fn on<T: UIWidget + 'static>(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<String> {
|
|
self.hovered_class()
|
|
}
|
|
|
|
fn extended_class(&self) -> Vec<String> {
|
|
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())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|