good-web-game 0.6.1

An alternative implementation of the ggez game engine, based on miniquad
Documentation
#![allow(dead_code)]

use cgmath::Point2;
use std::collections::HashSet;

use miniquad::MouseButton as QuadMouseButton;

#[derive(Hash, Debug, Eq, PartialEq, Clone, Copy)]
pub enum MouseButton {
    Left,
    Middle,
    Right,
    Button4,
    Button5,
}

impl From<QuadMouseButton> for MouseButton {
    fn from(button: QuadMouseButton) -> MouseButton {
        match button {
            QuadMouseButton::Left => MouseButton::Left,
            QuadMouseButton::Right => MouseButton::Right,
            QuadMouseButton::Middle => MouseButton::Middle,
            QuadMouseButton::Unknown => MouseButton::Button4,
        }
    }
}

pub struct InputHandler {
    pub keys: HashSet<String>,
    pub frame_keys: HashSet<String>,
    pub mouse_position: Point2<f32>,
    pub mouse_keys: HashSet<MouseButton>,
    pub wheel: f32,
}

impl Default for InputHandler {
    fn default() -> Self {
        InputHandler::new()
    }
}

impl InputHandler {
    pub fn new() -> InputHandler {
        InputHandler {
            keys: HashSet::new(),
            frame_keys: HashSet::new(),
            mouse_position: Point2::new(0., 0.),
            mouse_keys: HashSet::new(),
            wheel: 0.,
        }
    }

    pub fn handle_mouse_move(&mut self, mouse_x: f32, mouse_y: f32) {
        self.mouse_position = Point2::new(mouse_x, mouse_y);
    }

    pub fn handle_mouse_down(&mut self, button: miniquad::MouseButton) {
        self.mouse_keys.insert(MouseButton::from(button));
    }

    pub fn handle_mouse_up(&mut self, button: miniquad::MouseButton) {
        self.mouse_keys.remove(&MouseButton::from(button));
    }

    pub fn handle_key_down(&mut self, key: String) {
        self.keys.insert(key.clone());
        self.frame_keys.insert(key);
    }

    pub fn handle_end_frame(&mut self) {
        self.frame_keys.clear();
        self.wheel = 0.;
    }

    pub fn handle_key_up(&mut self, key: String) {
        self.keys.remove(&key);
    }

    pub fn handle_mouse_wheel(&mut self, delta_y: f64) {
        self.wheel = delta_y as f32;
    }

    pub fn is_key_pressed(&self, key: &str) -> bool {
        self.keys.contains(key)
    }

    pub fn is_key_down(&self, key: &str) -> bool {
        self.frame_keys.contains(key)
    }

    pub fn is_mouse_key_down(&self, key: &MouseButton) -> bool {
        self.mouse_keys.contains(key)
    }
}