2014-02-10 02:10:30 +01:00
/*************************************************************************/
/* base_button.cpp */
/*************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
2017-08-27 14:16:55 +02:00
/* https://godotengine.org */
2014-02-10 02:10:30 +01:00
/*************************************************************************/
2021-01-01 20:13:46 +01:00
/* Copyright (c) 2007-2021 Juan Linietsky, Ariel Manzur. */
/* Copyright (c) 2014-2021 Godot Engine contributors (cf. AUTHORS.md). */
2014-02-10 02:10:30 +01:00
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/*************************************************************************/
2018-01-05 00:50:27 +01:00
2014-02-10 02:10:30 +01:00
# include "base_button.h"
2017-08-27 21:07:15 +02:00
2018-09-11 18:13:45 +02:00
# include "core/os/keyboard.h"
2016-06-28 01:14:59 +02:00
# include "scene/main/viewport.h"
2017-03-05 16:44:50 +01:00
# include "scene/scene_string_names.h"
2017-01-10 05:04:31 +01:00
void BaseButton : : _unpress_group ( ) {
2021-05-05 12:44:11 +02:00
if ( ! button_group . is_valid ( ) ) {
2017-01-10 05:04:31 +01:00
return ;
2021-05-05 12:44:11 +02:00
}
2017-01-10 05:04:31 +01:00
2017-09-27 01:40:00 +02:00
if ( toggle_mode ) {
status . pressed = true ;
}
2017-04-10 06:57:24 +02:00
2017-03-05 16:44:50 +01:00
for ( Set < BaseButton * > : : Element * E = button_group - > buttons . front ( ) ; E ; E = E - > next ( ) ) {
2021-05-05 12:44:11 +02:00
if ( E - > get ( ) = = this ) {
2017-01-10 05:04:31 +01:00
continue ;
2021-05-05 12:44:11 +02:00
}
2017-01-10 05:04:31 +01:00
E - > get ( ) - > set_pressed ( false ) ;
}
}
2017-05-20 17:38:03 +02:00
void BaseButton : : _gui_input ( Ref < InputEvent > p_event ) {
2021-04-27 16:51:29 +02:00
ERR_FAIL_COND ( p_event . is_null ( ) ) ;
2014-02-10 02:10:30 +01:00
2021-05-05 12:44:11 +02:00
if ( status . disabled ) { // no interaction with disabled button
2014-02-10 02:10:30 +01:00
return ;
2021-05-05 12:44:11 +02:00
}
2016-03-09 00:00:52 +01:00
2019-05-21 10:26:08 +02:00
Ref < InputEventMouseButton > mouse_button = p_event ;
bool ui_accept = p_event - > is_action ( " ui_accept " ) & & ! p_event - > is_echo ( ) ;
2016-03-09 00:00:52 +01:00
2019-05-21 10:26:08 +02:00
bool button_masked = mouse_button . is_valid ( ) & & ( ( 1 < < ( mouse_button - > get_button_index ( ) - 1 ) ) & button_mask ) > 0 ;
if ( button_masked | | ui_accept ) {
2019-02-03 02:24:05 +01:00
on_action_event ( p_event ) ;
2019-05-21 10:26:08 +02:00
return ;
2017-05-20 17:38:03 +02:00
}
2014-02-10 02:10:30 +01:00
2019-05-21 10:26:08 +02:00
Ref < InputEventMouseMotion > mouse_motion = p_event ;
if ( mouse_motion . is_valid ( ) ) {
if ( status . press_attempt ) {
2017-05-20 17:38:03 +02:00
bool last_press_inside = status . pressing_inside ;
2019-05-21 10:26:08 +02:00
status . pressing_inside = has_point ( mouse_motion - > get_position ( ) ) ;
if ( last_press_inside ! = status . pressing_inside ) {
2017-05-20 17:38:03 +02:00
update ( ) ;
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
}
}
void BaseButton : : _notification ( int p_what ) {
2017-03-05 16:44:50 +01:00
if ( p_what = = NOTIFICATION_MOUSE_ENTER ) {
status . hovering = true ;
2014-02-10 02:10:30 +01:00
update ( ) ;
}
2016-03-09 00:00:52 +01:00
2017-03-05 16:44:50 +01:00
if ( p_what = = NOTIFICATION_MOUSE_EXIT ) {
status . hovering = false ;
2014-02-10 02:10:30 +01:00
update ( ) ;
2016-03-09 00:00:52 +01:00
}
2018-02-27 16:37:20 +01:00
if ( p_what = = NOTIFICATION_DRAG_BEGIN | | p_what = = NOTIFICATION_SCROLL_BEGIN ) {
2016-06-23 23:20:39 +02:00
if ( status . press_attempt ) {
2017-03-05 16:44:50 +01:00
status . press_attempt = false ;
2016-06-23 23:20:39 +02:00
update ( ) ;
}
}
2017-03-05 16:44:50 +01:00
if ( p_what = = NOTIFICATION_FOCUS_ENTER ) {
2016-10-07 15:33:28 +02:00
update ( ) ;
}
2016-06-23 23:20:39 +02:00
2017-03-05 16:44:50 +01:00
if ( p_what = = NOTIFICATION_FOCUS_EXIT ) {
2019-05-21 10:26:08 +02:00
if ( status . press_attempt ) {
2017-03-05 16:44:50 +01:00
status . press_attempt = false ;
2016-10-07 15:33:28 +02:00
update ( ) ;
} else if ( status . hovering ) {
2016-06-23 23:20:39 +02:00
update ( ) ;
2014-02-10 02:10:30 +01:00
}
}
2019-04-08 07:31:41 +02:00
if ( p_what = = NOTIFICATION_EXIT_TREE | | ( p_what = = NOTIFICATION_VISIBILITY_CHANGED & & ! is_visible_in_tree ( ) ) ) {
2015-09-26 03:06:42 +02:00
if ( ! toggle_mode ) {
status . pressed = false ;
}
status . hovering = false ;
status . press_attempt = false ;
status . pressing_inside = false ;
}
2014-02-10 02:10:30 +01:00
}
2019-05-28 23:28:34 +02:00
void BaseButton : : _pressed ( ) {
2019-05-21 10:26:08 +02:00
if ( get_script_instance ( ) ) {
get_script_instance ( ) - > call ( SceneStringNames : : get_singleton ( ) - > _pressed ) ;
}
2019-05-28 23:28:34 +02:00
pressed ( ) ;
2019-05-21 10:26:08 +02:00
emit_signal ( " pressed " ) ;
2014-02-10 02:10:30 +01:00
}
2019-05-28 23:28:34 +02:00
void BaseButton : : _toggled ( bool p_pressed ) {
2017-01-10 05:04:31 +01:00
if ( get_script_instance ( ) ) {
2019-05-21 10:26:08 +02:00
get_script_instance ( ) - > call ( SceneStringNames : : get_singleton ( ) - > _toggled , p_pressed ) ;
2017-01-10 05:04:31 +01:00
}
2019-05-28 23:28:34 +02:00
toggled ( p_pressed ) ;
2019-05-21 10:26:08 +02:00
emit_signal ( " toggled " , p_pressed ) ;
2014-02-10 02:10:30 +01:00
}
2019-02-03 02:24:05 +01:00
void BaseButton : : on_action_event ( Ref < InputEvent > p_event ) {
if ( p_event - > is_pressed ( ) ) {
status . press_attempt = true ;
status . pressing_inside = true ;
emit_signal ( " button_down " ) ;
}
if ( status . press_attempt & & status . pressing_inside ) {
if ( toggle_mode ) {
if ( ( p_event - > is_pressed ( ) & & action_mode = = ACTION_MODE_BUTTON_PRESS ) | | ( ! p_event - > is_pressed ( ) & & action_mode = = ACTION_MODE_BUTTON_RELEASE ) ) {
if ( action_mode = = ACTION_MODE_BUTTON_PRESS ) {
status . press_attempt = false ;
status . pressing_inside = false ;
}
status . pressed = ! status . pressed ;
_unpress_group ( ) ;
2021-05-06 12:16:27 +02:00
if ( button_group . is_valid ( ) ) {
button_group - > emit_signal ( " pressed " , this ) ;
}
2019-02-03 02:24:05 +01:00
_toggled ( status . pressed ) ;
_pressed ( ) ;
}
} else {
2020-01-09 00:01:37 +01:00
if ( ( p_event - > is_pressed ( ) & & action_mode = = ACTION_MODE_BUTTON_PRESS ) | | ( ! p_event - > is_pressed ( ) & & action_mode = = ACTION_MODE_BUTTON_RELEASE ) ) {
2019-02-03 02:24:05 +01:00
_pressed ( ) ;
}
}
}
2020-01-03 12:21:52 +01:00
if ( ! p_event - > is_pressed ( ) ) {
Ref < InputEventMouseButton > mouse_button = p_event ;
if ( mouse_button . is_valid ( ) ) {
if ( ! has_point ( mouse_button - > get_position ( ) ) ) {
status . hovering = false ;
}
}
2019-02-03 02:24:05 +01:00
status . press_attempt = false ;
2020-01-03 12:21:52 +01:00
status . pressing_inside = false ;
2021-05-27 23:06:53 +02:00
emit_signal ( " button_up " ) ;
2019-02-03 02:24:05 +01:00
}
update ( ) ;
}
2019-05-28 23:28:34 +02:00
void BaseButton : : pressed ( ) {
}
void BaseButton : : toggled ( bool p_pressed ) {
}
2014-02-10 02:10:30 +01:00
void BaseButton : : set_disabled ( bool p_disabled ) {
2021-05-05 12:44:11 +02:00
if ( status . disabled = = p_disabled ) {
2017-11-07 08:58:35 +01:00
return ;
2021-05-05 12:44:11 +02:00
}
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
status . disabled = p_disabled ;
2018-09-14 09:21:58 +02:00
if ( p_disabled ) {
if ( ! toggle_mode ) {
status . pressed = false ;
}
status . press_attempt = false ;
status . pressing_inside = false ;
}
2014-02-10 02:10:30 +01:00
update ( ) ;
_change_notify ( " disabled " ) ;
2015-03-02 01:07:50 +01:00
}
2014-02-10 02:10:30 +01:00
bool BaseButton : : is_disabled ( ) const {
return status . disabled ;
2015-03-02 01:07:50 +01:00
}
2014-02-10 02:10:30 +01:00
void BaseButton : : set_pressed ( bool p_pressed ) {
2021-05-05 12:44:11 +02:00
if ( ! toggle_mode ) {
2014-02-10 02:10:30 +01:00
return ;
2021-05-05 12:44:11 +02:00
}
if ( status . pressed = = p_pressed ) {
2014-02-10 02:10:30 +01:00
return ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
_change_notify ( " pressed " ) ;
2017-03-05 16:44:50 +01:00
status . pressed = p_pressed ;
2017-01-10 05:04:31 +01:00
if ( p_pressed ) {
_unpress_group ( ) ;
2021-05-06 12:16:27 +02:00
if ( button_group . is_valid ( ) ) {
button_group - > emit_signal ( " pressed " , this ) ;
}
2017-01-10 05:04:31 +01:00
}
2019-06-12 16:31:01 +02:00
_toggled ( status . pressed ) ;
2019-05-21 10:26:08 +02:00
2014-02-10 02:10:30 +01:00
update ( ) ;
}
2021-05-06 14:33:44 +02:00
void BaseButton : : set_pressed_no_signal ( bool p_pressed ) {
if ( ! toggle_mode ) {
return ;
}
if ( status . pressed = = p_pressed ) {
return ;
}
status . pressed = p_pressed ;
update ( ) ;
}
2017-03-05 16:44:50 +01:00
bool BaseButton : : is_pressing ( ) const {
2014-02-10 02:10:30 +01:00
return status . press_attempt ;
}
bool BaseButton : : is_pressed ( ) const {
2017-03-05 16:44:50 +01:00
return toggle_mode ? status . pressed : status . press_attempt ;
2014-02-10 02:10:30 +01:00
}
2014-06-30 03:41:02 +02:00
bool BaseButton : : is_hovered ( ) const {
return status . hovering ;
}
2014-02-10 02:10:30 +01:00
BaseButton : : DrawMode BaseButton : : get_draw_mode ( ) const {
if ( status . disabled ) {
return DRAW_DISABLED ;
} ;
2016-03-09 00:00:52 +01:00
2018-10-06 22:20:41 +02:00
if ( ! status . press_attempt & & status . hovering ) {
2021-05-05 12:44:11 +02:00
if ( status . pressed ) {
2018-09-24 01:56:30 +02:00
return DRAW_HOVER_PRESSED ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
return DRAW_HOVER ;
} else {
/* determine if pressed or not */
2016-03-09 00:00:52 +01:00
2014-02-10 02:10:30 +01:00
bool pressing ;
if ( status . press_attempt ) {
2019-01-29 08:19:48 +01:00
pressing = ( status . pressing_inside | | keep_pressed_outside ) ;
2021-05-05 12:44:11 +02:00
if ( status . pressed ) {
2017-03-05 16:44:50 +01:00
pressing = ! pressing ;
2021-05-05 12:44:11 +02:00
}
2014-02-10 02:10:30 +01:00
} else {
2017-03-05 16:44:50 +01:00
pressing = status . pressed ;
2014-02-10 02:10:30 +01:00
}
2016-03-09 00:00:52 +01:00
2021-05-05 12:44:11 +02:00
if ( pressing ) {
2014-02-10 02:10:30 +01:00
return DRAW_PRESSED ;
2021-05-05 12:44:11 +02:00
} else {
2014-02-10 02:10:30 +01:00
return DRAW_NORMAL ;
2021-05-05 12:44:11 +02:00
}
2016-03-09 00:00:52 +01:00
}
2014-02-10 02:10:30 +01:00
return DRAW_NORMAL ;
}
void BaseButton : : set_toggle_mode ( bool p_on ) {
2017-03-05 16:44:50 +01:00
toggle_mode = p_on ;
2014-02-10 02:10:30 +01:00
}
bool BaseButton : : is_toggle_mode ( ) const {
return toggle_mode ;
}
2018-11-19 14:30:59 +01:00
void BaseButton : : set_shortcut_in_tooltip ( bool p_on ) {
shortcut_in_tooltip = p_on ;
}
bool BaseButton : : is_shortcut_in_tooltip_enabled ( ) const {
return shortcut_in_tooltip ;
}
2017-01-13 18:08:30 +01:00
void BaseButton : : set_action_mode ( ActionMode p_mode ) {
2017-03-05 16:44:50 +01:00
action_mode = p_mode ;
2014-02-10 02:10:30 +01:00
}
2017-01-13 18:08:30 +01:00
BaseButton : : ActionMode BaseButton : : get_action_mode ( ) const {
return action_mode ;
2014-02-10 02:10:30 +01:00
}
2018-03-11 18:19:18 +01:00
void BaseButton : : set_button_mask ( int p_mask ) {
button_mask = p_mask ;
}
int BaseButton : : get_button_mask ( ) const {
return button_mask ;
}
2016-04-12 18:25:17 +02:00
void BaseButton : : set_enabled_focus_mode ( FocusMode p_mode ) {
enabled_focus_mode = p_mode ;
if ( ! status . disabled ) {
2017-03-05 16:44:50 +01:00
set_focus_mode ( p_mode ) ;
2016-04-12 18:25:17 +02:00
}
2020-10-16 08:14:04 +02:00
WARN_DEPRECATED_MSG ( " BaseButton's Enabled Focus Mode property has been deprecated due to redundancy and will be removed in Godot 4.0. Please use Control.set_focus_mode instead. " ) ;
2016-04-12 18:25:17 +02:00
}
Control : : FocusMode BaseButton : : get_enabled_focus_mode ( ) const {
return enabled_focus_mode ;
}
2014-11-02 15:31:01 +01:00
2019-01-29 08:19:48 +01:00
void BaseButton : : set_keep_pressed_outside ( bool p_on ) {
keep_pressed_outside = p_on ;
}
bool BaseButton : : is_keep_pressed_outside ( ) const {
return keep_pressed_outside ;
}
2017-03-05 16:44:50 +01:00
void BaseButton : : set_shortcut ( const Ref < ShortCut > & p_shortcut ) {
shortcut = p_shortcut ;
2016-06-05 02:31:29 +02:00
set_process_unhandled_input ( shortcut . is_valid ( ) ) ;
}
2017-03-05 16:44:50 +01:00
Ref < ShortCut > BaseButton : : get_shortcut ( ) const {
2016-06-05 02:31:29 +02:00
return shortcut ;
}
2017-05-20 17:38:03 +02:00
void BaseButton : : _unhandled_input ( Ref < InputEvent > p_event ) {
2021-04-27 16:51:29 +02:00
ERR_FAIL_COND ( p_event . is_null ( ) ) ;
2016-06-05 02:31:29 +02:00
2019-02-03 02:24:05 +01:00
if ( ! is_disabled ( ) & & is_visible_in_tree ( ) & & ! p_event - > is_echo ( ) & & shortcut . is_valid ( ) & & shortcut - > is_shortcut ( p_event ) ) {
2021-05-05 12:44:11 +02:00
if ( get_viewport ( ) - > get_modal_stack_top ( ) & & ! get_viewport ( ) - > get_modal_stack_top ( ) - > is_a_parent_of ( this ) ) {
2016-06-28 01:14:59 +02:00
return ; //ignore because of modal window
2021-05-05 12:44:11 +02:00
}
2016-06-28 01:14:59 +02:00
2019-02-03 02:24:05 +01:00
on_action_event ( p_event ) ;
2016-06-05 02:31:29 +02:00
}
}
2017-03-05 16:44:50 +01:00
String BaseButton : : get_tooltip ( const Point2 & p_pos ) const {
String tooltip = Control : : get_tooltip ( p_pos ) ;
2018-11-19 14:30:59 +01:00
if ( shortcut_in_tooltip & & shortcut . is_valid ( ) & & shortcut - > is_valid ( ) ) {
2017-12-21 20:17:30 +01:00
String text = shortcut - > get_name ( ) + " ( " + shortcut - > get_as_text ( ) + " ) " ;
if ( shortcut - > get_name ( ) . nocasecmp_to ( tooltip ) ! = 0 ) {
text + = " \n " + tooltip ;
2016-06-11 21:51:00 +02:00
}
2017-12-21 20:17:30 +01:00
tooltip = text ;
2016-06-11 21:51:00 +02:00
}
2016-06-05 02:31:29 +02:00
return tooltip ;
}
2014-11-02 15:31:01 +01:00
2017-03-05 16:44:50 +01:00
void BaseButton : : set_button_group ( const Ref < ButtonGroup > & p_group ) {
2017-01-10 05:04:31 +01:00
if ( button_group . is_valid ( ) ) {
button_group - > buttons . erase ( this ) ;
}
2017-03-05 16:44:50 +01:00
button_group = p_group ;
2017-01-10 05:04:31 +01:00
if ( button_group . is_valid ( ) ) {
button_group - > buttons . insert ( this ) ;
}
update ( ) ; //checkbox changes to radio if set a buttongroup
}
Ref < ButtonGroup > BaseButton : : get_button_group ( ) const {
return button_group ;
}
2014-02-10 02:10:30 +01:00
void BaseButton : : _bind_methods ( ) {
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " _gui_input " ) , & BaseButton : : _gui_input ) ;
ClassDB : : bind_method ( D_METHOD ( " _unhandled_input " ) , & BaseButton : : _unhandled_input ) ;
ClassDB : : bind_method ( D_METHOD ( " set_pressed " , " pressed " ) , & BaseButton : : set_pressed ) ;
ClassDB : : bind_method ( D_METHOD ( " is_pressed " ) , & BaseButton : : is_pressed ) ;
2021-05-06 14:33:44 +02:00
ClassDB : : bind_method ( D_METHOD ( " set_pressed_no_signal " , " pressed " ) , & BaseButton : : set_pressed_no_signal ) ;
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " is_hovered " ) , & BaseButton : : is_hovered ) ;
ClassDB : : bind_method ( D_METHOD ( " set_toggle_mode " , " enabled " ) , & BaseButton : : set_toggle_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " is_toggle_mode " ) , & BaseButton : : is_toggle_mode ) ;
2018-11-19 14:30:59 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_shortcut_in_tooltip " , " enabled " ) , & BaseButton : : set_shortcut_in_tooltip ) ;
ClassDB : : bind_method ( D_METHOD ( " is_shortcut_in_tooltip_enabled " ) , & BaseButton : : is_shortcut_in_tooltip_enabled ) ;
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_disabled " , " disabled " ) , & BaseButton : : set_disabled ) ;
ClassDB : : bind_method ( D_METHOD ( " is_disabled " ) , & BaseButton : : is_disabled ) ;
ClassDB : : bind_method ( D_METHOD ( " set_action_mode " , " mode " ) , & BaseButton : : set_action_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " get_action_mode " ) , & BaseButton : : get_action_mode ) ;
2018-03-11 18:19:18 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_button_mask " , " mask " ) , & BaseButton : : set_button_mask ) ;
ClassDB : : bind_method ( D_METHOD ( " get_button_mask " ) , & BaseButton : : get_button_mask ) ;
2017-03-05 16:44:50 +01:00
ClassDB : : bind_method ( D_METHOD ( " get_draw_mode " ) , & BaseButton : : get_draw_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " set_enabled_focus_mode " , " mode " ) , & BaseButton : : set_enabled_focus_mode ) ;
ClassDB : : bind_method ( D_METHOD ( " get_enabled_focus_mode " ) , & BaseButton : : get_enabled_focus_mode ) ;
2019-01-29 08:19:48 +01:00
ClassDB : : bind_method ( D_METHOD ( " set_keep_pressed_outside " , " enabled " ) , & BaseButton : : set_keep_pressed_outside ) ;
ClassDB : : bind_method ( D_METHOD ( " is_keep_pressed_outside " ) , & BaseButton : : is_keep_pressed_outside ) ;
2017-03-05 16:44:50 +01:00
2017-08-09 13:19:41 +02:00
ClassDB : : bind_method ( D_METHOD ( " set_shortcut " , " shortcut " ) , & BaseButton : : set_shortcut ) ;
ClassDB : : bind_method ( D_METHOD ( " get_shortcut " ) , & BaseButton : : get_shortcut ) ;
2017-03-05 16:44:50 +01:00
2017-08-09 13:19:41 +02:00
ClassDB : : bind_method ( D_METHOD ( " set_button_group " , " button_group " ) , & BaseButton : : set_button_group ) ;
ClassDB : : bind_method ( D_METHOD ( " get_button_group " ) , & BaseButton : : get_button_group ) ;
2017-01-10 05:04:31 +01:00
2014-12-02 21:26:56 +01:00
BIND_VMETHOD ( MethodInfo ( " _pressed " ) ) ;
2018-01-09 16:39:43 +01:00
BIND_VMETHOD ( MethodInfo ( " _toggled " , PropertyInfo ( Variant : : BOOL , " button_pressed " ) ) ) ;
2017-03-05 16:44:50 +01:00
ADD_SIGNAL ( MethodInfo ( " pressed " ) ) ;
ADD_SIGNAL ( MethodInfo ( " button_up " ) ) ;
ADD_SIGNAL ( MethodInfo ( " button_down " ) ) ;
2018-01-09 16:39:43 +01:00
ADD_SIGNAL ( MethodInfo ( " toggled " , PropertyInfo ( Variant : : BOOL , " button_pressed " ) ) ) ;
2018-11-08 15:30:02 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " disabled " ) , " set_disabled " , " is_disabled " ) ;
2017-03-05 16:44:50 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " toggle_mode " ) , " set_toggle_mode " , " is_toggle_mode " ) ;
2018-11-19 14:30:59 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " shortcut_in_tooltip " ) , " set_shortcut_in_tooltip " , " is_shortcut_in_tooltip_enabled " ) ;
2018-11-08 15:30:02 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " pressed " ) , " set_pressed " , " is_pressed " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " action_mode " , PROPERTY_HINT_ENUM , " Button Press,Button Release " ) , " set_action_mode " , " get_action_mode " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " button_mask " , PROPERTY_HINT_FLAGS , " Mouse Left, Mouse Right, Mouse Middle " ) , " set_button_mask " , " get_button_mask " ) ;
2017-03-05 16:44:50 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : INT , " enabled_focus_mode " , PROPERTY_HINT_ENUM , " None,Click,All " ) , " set_enabled_focus_mode " , " get_enabled_focus_mode " ) ;
2019-01-29 08:19:48 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : BOOL , " keep_pressed_outside " ) , " set_keep_pressed_outside " , " is_keep_pressed_outside " ) ;
2017-03-05 16:44:50 +01:00
ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT , " shortcut " , PROPERTY_HINT_RESOURCE_TYPE , " ShortCut " ) , " set_shortcut " , " get_shortcut " ) ;
ADD_PROPERTY ( PropertyInfo ( Variant : : OBJECT , " group " , PROPERTY_HINT_RESOURCE_TYPE , " ButtonGroup " ) , " set_button_group " , " get_button_group " ) ;
2017-08-20 17:45:01 +02:00
BIND_ENUM_CONSTANT ( DRAW_NORMAL ) ;
BIND_ENUM_CONSTANT ( DRAW_PRESSED ) ;
BIND_ENUM_CONSTANT ( DRAW_HOVER ) ;
BIND_ENUM_CONSTANT ( DRAW_DISABLED ) ;
2018-09-24 01:56:30 +02:00
BIND_ENUM_CONSTANT ( DRAW_HOVER_PRESSED ) ;
2017-03-05 16:44:50 +01:00
2017-08-20 17:45:01 +02:00
BIND_ENUM_CONSTANT ( ACTION_MODE_BUTTON_PRESS ) ;
BIND_ENUM_CONSTANT ( ACTION_MODE_BUTTON_RELEASE ) ;
2014-02-10 02:10:30 +01:00
}
BaseButton : : BaseButton ( ) {
2017-03-05 16:44:50 +01:00
toggle_mode = false ;
2018-11-19 14:30:59 +01:00
shortcut_in_tooltip = true ;
2019-01-29 08:19:48 +01:00
keep_pressed_outside = false ;
2017-03-05 16:44:50 +01:00
status . pressed = false ;
status . press_attempt = false ;
status . hovering = false ;
status . pressing_inside = false ;
2014-02-10 02:10:30 +01:00
status . disabled = false ;
2017-03-05 16:44:50 +01:00
set_focus_mode ( FOCUS_ALL ) ;
2016-04-12 18:25:17 +02:00
enabled_focus_mode = FOCUS_ALL ;
2017-03-05 16:44:50 +01:00
action_mode = ACTION_MODE_BUTTON_RELEASE ;
2018-03-11 18:19:18 +01:00
button_mask = BUTTON_MASK_LEFT ;
2018-01-05 22:06:22 +01:00
}
BaseButton : : ~ BaseButton ( ) {
2017-01-10 05:04:31 +01:00
if ( button_group . is_valid ( ) ) {
button_group - > buttons . erase ( this ) ;
}
2014-02-10 02:10:30 +01:00
}
2017-03-05 16:44:50 +01:00
void ButtonGroup : : get_buttons ( List < BaseButton * > * r_buttons ) {
for ( Set < BaseButton * > : : Element * E = buttons . front ( ) ; E ; E = E - > next ( ) ) {
2017-01-10 05:04:31 +01:00
r_buttons - > push_back ( E - > get ( ) ) ;
}
}
2018-12-14 06:39:31 +01:00
Array ButtonGroup : : _get_buttons ( ) {
Array btns ;
for ( Set < BaseButton * > : : Element * E = buttons . front ( ) ; E ; E = E - > next ( ) ) {
btns . push_back ( E - > get ( ) ) ;
}
return btns ;
}
2017-03-05 16:44:50 +01:00
BaseButton * ButtonGroup : : get_pressed_button ( ) {
for ( Set < BaseButton * > : : Element * E = buttons . front ( ) ; E ; E = E - > next ( ) ) {
2021-05-05 12:44:11 +02:00
if ( E - > get ( ) - > is_pressed ( ) ) {
2017-01-10 05:04:31 +01:00
return E - > get ( ) ;
2021-05-05 12:44:11 +02:00
}
2017-01-10 05:04:31 +01:00
}
2021-05-04 16:00:45 +02:00
return nullptr ;
2017-01-10 05:04:31 +01:00
}
void ButtonGroup : : _bind_methods ( ) {
2017-08-09 13:19:41 +02:00
ClassDB : : bind_method ( D_METHOD ( " get_pressed_button " ) , & ButtonGroup : : get_pressed_button ) ;
2018-12-14 06:39:31 +01:00
ClassDB : : bind_method ( D_METHOD ( " get_buttons " ) , & ButtonGroup : : _get_buttons ) ;
2021-05-06 12:16:27 +02:00
ADD_SIGNAL ( MethodInfo ( " pressed " , PropertyInfo ( Variant : : OBJECT , " button " ) ) ) ;
2017-01-10 05:04:31 +01:00
}
ButtonGroup : : ButtonGroup ( ) {
set_local_to_scene ( true ) ;
}