浏览代码

Make dialogs exclusive by default, fixes #37732

Also fix on set_visible, not creating exclusive children as it should.
Juan Linietsky 5 年之前
父节点
当前提交
b19ab945ac
共有 3 个文件被更改,包括 17 次插入1 次删除
  1. 4 1
      scene/gui/dialogs.cpp
  2. 1 0
      scene/gui/dialogs.h
  3. 12 0
      scene/main/window.cpp

+ 4 - 1
scene/gui/dialogs.cpp

@@ -51,7 +51,9 @@ void AcceptDialog::_input_from_window(const Ref<InputEvent> &p_event) {
 }
 
 void AcceptDialog::_parent_focused() {
-	_cancel_pressed();
+	if (!is_exclusive()) {
+		_cancel_pressed();
+	}
 }
 
 void AcceptDialog::_notification(int p_what) {
@@ -295,6 +297,7 @@ AcceptDialog::AcceptDialog() {
 	set_wrap_controls(true);
 	set_visible(false);
 	set_transient(true);
+	set_exclusive(true);
 
 	bg = memnew(Panel);
 	add_child(bg);

+ 1 - 0
scene/gui/dialogs.h

@@ -44,6 +44,7 @@ class LineEdit;
 class AcceptDialog : public Window {
 	GDCLASS(AcceptDialog, Window);
 
+public:
 	Window *parent_visible;
 	Panel *bg;
 	HBoxContainer *hbc;

+ 12 - 0
scene/main/window.cpp

@@ -398,6 +398,18 @@ void Window::set_visible(bool p_visible) {
 	emit_signal(SceneStringNames::get_singleton()->visibility_changed);
 
 	RS::get_singleton()->viewport_set_active(get_viewport_rid(), visible);
+
+	//update transient exclusive
+	if (transient_parent) {
+		if (exclusive && visible) {
+			ERR_FAIL_COND_MSG(transient_parent->exclusive_child && transient_parent->exclusive_child != this, "Transient parent has another exclusive child.");
+			transient_parent->exclusive_child = this;
+		} else {
+			if (transient_parent->exclusive_child == this) {
+				transient_parent->exclusive_child = nullptr;
+			}
+		}
+	}
 }
 
 void Window::_clear_transient() {