nightshade 0.13.0

A cross-platform data-oriented game engine.
Documentation
use nalgebra_glm::Vec2;
use winit::keyboard::KeyCode;

use crate::ecs::world::World;

pub fn ui_retained_input_sync_system(world: &mut World) {
    if !world.resources.retained_ui.enabled {
        return;
    }

    world.resources.retained_ui.frame_events.clear();
    world.resources.retained_ui.delta_time = world.resources.window.timing.delta_time;
    world.resources.retained_ui.current_time =
        world.resources.window.timing.uptime_milliseconds as f64 / 1000.0;

    let focused_secondary = world
        .resources
        .secondary_windows
        .focused_index
        .and_then(|idx| {
            world
                .resources
                .secondary_windows
                .states
                .iter()
                .find(|s| s.index == idx)
                .map(|s| {
                    let keystates = &s.input.keyboard_keystates;
                    let ctrl = matches!(
                        keystates.get(&KeyCode::ControlLeft),
                        Some(winit::event::ElementState::Pressed)
                    ) || matches!(
                        keystates.get(&KeyCode::ControlRight),
                        Some(winit::event::ElementState::Pressed)
                    );
                    let shift = matches!(
                        keystates.get(&KeyCode::ShiftLeft),
                        Some(winit::event::ElementState::Pressed)
                    ) || matches!(
                        keystates.get(&KeyCode::ShiftRight),
                        Some(winit::event::ElementState::Pressed)
                    );
                    (
                        s.input.mouse_wheel_delta,
                        ctrl,
                        shift,
                        s.input.frame_keys.clone(),
                        s.input.frame_chars.clone(),
                    )
                })
        });

    if let Some((scroll, ctrl, shift, frame_keys, frame_chars)) = focused_secondary {
        world.resources.retained_ui.frame_chars = frame_chars;
        world.resources.retained_ui.frame_keys = frame_keys;
        world.resources.retained_ui.scroll_delta = scroll;
        world.resources.retained_ui.ctrl_held = ctrl;
        world.resources.retained_ui.shift_held = shift;
    } else {
        world.resources.retained_ui.frame_chars =
            world.resources.input.keyboard.frame_chars.clone();
        world.resources.retained_ui.frame_keys = world.resources.input.keyboard.frame_keys.clone();
        world.resources.retained_ui.scroll_delta = world.resources.input.mouse.wheel_delta;

        let ctrl_held = world
            .resources
            .input
            .keyboard
            .is_key_pressed(KeyCode::ControlLeft)
            || world
                .resources
                .input
                .keyboard
                .is_key_pressed(KeyCode::ControlRight);
        let shift_held = world
            .resources
            .input
            .keyboard
            .is_key_pressed(KeyCode::ShiftLeft)
            || world
                .resources
                .input
                .keyboard
                .is_key_pressed(KeyCode::ShiftRight);

        world.resources.retained_ui.ctrl_held = ctrl_held;
        world.resources.retained_ui.shift_held = shift_held;
    }

    if world.resources.retained_ui.scroll_delta != Vec2::zeros()
        || !world.resources.retained_ui.frame_chars.is_empty()
    {
        world.resources.retained_ui.layout_dirty = true;
    }

    world.resources.retained_ui.cleanup_stale_animations();
}