Merge pull request #66906 from Sauermann/fix-prohibit-inconsistent-size-state
Prohibit inconsistent size state for SubViewport
This commit is contained in:
commit
51414fc987
@ -26,6 +26,7 @@
|
|||||||
</member>
|
</member>
|
||||||
<member name="size" type="Vector2i" setter="set_size" getter="get_size" default="Vector2i(512, 512)">
|
<member name="size" type="Vector2i" setter="set_size" getter="get_size" default="Vector2i(512, 512)">
|
||||||
The width and height of the sub-viewport. Must be set to a value greater than or equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed.
|
The width and height of the sub-viewport. Must be set to a value greater than or equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed.
|
||||||
|
[b]Note:[/b] If the parent node is a [SubViewportContainer] and its [member SubViewportContainer.stretch] is [code]true[/code], the viewport size cannot be changed manually.
|
||||||
</member>
|
</member>
|
||||||
<member name="size_2d_override" type="Vector2i" setter="set_size_2d_override" getter="get_size_2d_override" default="Vector2i(0, 0)">
|
<member name="size_2d_override" type="Vector2i" setter="set_size_2d_override" getter="get_size_2d_override" default="Vector2i(0, 0)">
|
||||||
The 2D size override of the sub-viewport. If either the width or height is [code]0[/code], the override is disabled.
|
The 2D size override of the sub-viewport. If either the width or height is [code]0[/code], the override is disabled.
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
<members>
|
<members>
|
||||||
<member name="stretch" type="bool" setter="set_stretch" getter="is_stretch_enabled" default="false">
|
<member name="stretch" type="bool" setter="set_stretch" getter="is_stretch_enabled" default="false">
|
||||||
If [code]true[/code], the sub-viewport will be automatically resized to the control's size.
|
If [code]true[/code], the sub-viewport will be automatically resized to the control's size.
|
||||||
|
[b]Note:[/b] If [code]true[/code], this will prohibit changing [member SubViewport.size] of its children manually.
|
||||||
</member>
|
</member>
|
||||||
<member name="stretch_shrink" type="int" setter="set_stretch_shrink" getter="get_stretch_shrink" default="1">
|
<member name="stretch_shrink" type="int" setter="set_stretch_shrink" getter="get_stretch_shrink" default="1">
|
||||||
Divides the sub-viewport's effective resolution by this value while preserving its scale. This can be used to speed up rendering.
|
Divides the sub-viewport's effective resolution by this value while preserving its scale. This can be used to speed up rendering.
|
||||||
|
@ -85,7 +85,7 @@ void SubViewportContainer::set_stretch_shrink(int p_shrink) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
c->set_size(get_size() / shrink);
|
c->set_size_force(get_size() / shrink);
|
||||||
}
|
}
|
||||||
|
|
||||||
queue_redraw();
|
queue_redraw();
|
||||||
@ -116,7 +116,7 @@ void SubViewportContainer::_notification(int p_what) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
c->set_size(get_size() / shrink);
|
c->set_size_force(get_size() / shrink);
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
@ -4114,9 +4114,26 @@ Viewport::~Viewport() {
|
|||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
|
|
||||||
void SubViewport::set_size(const Size2i &p_size) {
|
void SubViewport::set_size(const Size2i &p_size) {
|
||||||
|
_internal_set_size(p_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubViewport::set_size_force(const Size2i &p_size) {
|
||||||
|
// Use only for setting the size from the parent SubViewportContainer with enabled stretch mode.
|
||||||
|
// Don't expose function to scripting.
|
||||||
|
_internal_set_size(p_size, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SubViewport::_internal_set_size(const Size2i &p_size, bool p_force) {
|
||||||
|
SubViewportContainer *c = Object::cast_to<SubViewportContainer>(get_parent());
|
||||||
|
if (!p_force && c && c->is_stretch_enabled()) {
|
||||||
|
#ifdef DEBUG_ENABLED
|
||||||
|
WARN_PRINT("Can't change the size of a `SubViewport` with a `SubViewportContainer` parent that has `stretch` enabled. Set `SubViewportContainer.stretch` to `false` to allow changing the size manually.");
|
||||||
|
#endif // DEBUG_ENABLED
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
_set_size(p_size, _get_size_2d_override(), Rect2i(), _stretch_transform(), true);
|
_set_size(p_size, _get_size_2d_override(), Rect2i(), _stretch_transform(), true);
|
||||||
|
|
||||||
SubViewportContainer *c = Object::cast_to<SubViewportContainer>(get_parent());
|
|
||||||
if (c) {
|
if (c) {
|
||||||
c->update_minimum_size();
|
c->update_minimum_size();
|
||||||
}
|
}
|
||||||
|
@ -754,6 +754,8 @@ private:
|
|||||||
ClearMode clear_mode = CLEAR_MODE_ALWAYS;
|
ClearMode clear_mode = CLEAR_MODE_ALWAYS;
|
||||||
bool size_2d_override_stretch = false;
|
bool size_2d_override_stretch = false;
|
||||||
|
|
||||||
|
void _internal_set_size(const Size2i &p_size, bool p_force = false);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
virtual DisplayServer::WindowID get_window_id() const override;
|
virtual DisplayServer::WindowID get_window_id() const override;
|
||||||
@ -763,6 +765,7 @@ protected:
|
|||||||
public:
|
public:
|
||||||
void set_size(const Size2i &p_size);
|
void set_size(const Size2i &p_size);
|
||||||
Size2i get_size() const;
|
Size2i get_size() const;
|
||||||
|
void set_size_force(const Size2i &p_size);
|
||||||
|
|
||||||
void set_size_2d_override(const Size2i &p_size);
|
void set_size_2d_override(const Size2i &p_size);
|
||||||
Size2i get_size_2d_override() const;
|
Size2i get_size_2d_override() const;
|
||||||
|
Loading…
Reference in New Issue
Block a user