diff options
Diffstat (limited to 'scene/gui/dialogs.cpp')
| -rw-r--r-- | scene/gui/dialogs.cpp | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/scene/gui/dialogs.cpp b/scene/gui/dialogs.cpp index 9e99bda60b..0860bf3968 100644 --- a/scene/gui/dialogs.cpp +++ b/scene/gui/dialogs.cpp @@ -44,6 +44,12 @@ void AcceptDialog::_input_from_window(const Ref<InputEvent> &p_event) { } } +void AcceptDialog::_parent_focused() { + if (close_on_escape && !is_exclusive()) { + _cancel_pressed(); + } +} + void AcceptDialog::_update_theme_item_cache() { Window::_update_theme_item_cache(); @@ -64,6 +70,16 @@ void AcceptDialog::_notification(int p_what) { get_ok_button()->grab_focus(); } _update_child_rects(); + + parent_visible = get_parent_visible_window(); + if (parent_visible) { + parent_visible->connect("focus_entered", callable_mp(this, &AcceptDialog::_parent_focused)); + } + } else { + if (parent_visible) { + parent_visible->disconnect("focus_entered", callable_mp(this, &AcceptDialog::_parent_focused)); + parent_visible = nullptr; + } } } break; @@ -76,9 +92,10 @@ void AcceptDialog::_notification(int p_what) { } } break; - case NOTIFICATION_WM_WINDOW_FOCUS_OUT: { - if (close_on_escape && !is_exclusive()) { - _cancel_pressed(); + case NOTIFICATION_EXIT_TREE: { + if (parent_visible) { + parent_visible->disconnect("focus_entered", callable_mp(this, &AcceptDialog::_parent_focused)); + parent_visible = nullptr; } } break; @@ -112,9 +129,21 @@ void AcceptDialog::_ok_pressed() { } void AcceptDialog::_cancel_pressed() { + Window *parent_window = parent_visible; + if (parent_visible) { + parent_visible->disconnect("focus_entered", callable_mp(this, &AcceptDialog::_parent_focused)); + parent_visible = nullptr; + } + call_deferred(SNAME("hide")); + emit_signal(SNAME("canceled")); + cancel_pressed(); + + if (parent_window) { + //parent_window->grab_focus(); + } set_input_as_handled(); } |
