raekna-ui 0.2.1

This crate contains functionality to draw a plain text calculator using wgpu.
Documentation
use winit::{
    dpi::PhysicalPosition,
    event::{ElementState, MouseButton, MouseScrollDelta, VirtualKeyCode},
};

use super::active_modifiers::ActiveModifiers;

#[derive(Copy, Clone, Debug)]
pub enum KeyboardMovement {
    Home,
    End,
    PageUp,
    PageDown,
    Up,
    Down,
    Left,
    Right,
    SelectAll,
}

#[derive(Copy, Clone, Debug)]
pub enum KeyboardEdit {
    Input(char),
    NewLine,
    Delete,
    Backspace,
    Cut,
    Copy,
    Paste,
}

#[derive(Copy, Clone, Debug)]
pub enum MouseInput {
    CursorMoved(PhysicalPosition<f32>),
    LineScroll(f32, f32),
    PixelScroll(PhysicalPosition<f32>),
    MouseClick {
        state: ElementState,
        button: MouseButton,
        click_count: u8,
    },
}

#[derive(Copy, Clone, Debug)]
pub enum UserInput {
    KeyboardMovement(KeyboardMovement),
    KeyboardEdit(KeyboardEdit),
    MouseInput(MouseInput),
}

impl UserInput {
    pub fn from_key_code(
        key_code: &Option<VirtualKeyCode>,
        active_modifiers: &ActiveModifiers,
    ) -> Option<Self> {
        key_code.and_then(|key_code| match key_code {
            VirtualKeyCode::Home => Some(KeyboardMovement::Home.into()),
            VirtualKeyCode::End => Some(KeyboardMovement::End.into()),
            VirtualKeyCode::PageDown => Some(KeyboardMovement::PageDown.into()),
            VirtualKeyCode::PageUp => Some(KeyboardMovement::PageUp.into()),
            VirtualKeyCode::Left => Some(KeyboardMovement::Left.into()),
            VirtualKeyCode::Up => Some(KeyboardMovement::Up.into()),
            VirtualKeyCode::Right => Some(KeyboardMovement::Right.into()),
            VirtualKeyCode::Down => Some(KeyboardMovement::Down.into()),
            VirtualKeyCode::Return | VirtualKeyCode::NumpadEnter => {
                Some(KeyboardEdit::NewLine.into())
            }
            VirtualKeyCode::Delete => Some(KeyboardEdit::Delete.into()),
            VirtualKeyCode::Back => Some(KeyboardEdit::Backspace.into()),
            VirtualKeyCode::X if active_modifiers.ctrl => Some(KeyboardEdit::Cut.into()),
            VirtualKeyCode::C if active_modifiers.ctrl => Some(KeyboardEdit::Copy.into()),
            VirtualKeyCode::V if active_modifiers.ctrl => Some(KeyboardEdit::Paste.into()),
            VirtualKeyCode::A if active_modifiers.ctrl => Some(KeyboardMovement::SelectAll.into()),
            _ => None,
        })
    }
}

impl From<KeyboardMovement> for UserInput {
    fn from(k: KeyboardMovement) -> Self {
        Self::KeyboardMovement(k)
    }
}

impl From<KeyboardEdit> for UserInput {
    fn from(k: KeyboardEdit) -> Self {
        Self::KeyboardEdit(k)
    }
}

impl From<MouseInput> for UserInput {
    fn from(m: MouseInput) -> Self {
        Self::MouseInput(m)
    }
}

impl From<&MouseScrollDelta> for UserInput {
    fn from(delta: &MouseScrollDelta) -> Self {
        let mouse_input = match delta {
            MouseScrollDelta::LineDelta(x, y) => MouseInput::LineScroll(*x, *y),
            MouseScrollDelta::PixelDelta(delta) => {
                let delta = PhysicalPosition::new(delta.x as f32, delta.y as f32);
                MouseInput::PixelScroll(delta)
            }
        };
        mouse_input.into()
    }
}