use std::hash::Hash;
use fret_core::Rect;
use fret_ui::element::AnyElement;
use fret_ui::{ElementContext, UiHost};
#[derive(Debug, Clone, Copy, Default)]
pub struct Response {
pub hovered: bool,
pub pressed: bool,
pub focused: bool,
pub clicked: bool,
pub changed: bool,
pub rect: Option<Rect>,
}
impl Response {
pub fn clicked(self) -> bool {
self.clicked
}
pub fn changed(self) -> bool {
self.changed
}
}
#[cfg(feature = "query")]
pub mod query;
#[cfg(feature = "selector")]
pub mod selector;
#[cfg(feature = "query")]
pub use query::UiWriterQueryExt;
#[cfg(feature = "selector")]
pub use selector::UiWriterSelectorExt;
pub trait UiWriter<H: UiHost> {
fn with_cx_mut<R>(&mut self, f: impl FnOnce(&mut ElementContext<'_, H>) -> R) -> R;
fn add(&mut self, element: AnyElement);
fn extend<I>(&mut self, elements: I)
where
I: IntoIterator<Item = AnyElement>,
{
for element in elements {
self.add(element);
}
}
fn mount<I>(&mut self, f: impl FnOnce(&mut ElementContext<'_, H>) -> I)
where
I: IntoIterator<Item = AnyElement>,
{
let elements: Vec<AnyElement> = self.with_cx_mut(|cx| f(cx).into_iter().collect());
self.extend(elements);
}
fn keyed<K: Hash, R>(&mut self, key: K, f: impl FnOnce(&mut ElementContext<'_, H>) -> R) -> R {
self.with_cx_mut(|cx| cx.keyed(key, f))
}
}
#[cfg(test)]
mod tests {
use super::UiWriter;
use fret_ui::UiHost;
use fret_ui::element::AnyElement;
#[allow(dead_code)]
fn writer_surface_smoke<H: UiHost>(ui: &mut impl UiWriter<H>) {
ui.with_cx_mut(|_cx| ());
ui.extend(Vec::<AnyElement>::new());
ui.mount(|_cx| Vec::<AnyElement>::new());
ui.keyed("key", |_cx| ());
ui.keyed(123_u64, |_cx| ());
}
#[test]
fn ui_writer_compiles() {}
}