diff options
Diffstat (limited to 'scene/gui/base_button.cpp')
-rw-r--r-- | scene/gui/base_button.cpp | 299 |
1 files changed, 132 insertions, 167 deletions
diff --git a/scene/gui/base_button.cpp b/scene/gui/base_button.cpp index 79b607e2e6..eceee8e317 100644 --- a/scene/gui/base_button.cpp +++ b/scene/gui/base_button.cpp @@ -29,17 +29,16 @@ #include "base_button.h" #include "os/keyboard.h" #include "print_string.h" -#include "scene/scene_string_names.h" #include "scene/main/viewport.h" - +#include "scene/scene_string_names.h" void BaseButton::_unpress_group() { if (!button_group.is_valid()) return; - for (Set<BaseButton*>::Element *E=button_group->buttons.front();E;E=E->next()) { - if (E->get()==this) + for (Set<BaseButton *>::Element *E = button_group->buttons.front(); E; E = E->next()) { + if (E->get() == this) continue; E->get()->set_pressed(false); @@ -48,23 +47,22 @@ void BaseButton::_unpress_group() { void BaseButton::_gui_input(InputEvent p_event) { - if (status.disabled) // no interaction with disabled button return; - switch(p_event.type) { + switch (p_event.type) { case InputEvent::MOUSE_BUTTON: { - const InputEventMouseButton &b=p_event.mouse_button; + const InputEventMouseButton &b = p_event.mouse_button; - if ( status.disabled || b.button_index!=1 ) + if (status.disabled || b.button_index != 1) return; if (status.pressing_button) break; - if (action_mode==ACTION_MODE_BUTTON_PRESS) { + if (action_mode == ACTION_MODE_BUTTON_PRESS) { if (b.pressed) { @@ -72,47 +70,43 @@ void BaseButton::_gui_input(InputEvent p_event) { if (!toggle_mode) { //mouse press attempt - status.press_attempt=true; - status.pressing_inside=true; + status.press_attempt = true; + status.pressing_inside = true; pressed(); if (get_script_instance()) { Variant::CallError ce; - get_script_instance()->call(SceneStringNames::get_singleton()->_pressed,NULL,0,ce); + get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); _unpress_group(); - } else { - status.pressed=!status.pressed; + status.pressed = !status.pressed; pressed(); if (get_script_instance()) { Variant::CallError ce; - get_script_instance()->call(SceneStringNames::get_singleton()->_pressed,NULL,0,ce); + get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); _unpress_group(); - toggled(status.pressed); - emit_signal("toggled",status.pressed); - + emit_signal("toggled", status.pressed); } - } else { emit_signal("button_up"); -/* this is pointless if (status.press_attempt && status.pressing_inside) { + /* this is pointless if (status.press_attempt && status.pressing_inside) { //released(); emit_signal("released"); } */ - status.press_attempt=false; + status.press_attempt = false; } update(); break; @@ -120,59 +114,54 @@ void BaseButton::_gui_input(InputEvent p_event) { if (b.pressed) { - status.press_attempt=true; - status.pressing_inside=true; + status.press_attempt = true; + status.pressing_inside = true; emit_signal("button_down"); } else { emit_signal("button_up"); - if (status.press_attempt &&status.pressing_inside) { + if (status.press_attempt && status.pressing_inside) { if (!toggle_mode) { //mouse press attempt pressed(); if (get_script_instance()) { Variant::CallError ce; - get_script_instance()->call(SceneStringNames::get_singleton()->_pressed,NULL,0,ce); + get_script_instance()->call(SceneStringNames::get_singleton()->_pressed, NULL, 0, ce); } emit_signal("pressed"); } else { - status.pressed=!status.pressed; + status.pressed = !status.pressed; pressed(); emit_signal("pressed"); toggled(status.pressed); - emit_signal("toggled",status.pressed); + emit_signal("toggled", status.pressed); if (get_script_instance()) { - get_script_instance()->call(SceneStringNames::get_singleton()->_toggled,status.pressed); + get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed); } - - } _unpress_group(); - - } - status.press_attempt=false; - + status.press_attempt = false; } update(); } break; case InputEvent::MOUSE_MOTION: { - if (status.press_attempt && status.pressing_button==0) { - bool last_press_inside=status.pressing_inside; - status.pressing_inside=has_point(Point2(p_event.mouse_motion.x,p_event.mouse_motion.y)); - if (last_press_inside!=status.pressing_inside) + if (status.press_attempt && status.pressing_button == 0) { + bool last_press_inside = status.pressing_inside; + status.pressing_inside = has_point(Point2(p_event.mouse_motion.x, p_event.mouse_motion.y)); + if (last_press_inside != status.pressing_inside) update(); } } break; @@ -180,7 +169,6 @@ void BaseButton::_gui_input(InputEvent p_event) { case InputEvent::JOYPAD_BUTTON: case InputEvent::KEY: { - if (p_event.is_echo()) { break; } @@ -189,7 +177,7 @@ void BaseButton::_gui_input(InputEvent p_event) { break; } - if (status.press_attempt && status.pressing_button==0) { + if (status.press_attempt && status.pressing_button == 0) { break; } @@ -198,8 +186,8 @@ void BaseButton::_gui_input(InputEvent p_event) { if (p_event.is_pressed()) { status.pressing_button++; - status.press_attempt=true; - status.pressing_inside=true; + status.press_attempt = true; + status.pressing_inside = true; emit_signal("button_down"); } else if (status.press_attempt) { @@ -210,8 +198,8 @@ void BaseButton::_gui_input(InputEvent p_event) { if (status.pressing_button) break; - status.press_attempt=false; - status.pressing_inside=false; + status.press_attempt = false; + status.pressing_inside = false; emit_signal("button_up"); @@ -221,83 +209,75 @@ void BaseButton::_gui_input(InputEvent p_event) { emit_signal("pressed"); } else { - status.pressed=!status.pressed; + status.pressed = !status.pressed; pressed(); emit_signal("pressed"); toggled(status.pressed); if (get_script_instance()) { - get_script_instance()->call(SceneStringNames::get_singleton()->_toggled,status.pressed); + get_script_instance()->call(SceneStringNames::get_singleton()->_toggled, status.pressed); } - emit_signal("toggled",status.pressed); + emit_signal("toggled", status.pressed); } _unpress_group(); - } accept_event(); update(); - } } - } } void BaseButton::_notification(int p_what) { + if (p_what == NOTIFICATION_MOUSE_ENTER) { - if (p_what==NOTIFICATION_MOUSE_ENTER) { - - status.hovering=true; + status.hovering = true; update(); } - if (p_what==NOTIFICATION_MOUSE_EXIT) { - status.hovering=false; + if (p_what == NOTIFICATION_MOUSE_EXIT) { + status.hovering = false; update(); } - if (p_what==NOTIFICATION_DRAG_BEGIN) { + if (p_what == NOTIFICATION_DRAG_BEGIN) { if (status.press_attempt) { - status.press_attempt=false; - status.pressing_button=0; + status.press_attempt = false; + status.pressing_button = 0; update(); } } - - if (p_what==NOTIFICATION_FOCUS_ENTER) { - - status.hovering=true; + + if (p_what == NOTIFICATION_FOCUS_ENTER) { + + status.hovering = true; update(); } - if (p_what==NOTIFICATION_FOCUS_EXIT) { + if (p_what == NOTIFICATION_FOCUS_EXIT) { if (status.pressing_button && status.press_attempt) { - status.press_attempt=false; - status.pressing_button=0; - status.hovering=false; + status.press_attempt = false; + status.pressing_button = 0; + status.hovering = false; update(); } else if (status.hovering) { - status.hovering=false; + status.hovering = false; update(); } } - if (p_what==NOTIFICATION_ENTER_TREE) { - - + if (p_what == NOTIFICATION_ENTER_TREE) { } - if (p_what==NOTIFICATION_EXIT_TREE) { - - + if (p_what == NOTIFICATION_EXIT_TREE) { } - if (p_what==NOTIFICATION_VISIBILITY_CHANGED && !is_visible_in_tree()) { + if (p_what == NOTIFICATION_VISIBILITY_CHANGED && !is_visible_in_tree()) { if (!toggle_mode) { status.pressed = false; @@ -318,12 +298,10 @@ void BaseButton::pressed() { void BaseButton::toggled(bool p_pressed) { if (get_script_instance()) { - get_script_instance()->call("toggled",p_pressed); + get_script_instance()->call("toggled", p_pressed); } - } - void BaseButton::set_disabled(bool p_disabled) { status.disabled = p_disabled; @@ -344,26 +322,25 @@ void BaseButton::set_pressed(bool p_pressed) { if (!toggle_mode) return; - if (status.pressed==p_pressed) + if (status.pressed == p_pressed) return; _change_notify("pressed"); - status.pressed=p_pressed; + status.pressed = p_pressed; if (p_pressed) { _unpress_group(); - } update(); } -bool BaseButton::is_pressing() const{ +bool BaseButton::is_pressing() const { return status.press_attempt; } bool BaseButton::is_pressed() const { - return toggle_mode?status.pressed:status.press_attempt; + return toggle_mode ? status.pressed : status.press_attempt; } bool BaseButton::is_hovered() const { @@ -378,8 +355,7 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const { }; //print_line("press attempt: "+itos(status.press_attempt)+" hover: "+itos(status.hovering)+" pressed: "+itos(status.pressed)); - if (status.press_attempt==false && status.hovering && !status.pressed) { - + if (status.press_attempt == false && status.hovering && !status.pressed) { return DRAW_HOVER; } else { @@ -388,12 +364,12 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const { bool pressing; if (status.press_attempt) { - pressing=status.pressing_inside; + pressing = status.pressing_inside; if (status.pressed) - pressing=!pressing; + pressing = !pressing; } else { - pressing=status.pressed; + pressing = status.pressed; } if (pressing) @@ -407,7 +383,7 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const { void BaseButton::set_toggle_mode(bool p_on) { - toggle_mode=p_on; + toggle_mode = p_on; } bool BaseButton::is_toggle_mode() const { @@ -417,7 +393,7 @@ bool BaseButton::is_toggle_mode() const { void BaseButton::set_action_mode(ActionMode p_mode) { - action_mode=p_mode; + action_mode = p_mode; } BaseButton::ActionMode BaseButton::get_action_mode() const { @@ -429,7 +405,7 @@ void BaseButton::set_enabled_focus_mode(FocusMode p_mode) { enabled_focus_mode = p_mode; if (!status.disabled) { - set_focus_mode( p_mode ); + set_focus_mode(p_mode); } } @@ -438,16 +414,16 @@ Control::FocusMode BaseButton::get_enabled_focus_mode() const { return enabled_focus_mode; } -void BaseButton::set_shortcut(const Ref<ShortCut>& p_shortcut) { +void BaseButton::set_shortcut(const Ref<ShortCut> &p_shortcut) { if (shortcut.is_null() == p_shortcut.is_null()) return; - shortcut=p_shortcut; + shortcut = p_shortcut; set_process_unhandled_input(shortcut.is_valid()); } -Ref<ShortCut> BaseButton:: get_shortcut() const { +Ref<ShortCut> BaseButton::get_shortcut() const { return shortcut; } @@ -460,41 +436,39 @@ void BaseButton::_unhandled_input(InputEvent p_event) { if (is_toggle_mode()) { set_pressed(!is_pressed()); - emit_signal("toggled",is_pressed()); + emit_signal("toggled", is_pressed()); } emit_signal("pressed"); } } -String BaseButton::get_tooltip(const Point2& p_pos) const { +String BaseButton::get_tooltip(const Point2 &p_pos) const { - String tooltip=Control::get_tooltip(p_pos); + String tooltip = Control::get_tooltip(p_pos); if (shortcut.is_valid() && shortcut->is_valid()) { - if (tooltip.find("$sc")!=-1) { - tooltip=tooltip.replace_first("$sc","("+shortcut->get_as_text()+")"); + if (tooltip.find("$sc") != -1) { + tooltip = tooltip.replace_first("$sc", "(" + shortcut->get_as_text() + ")"); } else { - tooltip+=" ("+shortcut->get_as_text()+")"; + tooltip += " (" + shortcut->get_as_text() + ")"; } } return tooltip; } - -void BaseButton::set_button_group(const Ref<ButtonGroup>& p_group) { +void BaseButton::set_button_group(const Ref<ButtonGroup> &p_group) { if (button_group.is_valid()) { button_group->buttons.erase(this); } - button_group=p_group; + button_group = p_group; 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 { @@ -502,103 +476,94 @@ Ref<ButtonGroup> BaseButton::get_button_group() const { return button_group; } - void BaseButton::_bind_methods() { - 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); - 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); - 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); - 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); - - ClassDB::bind_method(D_METHOD("set_shortcut","shortcut"),&BaseButton::set_shortcut); - ClassDB::bind_method(D_METHOD("get_shortcut"),&BaseButton::get_shortcut); - - 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); + 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); + 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); + 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); + 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); + + ClassDB::bind_method(D_METHOD("set_shortcut", "shortcut"), &BaseButton::set_shortcut); + ClassDB::bind_method(D_METHOD("get_shortcut"), &BaseButton::get_shortcut); + + 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); BIND_VMETHOD(MethodInfo("_pressed")); - BIND_VMETHOD(MethodInfo("_toggled",PropertyInfo(Variant::BOOL,"pressed"))); - - ADD_SIGNAL( MethodInfo("pressed" ) ); - ADD_SIGNAL( MethodInfo("button_up") ); - ADD_SIGNAL( MethodInfo("button_down") ); - ADD_SIGNAL( MethodInfo("toggled", PropertyInfo( Variant::BOOL,"pressed") ) ); - ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); - ADD_PROPERTY( PropertyInfo( Variant::BOOL, "toggle_mode"), "set_toggle_mode", "is_toggle_mode"); - ADD_PROPERTYNZ( PropertyInfo( Variant::BOOL, "is_pressed"), "set_pressed", "is_pressed"); - ADD_PROPERTYNO( PropertyInfo( Variant::INT, "action_mode",PROPERTY_HINT_ENUM,"Button Press,Button Release"), "set_action_mode", "get_action_mode"); - ADD_PROPERTY( PropertyInfo( Variant::INT,"enabled_focus_mode", PROPERTY_HINT_ENUM, "None,Click,All" ), "set_enabled_focus_mode", "get_enabled_focus_mode") ; - 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"); - - - BIND_CONSTANT( DRAW_NORMAL ); - BIND_CONSTANT( DRAW_PRESSED ); - BIND_CONSTANT( DRAW_HOVER ); - BIND_CONSTANT( DRAW_DISABLED ); - - BIND_CONSTANT( ACTION_MODE_BUTTON_PRESS ); - BIND_CONSTANT( ACTION_MODE_BUTTON_RELEASE ); - - + BIND_VMETHOD(MethodInfo("_toggled", PropertyInfo(Variant::BOOL, "pressed"))); + + ADD_SIGNAL(MethodInfo("pressed")); + ADD_SIGNAL(MethodInfo("button_up")); + ADD_SIGNAL(MethodInfo("button_down")); + ADD_SIGNAL(MethodInfo("toggled", PropertyInfo(Variant::BOOL, "pressed"))); + ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "disabled"), "set_disabled", "is_disabled"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "toggle_mode"), "set_toggle_mode", "is_toggle_mode"); + ADD_PROPERTYNZ(PropertyInfo(Variant::BOOL, "is_pressed"), "set_pressed", "is_pressed"); + ADD_PROPERTYNO(PropertyInfo(Variant::INT, "action_mode", PROPERTY_HINT_ENUM, "Button Press,Button Release"), "set_action_mode", "get_action_mode"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "enabled_focus_mode", PROPERTY_HINT_ENUM, "None,Click,All"), "set_enabled_focus_mode", "get_enabled_focus_mode"); + 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"); + + BIND_CONSTANT(DRAW_NORMAL); + BIND_CONSTANT(DRAW_PRESSED); + BIND_CONSTANT(DRAW_HOVER); + BIND_CONSTANT(DRAW_DISABLED); + + BIND_CONSTANT(ACTION_MODE_BUTTON_PRESS); + BIND_CONSTANT(ACTION_MODE_BUTTON_RELEASE); } BaseButton::BaseButton() { - toggle_mode=false; - status.pressed=false; - status.press_attempt=false; - status.hovering=false; - status.pressing_inside=false; + toggle_mode = false; + status.pressed = false; + status.press_attempt = false; + status.hovering = false; + status.pressing_inside = false; status.disabled = false; - status.pressing_button=0; - set_focus_mode( FOCUS_ALL ); + status.pressing_button = 0; + set_focus_mode(FOCUS_ALL); enabled_focus_mode = FOCUS_ALL; - action_mode=ACTION_MODE_BUTTON_RELEASE; - + action_mode = ACTION_MODE_BUTTON_RELEASE; if (button_group.is_valid()) { button_group->buttons.erase(this); } - - } -BaseButton::~BaseButton() -{ +BaseButton::~BaseButton() { } -void ButtonGroup::get_buttons(List<BaseButton*> *r_buttons) { +void ButtonGroup::get_buttons(List<BaseButton *> *r_buttons) { - for (Set<BaseButton*>::Element *E=buttons.front();E;E=E->next()) { + for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { r_buttons->push_back(E->get()); } } -BaseButton* ButtonGroup::get_pressed_button() { +BaseButton *ButtonGroup::get_pressed_button() { - for (Set<BaseButton*>::Element *E=buttons.front();E;E=E->next()) { + for (Set<BaseButton *>::Element *E = buttons.front(); E; E = E->next()) { if (E->get()->is_pressed()) return E->get(); } return NULL; - } void ButtonGroup::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_pressed_button:BaseButton"),&ButtonGroup::get_pressed_button); + ClassDB::bind_method(D_METHOD("get_pressed_button:BaseButton"), &ButtonGroup::get_pressed_button); } ButtonGroup::ButtonGroup() { |