Merge pull request #68070 from Geometror/move_z_index_to_canvasitem
Move z_index, z_as_relative and y_sort_enabled from `Node2D` to `CanvasItem`
This commit is contained in:
commit
3cf2fc9839
7 changed files with 79 additions and 69 deletions
|
@ -510,7 +510,7 @@
|
|||
<method name="move_to_front">
|
||||
<return type="void" />
|
||||
<description>
|
||||
Moves this node to display on top of its siblings. This has more use in [Control], as [Node2D] can be ordered with [member Node2D.z_index].
|
||||
Moves this node to display on top of its siblings.
|
||||
Internally, the node is moved to the bottom of parent's children list. The method has no effect on nodes without a parent.
|
||||
</description>
|
||||
</method>
|
||||
|
@ -587,6 +587,17 @@
|
|||
If [code]true[/code], this [CanvasItem] is drawn. The node is only visible if all of its antecedents are visible as well (in other words, [method is_visible_in_tree] must return [code]true[/code]).
|
||||
[b]Note:[/b] For controls that inherit [Popup], the correct way to make them visible is to call one of the multiple [code]popup*()[/code] functions instead.
|
||||
</member>
|
||||
<member name="y_sort_enabled" type="bool" setter="set_y_sort_enabled" getter="is_y_sort_enabled" default="false">
|
||||
If [code]true[/code], child nodes with the lowest Y position are drawn before those with a higher Y position. If [code]false[/code], Y-sorting is disabled. Y-sorting only affects children that inherit from [CanvasItem].
|
||||
You can nest nodes with Y-sorting. Child Y-sorted nodes are sorted in the same space as the parent Y-sort. This feature allows you to organize a scene better or divide it into multiple ones without changing your scene tree.
|
||||
</member>
|
||||
<member name="z_as_relative" type="bool" setter="set_z_as_relative" getter="is_z_relative" default="true">
|
||||
If [code]true[/code], the node's Z index is relative to its parent's Z index. If this node's Z index is 2 and its parent's effective Z index is 3, then this node's effective Z index will be 2 + 3 = 5.
|
||||
</member>
|
||||
<member name="z_index" type="int" setter="set_z_index" getter="get_z_index" default="0">
|
||||
Z index. Controls the order in which the nodes render. A node with a higher Z index will display in front of others. Must be between [constant RenderingServer.CANVAS_ITEM_Z_MIN] and [constant RenderingServer.CANVAS_ITEM_Z_MAX] (inclusive).
|
||||
[b]Note:[/b] Changing the Z index of a [Control] only affects the drawing order, not the order in which input events are handled. This can be useful to implement certain UI animations, e.g. a menu where hovered items are scaled and should overlap others.
|
||||
</member>
|
||||
</members>
|
||||
<signals>
|
||||
<signal name="draw">
|
||||
|
|
|
@ -125,15 +125,5 @@
|
|||
<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform">
|
||||
Local [Transform2D].
|
||||
</member>
|
||||
<member name="y_sort_enabled" type="bool" setter="set_y_sort_enabled" getter="is_y_sort_enabled" default="false">
|
||||
If [code]true[/code], child nodes with the lowest Y position are drawn before those with a higher Y position. If [code]false[/code], Y-sorting is disabled. Y-sorting only affects children that inherit from [CanvasItem].
|
||||
You can nest nodes with Y-sorting. Child Y-sorted nodes are sorted in the same space as the parent Y-sort. This feature allows you to organize a scene better or divide it into multiple ones without changing your scene tree.
|
||||
</member>
|
||||
<member name="z_as_relative" type="bool" setter="set_z_as_relative" getter="is_z_relative" default="true">
|
||||
If [code]true[/code], the node's Z index is relative to its parent's Z index. If this node's Z index is 2 and its parent's effective Z index is 3, then this node's effective Z index will be 2 + 3 = 5.
|
||||
</member>
|
||||
<member name="z_index" type="int" setter="set_z_index" getter="get_z_index" default="0">
|
||||
Z index. Controls the order in which the nodes render. A node with a higher Z index will display in front of others. Must be between [constant RenderingServer.CANVAS_ITEM_Z_MIN] and [constant RenderingServer.CANVAS_ITEM_Z_MAX] (inclusive).
|
||||
</member>
|
||||
</members>
|
||||
</class>
|
||||
|
|
|
@ -328,29 +328,6 @@ void Node2D::set_global_transform(const Transform2D &p_transform) {
|
|||
}
|
||||
}
|
||||
|
||||
void Node2D::set_z_index(int p_z) {
|
||||
ERR_FAIL_COND(p_z < RS::CANVAS_ITEM_Z_MIN);
|
||||
ERR_FAIL_COND(p_z > RS::CANVAS_ITEM_Z_MAX);
|
||||
z_index = p_z;
|
||||
RS::get_singleton()->canvas_item_set_z_index(get_canvas_item(), z_index);
|
||||
}
|
||||
|
||||
void Node2D::set_z_as_relative(bool p_enabled) {
|
||||
if (z_relative == p_enabled) {
|
||||
return;
|
||||
}
|
||||
z_relative = p_enabled;
|
||||
RS::get_singleton()->canvas_item_set_z_as_relative_to_parent(get_canvas_item(), p_enabled);
|
||||
}
|
||||
|
||||
bool Node2D::is_z_relative() const {
|
||||
return z_relative;
|
||||
}
|
||||
|
||||
int Node2D::get_z_index() const {
|
||||
return z_index;
|
||||
}
|
||||
|
||||
Transform2D Node2D::get_relative_transform_to_parent(const Node *p_parent) const {
|
||||
if (p_parent == this) {
|
||||
return Transform2D();
|
||||
|
@ -382,15 +359,6 @@ Point2 Node2D::to_global(Point2 p_local) const {
|
|||
return get_global_transform().xform(p_local);
|
||||
}
|
||||
|
||||
void Node2D::set_y_sort_enabled(bool p_enabled) {
|
||||
y_sort_enabled = p_enabled;
|
||||
RS::get_singleton()->canvas_item_set_sort_children_by_y(get_canvas_item(), y_sort_enabled);
|
||||
}
|
||||
|
||||
bool Node2D::is_y_sort_enabled() const {
|
||||
return y_sort_enabled;
|
||||
}
|
||||
|
||||
void Node2D::_notification(int p_notification) {
|
||||
switch (p_notification) {
|
||||
case NOTIFICATION_MOVED_IN_PARENT: {
|
||||
|
@ -437,15 +405,6 @@ void Node2D::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("to_local", "global_point"), &Node2D::to_local);
|
||||
ClassDB::bind_method(D_METHOD("to_global", "local_point"), &Node2D::to_global);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_z_index", "z_index"), &Node2D::set_z_index);
|
||||
ClassDB::bind_method(D_METHOD("get_z_index"), &Node2D::get_z_index);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_z_as_relative", "enable"), &Node2D::set_z_as_relative);
|
||||
ClassDB::bind_method(D_METHOD("is_z_relative"), &Node2D::is_z_relative);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_y_sort_enabled", "enabled"), &Node2D::set_y_sort_enabled);
|
||||
ClassDB::bind_method(D_METHOD("is_y_sort_enabled"), &Node2D::is_y_sort_enabled);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("get_relative_transform_to_parent", "parent"), &Node2D::get_relative_transform_to_parent);
|
||||
|
||||
ADD_GROUP("Transform", "");
|
||||
|
@ -460,9 +419,4 @@ void Node2D::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_scale", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_scale", "get_global_scale");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "global_skew", PROPERTY_HINT_NONE, "radians", PROPERTY_USAGE_NONE), "set_global_skew", "get_global_skew");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "global_transform", PROPERTY_HINT_NONE, "suffix:px", PROPERTY_USAGE_NONE), "set_global_transform", "get_global_transform");
|
||||
|
||||
ADD_GROUP("Ordering", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "z_index", PROPERTY_HINT_RANGE, itos(RS::CANVAS_ITEM_Z_MIN) + "," + itos(RS::CANVAS_ITEM_Z_MAX) + ",1"), "set_z_index", "get_z_index");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "z_as_relative"), "set_z_as_relative", "is_z_relative");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "y_sort_enabled"), "set_y_sort_enabled", "is_y_sort_enabled");
|
||||
}
|
||||
|
|
|
@ -40,9 +40,6 @@ class Node2D : public CanvasItem {
|
|||
real_t rotation = 0.0;
|
||||
Size2 scale = Vector2(1, 1);
|
||||
real_t skew = 0.0;
|
||||
int z_index = 0;
|
||||
bool z_relative = true;
|
||||
bool y_sort_enabled = false;
|
||||
|
||||
Transform2D transform;
|
||||
|
||||
|
@ -103,21 +100,12 @@ public:
|
|||
void set_global_skew(const real_t p_radians);
|
||||
void set_global_scale(const Size2 &p_scale);
|
||||
|
||||
void set_z_index(int p_z);
|
||||
int get_z_index() const;
|
||||
|
||||
void look_at(const Vector2 &p_pos);
|
||||
real_t get_angle_to(const Vector2 &p_pos) const;
|
||||
|
||||
Point2 to_local(Point2 p_global) const;
|
||||
Point2 to_global(Point2 p_local) const;
|
||||
|
||||
void set_z_as_relative(bool p_enabled);
|
||||
bool is_z_relative() const;
|
||||
|
||||
virtual void set_y_sort_enabled(bool p_enabled);
|
||||
virtual bool is_y_sort_enabled() const;
|
||||
|
||||
Transform2D get_relative_transform_to_parent(const Node *p_parent) const;
|
||||
|
||||
Transform2D get_transform() const override;
|
||||
|
|
|
@ -220,6 +220,10 @@ PackedStringArray Control::get_configuration_warnings() const {
|
|||
warnings.push_back(RTR("The Hint Tooltip won't be displayed as the control's Mouse Filter is set to \"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"."));
|
||||
}
|
||||
|
||||
if (get_z_index() != 0) {
|
||||
warnings.push_back(RTR("Changing the Z index of a control only affects the drawing order, not the input event handling order."));
|
||||
}
|
||||
|
||||
return warnings;
|
||||
}
|
||||
|
||||
|
|
|
@ -450,6 +450,39 @@ void CanvasItem::item_rect_changed(bool p_size_changed) {
|
|||
emit_signal(SceneStringNames::get_singleton()->item_rect_changed);
|
||||
}
|
||||
|
||||
void CanvasItem::set_z_index(int p_z) {
|
||||
ERR_FAIL_COND(p_z < RS::CANVAS_ITEM_Z_MIN);
|
||||
ERR_FAIL_COND(p_z > RS::CANVAS_ITEM_Z_MAX);
|
||||
z_index = p_z;
|
||||
RS::get_singleton()->canvas_item_set_z_index(canvas_item, z_index);
|
||||
update_configuration_warnings();
|
||||
}
|
||||
|
||||
void CanvasItem::set_z_as_relative(bool p_enabled) {
|
||||
if (z_relative == p_enabled) {
|
||||
return;
|
||||
}
|
||||
z_relative = p_enabled;
|
||||
RS::get_singleton()->canvas_item_set_z_as_relative_to_parent(canvas_item, p_enabled);
|
||||
}
|
||||
|
||||
bool CanvasItem::is_z_relative() const {
|
||||
return z_relative;
|
||||
}
|
||||
|
||||
int CanvasItem::get_z_index() const {
|
||||
return z_index;
|
||||
}
|
||||
|
||||
void CanvasItem::set_y_sort_enabled(bool p_enabled) {
|
||||
y_sort_enabled = p_enabled;
|
||||
RS::get_singleton()->canvas_item_set_sort_children_by_y(canvas_item, y_sort_enabled);
|
||||
}
|
||||
|
||||
bool CanvasItem::is_y_sort_enabled() const {
|
||||
return y_sort_enabled;
|
||||
}
|
||||
|
||||
void CanvasItem::draw_dashed_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, real_t p_width, real_t p_dash) {
|
||||
ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal.");
|
||||
|
||||
|
@ -913,9 +946,19 @@ void CanvasItem::_bind_methods() {
|
|||
|
||||
ClassDB::bind_method(D_METHOD("set_modulate", "modulate"), &CanvasItem::set_modulate);
|
||||
ClassDB::bind_method(D_METHOD("get_modulate"), &CanvasItem::get_modulate);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_self_modulate", "self_modulate"), &CanvasItem::set_self_modulate);
|
||||
ClassDB::bind_method(D_METHOD("get_self_modulate"), &CanvasItem::get_self_modulate);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_z_index", "z_index"), &Node2D::set_z_index);
|
||||
ClassDB::bind_method(D_METHOD("get_z_index"), &Node2D::get_z_index);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_z_as_relative", "enable"), &Node2D::set_z_as_relative);
|
||||
ClassDB::bind_method(D_METHOD("is_z_relative"), &Node2D::is_z_relative);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_y_sort_enabled", "enabled"), &Node2D::set_y_sort_enabled);
|
||||
ClassDB::bind_method(D_METHOD("is_y_sort_enabled"), &Node2D::is_y_sort_enabled);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_draw_behind_parent", "enable"), &CanvasItem::set_draw_behind_parent);
|
||||
ClassDB::bind_method(D_METHOD("is_draw_behind_parent_enabled"), &CanvasItem::is_draw_behind_parent_enabled);
|
||||
|
||||
|
@ -1005,6 +1048,11 @@ void CanvasItem::_bind_methods() {
|
|||
ADD_PROPERTY(PropertyInfo(Variant::INT, "light_mask", PROPERTY_HINT_LAYERS_2D_RENDER), "set_light_mask", "get_light_mask");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "visibility_layer", PROPERTY_HINT_LAYERS_2D_RENDER), "set_visibility_layer", "get_visibility_layer");
|
||||
|
||||
ADD_GROUP("Ordering", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "z_index", PROPERTY_HINT_RANGE, itos(RS::CANVAS_ITEM_Z_MIN) + "," + itos(RS::CANVAS_ITEM_Z_MAX) + ",1"), "set_z_index", "get_z_index");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "z_as_relative"), "set_z_as_relative", "is_z_relative");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "y_sort_enabled"), "set_y_sort_enabled", "is_y_sort_enabled");
|
||||
|
||||
ADD_GROUP("Texture", "texture_");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_filter", PROPERTY_HINT_ENUM, "Inherit,Nearest,Linear,Nearest Mipmap,Linear Mipmap,Nearest Mipmap Anisotropic,Linear Mipmap Anisotropic"), "set_texture_filter", "get_texture_filter");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_repeat", PROPERTY_HINT_ENUM, "Inherit,Disabled,Enabled,Mirror"), "set_texture_repeat", "get_texture_repeat");
|
||||
|
|
|
@ -91,6 +91,10 @@ private:
|
|||
int light_mask = 1;
|
||||
uint32_t visibility_layer = 1;
|
||||
|
||||
int z_index = 0;
|
||||
bool z_relative = true;
|
||||
bool y_sort_enabled = false;
|
||||
|
||||
Window *window = nullptr;
|
||||
bool visible = true;
|
||||
bool parent_visible_in_tree = false;
|
||||
|
@ -230,6 +234,17 @@ public:
|
|||
void set_visibility_layer_bit(uint32_t p_visibility_layer, bool p_enable);
|
||||
bool get_visibility_layer_bit(uint32_t p_visibility_layer) const;
|
||||
|
||||
/* ORDERING */
|
||||
|
||||
void set_z_index(int p_z);
|
||||
int get_z_index() const;
|
||||
|
||||
void set_z_as_relative(bool p_enabled);
|
||||
bool is_z_relative() const;
|
||||
|
||||
virtual void set_y_sort_enabled(bool p_enabled);
|
||||
virtual bool is_y_sort_enabled() const;
|
||||
|
||||
/* DRAWING API */
|
||||
|
||||
void draw_dashed_line(const Point2 &p_from, const Point2 &p_to, const Color &p_color, real_t p_width = 1.0, real_t p_dash = 2.0);
|
||||
|
|
Loading…
Reference in a new issue