mirror of
https://github.com/godotengine/godot.git
synced 2026-01-06 10:11:57 +03:00
Move Shortcut Context to Control and ensure that shortcut_input adheres to contexts. Also ensure that controls with no context are only triggered AFTER nodes which do have a context.
This commit is contained in:
@@ -149,10 +149,6 @@ void MenuBar::_open_popup(int p_index, bool p_focus_item) {
|
||||
void MenuBar::shortcut_input(const Ref<InputEvent> &p_event) {
|
||||
ERR_FAIL_COND(p_event.is_null());
|
||||
|
||||
if (!_is_focus_owner_in_shortcut_context()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (disable_shortcuts) {
|
||||
return;
|
||||
}
|
||||
@@ -175,34 +171,6 @@ void MenuBar::shortcut_input(const Ref<InputEvent> &p_event) {
|
||||
}
|
||||
}
|
||||
|
||||
void MenuBar::set_shortcut_context(Node *p_node) {
|
||||
if (p_node != nullptr) {
|
||||
shortcut_context = p_node->get_instance_id();
|
||||
} else {
|
||||
shortcut_context = ObjectID();
|
||||
}
|
||||
}
|
||||
|
||||
Node *MenuBar::get_shortcut_context() const {
|
||||
Object *ctx_obj = ObjectDB::get_instance(shortcut_context);
|
||||
Node *ctx_node = Object::cast_to<Node>(ctx_obj);
|
||||
|
||||
return ctx_node;
|
||||
}
|
||||
|
||||
bool MenuBar::_is_focus_owner_in_shortcut_context() const {
|
||||
if (shortcut_context == ObjectID()) {
|
||||
// No context, therefore global - always "in" context.
|
||||
return true;
|
||||
}
|
||||
|
||||
Node *ctx_node = get_shortcut_context();
|
||||
Control *vp_focus = get_viewport() ? get_viewport()->gui_get_focus_owner() : nullptr;
|
||||
|
||||
// If the context is valid and the viewport focus is valid, check if the context is the focus or is a parent of it.
|
||||
return ctx_node && vp_focus && (ctx_node == vp_focus || ctx_node->is_ancestor_of(vp_focus));
|
||||
}
|
||||
|
||||
void MenuBar::_popup_visibility_changed(bool p_visible) {
|
||||
if (!p_visible) {
|
||||
active_menu = -1;
|
||||
@@ -694,16 +662,12 @@ void MenuBar::_bind_methods() {
|
||||
ClassDB::bind_method(D_METHOD("set_menu_hidden", "menu", "hidden"), &MenuBar::set_menu_hidden);
|
||||
ClassDB::bind_method(D_METHOD("is_menu_hidden", "menu"), &MenuBar::is_menu_hidden);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_shortcut_context", "node"), &MenuBar::set_shortcut_context);
|
||||
ClassDB::bind_method(D_METHOD("get_shortcut_context"), &MenuBar::get_shortcut_context);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_menu_popup", "menu"), &MenuBar::get_menu_popup);
|
||||
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "flat"), "set_flat", "is_flat");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "start_index"), "set_start_index", "get_start_index");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "switch_on_hover"), "set_switch_on_hover", "is_switch_on_hover");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "prefer_global_menu"), "set_prefer_global_menu", "is_prefer_global_menu");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "shortcut_context", PROPERTY_HINT_NODE_TYPE, "Node"), "set_shortcut_context", "get_shortcut_context");
|
||||
|
||||
ADD_GROUP("BiDi", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction");
|
||||
|
||||
Reference in New Issue
Block a user