use bevy::input_focus::{InputFocus, InputFocusVisible};
use bevy::prelude::*;
use crate::nav::{FocusScopes, show_focus};
use crate::tabs::StopQuery;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash, Reflect)]
#[reflect(Default, Debug, PartialEq, Hash, Clone)]
pub enum ArrowPolicy {
#[default]
Navigate,
Host,
}
#[derive(Component, Clone, Copy, Debug, Default, PartialEq, Eq, Reflect)]
#[reflect(Component, Default, Debug, PartialEq, Clone)]
pub struct FocusRegion {
pub arrows: ArrowPolicy,
}
impl FocusRegion {
pub const fn host() -> Self {
Self {
arrows: ArrowPolicy::Host,
}
}
pub const fn navigate() -> Self {
Self {
arrows: ArrowPolicy::Navigate,
}
}
}
pub fn cycle_regions(
keys: Res<ButtonInput<KeyCode>>,
mut focus: ResMut<InputFocus>,
mut shown: ResMut<InputFocusVisible>,
scopes: FocusScopes,
stops: Query<StopQuery>,
) {
if !keys.just_pressed(KeyCode::F6)
|| keys.any_pressed([
KeyCode::ControlLeft,
KeyCode::ControlRight,
KeyCode::AltLeft,
KeyCode::AltRight,
KeyCode::SuperLeft,
KeyCode::SuperRight,
])
{
return;
}
let backwards = keys.any_pressed([KeyCode::ShiftLeft, KeyCode::ShiftRight]);
if let Some(to) = scopes.region_stop(focus.get(), backwards, &stops) {
show_focus(&mut shown);
focus.set(to, bevy::input_focus::FocusCause::Navigated);
}
}