diff options
author | Markus Sauermann <6299227+Sauermann@users.noreply.github.com> | 2023-02-13 00:34:16 +0100 |
---|---|---|
committer | Yuri Sizov <yuris@humnom.net> | 2023-03-27 16:34:05 +0200 |
commit | 3cae980c178905ac5be51c168698af7b355c4e9c (patch) | |
tree | 8e18a40f72092532c68b087457d2a1a01c53d095 /scene | |
parent | 34a087cc2c8f7c1444642723bbb4178e359dad61 (diff) |
Fix some ways to create inconsistent Viewport sizes
In the editor, it was possible to set the size of a `SubViewport` even
in cases where a parent `SubViewportContainer` had stretch enabled.
This PR disables editing a `SubViewport.size` while the parent disallows
it and it makes necessary adjustments during `NOTIFICATION_ENTER_TREE`.
(cherry picked from commit 34a7fc744762dcf66eff7e3b5e4d46e09e7c0bdc)
Diffstat (limited to 'scene')
-rw-r--r-- | scene/gui/subviewport_container.cpp | 22 | ||||
-rw-r--r-- | scene/gui/subviewport_container.h | 1 | ||||
-rw-r--r-- | scene/main/viewport.cpp | 16 | ||||
-rw-r--r-- | scene/main/viewport.h | 1 |
4 files changed, 26 insertions, 14 deletions
diff --git a/scene/gui/subviewport_container.cpp b/scene/gui/subviewport_container.cpp index f10e1c2cd1..f9e96a44ed 100644 --- a/scene/gui/subviewport_container.cpp +++ b/scene/gui/subviewport_container.cpp @@ -58,6 +58,7 @@ void SubViewportContainer::set_stretch(bool p_enable) { } stretch = p_enable; + recalc_force_viewport_sizes(); update_minimum_size(); queue_sort(); queue_redraw(); @@ -75,10 +76,16 @@ void SubViewportContainer::set_stretch_shrink(int p_shrink) { shrink = p_shrink; + recalc_force_viewport_sizes(); + queue_redraw(); +} + +void SubViewportContainer::recalc_force_viewport_sizes() { if (!stretch) { return; } + // If stretch is enabled, make sure that all child SubViwewports have the correct size. for (int i = 0; i < get_child_count(); i++) { SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); if (!c) { @@ -87,8 +94,6 @@ void SubViewportContainer::set_stretch_shrink(int p_shrink) { c->set_size_force(get_size() / shrink); } - - queue_redraw(); } int SubViewportContainer::get_stretch_shrink() const { @@ -106,18 +111,7 @@ Vector<int> SubViewportContainer::get_allowed_size_flags_vertical() const { void SubViewportContainer::_notification(int p_what) { switch (p_what) { case NOTIFICATION_RESIZED: { - if (!stretch) { - return; - } - - for (int i = 0; i < get_child_count(); i++) { - SubViewport *c = Object::cast_to<SubViewport>(get_child(i)); - if (!c) { - continue; - } - - c->set_size_force(get_size() / shrink); - } + recalc_force_viewport_sizes(); } break; case NOTIFICATION_ENTER_TREE: diff --git a/scene/gui/subviewport_container.h b/scene/gui/subviewport_container.h index d3236b0c4e..c1a74e5b98 100644 --- a/scene/gui/subviewport_container.h +++ b/scene/gui/subviewport_container.h @@ -58,6 +58,7 @@ public: virtual void unhandled_input(const Ref<InputEvent> &p_event) override; void set_stretch_shrink(int p_shrink); int get_stretch_shrink() const; + void recalc_force_viewport_sizes(); virtual Size2 get_minimum_size() const override; diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index 244e0d5b93..8cd57536bf 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -4281,6 +4281,11 @@ void SubViewport::_notification(int p_what) { switch (p_what) { case NOTIFICATION_ENTER_TREE: { RS::get_singleton()->viewport_set_active(get_viewport_rid(), true); + + SubViewportContainer *parent_svc = Object::cast_to<SubViewportContainer>(get_parent()); + if (parent_svc) { + parent_svc->recalc_force_viewport_sizes(); + } } break; case NOTIFICATION_EXIT_TREE: { @@ -4323,6 +4328,17 @@ void SubViewport::_bind_methods() { BIND_ENUM_CONSTANT(UPDATE_ALWAYS); } +void SubViewport::_validate_property(PropertyInfo &p_property) const { + if (p_property.name == "size") { + SubViewportContainer *parent_svc = Object::cast_to<SubViewportContainer>(get_parent()); + if (parent_svc && parent_svc->is_stretch_enabled()) { + p_property.usage = PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_READ_ONLY; + } else { + p_property.usage = PROPERTY_USAGE_DEFAULT; + } + } +} + SubViewport::SubViewport() { RS::get_singleton()->viewport_set_size(get_viewport_rid(), get_size().width, get_size().height); } diff --git a/scene/main/viewport.h b/scene/main/viewport.h index 055fad5369..5213c0db01 100644 --- a/scene/main/viewport.h +++ b/scene/main/viewport.h @@ -784,6 +784,7 @@ public: virtual Transform2D get_screen_transform_internal(bool p_absolute_position = false) const override; virtual Transform2D get_popup_base_transform() const override; + void _validate_property(PropertyInfo &p_property) const; SubViewport(); ~SubViewport(); }; |