use egui::{Id, Response, Ui};
#[derive(Clone, Copy, Default, Debug)]
pub(crate) struct PseudoState {
pub hovered: bool,
pub active: bool,
pub focused: bool,
}
impl PseudoState {
pub(crate) fn load(ui: &Ui, id: Id) -> Self {
ui.memory(|mem| mem.data.get_temp::<PseudoState>(id).unwrap_or_default())
}
pub(crate) fn store(self, ui: &Ui, id: Id) {
ui.memory_mut(|mem| {
mem.data.insert_temp(id, self);
})
}
pub(crate) fn from_response(response: &Response) -> Self {
Self {
hovered: response.hovered(),
active: response.is_pointer_button_down_on(),
focused: response.has_focus(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn memory_roundtrip() {
let ctx = egui::Context::default();
let id = Id::new("ps-test");
let state = PseudoState {
hovered: true,
active: false,
focused: true,
};
ctx.memory_mut(|mem| mem.data.insert_temp(id, state));
let loaded = ctx.memory_mut(|mem| mem.data.get_temp::<PseudoState>(id).unwrap_or_default());
assert!(loaded.hovered);
assert!(!loaded.active);
assert!(loaded.focused);
}
#[test]
fn unset_id_returns_default() {
let ctx = egui::Context::default();
let id = Id::new("ps-never-stored");
let loaded = ctx.memory_mut(|mem| mem.data.get_temp::<PseudoState>(id).unwrap_or_default());
assert!(!loaded.hovered);
assert!(!loaded.active);
assert!(!loaded.focused);
}
}