HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
mouse_event.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "mouse_buttons.hpp"
8#include "../geometry/point.hpp"
9#include "../geometry/vector.hpp"
10#include "../geometry/transform.hpp"
11#include <chrono>
12
13namespace tt {
14
16 enum class Type { None, Entered, Exited, Move, Drag, ButtonDown, ButtonUp, Wheel };
17
18 Type type;
19
20 std::chrono::utc_time<std::chrono::nanoseconds> timePoint;
21
24
27
30
33
36
39
40 mouse_event() noexcept :
41 type(Type::None),
42 position(),
43 cause(),
44 down(),
45 clickCount(0)
46 {
47 }
48
49 static mouse_event entered(point2 position={}) noexcept {
50 mouse_event event;
51 event.position = position;
52 event.type = mouse_event::Type::Entered;
53 return event;
54 }
55
56 static mouse_event exited() noexcept {
57 // Position far away from the left/bottom corner, but where even
58 // after translations will not cause the position to be infinite.
59 constexpr float far_ = std::numeric_limits<float>::max() * -0.5f;
60
61 mouse_event event;
62 event.position = point2{far_, far_};
63 event.type = mouse_event::Type::Exited;
64 return event;
65 }
66
69 [[nodiscard]] vector2 delta() const noexcept
70 {
71 return type == Type::Drag ? position - downPosition : vector2{};
72 }
73
74 [[nodiscard]] friend mouse_event operator*(geo::transformer auto const &transform, mouse_event const &rhs) noexcept
75 {
76 auto r = rhs;
77 r.position = point2{transform * rhs.position};
78 r.downPosition = point2{transform * rhs.downPosition};
79 r.wheelDelta = vector2{transform * rhs.wheelDelta};
80 return r;
81 }
82
83 friend std::string to_string(mouse_event const &rhs) noexcept {
84 char const *type_s;
85 switch (rhs.type) {
86 using enum mouse_event::Type;
87 case None: type_s = "none"; break;
88 case Entered: type_s = "entered"; break;
89 case Exited: type_s = "exited"; break;
90 case Move: type_s = "move"; break;
91 case Drag: type_s = "drag"; break;
92 case ButtonDown: type_s = "down"; break;
93 case ButtonUp: type_s = "up"; break;
94 case Wheel: type_s = "wheel"; break;
95 default: tt_no_default();
96 }
97
98 return std::format("<mouse {} {}>", type_s, rhs.position);
99 }
100
101 friend std::ostream &operator<<(std::ostream &lhs, mouse_event const &rhs) {
102 return lhs << to_string(rhs);
103 }
104};
105
106
107
108}
Definition mouse_buttons.hpp:11
Definition mouse_event.hpp:15
point2 position
The current position of the mouse pointer.
Definition mouse_event.hpp:23
point2 downPosition
The position the last time a button was pressed.
Definition mouse_event.hpp:26
int clickCount
Number of clicks from the last button clicked.
Definition mouse_event.hpp:38
vector2 delta() const noexcept
Get the location of the mouse relative to the start of a drag.
Definition mouse_event.hpp:69
mouse_buttons down
Buttons that are pressed/held down.
Definition mouse_event.hpp:35
vector2 wheelDelta
Change in wheel rotation, in pixels.
Definition mouse_event.hpp:29
mouse_buttons cause
Buttons which has caused this event.
Definition mouse_event.hpp:32
Definition transform.hpp:83
T max(T... args)
T transform(T... args)