tge 0.0.4

A lightweight cross-platform 2D game framework written in pure Rust and based on OpenGL 3.3+.
Documentation
mod code;
mod modifier;

pub use code::KeyCode;
pub use modifier::ModifiersState;

use crate::error::GameResult;
use crate::event::{KeyState, KeyAction};
use std::collections::HashMap;

pub struct Keyboard {
    key_states: HashMap<KeyCode, KeyState>,
    modifiers_state: ModifiersState,
}

impl Keyboard {
    pub(crate) fn new(_: KeyboardConfig) -> GameResult<Self> {
        Ok(Self {
            key_states: HashMap::new(),
            modifiers_state: ModifiersState {
                shift: false,
                ctrl: false,
                alt: false,
                logo: false,
            },
        })
    }

    pub(crate) fn handle_input_event(&mut self, key: KeyCode, action: KeyAction) -> bool {
        let new_state = action.into();
        if let Some(state) = self.key_states.get_mut(&key) {
            if state == &new_state || (state == &KeyState::Hold && new_state == KeyState::Down) {
                true
            } else {
                *state = new_state;
                false
            }
        } else {
            self.key_states.insert(key, new_state);
            false
        }
    }

    pub(crate) fn handle_modifiers_state_change(&mut self, state: ModifiersState) {
        self.modifiers_state = state;
    }

    pub(crate) fn clear_states(&mut self) {
        self.key_states.retain(|_, state| match state {
            KeyState::Down | KeyState::Hold => {
                *state = KeyState::Hold;
                true
            }
            KeyState::Up | KeyState::Idle => false,
        });
    }

    pub fn is_key_down(&self, key: KeyCode) -> bool {
        match self.key_states.get(&key).unwrap_or(&KeyState::Idle) {
            KeyState::Down => true,
            _ => false,
        }
    }

    pub fn is_key_hold(&self, key: KeyCode) -> bool {
        match self.key_states.get(&key).unwrap_or(&KeyState::Idle) {
            KeyState::Down | KeyState::Hold => true,
            _ => false,
        }
    }

    pub fn is_key_up(&self, key: KeyCode) -> bool {
        match self.key_states.get(&key).unwrap_or(&KeyState::Idle) {
            KeyState::Up => true,
            _ => false,
        }
    }

    pub fn modifiers_state(&self) -> ModifiersState {
        self.modifiers_state
    }
}

#[derive(Debug, Clone)]
pub struct KeyboardConfig {}

impl KeyboardConfig {
    pub fn new() -> Self {
        Self {}
    }
}