Browse Source

Merge pull request #28454 from homer666/popup-centered-maxsize

Add `popup_centered_clamped()` method to Popup
Rémi Verschelde 6 years ago
parent
commit
47f00925dc

+ 11 - 0
doc/classes/Popup.xml

@@ -27,6 +27,17 @@
 				Popup (show the control in modal form) in the center of the screen relative to its current canvas transform, at the current size, or at a size determined by "size".
 			</description>
 		</method>
+		<method name="popup_centered_clamped">
+			<return type="void">
+			</return>
+			<argument index="0" name="size" type="Vector2" default="Vector2( 0, 0 )">
+			</argument>
+			<argument index="1" name="fallback_ratio" type="float" default="0.75">
+			</argument>
+			<description>
+				Popup (show the control in modal form) in the center of the screen relative to the current canvas transform, clamping the size to [code]size[/code], then ensuring the popup is no larger than the viewport size multiplied by [code]fallback_ratio[/code].
+			</description>
+		</method>
 		<method name="popup_centered_minsize">
 			<return type="void">
 			</return>

+ 1 - 8
editor/create_dialog.cpp

@@ -93,14 +93,7 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode) {
 	if (saved_size != Rect2()) {
 		popup(saved_size);
 	} else {
-
-		Size2 popup_size = Size2(900, 700) * editor_get_scale();
-		Size2 window_size = get_viewport_rect().size;
-
-		popup_size.x = MIN(window_size.x * 0.8, popup_size.x);
-		popup_size.y = MIN(window_size.y * 0.8, popup_size.y);
-
-		popup_centered(popup_size);
+		popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
 	}
 
 	if (p_dont_clear) {

+ 1 - 8
editor/editor_node.cpp

@@ -2454,14 +2454,7 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) {
 		} break;
 		case SETTINGS_MANAGE_FEATURE_PROFILES: {
 
-			Size2 popup_size = Size2(900, 800) * editor_get_scale();
-			Size2 window_size = get_viewport()->get_size();
-
-			popup_size.x = MIN(window_size.x * 0.8, popup_size.x);
-			popup_size.y = MIN(window_size.y * 0.8, popup_size.y);
-
-			feature_profile_manager->popup_centered(popup_size);
-
+			feature_profile_manager->popup_centered_clamped(Size2(900, 800) * EDSCALE, 0.8);
 		} break;
 		case SETTINGS_TOGGLE_FULLSCREEN: {
 

+ 1 - 8
editor/project_export.cpp

@@ -88,14 +88,7 @@ void ProjectExportDialog::popup_export() {
 	if (saved_size != Rect2()) {
 		popup(saved_size);
 	} else {
-
-		Size2 popup_size = Size2(900, 700) * editor_get_scale();
-		Size2 window_size = get_viewport_rect().size;
-
-		popup_size.x = MIN(window_size.x * 0.8, popup_size.x);
-		popup_size.y = MIN(window_size.y * 0.8, popup_size.y);
-
-		popup_centered(popup_size);
+		popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
 	}
 }
 

+ 2 - 8
editor/project_settings_editor.cpp

@@ -793,15 +793,9 @@ void ProjectSettingsEditor::popup_project_settings() {
 	if (saved_size != Rect2()) {
 		popup(saved_size);
 	} else {
-
-		Size2 popup_size = Size2(900, 700) * editor_get_scale();
-		Size2 window_size = get_viewport_rect().size;
-
-		popup_size.x = MIN(window_size.x * 0.8, popup_size.x);
-		popup_size.y = MIN(window_size.y * 0.8, popup_size.y);
-
-		popup_centered(popup_size);
+		popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
 	}
+
 	globals_editor->update_category_list();
 	_update_translations();
 	autoload_settings->update_autoload();

+ 1 - 7
editor/scene_tree_dock.cpp

@@ -1942,13 +1942,7 @@ void SceneTreeDock::set_selected(Node *p_node, bool p_emit_selected) {
 
 void SceneTreeDock::import_subscene() {
 
-	Size2 popup_size = Size2(500, 800) * editor_get_scale();
-	Size2 window_size = get_viewport_rect().size;
-
-	popup_size.x = MIN(window_size.x * 0.8, popup_size.x);
-	popup_size.y = MIN(window_size.y * 0.8, popup_size.y);
-
-	import_subscene_dialog->popup_centered(popup_size);
+	import_subscene_dialog->popup_centered_clamped(Size2(500, 800) * EDSCALE, 0.8);
 }
 
 void SceneTreeDock::_import_subscene() {

+ 1 - 8
editor/settings_config_dialog.cpp

@@ -98,14 +98,7 @@ void EditorSettingsDialog::popup_edit_settings() {
 	if (saved_size != Rect2()) {
 		popup(saved_size);
 	} else {
-
-		Size2 popup_size = Size2(900, 700) * editor_get_scale();
-		Size2 window_size = get_viewport_rect().size;
-
-		popup_size.x = MIN(window_size.x * 0.8, popup_size.x);
-		popup_size.y = MIN(window_size.y * 0.8, popup_size.y);
-
-		popup_centered(popup_size);
+		popup_centered_clamped(Size2(900, 700) * EDSCALE, 0.8);
 	}
 
 	_focus_current_search_box();

+ 13 - 0
scene/gui/popup.cpp

@@ -115,6 +115,18 @@ void Popup::set_as_minsize() {
 	set_size(total_minsize);
 }
 
+void Popup::popup_centered_clamped(const Size2 &p_size, float p_fallback_ratio) {
+
+	Size2 popup_size = p_size;
+	Size2 window_size = get_viewport_rect().size;
+
+	// clamp popup size in each dimension if window size is too small (using fallback ratio)
+	popup_size.x = MIN(window_size.x * p_fallback_ratio, popup_size.x);
+	popup_size.y = MIN(window_size.y * p_fallback_ratio, popup_size.y);
+
+	popup_centered(popup_size);
+}
+
 void Popup::popup_centered_minsize(const Size2 &p_minsize) {
 
 	set_custom_minimum_size(p_minsize);
@@ -179,6 +191,7 @@ void Popup::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("popup_centered", "size"), &Popup::popup_centered, DEFVAL(Size2()));
 	ClassDB::bind_method(D_METHOD("popup_centered_ratio", "ratio"), &Popup::popup_centered_ratio, DEFVAL(0.75));
 	ClassDB::bind_method(D_METHOD("popup_centered_minsize", "minsize"), &Popup::popup_centered_minsize, DEFVAL(Size2()));
+	ClassDB::bind_method(D_METHOD("popup_centered_clamped", "size", "fallback_ratio"), &Popup::popup_centered_clamped, DEFVAL(Size2()), DEFVAL(0.75));
 	ClassDB::bind_method(D_METHOD("popup", "bounds"), &Popup::popup, DEFVAL(Rect2()));
 	ClassDB::bind_method(D_METHOD("set_exclusive", "enable"), &Popup::set_exclusive);
 	ClassDB::bind_method(D_METHOD("is_exclusive"), &Popup::is_exclusive);

+ 1 - 0
scene/gui/popup.h

@@ -64,6 +64,7 @@ public:
 	void popup_centered(const Size2 &p_size = Size2());
 	void popup_centered_minsize(const Size2 &p_minsize = Size2());
 	void set_as_minsize();
+	void popup_centered_clamped(const Size2 &p_size = Size2(), float p_fallback_ratio = 0.75);
 	virtual void popup(const Rect2 &p_bounds = Rect2());
 
 	virtual String get_configuration_warning() const;