Răsfoiți Sursa

Make handling of rename line-edit popups more robust

Pedro J. Estébanez 1 an în urmă
părinte
comite
eb2bd41fb8
4 a modificat fișierele cu 20 adăugiri și 6 ștergeri
  1. 1 3
      editor/filesystem_dock.cpp
  2. 6 0
      scene/gui/popup.cpp
  3. 12 0
      scene/gui/popup.h
  4. 1 3
      scene/gui/tree.cpp

+ 1 - 3
editor/filesystem_dock.cpp

@@ -138,9 +138,7 @@ String FileSystemList::get_edit_text() {
 }
 
 void FileSystemList::_text_editor_popup_modal_close() {
-	if (Input::get_singleton()->is_key_pressed(Key::ESCAPE) ||
-			Input::get_singleton()->is_key_pressed(Key::KP_ENTER) ||
-			Input::get_singleton()->is_key_pressed(Key::ENTER)) {
+	if (popup_editor->get_hide_reason() == Popup::HIDE_REASON_CANCELED) {
 		return;
 	}
 

+ 6 - 0
scene/gui/popup.cpp

@@ -77,6 +77,9 @@ void Popup::_notification(int p_what) {
 					_initialize_visible_parents();
 				} else {
 					_deinitialize_visible_parents();
+					if (hide_reason == HIDE_REASON_NONE) {
+						hide_reason = HIDE_REASON_CANCELED;
+					}
 					emit_signal(SNAME("popup_hide"));
 					popped_up = false;
 				}
@@ -87,6 +90,7 @@ void Popup::_notification(int p_what) {
 			if (!is_in_edited_scene_root()) {
 				if (has_focus()) {
 					popped_up = true;
+					hide_reason = HIDE_REASON_NONE;
 				}
 			}
 		} break;
@@ -100,6 +104,7 @@ void Popup::_notification(int p_what) {
 
 		case NOTIFICATION_WM_CLOSE_REQUEST: {
 			if (!is_in_edited_scene_root()) {
+				hide_reason = HIDE_REASON_UNFOCUSED;
 				_close_pressed();
 			}
 		} break;
@@ -114,6 +119,7 @@ void Popup::_notification(int p_what) {
 
 void Popup::_parent_focused() {
 	if (popped_up && get_flag(FLAG_POPUP)) {
+		hide_reason = HIDE_REASON_UNFOCUSED;
 		_close_pressed();
 	}
 }

+ 12 - 0
scene/gui/popup.h

@@ -43,6 +43,16 @@ class Popup : public Window {
 	LocalVector<Window *> visible_parents;
 	bool popped_up = false;
 
+public:
+	enum HideReason {
+		HIDE_REASON_NONE,
+		HIDE_REASON_CANCELED, // E.g., because of rupture of UI flow (app unfocused). Includes closed programmatically.
+		HIDE_REASON_UNFOCUSED, // E.g., user clicked outside.
+	};
+
+private:
+	HideReason hide_reason = HIDE_REASON_NONE;
+
 	void _initialize_visible_parents();
 	void _deinitialize_visible_parents();
 
@@ -60,6 +70,8 @@ protected:
 	virtual void _post_popup() override;
 
 public:
+	HideReason get_hide_reason() const { return hide_reason; }
+
 	Popup();
 	~Popup();
 };

+ 1 - 3
scene/gui/tree.cpp

@@ -3152,9 +3152,7 @@ int Tree::propagate_mouse_event(const Point2i &p_pos, int x_ofs, int y_ofs, int
 }
 
 void Tree::_text_editor_popup_modal_close() {
-	if (Input::get_singleton()->is_key_pressed(Key::ESCAPE) ||
-			Input::get_singleton()->is_key_pressed(Key::KP_ENTER) ||
-			Input::get_singleton()->is_key_pressed(Key::ENTER)) {
+	if (popup_editor->get_hide_reason() == Popup::HIDE_REASON_CANCELED) {
 		return;
 	}