Skip to content

Commit

Permalink
Add ability to clamp embedded subwindows to parent, fixes godotengine…
Browse files Browse the repository at this point in the history
  • Loading branch information
reduz authored and MarcusElg committed Oct 19, 2020
1 parent a9eae1b commit 8be16e0
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 0 deletions.
1 change: 1 addition & 0 deletions scene/gui/dialogs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
21 changes: 21 additions & 0 deletions scene/main/viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
8 changes: 8 additions & 0 deletions scene/main/window.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions scene/main/window.h
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ class Window : public Viewport {
bool exclusive = false;
bool wrap_controls = false;
bool updating_child_controls = false;
bool clamp_to_embedder = false;

void _update_child_controls();

Expand Down Expand Up @@ -196,6 +197,9 @@ class Window : public Viewport {
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);
Expand Down

0 comments on commit 8be16e0

Please sign in to comment.