@@ -34,46 +34,52 @@ void button::fire_script(const std::string& script_name, const event_data& data)
3434 if (!checker.is_alive ())
3535 return ;
3636
37- if (is_enabled ()) {
38- if (script_name == " OnEnter" )
39- highlight ();
37+ if (!is_enabled ())
38+ return ;
4039
41- if (script_name == " OnLeave " ) {
42- unlight ();
40+ if (script_name == " OnEnter " )
41+ highlight ();
4342
44- if (state_ == state::down)
45- release ();
43+ if (script_name == " OnLeave" ) {
44+ unlight ();
45+
46+ if (state_ == state::down)
47+ release ();
48+ }
49+
50+ bool try_handle_click = false ;
51+ if (script_name == " OnMouseDown" || script_name == " OnMouseUp" ||
52+ script_name == " OnDoubleClick" ) {
53+
54+ try_handle_click = true ;
55+
56+ // If reacting to a "mouse up" event, only handle as a click if
57+ // the mouse was pressed down on this button.
58+ if (script_name == " OnMouseUp" && !data.get <bool >(5 )) {
59+ try_handle_click = false ;
4660 }
61+ }
4762
48- if (script_name == " OnMouseDown" || script_name == " OnMouseUp" ||
49- script_name == " OnDoubleClick" ) {
50-
51- const input::mouse_button_event event_id =
52- script_name == " OnMouseDown" ? input::mouse_button_event::down
53- : script_name == " OnMouseUp" ? input::mouse_button_event::up
54- : input::mouse_button_event::double_click;
55-
56- const auto event_name = data.get <std::string>(1 ) +
57- std::string{input::get_mouse_button_event_codename (event_id)};
58-
59- if (is_button_clicks_enabled (event_name)) {
60- if (event_id == input::mouse_button_event::down)
61- push ();
62- else if (event_id == input::mouse_button_event::up)
63- release ();
64-
65- event_data new_data;
66- new_data.add (data.get (0 )); // Mouse button ID
67- new_data.add (static_cast <std::underlying_type_t <input::mouse_button_event>>(
68- event_id)); // Mouse button event
69- new_data.add (event_name); // Mouse button event name
70- new_data.add (data.get (2 )); // Mouse pos X
71- new_data.add (data.get (3 )); // Mouse pos Y
72- fire_script (" OnClick" , new_data);
73- if (!checker.is_alive ())
74- return ;
75- }
63+ if (try_handle_click) {
64+ const input::mouse_button button_id = data.get <input::mouse_button>(0 );
65+ const input::mouse_button_event event_id =
66+ script_name == " OnMouseDown" ? input::mouse_button_event::down
67+ : script_name == " OnMouseUp" ? input::mouse_button_event::up
68+ : input::mouse_button_event::double_click;
69+
70+ if (is_button_clicks_enabled_ (button_id)) {
71+ if (event_id == input::mouse_button_event::down)
72+ push ();
73+ else if (event_id == input::mouse_button_event::up)
74+ release ();
7675 }
76+
77+ float mx = data.get <float >(2 );
78+ float my = data.get <float >(3 );
79+
80+ click_ (button_id, event_id, mx, my);
81+ if (!checker.is_alive ())
82+ return ;
7783 }
7884}
7985
@@ -389,6 +395,39 @@ void button::release() {
389395 state_ = state::up;
390396}
391397
398+ void button::click (const std::string& mouse_event) {
399+ auto mouse_event_id = input::get_mouse_button_and_event_from_codename (mouse_event);
400+ if (!mouse_event_id.has_value ()) {
401+ return ;
402+ }
403+
404+ click (mouse_event_id.value ().first , mouse_event_id.value ().second );
405+ }
406+
407+ void button::click (input::mouse_button button_id, input::mouse_button_event button_event) {
408+ vector2f center = get_center ();
409+ click_ (button_id, button_event, center.x , center.y );
410+ }
411+
412+ void button::click_ (
413+ input::mouse_button button_id, input::mouse_button_event button_event, float mx, float my) {
414+
415+ if (!is_button_clicks_enabled (button_id, button_event)) {
416+ return ;
417+ }
418+
419+ std::string event_name =
420+ std::string{input::get_mouse_button_and_event_codename (button_id, button_event)};
421+
422+ event_data new_data;
423+ new_data.add (static_cast <std::underlying_type_t <input::mouse_button>>(button_id));
424+ new_data.add (static_cast <std::underlying_type_t <input::mouse_button_event>>(button_event));
425+ new_data.add (event_name);
426+ new_data.add (mx);
427+ new_data.add (my);
428+ fire_script (" OnClick" , new_data);
429+ }
430+
392431void button::highlight () {
393432 if (is_highlighted_)
394433 return ;
@@ -464,8 +503,7 @@ void button::enable_button_clicks(const std::string& mouse_state) {
464503void button::enable_button_clicks (
465504 input::mouse_button button_id, input::mouse_button_event button_event) {
466505 reg_click_list_.insert (
467- std::string{input::get_mouse_button_codename (button_id)} +
468- std::string{input::get_mouse_button_event_codename (button_event)});
506+ std::string{input::get_mouse_button_and_event_codename (button_id, button_event)});
469507}
470508
471509void button::disable_button_clicks (const std::string& mouse_state) {
@@ -475,8 +513,7 @@ void button::disable_button_clicks(const std::string& mouse_state) {
475513void button::disable_button_clicks (
476514 input::mouse_button button_id, input::mouse_button_event button_event) {
477515 reg_click_list_.erase (
478- std::string{input::get_mouse_button_codename (button_id)} +
479- std::string{input::get_mouse_button_event_codename (button_event)});
516+ std::string{input::get_mouse_button_and_event_codename (button_id, button_event)});
480517}
481518
482519void button::disable_button_clicks () {
@@ -489,10 +526,19 @@ bool button::is_button_clicks_enabled(const std::string& mouse_event) const {
489526
490527bool button::is_button_clicks_enabled (
491528 input::mouse_button button_id, input::mouse_button_event button_event) const {
492- return reg_click_list_.find (
493- std::string{input::get_mouse_button_codename (button_id)} +
494- std::string{input::get_mouse_button_event_codename (button_event)}) !=
495- reg_click_list_.end ();
529+ return reg_click_list_.find (std::string{input::get_mouse_button_and_event_codename (
530+ button_id, button_event)}) != reg_click_list_.end ();
531+ }
532+
533+ bool button::is_button_clicks_enabled_ (input::mouse_button button_id) const {
534+ auto button_name = input::get_mouse_button_codename (button_id);
535+ for (const auto & click : reg_click_list_) {
536+ if (click.find (button_name) == 0 ) {
537+ return true ;
538+ }
539+ }
540+
541+ return false ;
496542}
497543
498544const std::vector<std::string>& button::get_type_list_ () const {
0 commit comments