use nalgebra_glm::Vec2;
use winit::keyboard::KeyCode;
use crate::ecs::world::World;
use crate::prelude::*;
pub fn ui_retained_input_sync_system(world: &mut World) {
if !world
.res::<crate::ecs::ui::resources::RetainedUiState>()
.visible
{
return;
}
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.frame
.events
.clear();
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.accessibility
.announce_queue
.clear();
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.timing
.delta_time = world.res_mut::<crate::ecs::time::Time>().delta_time;
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.timing
.current_time = world
.res_mut::<crate::ecs::time::Time>()
.uptime_milliseconds as f64
/ 1000.0;
let ctrl_held = world
.res::<crate::ecs::input::resources::Input>()
.keyboard
.is_key_pressed(KeyCode::ControlLeft)
|| world
.res::<crate::ecs::input::resources::Input>()
.keyboard
.is_key_pressed(KeyCode::ControlRight);
let shift_held = world
.res::<crate::ecs::input::resources::Input>()
.keyboard
.is_key_pressed(KeyCode::ShiftLeft)
|| world
.res::<crate::ecs::input::resources::Input>()
.keyboard
.is_key_pressed(KeyCode::ShiftRight);
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.input
.frame_chars = filter_chars(
world
.res::<crate::ecs::input::resources::Input>()
.keyboard
.frame_chars
.clone(),
ctrl_held,
);
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.input
.frame_keys = world
.res::<crate::ecs::input::resources::Input>()
.keyboard
.frame_keys
.clone();
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.input
.scroll_delta = world
.res_mut::<crate::ecs::input::resources::Input>()
.mouse
.wheel_delta;
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.input
.ctrl_held = ctrl_held;
world
.res_mut::<crate::ecs::ui::resources::RetainedUiState>()
.input
.shift_held = shift_held;
let mouse_state = world
.res::<crate::ecs::input::resources::Input>()
.mouse
.state;
let mouse_drives_layout = mouse_state.intersects(
crate::ecs::input::resources::MouseState::LEFT_CLICKED
| crate::ecs::input::resources::MouseState::LEFT_JUST_PRESSED
| crate::ecs::input::resources::MouseState::LEFT_JUST_RELEASED
| crate::ecs::input::resources::MouseState::RIGHT_JUST_PRESSED
| crate::ecs::input::resources::MouseState::RIGHT_JUST_RELEASED,
);
if mouse_drives_layout
|| world
.res::<crate::ecs::ui::resources::RetainedUiState>()
.input
.scroll_delta
!= Vec2::zeros()
|| !world
.res::<crate::ecs::ui::resources::RetainedUiState>()
.input
.frame_chars
.is_empty()
|| !world
.res::<crate::ecs::ui::resources::RetainedUiState>()
.input
.frame_keys
.is_empty()
{
ui_mark_layout_dirty(world);
}
}
fn filter_chars(chars: Vec<char>, ctrl_held: bool) -> Vec<char> {
if !ctrl_held {
return chars;
}
chars.into_iter().filter(|c| !c.is_ascii()).collect()
}