Add visibility to CanvasLayer
This commit is contained in:
parent
df1724470d
commit
189dab2d76
|
@ -44,5 +44,16 @@
|
|||
<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform" default="Transform2D(1, 0, 0, 1, 0, 0)">
|
||||
The layer's transform.
|
||||
</member>
|
||||
<member name="visible" type="bool" setter="set_visible" getter="is_visible" default="true">
|
||||
If [code]false[/code], any [CanvasItem] under this [CanvasLayer] will be hidden.
|
||||
Unlike [member CanvasItem.visible], visibility of a [CanvasLayer] isn't propagated to underlying layers.
|
||||
</member>
|
||||
</members>
|
||||
<signals>
|
||||
<signal name="visibility_changed">
|
||||
<description>
|
||||
Emitted when visibility of the layer is changed. See [member visible].
|
||||
</description>
|
||||
</signal>
|
||||
</signals>
|
||||
</class>
|
||||
|
|
|
@ -362,6 +362,17 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent, bool p_scroll
|
|||
}
|
||||
|
||||
_update_visibility_color(p_node, item);
|
||||
} else if (p_node->is_class("CanvasLayer")) {
|
||||
bool v = p_node->call("is_visible");
|
||||
if (v) {
|
||||
item->add_button(0, get_theme_icon("GuiVisibilityVisible", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
|
||||
} else {
|
||||
item->add_button(0, get_theme_icon("GuiVisibilityHidden", "EditorIcons"), BUTTON_VISIBILITY, false, TTR("Toggle Visibility"));
|
||||
}
|
||||
|
||||
if (!p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) {
|
||||
p_node->connect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed), varray(p_node));
|
||||
}
|
||||
} else if (p_node->is_class("Node3D")) {
|
||||
bool is_locked = p_node->has_meta("_edit_lock_");
|
||||
if (is_locked) {
|
||||
|
@ -471,6 +482,9 @@ void SceneTreeEditor::_node_visibility_changed(Node *p_node) {
|
|||
if (p_node->is_class("CanvasItem")) {
|
||||
visible = p_node->call("is_visible");
|
||||
CanvasItemEditor::get_singleton()->get_viewport_control()->update();
|
||||
} else if (p_node->is_class("CanvasLayer")) {
|
||||
visible = p_node->call("is_visible");
|
||||
CanvasItemEditor::get_singleton()->get_viewport_control()->update();
|
||||
} else if (p_node->is_class("Node3D")) {
|
||||
visible = p_node->call("is_visible");
|
||||
}
|
||||
|
@ -514,7 +528,7 @@ void SceneTreeEditor::_node_removed(Node *p_node) {
|
|||
p_node->disconnect("script_changed", callable_mp(this, &SceneTreeEditor::_node_script_changed));
|
||||
}
|
||||
|
||||
if (p_node->is_class("Node3D") || p_node->is_class("CanvasItem")) {
|
||||
if (p_node->is_class("Node3D") || p_node->is_class("CanvasItem") || p_node->is_class("CanvasLayer")) {
|
||||
if (p_node->is_connected("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed))) {
|
||||
p_node->disconnect("visibility_changed", callable_mp(this, &SceneTreeEditor::_node_visibility_changed));
|
||||
}
|
||||
|
|
|
@ -72,6 +72,15 @@ bool CanvasItem::is_visible_in_tree() const {
|
|||
p = p->get_parent_item();
|
||||
}
|
||||
|
||||
const Node *n = get_parent();
|
||||
while (n) {
|
||||
const CanvasLayer *c = Object::cast_to<CanvasLayer>(n);
|
||||
if (c && !c->is_visible()) {
|
||||
return false;
|
||||
}
|
||||
n = n->get_parent();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -46,6 +46,8 @@ class World2D;
|
|||
class CanvasItem : public Node {
|
||||
GDCLASS(CanvasItem, Node);
|
||||
|
||||
friend class CanvasLayer;
|
||||
|
||||
public:
|
||||
enum TextureFilter {
|
||||
TEXTURE_FILTER_PARENT_NODE,
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
/*************************************************************************/
|
||||
|
||||
#include "canvas_layer.h"
|
||||
#include "canvas_item.h"
|
||||
#include "viewport.h"
|
||||
|
||||
void CanvasLayer::set_layer(int p_xform) {
|
||||
|
@ -42,6 +43,32 @@ int CanvasLayer::get_layer() const {
|
|||
return layer;
|
||||
}
|
||||
|
||||
void CanvasLayer::set_visible(bool p_visible) {
|
||||
if (p_visible == visible) {
|
||||
return;
|
||||
}
|
||||
|
||||
visible = p_visible;
|
||||
emit_signal(SNAME("visibility_changed"));
|
||||
|
||||
for (int i = 0; i < get_child_count(); i++) {
|
||||
CanvasItem *c = Object::cast_to<CanvasItem>(get_child(i));
|
||||
if (c) {
|
||||
RenderingServer::get_singleton()->canvas_item_set_visible(c->get_canvas_item(), p_visible && c->is_visible());
|
||||
|
||||
if (c->is_visible()) {
|
||||
c->_propagate_visibility_changed(p_visible);
|
||||
} else {
|
||||
c->notification(CanvasItem::NOTIFICATION_VISIBILITY_CHANGED);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CanvasLayer::is_visible() const {
|
||||
return visible;
|
||||
}
|
||||
|
||||
void CanvasLayer::set_transform(const Transform2D &p_xform) {
|
||||
transform = p_xform;
|
||||
locrotscale_dirty = true;
|
||||
|
@ -264,6 +291,9 @@ void CanvasLayer::_bind_methods() {
|
|||
ClassDB::bind_method(D_METHOD("set_layer", "layer"), &CanvasLayer::set_layer);
|
||||
ClassDB::bind_method(D_METHOD("get_layer"), &CanvasLayer::get_layer);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_visible", "visible"), &CanvasLayer::set_visible);
|
||||
ClassDB::bind_method(D_METHOD("is_visible"), &CanvasLayer::is_visible);
|
||||
|
||||
ClassDB::bind_method(D_METHOD("set_transform", "transform"), &CanvasLayer::set_transform);
|
||||
ClassDB::bind_method(D_METHOD("get_transform"), &CanvasLayer::get_transform);
|
||||
|
||||
|
@ -289,6 +319,7 @@ void CanvasLayer::_bind_methods() {
|
|||
|
||||
ADD_GROUP("Layer", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "layer", PROPERTY_HINT_RANGE, "-128,128,1"), "set_layer", "get_layer");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "visible"), "set_visible", "is_visible");
|
||||
ADD_GROUP("Transform", "");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset"), "set_offset", "get_offset");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation", PROPERTY_HINT_RANGE, "-1080,1080,0.1,or_lesser,or_greater,radians"), "set_rotation", "get_rotation");
|
||||
|
@ -299,6 +330,8 @@ void CanvasLayer::_bind_methods() {
|
|||
ADD_GROUP("Follow Viewport", "follow_viewport");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "follow_viewport_enable"), "set_follow_viewport", "is_following_viewport");
|
||||
ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "follow_viewport_scale", PROPERTY_HINT_RANGE, "0.001,1000,0.001,or_greater,or_lesser"), "set_follow_viewport_scale", "get_follow_viewport_scale");
|
||||
|
||||
ADD_SIGNAL(MethodInfo("visibility_changed"));
|
||||
}
|
||||
|
||||
CanvasLayer::CanvasLayer() {
|
||||
|
|
|
@ -52,6 +52,7 @@ class CanvasLayer : public Node {
|
|||
Viewport *vp = nullptr;
|
||||
|
||||
int sort_index = 0;
|
||||
bool visible = true;
|
||||
|
||||
bool follow_viewport = false;
|
||||
float follow_viewport_scale = 1.0;
|
||||
|
@ -69,6 +70,9 @@ public:
|
|||
void set_layer(int p_xform);
|
||||
int get_layer() const;
|
||||
|
||||
void set_visible(bool p_visible);
|
||||
bool is_visible() const;
|
||||
|
||||
void set_transform(const Transform2D &p_xform);
|
||||
Transform2D get_transform() const;
|
||||
|
||||
|
|
Loading…
Reference in New Issue