1 #include "lxgui/input_dispatcher.hpp"
3 #include "lxgui/gui_event_emitter.hpp"
4 #include "lxgui/gui_event_receiver.hpp"
5 #include "lxgui/gui_out.hpp"
6 #include "lxgui/input_source.hpp"
7 #include "lxgui/utils_exception.hpp"
8 #include "lxgui/utils_std.hpp"
9 #include "lxgui/utils_string.hpp"
18 key_pressed_time_[static_cast<std::size_t>(key_id)] = timer::now();
20 on_key_pressed(key_pressed_data{key_id});
23 connections_.push_back(src.on_key_pressed_repeat.connect([&](
key key_id) {
25 on_key_pressed_repeat(key_pressed_repeat_data{key_id});
28 connections_.push_back(src.on_key_released.connect([&](key key_id) {
30 on_key_released(key_released_data{key_id});
33 connections_.push_back(src.on_text_entered.connect([&](std::uint32_t c) {
35 on_text_entered(text_entered_data{c});
38 connections_.push_back(
39 src.on_mouse_pressed.connect([&](mouse_button button_id,
gui::vector2f mouse_pos) {
41 mouse_pos /= scaling_factor_;
44 auto time_last = mouse_pressed_time_[
static_cast<std::size_t
>(button_id)];
45 auto time_now = timer::now();
46 mouse_pressed_time_[
static_cast<std::size_t
>(button_id)] = time_now;
47 double click_time = std::chrono::duration<double>(time_now - time_last).count();
50 on_mouse_pressed(mouse_pressed_data{button_id, mouse_pos});
52 if (click_time < double_click_time_)
53 on_mouse_double_clicked(mouse_double_clicked_data{button_id, mouse_pos});
56 connections_.push_back(
57 src.on_mouse_released.connect([&](mouse_button button_id,
gui::vector2f mouse_pos) {
59 mouse_pos /= scaling_factor_;
62 bool was_dragged = is_mouse_dragged_ && button_id == mouse_drag_button_;
63 on_mouse_released(mouse_released_data{button_id, mouse_pos, was_dragged});
66 is_mouse_dragged_ =
false;
67 on_mouse_drag_stop(mouse_drag_stop_data{button_id, mouse_pos});
71 connections_.push_back(src.on_mouse_wheel.connect([&](
float wheel,
gui::vector2f mouse_pos) {
73 mouse_pos /= scaling_factor_;
75 on_mouse_wheel(mouse_wheel_data{wheel, mouse_pos});
78 connections_.push_back(
81 movement /= scaling_factor_;
82 mouse_pos /= scaling_factor_;
85 on_mouse_moved(mouse_moved_data{movement, mouse_pos});
87 if (!is_mouse_dragged_) {
88 std::size_t mouse_button_pressed = std::numeric_limits<std::size_t>::max();
91 mouse_button_pressed = i;
96 if (mouse_button_pressed != std::numeric_limits<std::size_t>::max()) {
97 is_mouse_dragged_ =
true;
98 mouse_drag_button_ =
static_cast<mouse_button>(mouse_button_pressed);
99 on_mouse_drag_start(mouse_drag_start_data{mouse_drag_button_, mouse_pos});
105 bool dispatcher::any_key_is_down()
const {
106 const auto& is_key_down = source_.get_key_state().is_key_down;
107 for (std::size_t i = 1; i <
key_number; ++i) {
115 bool dispatcher::key_is_down(
key key_id)
const {
116 return source_.get_key_state().is_key_down[
static_cast<std::size_t
>(key_id)];
119 double dispatcher::get_key_down_duration(
key key_id)
const {
120 if (!key_is_down(key_id))
123 return std::chrono::duration<double>(
124 timer::now() - key_pressed_time_[
static_cast<std::size_t
>(key_id)])
129 return source_.get_mouse_state().is_button_down[
static_cast<std::size_t
>(button_id)];
132 double dispatcher::get_mouse_down_duration(
mouse_button button_id)
const {
133 if (!mouse_is_down(button_id))
136 return std::chrono::duration<double>(
137 timer::now() - mouse_pressed_time_[
static_cast<std::size_t
>(button_id)])
141 void dispatcher::set_doubleclick_time(
double double_click_time) {
142 double_click_time_ = double_click_time;
145 double dispatcher::get_doubleclick_time()
const {
146 return double_click_time_;
149 bool dispatcher::alt_is_pressed()
const {
150 return key_is_down(key::k_lmenu) || key_is_down(key::k_rmenu);
153 bool dispatcher::shift_is_pressed()
const {
154 return key_is_down(key::k_lshift) || key_is_down(key::k_rshift);
157 bool dispatcher::ctrl_is_pressed()
const {
158 return key_is_down(key::k_lcontrol) || key_is_down(key::k_rcontrol);
162 return source_.get_mouse_state().position / scaling_factor_;
165 float dispatcher::get_mouse_wheel()
const {
166 return source_.get_mouse_state().wheel;
169 const source& dispatcher::get_source()
const {
177 void dispatcher::set_interface_scaling_factor(
float scaling_factor) {
178 scaling_factor_ = scaling_factor;
181 float dispatcher::get_interface_scaling_factor()
const {
182 return scaling_factor_;
connection connect(function_type function)
Connect a new slot to this signal.
vector2< float > vector2f
Holds 2D coordinates (as floats)