Skip to main content

cotis_raylib/
interactivity.rs

1//! Input polling: maps raylib keyboard/mouse state to `cotis-utils` interactivity traits.
2//!
3//! `MouseProvider`, `SimpleKeyboardProvider`, and `SimpleTextProvider` (from `cotis_utils::interactivity`)
4//! are implemented for:
5//!
6//! - [`crate::renderer::RayRenderHandle`] — direct handle access (e.g. while holding a mutex guard).
7//! - [`crate::renderer::RaylibRender`] — delegates through the shared mutex.
8//! - `RayTestRender` (feature `test-render`) — scales mouse position.
9//!
10//! Key and button mapping lives in the `keyboard` and `mouse` submodules.
11
12use crate::interactivity::keyboard::{collect_pressed_chars, into_raylib_key};
13use crate::interactivity::mouse::into_raylib_mouse;
14use crate::renderer::{RayRenderHandle, RaylibRender};
15use cotis_utils::interactivity::keyboard::{
16    KEYBOARD_LIST, KeyboardKey, SimpleKeyboardProvider, SimpleTextProvider,
17};
18use cotis_utils::interactivity::mouse::{MouseButton, MouseProvider};
19use cotis_utils::math::Vector2;
20use indexmap::IndexSet;
21
22mod keyboard;
23mod mouse;
24
25impl MouseProvider for RayRenderHandle {
26    fn get_mouse_position(&self) -> Vector2 {
27        let pos = self.0.get_mouse_position();
28        (pos.x, pos.y).into()
29    }
30
31    fn mouse_button_down(&self, button: MouseButton) -> bool {
32        !self.0.is_mouse_button_up(into_raylib_mouse(button))
33    }
34
35    fn get_mouse_wheel_move_v(&self) -> Vector2 {
36        let pos = self.0.get_mouse_wheel_move_v();
37        (pos.x, pos.y).into()
38    }
39}
40
41impl SimpleKeyboardProvider for RayRenderHandle {
42    fn get_pressed_keys(&self) -> IndexSet<KeyboardKey> {
43        let mut keys = IndexSet::new();
44        for &key in &KEYBOARD_LIST {
45            if key != KeyboardKey::KeyNull && self.0.is_key_down(into_raylib_key(key)) {
46                keys.insert(key);
47            }
48        }
49        keys
50    }
51}
52
53impl SimpleTextProvider for RayRenderHandle {
54    fn get_pressed_chars(&self) -> Vec<char> {
55        collect_pressed_chars()
56    }
57}
58
59impl MouseProvider for RaylibRender {
60    fn get_mouse_position(&self) -> Vector2 {
61        self.lock_handle().get_mouse_position()
62    }
63
64    fn mouse_button_down(&self, button: MouseButton) -> bool {
65        self.lock_handle().mouse_button_down(button)
66    }
67
68    fn get_mouse_wheel_move_v(&self) -> Vector2 {
69        self.lock_handle().get_mouse_wheel_move_v()
70    }
71}
72
73impl SimpleKeyboardProvider for RaylibRender {
74    fn get_pressed_keys(&self) -> IndexSet<KeyboardKey> {
75        self.lock_handle().get_pressed_keys()
76    }
77}
78
79impl SimpleTextProvider for RaylibRender {
80    fn get_pressed_chars(&self) -> Vec<char> {
81        collect_pressed_chars()
82    }
83}