#pragma once #include namespace plot::input { /// Mouse buttons a host can report. The controller never assumes a fixed /// mapping: right-drag pans as well as left, for hosts that reserve left-drag. enum class Button { Left, Middle, Right }; /// Keyboard modifier bits for `PointerEvent::mods` / `WheelEvent::mods`. enum class Mod { None = 0, Shift = 1, Ctrl = 2, Alt = 4, Super = 8 }; /// True when `mods` holds `m`. The single place modifier bits are tested, so a /// call site never hand-rolls a mask. constexpr bool has_mod(u32 mods, Mod m) noexcept { return (mods & static_cast(m)) != 0u; } /// A pointer event in viewport pixels (origin top-left, the same space as /// `Rect`). `dx`/`dy` are the movement since the previous event; the controller /// reads them for panning and the absolute `x`/`y` for anchoring and hit tests. /// `pressed` and `released` are the transitions; `down` is the state after the /// event. A plain move has all three false/true as appropriate (down only). struct PointerEvent { f32 x = 0.0f; f32 y = 0.0f; f32 dx = 0.0f; f32 dy = 0.0f; Button button = Button::Left; u32 mods = 0; bool down = false; ///< the button is held after this event bool pressed = false; ///< a press transition happened on this event bool released = false; ///< a release transition happened on this event }; /// A wheel/scroll event at a pixel position. A positive `dy` (scroll up) zooms /// in; a positive `dx` scrolls right. Only `dy` drives the controller's zoom. struct WheelEvent { f32 x = 0.0f; f32 y = 0.0f; f32 dx = 0.0f; f32 dy = 0.0f; u32 mods = 0; }; /// A key event. `key` is an ASCII codepoint for printable keys; hosts that only /// have scancodes translate them before calling. `down` distinguishes the press /// from the release -- the controller's actions are press-only. struct KeyEvent { int key = 0; u32 mods = 0; bool down = false; }; /// The printable keys the controller reacts to, named so no call site spells a /// bare character literal. `kKeyZoomIn`/`kKeyZoomOut` zoom about the plot centre, /// `kKeyFit` re-fits every axis to its traces. inline constexpr int kKeyZoomIn = '+'; inline constexpr int kKeyZoomOut = '-'; inline constexpr int kKeyFit = 'f'; /// Hosts that report shifted keys uppercase can pass this unchanged. inline constexpr int kKeyFitUpper = 'F'; } // namespace plot::input