| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | /**************************************************************************/ | 
					
						
							|  |  |  | /*  margin_container.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 "margin_container.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 21:00:10 +02:00
										 |  |  | #include "scene/theme/theme_db.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 15:02:40 +03:00
										 |  |  | Size2 MarginContainer::get_minimum_size() const { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	Size2 max; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (int i = 0; i < get_child_count(); i++) { | 
					
						
							| 
									
										
										
										
											2017-08-24 22:58:51 +02:00
										 |  |  | 		Control *c = Object::cast_to<Control>(get_child(i)); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (!c) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-10-01 03:17:33 -04:00
										 |  |  | 		if (c->is_set_as_top_level()) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (!c->is_visible()) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		Size2 s = c->get_combined_minimum_size(); | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		if (s.width > max.width) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			max.width = s.width; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (s.height > max.height) { | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 			max.height = s.height; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 15:02:40 +03:00
										 |  |  | 	max.width += (theme_cache.margin_left + theme_cache.margin_right); | 
					
						
							|  |  |  | 	max.height += (theme_cache.margin_top + theme_cache.margin_bottom); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-19 14:31:06 +01:00
										 |  |  | 	return max; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-08 23:53:41 +03:00
										 |  |  | Vector<int> MarginContainer::get_allowed_size_flags_horizontal() const { | 
					
						
							|  |  |  | 	Vector<int> flags; | 
					
						
							|  |  |  | 	flags.append(SIZE_FILL); | 
					
						
							|  |  |  | 	flags.append(SIZE_SHRINK_BEGIN); | 
					
						
							|  |  |  | 	flags.append(SIZE_SHRINK_CENTER); | 
					
						
							|  |  |  | 	flags.append(SIZE_SHRINK_END); | 
					
						
							|  |  |  | 	return flags; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Vector<int> MarginContainer::get_allowed_size_flags_vertical() const { | 
					
						
							|  |  |  | 	Vector<int> flags; | 
					
						
							|  |  |  | 	flags.append(SIZE_FILL); | 
					
						
							|  |  |  | 	flags.append(SIZE_SHRINK_BEGIN); | 
					
						
							|  |  |  | 	flags.append(SIZE_SHRINK_CENTER); | 
					
						
							|  |  |  | 	flags.append(SIZE_SHRINK_END); | 
					
						
							|  |  |  | 	return flags; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-12 15:01:42 +02:00
										 |  |  | int MarginContainer::get_margin_size(Side p_side) const { | 
					
						
							|  |  |  | 	ERR_FAIL_INDEX_V((int)p_side, 4, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	switch (p_side) { | 
					
						
							|  |  |  | 		case SIDE_LEFT: | 
					
						
							|  |  |  | 			return theme_cache.margin_left; | 
					
						
							|  |  |  | 		case SIDE_RIGHT: | 
					
						
							|  |  |  | 			return theme_cache.margin_right; | 
					
						
							|  |  |  | 		case SIDE_TOP: | 
					
						
							|  |  |  | 			return theme_cache.margin_top; | 
					
						
							|  |  |  | 		case SIDE_BOTTOM: | 
					
						
							|  |  |  | 			return theme_cache.margin_bottom; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | void MarginContainer::_notification(int p_what) { | 
					
						
							| 
									
										
										
										
											2019-01-24 22:31:33 +01:00
										 |  |  | 	switch (p_what) { | 
					
						
							|  |  |  | 		case NOTIFICATION_SORT_CHILDREN: { | 
					
						
							|  |  |  | 			Size2 s = get_size(); | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-24 22:31:33 +01: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) { | 
					
						
							| 
									
										
										
										
											2019-01-24 22:31:33 +01:00
										 |  |  | 					continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2020-10-01 03:17:33 -04:00
										 |  |  | 				if (c->is_set_as_top_level()) { | 
					
						
							| 
									
										
										
										
											2019-01-24 22:31:33 +01:00
										 |  |  | 					continue; | 
					
						
							| 
									
										
										
										
											2020-05-14 16:41:43 +02:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-31 15:02:40 +03:00
										 |  |  | 				int w = s.width - theme_cache.margin_left - theme_cache.margin_right; | 
					
						
							|  |  |  | 				int h = s.height - theme_cache.margin_top - theme_cache.margin_bottom; | 
					
						
							|  |  |  | 				fit_child_in_rect(c, Rect2(theme_cache.margin_left, theme_cache.margin_top, w, h)); | 
					
						
							| 
									
										
										
										
											2019-01-24 22:31:33 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2022-02-15 18:06:48 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-24 22:31:33 +01:00
										 |  |  | 		case NOTIFICATION_THEME_CHANGED: { | 
					
						
							| 
									
										
										
										
											2021-12-06 14:02:34 +01:00
										 |  |  | 			update_minimum_size(); | 
					
						
							| 
									
										
										
										
											2019-01-24 22:31:33 +01:00
										 |  |  | 		} break; | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 21:00:10 +02:00
										 |  |  | void MarginContainer::_bind_methods() { | 
					
						
							|  |  |  | 	BIND_THEME_ITEM(Theme::DATA_TYPE_CONSTANT, MarginContainer, margin_left); | 
					
						
							|  |  |  | 	BIND_THEME_ITEM(Theme::DATA_TYPE_CONSTANT, MarginContainer, margin_top); | 
					
						
							|  |  |  | 	BIND_THEME_ITEM(Theme::DATA_TYPE_CONSTANT, MarginContainer, margin_right); | 
					
						
							|  |  |  | 	BIND_THEME_ITEM(Theme::DATA_TYPE_CONSTANT, MarginContainer, margin_bottom); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-09 22:10:30 -03:00
										 |  |  | MarginContainer::MarginContainer() { | 
					
						
							|  |  |  | } |