use std::time::Duration;
use winit::event::VirtualKeyCode;
use winit_input_helper::WinitInputHelper;
use crate::{color::Color, program::{DeltaTime, Fps}, resources::Buffer, resources::Renderable};
pub enum MouseButton {
Left,
Right,
Middle,
Other(u16),
}
pub struct Commands {
pub(crate) buffer: Buffer,
pub(crate) winit_input: WinitInputHelper,
pub(crate) quit: bool,
fps: Fps,
delta: DeltaTime,
}
impl Commands {
pub(crate) fn new(buffer: Buffer, fps: Fps, delta: DeltaTime) -> Self {
let winit_input = WinitInputHelper::new();
Self {
buffer, winit_input,
quit: false,
fps, delta
}
}
pub fn quit_program(&mut self) { self.quit = true; }
pub fn program_is_quit(&mut self) { self.winit_input.close_requested(); }
pub fn key_pressed(&self, key: VirtualKeyCode) -> bool { self.winit_input.key_held(key) }
pub fn key_released(&self, key: VirtualKeyCode) -> bool { self.winit_input.key_released(key) }
fn mouse_button_to_number(&self, button: MouseButton) -> u16 {
match button {
MouseButton::Left => 0, MouseButton::Right => 1,
MouseButton::Middle => 2, MouseButton::Other(num) => num,
}
}
pub fn mouse_pressed(&self, button: MouseButton) -> bool {
let button = self.mouse_button_to_number(button);
self.winit_input.mouse_held(button as usize)
}
pub fn mouse_released(&self, button: MouseButton) -> bool {
let button = self.mouse_button_to_number(button);
self.winit_input.mouse_released(button as usize)
}
pub fn mouse_position(&self) -> Option<(f32, f32)> { self.winit_input.mouse() }
pub fn delta_time(&mut self) -> Duration { self.delta.get() }
pub fn fps(&mut self) -> f32 { self.fps.get() }
pub fn clear_buffer(&mut self, color: Color) {
for pixel in self.buffer.raw_buffer().chunks_mut(4) {
pixel[0] = color.r; pixel[1] = color.g; pixel[2] = color.b; pixel[3] = color.a; }
}
pub fn render<R: Renderable>(&mut self, resource: &mut R) -> &mut Self { resource.render(&mut self.buffer); self }
}