Explorar o código

Add ability to clamp embedded subwindows to parent, fixes #37792

Juan Linietsky %!s(int64=5) %!d(string=hai) anos
pai
achega
39a77735bd
Modificáronse 4 ficheiros con 34 adicións e 0 borrados
  1. 1 0
      scene/gui/dialogs.cpp
  2. 21 0
      scene/main/viewport.cpp
  3. 8 0
      scene/main/window.cpp
  4. 4 0
      scene/main/window.h

+ 1 - 0
scene/gui/dialogs.cpp

@@ -298,6 +298,7 @@ AcceptDialog::AcceptDialog() {
 	set_visible(false);
 	set_transient(true);
 	set_exclusive(true);
+	set_clamp_to_embedder(true);
 
 	bg = memnew(Panel);
 	add_child(bg);

+ 21 - 0
scene/main/viewport.cpp

@@ -2685,6 +2685,27 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) {
 			if (gui.subwindow_drag == SUB_WINDOW_DRAG_MOVE) {
 				Vector2 diff = mm->get_position() - gui.subwindow_drag_from;
 				Rect2i new_rect(gui.subwindow_drag_pos + diff, gui.subwindow_focused->get_size());
+
+				if (gui.subwindow_focused->is_clamped_to_embedder()) {
+					Size2i limit = get_visible_rect().size;
+					if (new_rect.position.x + new_rect.size.x > limit.x) {
+						new_rect.position.x = limit.x - new_rect.size.x;
+					}
+					if (new_rect.position.y + new_rect.size.y > limit.y) {
+						new_rect.position.y = limit.y - new_rect.size.y;
+					}
+
+					if (new_rect.position.x < 0) {
+						new_rect.position.x = 0;
+					}
+
+					int title_height = gui.subwindow_focused->get_flag(Window::FLAG_BORDERLESS) ? 0 : gui.subwindow_focused->get_theme_constant("title_height");
+
+					if (new_rect.position.y < title_height) {
+						new_rect.position.y = title_height;
+					}
+				}
+
 				gui.subwindow_focused->_rect_changed_callback(new_rect);
 			}
 			if (gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE) {

+ 8 - 0
scene/main/window.cpp

@@ -1251,6 +1251,14 @@ Rect2i Window::get_parent_rect() const {
 	}
 }
 
+void Window::set_clamp_to_embedder(bool p_enable) {
+	clamp_to_embedder = p_enable;
+}
+
+bool Window::is_clamped_to_embedder() const {
+	return clamp_to_embedder;
+}
+
 void Window::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_title", "title"), &Window::set_title);
 	ClassDB::bind_method(D_METHOD("get_title"), &Window::get_title);

+ 4 - 0
scene/main/window.h

@@ -92,6 +92,7 @@ private:
 	bool exclusive = false;
 	bool wrap_controls = false;
 	bool updating_child_controls = false;
+	bool clamp_to_embedder = false;
 
 	void _update_child_controls();
 
@@ -196,6 +197,9 @@ public:
 	void set_exclusive(bool p_exclusive);
 	bool is_exclusive() const;
 
+	void set_clamp_to_embedder(bool p_enable);
+	bool is_clamped_to_embedder() const;
+
 	bool can_draw() const;
 
 	void set_ime_active(bool p_active);