///|
/// SimpleUIInputAdapter converts InputSnapshot to UIEvents.
///|
pub struct SimpleUIInputAdapter {
mut prev_pressed_mouse : Array[Int]
mut prev_cursor_x : Double
mut prev_cursor_y : Double
mut prev_pressed_keys : Array[Int]
}
///|
pub fn SimpleUIInputAdapter::new() -> SimpleUIInputAdapter {
{
prev_pressed_mouse: [],
prev_cursor_x: 0.0,
prev_cursor_y: 0.0,
prev_pressed_keys: [],
}
}
///|
fn contains_int(arr : Array[Int], value : Int) -> Bool {
for item in arr {
if item == value {
return true
}
}
false
}
///|
pub impl UIInputAdapter for SimpleUIInputAdapter with fn from_input_snapshot(
self,
snapshot,
) {
let events : Array[UIEvent] = []
// Pointer move
if snapshot.cursor_x != self.prev_cursor_x ||
snapshot.cursor_y != self.prev_cursor_y {
events.push(UIEvent::PointerMove(snapshot.cursor_x, snapshot.cursor_y))
}
// Mouse button down (newly pressed)
for btn in snapshot.pressed_mouse_buttons {
if !contains_int(self.prev_pressed_mouse, btn) {
events.push(UIEvent::PointerDown(snapshot.cursor_x, snapshot.cursor_y))
}
}
// Mouse button up (newly released)
for btn in self.prev_pressed_mouse {
if !contains_int(snapshot.pressed_mouse_buttons, btn) {
events.push(UIEvent::PointerUp(snapshot.cursor_x, snapshot.cursor_y))
}
}
// Scroll
if snapshot.wheel_x != 0.0 || snapshot.wheel_y != 0.0 {
events.push(UIEvent::Scroll(snapshot.wheel_x, snapshot.wheel_y))
}
// Key down (newly pressed)
for key in snapshot.pressed_keys {
if !contains_int(self.prev_pressed_keys, key) {
events.push(UIEvent::KeyDown(key))
}
}
// Key up (newly released)
for key in self.prev_pressed_keys {
if !contains_int(snapshot.pressed_keys, key) {
events.push(UIEvent::KeyUp(key))
}
}
// Update state
self.prev_pressed_mouse = snapshot.pressed_mouse_buttons
self.prev_cursor_x = snapshot.cursor_x
self.prev_cursor_y = snapshot.cursor_y
self.prev_pressed_keys = snapshot.pressed_keys
events
}
///|
pub extend SimpleUIInputAdapter with UIInputAdapter::{from_input_snapshot}