Merge pull request #40022 from reduz/fix-subwindow-clamp
Add ability to clamp embedded subwindows to parent
This commit is contained in:
commit
1ae40793c7
@ -298,6 +298,7 @@ AcceptDialog::AcceptDialog() {
|
|||||||
set_visible(false);
|
set_visible(false);
|
||||||
set_transient(true);
|
set_transient(true);
|
||||||
set_exclusive(true);
|
set_exclusive(true);
|
||||||
|
set_clamp_to_embedder(true);
|
||||||
|
|
||||||
bg = memnew(Panel);
|
bg = memnew(Panel);
|
||||||
add_child(bg);
|
add_child(bg);
|
||||||
|
@ -2685,6 +2685,27 @@ bool Viewport::_sub_windows_forward_input(const Ref<InputEvent> &p_event) {
|
|||||||
if (gui.subwindow_drag == SUB_WINDOW_DRAG_MOVE) {
|
if (gui.subwindow_drag == SUB_WINDOW_DRAG_MOVE) {
|
||||||
Vector2 diff = mm->get_position() - gui.subwindow_drag_from;
|
Vector2 diff = mm->get_position() - gui.subwindow_drag_from;
|
||||||
Rect2i new_rect(gui.subwindow_drag_pos + diff, gui.subwindow_focused->get_size());
|
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);
|
gui.subwindow_focused->_rect_changed_callback(new_rect);
|
||||||
}
|
}
|
||||||
if (gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE) {
|
if (gui.subwindow_drag == SUB_WINDOW_DRAG_CLOSE) {
|
||||||
|
@ -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() {
|
void Window::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("set_title", "title"), &Window::set_title);
|
ClassDB::bind_method(D_METHOD("set_title", "title"), &Window::set_title);
|
||||||
ClassDB::bind_method(D_METHOD("get_title"), &Window::get_title);
|
ClassDB::bind_method(D_METHOD("get_title"), &Window::get_title);
|
||||||
|
@ -92,6 +92,7 @@ private:
|
|||||||
bool exclusive = false;
|
bool exclusive = false;
|
||||||
bool wrap_controls = false;
|
bool wrap_controls = false;
|
||||||
bool updating_child_controls = false;
|
bool updating_child_controls = false;
|
||||||
|
bool clamp_to_embedder = false;
|
||||||
|
|
||||||
void _update_child_controls();
|
void _update_child_controls();
|
||||||
|
|
||||||
@ -196,6 +197,9 @@ public:
|
|||||||
void set_exclusive(bool p_exclusive);
|
void set_exclusive(bool p_exclusive);
|
||||||
bool is_exclusive() const;
|
bool is_exclusive() const;
|
||||||
|
|
||||||
|
void set_clamp_to_embedder(bool p_enable);
|
||||||
|
bool is_clamped_to_embedder() const;
|
||||||
|
|
||||||
bool can_draw() const;
|
bool can_draw() const;
|
||||||
|
|
||||||
void set_ime_active(bool p_active);
|
void set_ime_active(bool p_active);
|
||||||
|
Loading…
Reference in New Issue
Block a user