use std::collections::HashSet;
use crate::get_context;
use crate::prelude::screen_height;
use crate::prelude::screen_width;
use crate::Vec2;
pub use miniquad::{KeyCode, MouseButton};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum TouchPhase {
Started,
Stationary,
Moved,
Ended,
Cancelled,
}
impl From<miniquad::TouchPhase> for TouchPhase {
fn from(miniquad_phase: miniquad::TouchPhase) -> TouchPhase {
match miniquad_phase {
miniquad::TouchPhase::Started => TouchPhase::Started,
miniquad::TouchPhase::Moved => TouchPhase::Moved,
miniquad::TouchPhase::Ended => TouchPhase::Ended,
miniquad::TouchPhase::Cancelled => TouchPhase::Cancelled,
}
}
}
#[derive(Clone, Debug)]
pub struct Touch {
pub id: u64,
pub phase: TouchPhase,
pub position: Vec2,
}
pub fn set_cursor_grab(grab: bool) {
let context = get_context();
context.cursor_grabbed = grab;
miniquad::window::set_cursor_grab(grab);
}
pub fn show_mouse(shown: bool) {
miniquad::window::show_mouse(shown);
}
pub fn mouse_position() -> (f32, f32) {
let context = get_context();
(
context.mouse_position.x / miniquad::window::dpi_scale(),
context.mouse_position.y / miniquad::window::dpi_scale(),
)
}
pub fn mouse_position_local() -> Vec2 {
let (pixels_x, pixels_y) = mouse_position();
convert_to_local(Vec2::new(pixels_x, pixels_y))
}
pub fn mouse_delta_position() -> Vec2 {
let context = get_context();
let current_position = mouse_position_local();
let last_position = context.last_mouse_position.unwrap_or(current_position);
let delta = last_position - current_position;
delta
}
pub fn is_simulating_mouse_with_touch() -> bool {
get_context().simulate_mouse_with_touch
}
pub fn simulate_mouse_with_touch(option: bool) {
get_context().simulate_mouse_with_touch = option;
}
pub fn touches() -> Vec<Touch> {
get_context().touches.values().cloned().collect()
}
pub fn touches_local() -> Vec<Touch> {
get_context()
.touches
.values()
.map(|touch| {
let mut touch = touch.clone();
touch.position = convert_to_local(touch.position);
touch
})
.collect()
}
pub fn mouse_wheel() -> (f32, f32) {
let context = get_context();
(context.mouse_wheel.x, context.mouse_wheel.y)
}
pub fn is_key_pressed(key_code: KeyCode) -> bool {
let context = get_context();
context.keys_pressed.contains(&key_code)
}
pub fn is_key_down(key_code: KeyCode) -> bool {
let context = get_context();
context.keys_down.contains(&key_code)
}
pub fn is_key_released(key_code: KeyCode) -> bool {
let context = get_context();
context.keys_released.contains(&key_code)
}
pub fn get_char_pressed() -> Option<char> {
let context = get_context();
context.chars_pressed_queue.pop()
}
pub(crate) fn get_char_pressed_ui() -> Option<char> {
let context = get_context();
context.chars_pressed_ui_queue.pop()
}
pub fn get_last_key_pressed() -> Option<KeyCode> {
let context = get_context();
context.keys_pressed.iter().next().cloned()
}
pub fn get_keys_pressed() -> HashSet<KeyCode> {
let context = get_context();
context.keys_pressed.clone()
}
pub fn get_keys_down() -> HashSet<KeyCode> {
let context = get_context();
context.keys_down.clone()
}
pub fn get_keys_released() -> HashSet<KeyCode> {
let context = get_context();
context.keys_released.clone()
}
pub fn clear_input_queue() {
let context = get_context();
context.chars_pressed_queue.clear();
context.chars_pressed_ui_queue.clear();
}
pub fn is_mouse_button_down(btn: MouseButton) -> bool {
let context = get_context();
context.mouse_down.contains(&btn)
}
pub fn is_mouse_button_pressed(btn: MouseButton) -> bool {
let context = get_context();
context.mouse_pressed.contains(&btn)
}
pub fn is_mouse_button_released(btn: MouseButton) -> bool {
let context = get_context();
context.mouse_released.contains(&btn)
}
fn convert_to_local(pixel_pos: Vec2) -> Vec2 {
Vec2::new(pixel_pos.x / screen_width(), pixel_pos.y / screen_height()) * 2.0
- Vec2::new(1.0, 1.0)
}
pub fn prevent_quit() {
get_context().prevent_quit_event = true;
}
pub fn is_quit_requested() -> bool {
get_context().quit_requested
}
pub mod utils {
use crate::get_context;
pub fn register_input_subscriber() -> usize {
let context = get_context();
context.input_events.push(vec![]);
context.input_events.len() - 1
}
pub fn repeat_all_miniquad_input<T: miniquad::EventHandler>(t: &mut T, subscriber: usize) {
let context = get_context();
for event in &context.input_events[subscriber] {
event.repeat(t);
}
context.input_events[subscriber].clear();
}
}