|
@@ -30,6 +30,7 @@
|
|
|
|
|
|
#include "base_button.h"
|
|
|
|
|
|
+#include "core/config/project_settings.h"
|
|
|
#include "core/os/keyboard.h"
|
|
|
#include "scene/main/window.h"
|
|
|
#include "scene/scene_string_names.h"
|
|
@@ -127,7 +128,6 @@ void BaseButton::_notification(int p_what) {
|
|
|
status.hovering = false;
|
|
|
status.press_attempt = false;
|
|
|
status.pressing_inside = false;
|
|
|
- status.shortcut_press = false;
|
|
|
} break;
|
|
|
}
|
|
|
}
|
|
@@ -154,14 +154,10 @@ void BaseButton::on_action_event(Ref<InputEvent> p_event) {
|
|
|
if (status.press_attempt && status.pressing_inside) {
|
|
|
if (toggle_mode) {
|
|
|
bool is_pressed = p_event->is_pressed();
|
|
|
- if (Object::cast_to<InputEventShortcut>(*p_event)) {
|
|
|
- is_pressed = false;
|
|
|
- }
|
|
|
if ((is_pressed && action_mode == ACTION_MODE_BUTTON_PRESS) || (!is_pressed && action_mode == ACTION_MODE_BUTTON_RELEASE)) {
|
|
|
if (action_mode == ACTION_MODE_BUTTON_PRESS) {
|
|
|
status.press_attempt = false;
|
|
|
status.pressing_inside = false;
|
|
|
- status.shortcut_press = false;
|
|
|
}
|
|
|
status.pressed = !status.pressed;
|
|
|
_unpress_group();
|
|
@@ -187,7 +183,6 @@ void BaseButton::on_action_event(Ref<InputEvent> p_event) {
|
|
|
}
|
|
|
status.press_attempt = false;
|
|
|
status.pressing_inside = false;
|
|
|
- status.shortcut_press = false;
|
|
|
emit_signal(SNAME("button_up"));
|
|
|
}
|
|
|
|
|
@@ -212,7 +207,6 @@ void BaseButton::set_disabled(bool p_disabled) {
|
|
|
}
|
|
|
status.press_attempt = false;
|
|
|
status.pressing_inside = false;
|
|
|
- status.shortcut_press = false;
|
|
|
}
|
|
|
queue_redraw();
|
|
|
}
|
|
@@ -267,6 +261,10 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const {
|
|
|
return DRAW_DISABLED;
|
|
|
}
|
|
|
|
|
|
+ if (in_shortcut_feedback) {
|
|
|
+ return DRAW_HOVER_PRESSED;
|
|
|
+ }
|
|
|
+
|
|
|
if (!status.press_attempt && status.hovering) {
|
|
|
if (status.pressed) {
|
|
|
return DRAW_HOVER_PRESSED;
|
|
@@ -285,7 +283,7 @@ BaseButton::DrawMode BaseButton::get_draw_mode() const {
|
|
|
pressing = status.pressed;
|
|
|
}
|
|
|
|
|
|
- if ((shortcut_feedback || !status.shortcut_press) && pressing) {
|
|
|
+ if (pressing) {
|
|
|
return DRAW_PRESSED;
|
|
|
} else {
|
|
|
return DRAW_NORMAL;
|
|
@@ -339,6 +337,14 @@ bool BaseButton::is_keep_pressed_outside() const {
|
|
|
return keep_pressed_outside;
|
|
|
}
|
|
|
|
|
|
+void BaseButton::set_shortcut_feedback(bool p_enable) {
|
|
|
+ shortcut_feedback = p_enable;
|
|
|
+}
|
|
|
+
|
|
|
+bool BaseButton::is_shortcut_feedback() const {
|
|
|
+ return shortcut_feedback;
|
|
|
+}
|
|
|
+
|
|
|
void BaseButton::set_shortcut(const Ref<Shortcut> &p_shortcut) {
|
|
|
shortcut = p_shortcut;
|
|
|
set_process_shortcut_input(shortcut.is_valid());
|
|
@@ -348,13 +354,45 @@ Ref<Shortcut> BaseButton::get_shortcut() const {
|
|
|
return shortcut;
|
|
|
}
|
|
|
|
|
|
+void BaseButton::_shortcut_feedback_timeout() {
|
|
|
+ in_shortcut_feedback = false;
|
|
|
+ queue_redraw();
|
|
|
+}
|
|
|
+
|
|
|
void BaseButton::shortcut_input(const Ref<InputEvent> &p_event) {
|
|
|
ERR_FAIL_COND(p_event.is_null());
|
|
|
|
|
|
- if (!is_disabled() && is_visible_in_tree() && !p_event->is_echo() && shortcut.is_valid() && shortcut->matches_event(p_event)) {
|
|
|
- status.shortcut_press = true;
|
|
|
- on_action_event(p_event);
|
|
|
+ if (!is_disabled() && p_event->is_pressed() && is_visible_in_tree() && !p_event->is_echo() && shortcut.is_valid() && shortcut->matches_event(p_event)) {
|
|
|
+ if (toggle_mode) {
|
|
|
+ status.pressed = !status.pressed;
|
|
|
+
|
|
|
+ if (status.pressed) {
|
|
|
+ _unpress_group();
|
|
|
+ if (button_group.is_valid()) {
|
|
|
+ button_group->emit_signal(SNAME("pressed"), this);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _toggled(status.pressed);
|
|
|
+ _pressed();
|
|
|
+
|
|
|
+ } else {
|
|
|
+ _pressed();
|
|
|
+ }
|
|
|
+ queue_redraw();
|
|
|
accept_event();
|
|
|
+
|
|
|
+ if (shortcut_feedback) {
|
|
|
+ if (shortcut_feedback_timer == nullptr) {
|
|
|
+ shortcut_feedback_timer = memnew(Timer);
|
|
|
+ add_child(shortcut_feedback_timer);
|
|
|
+ shortcut_feedback_timer->set_wait_time(GLOBAL_GET("gui/timers/button_shortcut_feedback_highlight_time"));
|
|
|
+ shortcut_feedback_timer->connect("timeout", callable_mp(this, &BaseButton::_shortcut_feedback_timeout));
|
|
|
+ }
|
|
|
+
|
|
|
+ in_shortcut_feedback = true;
|
|
|
+ shortcut_feedback_timer->start();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -393,14 +431,6 @@ bool BaseButton::_was_pressed_by_mouse() const {
|
|
|
return was_mouse_pressed;
|
|
|
}
|
|
|
|
|
|
-void BaseButton::set_shortcut_feedback(bool p_feedback) {
|
|
|
- shortcut_feedback = p_feedback;
|
|
|
-}
|
|
|
-
|
|
|
-bool BaseButton::is_shortcut_feedback() const {
|
|
|
- return shortcut_feedback;
|
|
|
-}
|
|
|
-
|
|
|
PackedStringArray BaseButton::get_configuration_warnings() const {
|
|
|
PackedStringArray warnings = Control::get_configuration_warnings();
|
|
|
|
|
@@ -429,6 +459,8 @@ void BaseButton::_bind_methods() {
|
|
|
ClassDB::bind_method(D_METHOD("get_draw_mode"), &BaseButton::get_draw_mode);
|
|
|
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);
|
|
|
+ ClassDB::bind_method(D_METHOD("set_shortcut_feedback", "enabled"), &BaseButton::set_shortcut_feedback);
|
|
|
+ ClassDB::bind_method(D_METHOD("is_shortcut_feedback"), &BaseButton::is_shortcut_feedback);
|
|
|
|
|
|
ClassDB::bind_method(D_METHOD("set_shortcut", "shortcut"), &BaseButton::set_shortcut);
|
|
|
ClassDB::bind_method(D_METHOD("get_shortcut"), &BaseButton::get_shortcut);
|
|
@@ -436,9 +468,6 @@ void BaseButton::_bind_methods() {
|
|
|
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("set_shortcut_feedback", "enabled"), &BaseButton::set_shortcut_feedback);
|
|
|
- ClassDB::bind_method(D_METHOD("is_shortcut_feedback"), &BaseButton::is_shortcut_feedback);
|
|
|
-
|
|
|
GDVIRTUAL_BIND(_pressed);
|
|
|
GDVIRTUAL_BIND(_toggled, "button_pressed");
|
|
|
|
|
@@ -466,6 +495,8 @@ void BaseButton::_bind_methods() {
|
|
|
|
|
|
BIND_ENUM_CONSTANT(ACTION_MODE_BUTTON_PRESS);
|
|
|
BIND_ENUM_CONSTANT(ACTION_MODE_BUTTON_RELEASE);
|
|
|
+
|
|
|
+ GLOBAL_DEF(PropertyInfo(Variant::FLOAT, "gui/timers/button_shortcut_feedback_highlight_time", PROPERTY_HINT_RANGE, "0.01,10,0.01,suffix:s"), 0.2);
|
|
|
}
|
|
|
|
|
|
BaseButton::BaseButton() {
|