feat(input): host-agnostic events and pan/zoom/cursor controller
This commit is contained in:
1 parent
606e40a9f1
commit
5ab854104a
6 files changed
+718
No files matched your search
@@ -0,0 +1,65 @@
|
||||
#pragma once
|
||||
|
||||
#include <plot/core/types.hpp>
|
||||
|
||||
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<u32>(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
|
||||
Reference in new issue
Block a user