use bevy::picking::Pickable;
use bevy::ui::FocusPolicy;
use crate::cursor::NodeCursor;
use crate::style::props::*;
use crate::style::{Writer, owns};
use crate::ui_map::remove_unless_fresh;
pub static FOCUS_POLICY_WRITER: Writer = Writer {
reads: &[&FOCUS_POLICY],
attrs: &[],
writes: &[owns::<FocusPolicy>, owns::<Pickable>],
apply: |ctx, s, ec| {
let policy = s.get(&FOCUS_POLICY).copied().unwrap_or(FocusPolicy::Pass);
ec.insert(policy);
ec.insert(focus_pickable(ctx.flags, policy));
},
};
pub(crate) fn focus_pickable(flags: crate::ext::ElementFlags, policy: FocusPolicy) -> Pickable {
if flags.pick_ignore {
Pickable::IGNORE
} else {
Pickable {
should_block_lower: policy == FocusPolicy::Block,
is_hoverable: true,
}
}
}
pub static CURSOR_WRITER: Writer = Writer {
reads: &[&CURSOR],
attrs: &[],
writes: &[owns::<NodeCursor>],
apply: |ctx, s, ec| match s.get(&CURSOR) {
Some(c) => {
ec.insert(NodeCursor(c.clone()));
}
None => remove_unless_fresh::<NodeCursor>(ec, ctx.fresh),
},
};