use bevy::prelude::*;
use bevy_egui::EguiContext;
#[derive(Resource, PartialEq, Eq, Default)]
pub struct EguiWantsFocus {
pub prev: bool,
pub curr: bool,
}
#[derive(Resource, PartialEq, Eq, Default, Clone, Copy, Debug, Reflect)]
pub enum EguiFocusIncludesHover {
#[default]
ClickOnly,
IncludeHover,
}
#[derive(Component, Reflect, Debug, Default)]
#[reflect(Component)]
pub struct BlockOnEguiFocus;
pub fn check_egui_wants_focus(
mut contexts: Query<&mut EguiContext>,
mut wants_focus: ResMut<EguiWantsFocus>,
include_hover: Res<EguiFocusIncludesHover>,
) {
let mut new_wants_focus = false;
for mut context in &mut contexts {
let context = context.get_mut();
let mut context_wants_focus =
context.wants_pointer_input() || context.wants_keyboard_input();
if *include_hover == EguiFocusIncludesHover::IncludeHover {
context_wants_focus |= context.is_pointer_over_area();
}
new_wants_focus |= context_wants_focus;
}
let new_res = EguiWantsFocus {
prev: wants_focus.curr,
curr: new_wants_focus,
};
wants_focus.set_if_neq(new_res);
}