nightshade 0.55.0

A cross-platform data-oriented game engine.
Documentation
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()
}