| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  popup.cpp                                                             */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*                         This file is part of:                          */ | 
					
						
							|  |  |  | /*                             GODOT ENGINE                               */ | 
					
						
							|  |  |  | /*                        https://godotengine.org                         */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ | 
					
						
							|  |  |  | /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur.                  */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* Permission is hereby granted, free of charge, to any person obtaining  */ | 
					
						
							|  |  |  | /* a copy of this software and associated documentation files (the        */ | 
					
						
							|  |  |  | /* "Software"), to deal in the Software without restriction, including    */ | 
					
						
							|  |  |  | /* without limitation the rights to use, copy, modify, merge, publish,    */ | 
					
						
							|  |  |  | /* distribute, sublicense, and/or sell copies of the Software, and to     */ | 
					
						
							|  |  |  | /* permit persons to whom the Software is furnished to do so, subject to  */ | 
					
						
							|  |  |  | /* the following conditions:                                              */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* The above copyright notice and this permission notice shall be         */ | 
					
						
							|  |  |  | /* included in all copies or substantial portions of the Software.        */ | 
					
						
							|  |  |  | /*                                                                        */ | 
					
						
							|  |  |  | /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,        */ | 
					
						
							|  |  |  | /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF     */ | 
					
						
							|  |  |  | /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ | 
					
						
							|  |  |  | /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY   */ | 
					
						
							|  |  |  | /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,   */ | 
					
						
							|  |  |  | /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE      */ | 
					
						
							|  |  |  | /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                 */ | 
					
						
							|  |  |  | /**************************************************************************/ | 
					
						
							| 
									
										
										
										
											2018-01-05 00:50:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | #include "popup.h"
 | 
					
						
							| 
									
										
										
										
											2017-08-19 01:02:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-07 19:33:38 -03:00
										 |  |  | #include "core/config/engine.h"
 | 
					
						
							| 
									
										
										
										
											2018-09-11 18:13:45 +02:00
										 |  |  | #include "core/os/keyboard.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | #include "scene/gui/panel.h"
 | 
					
						
							| 
									
										
										
										
											2023-09-08 21:00:10 +02:00
										 |  |  | #include "scene/theme/theme_db.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | void Popup::_input_from_window(const Ref<InputEvent> &p_event) { | 
					
						
							| 
									
										
										
										
											2023-08-03 12:22:03 +01:00
										 |  |  | 	if (get_flag(FLAG_POPUP) && p_event->is_action_pressed(SNAME("ui_cancel"), false, true)) { | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 		_close_pressed(); | 
					
						
							| 
									
										
										
										
											2015-12-29 09:26:17 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | void Popup::_initialize_visible_parents() { | 
					
						
							| 
									
										
										
										
											2022-02-24 11:21:23 +02:00
										 |  |  | 	if (is_embedded()) { | 
					
						
							|  |  |  | 		visible_parents.clear(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		Window *parent_window = this; | 
					
						
							|  |  |  | 		while (parent_window) { | 
					
						
							|  |  |  | 			parent_window = parent_window->get_parent_visible_window(); | 
					
						
							|  |  |  | 			if (parent_window) { | 
					
						
							|  |  |  | 				visible_parents.push_back(parent_window); | 
					
						
							|  |  |  | 				parent_window->connect("focus_entered", callable_mp(this, &Popup::_parent_focused)); | 
					
						
							|  |  |  | 				parent_window->connect("tree_exited", callable_mp(this, &Popup::_deinitialize_visible_parents)); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Popup::_deinitialize_visible_parents() { | 
					
						
							| 
									
										
										
										
											2022-02-24 11:21:23 +02:00
										 |  |  | 	if (is_embedded()) { | 
					
						
							| 
									
										
										
										
											2022-12-29 01:24:45 +01:00
										 |  |  | 		for (Window *parent_window : visible_parents) { | 
					
						
							|  |  |  | 			parent_window->disconnect("focus_entered", callable_mp(this, &Popup::_parent_focused)); | 
					
						
							|  |  |  | 			parent_window->disconnect("tree_exited", callable_mp(this, &Popup::_deinitialize_visible_parents)); | 
					
						
							| 
									
										
										
										
											2022-02-24 11:21:23 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-24 11:21:23 +02:00
										 |  |  | 		visible_parents.clear(); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2020-05-14 14:29:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | void Popup::_notification(int p_what) { | 
					
						
							|  |  |  | 	switch (p_what) { | 
					
						
							|  |  |  | 		case NOTIFICATION_VISIBILITY_CHANGED: { | 
					
						
							| 
									
										
										
										
											2022-10-11 08:39:36 +03:00
										 |  |  | 			if (!is_in_edited_scene_root()) { | 
					
						
							|  |  |  | 				if (is_visible()) { | 
					
						
							|  |  |  | 					_initialize_visible_parents(); | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					_deinitialize_visible_parents(); | 
					
						
							|  |  |  | 					emit_signal(SNAME("popup_hide")); | 
					
						
							|  |  |  | 					popped_up = false; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | 		case NOTIFICATION_WM_WINDOW_FOCUS_IN: { | 
					
						
							| 
									
										
										
										
											2022-10-11 08:39:36 +03:00
										 |  |  | 			if (!is_in_edited_scene_root()) { | 
					
						
							|  |  |  | 				if (has_focus()) { | 
					
						
							|  |  |  | 					popped_up = true; | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-29 17:00:09 +02:00
										 |  |  | 		case NOTIFICATION_UNPARENTED: | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | 		case NOTIFICATION_EXIT_TREE: { | 
					
						
							| 
									
										
										
										
											2022-10-11 08:39:36 +03:00
										 |  |  | 			if (!is_in_edited_scene_root()) { | 
					
						
							|  |  |  | 				_deinitialize_visible_parents(); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-14 09:23:40 +02:00
										 |  |  | 		case NOTIFICATION_WM_CLOSE_REQUEST: { | 
					
						
							| 
									
										
										
										
											2022-10-11 08:39:36 +03:00
										 |  |  | 			if (!is_in_edited_scene_root()) { | 
					
						
							|  |  |  | 				_close_pressed(); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2023-02-14 09:23:40 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		case NOTIFICATION_APPLICATION_FOCUS_OUT: { | 
					
						
							|  |  |  | 			if (!is_in_edited_scene_root() && get_flag(FLAG_POPUP)) { | 
					
						
							|  |  |  | 				_close_pressed(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2015-06-13 22:12:53 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | void Popup::_parent_focused() { | 
					
						
							| 
									
										
										
										
											2022-02-24 11:21:23 +02:00
										 |  |  | 	if (popped_up && get_flag(FLAG_POPUP)) { | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | 		_close_pressed(); | 
					
						
							| 
									
										
										
										
											2017-03-02 22:43:56 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2020-08-21 16:11:20 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Popup::_close_pressed() { | 
					
						
							|  |  |  | 	popped_up = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	_deinitialize_visible_parents(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-09 11:59:01 +03:00
										 |  |  | 	call_deferred(SNAME("hide")); | 
					
						
							| 
									
										
										
										
											2022-05-13 08:22:29 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void Popup::_post_popup() { | 
					
						
							|  |  |  | 	Window::_post_popup(); | 
					
						
							|  |  |  | 	popped_up = true; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-11 08:39:36 +03:00
										 |  |  | void Popup::_validate_property(PropertyInfo &p_property) const { | 
					
						
							|  |  |  | 	if ( | 
					
						
							|  |  |  | 			p_property.name == "transient" || | 
					
						
							|  |  |  | 			p_property.name == "exclusive" || | 
					
						
							|  |  |  | 			p_property.name == "popup_window" || | 
					
						
							|  |  |  | 			p_property.name == "unfocusable") { | 
					
						
							|  |  |  | 		p_property.usage = PROPERTY_USAGE_NO_EDITOR; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | Rect2i Popup::_popup_adjust_rect() const { | 
					
						
							|  |  |  | 	ERR_FAIL_COND_V(!is_inside_tree(), Rect2()); | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	Rect2i parent_rect = get_usable_parent_rect(); | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (parent_rect == Rect2i()) { | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | 		return Rect2i(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Rect2i current(get_position(), get_size()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.position.x + current.size.x > parent_rect.position.x + parent_rect.size.x) { | 
					
						
							|  |  |  | 		current.position.x = parent_rect.position.x + parent_rect.size.x - current.size.x; | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.position.x < parent_rect.position.x) { | 
					
						
							|  |  |  | 		current.position.x = parent_rect.position.x; | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.position.y + current.size.y > parent_rect.position.y + parent_rect.size.y) { | 
					
						
							|  |  |  | 		current.position.y = parent_rect.position.y + parent_rect.size.y - current.size.y; | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.position.y < parent_rect.position.y) { | 
					
						
							|  |  |  | 		current.position.y = parent_rect.position.y; | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.size.y > parent_rect.size.y) { | 
					
						
							|  |  |  | 		current.size.y = parent_rect.size.y; | 
					
						
							| 
									
										
										
										
											2020-08-29 22:05:59 +10:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.size.x > parent_rect.size.x) { | 
					
						
							|  |  |  | 		current.size.x = parent_rect.size.x; | 
					
						
							| 
									
										
										
										
											2020-08-29 22:05:59 +10:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// Early out if max size not set.
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	Size2i popup_max_size = get_max_size(); | 
					
						
							|  |  |  | 	if (popup_max_size <= Size2()) { | 
					
						
							| 
									
										
										
										
											2020-08-29 22:05:59 +10:00
										 |  |  | 		return current; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.size.x > popup_max_size.x) { | 
					
						
							|  |  |  | 		current.size.x = popup_max_size.x; | 
					
						
							| 
									
										
										
										
											2020-08-29 22:05:59 +10:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-29 12:53:28 +03:00
										 |  |  | 	if (current.size.y > popup_max_size.y) { | 
					
						
							|  |  |  | 		current.size.y = popup_max_size.y; | 
					
						
							| 
									
										
										
										
											2020-08-29 22:05:59 +10:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 23:32:09 -03:00
										 |  |  | 	return current; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 21:00:10 +02:00
										 |  |  | void Popup::_bind_methods() { | 
					
						
							|  |  |  | 	ADD_SIGNAL(MethodInfo("popup_hide")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	BIND_THEME_ITEM_CUSTOM(Theme::DATA_TYPE_STYLEBOX, Popup, panel_style, "panel"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | Popup::Popup() { | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 	set_wrap_controls(true); | 
					
						
							|  |  |  | 	set_visible(false); | 
					
						
							|  |  |  | 	set_transient(true); | 
					
						
							|  |  |  | 	set_flag(FLAG_BORDERLESS, true); | 
					
						
							|  |  |  | 	set_flag(FLAG_RESIZE_DISABLED, true); | 
					
						
							| 
									
										
										
										
											2022-02-24 11:21:23 +02:00
										 |  |  | 	set_flag(FLAG_POPUP, true); | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 	connect("window_input", callable_mp(this, &Popup::_input_from_window)); | 
					
						
							| 
									
										
										
										
											2016-05-17 18:27:15 -03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | Popup::~Popup() { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | Size2 PopupPanel::_get_contents_minimum_size() const { | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 	Size2 ms; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < get_child_count(); i++) { | 
					
						
							|  |  |  | 		Control *c = Object::cast_to<Control>(get_child(i)); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (!c || c == panel) { | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-01 03:17:33 -04:00
										 |  |  | 		if (c->is_set_as_top_level()) { | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		Size2 cms = c->get_combined_minimum_size(); | 
					
						
							|  |  |  | 		ms.x = MAX(cms.x, ms.x); | 
					
						
							|  |  |  | 		ms.y = MAX(cms.y, ms.y); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-09-01 13:38:08 +03:00
										 |  |  | 	return ms + theme_cache.panel_style->get_minimum_size(); | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PopupPanel::_update_child_rects() { | 
					
						
							| 
									
										
										
										
											2022-09-01 13:38:08 +03:00
										 |  |  | 	Vector2 cpos(theme_cache.panel_style->get_offset()); | 
					
						
							|  |  |  | 	Vector2 csize(get_size() - theme_cache.panel_style->get_minimum_size()); | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < get_child_count(); i++) { | 
					
						
							|  |  |  | 		Control *c = Object::cast_to<Control>(get_child(i)); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (!c) { | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-01 03:17:33 -04:00
										 |  |  | 		if (c->is_set_as_top_level()) { | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 		if (c == panel) { | 
					
						
							|  |  |  | 			c->set_position(Vector2()); | 
					
						
							|  |  |  | 			c->set_size(get_size()); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			c->set_position(cpos); | 
					
						
							|  |  |  | 			c->set_size(csize); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-09-07 13:49:10 -03:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void PopupPanel::_notification(int p_what) { | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 	switch (p_what) { | 
					
						
							| 
									
										
										
										
											2022-09-01 13:38:08 +03:00
										 |  |  | 		case NOTIFICATION_READY: | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 		case NOTIFICATION_THEME_CHANGED: { | 
					
						
							| 
									
										
										
										
											2022-09-01 13:38:08 +03:00
										 |  |  | 			panel->add_theme_style_override("panel", theme_cache.panel_style); | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 			_update_child_rects(); | 
					
						
							|  |  |  | 		} break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		case NOTIFICATION_WM_SIZE_CHANGED: { | 
					
						
							|  |  |  | 			_update_child_rects(); | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 21:00:10 +02:00
										 |  |  | void PopupPanel::_bind_methods() { | 
					
						
							|  |  |  | 	BIND_THEME_ITEM_CUSTOM(Theme::DATA_TYPE_STYLEBOX, PopupPanel, panel_style, "panel"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | PopupPanel::PopupPanel() { | 
					
						
							| 
									
										
										
										
											2020-03-12 09:37:40 -03:00
										 |  |  | 	panel = memnew(Panel); | 
					
						
							| 
									
										
										
										
											2021-08-25 15:49:30 +02:00
										 |  |  | 	add_child(panel, false, INTERNAL_MODE_FRONT); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } |