You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-13 13:31:48 +00:00
Add visibility to CanvasLayer
This commit is contained in:
@@ -44,5 +44,16 @@
|
|||||||
<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform" default="Transform2D(1, 0, 0, 1, 0, 0)">
|
<member name="transform" type="Transform2D" setter="set_transform" getter="get_transform" default="Transform2D(1, 0, 0, 1, 0, 0)">
|
||||||
The layer's transform.
|
The layer's transform.
|
||||||
</member>
|
</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>
|
</members>
|
||||||
|
<signals>
|
||||||
|
<signal name="visibility_changed">
|
||||||
|
<description>
|
||||||
|
Emitted when visibility of the layer is changed. See [member visible].
|
||||||
|
</description>
|
||||||
|
</signal>
|
||||||
|
</signals>
|
||||||
</class>
|
</class>
|
||||||
|
|||||||
@@ -362,6 +362,17 @@ bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent, bool p_scroll
|
|||||||
}
|
}
|
||||||
|
|
||||||
_update_visibility_color(p_node, item);
|
_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")) {
|
} else if (p_node->is_class("Node3D")) {
|
||||||
bool is_locked = p_node->has_meta("_edit_lock_");
|
bool is_locked = p_node->has_meta("_edit_lock_");
|
||||||
if (is_locked) {
|
if (is_locked) {
|
||||||
@@ -471,6 +482,9 @@ void SceneTreeEditor::_node_visibility_changed(Node *p_node) {
|
|||||||
if (p_node->is_class("CanvasItem")) {
|
if (p_node->is_class("CanvasItem")) {
|
||||||
visible = p_node->call("is_visible");
|
visible = p_node->call("is_visible");
|
||||||
CanvasItemEditor::get_singleton()->get_viewport_control()->update();
|
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")) {
|
} else if (p_node->is_class("Node3D")) {
|
||||||
visible = p_node->call("is_visible");
|
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));
|
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))) {
|
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));
|
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();
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ class World2D;
|
|||||||
class CanvasItem : public Node {
|
class CanvasItem : public Node {
|
||||||
GDCLASS(CanvasItem, Node);
|
GDCLASS(CanvasItem, Node);
|
||||||
|
|
||||||
|
friend class CanvasLayer;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
enum TextureFilter {
|
enum TextureFilter {
|
||||||
TEXTURE_FILTER_PARENT_NODE,
|
TEXTURE_FILTER_PARENT_NODE,
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
#include "canvas_layer.h"
|
#include "canvas_layer.h"
|
||||||
|
#include "canvas_item.h"
|
||||||
#include "viewport.h"
|
#include "viewport.h"
|
||||||
|
|
||||||
void CanvasLayer::set_layer(int p_xform) {
|
void CanvasLayer::set_layer(int p_xform) {
|
||||||
@@ -42,6 +43,32 @@ int CanvasLayer::get_layer() const {
|
|||||||
return layer;
|
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) {
|
void CanvasLayer::set_transform(const Transform2D &p_xform) {
|
||||||
transform = p_xform;
|
transform = p_xform;
|
||||||
locrotscale_dirty = true;
|
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("set_layer", "layer"), &CanvasLayer::set_layer);
|
||||||
ClassDB::bind_method(D_METHOD("get_layer"), &CanvasLayer::get_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("set_transform", "transform"), &CanvasLayer::set_transform);
|
||||||
ClassDB::bind_method(D_METHOD("get_transform"), &CanvasLayer::get_transform);
|
ClassDB::bind_method(D_METHOD("get_transform"), &CanvasLayer::get_transform);
|
||||||
|
|
||||||
@@ -289,6 +319,7 @@ void CanvasLayer::_bind_methods() {
|
|||||||
|
|
||||||
ADD_GROUP("Layer", "");
|
ADD_GROUP("Layer", "");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::INT, "layer", PROPERTY_HINT_RANGE, "-128,128,1"), "set_layer", "get_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_GROUP("Transform", "");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "offset"), "set_offset", "get_offset");
|
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");
|
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_GROUP("Follow Viewport", "follow_viewport");
|
||||||
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "follow_viewport_enable"), "set_follow_viewport", "is_following_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_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() {
|
CanvasLayer::CanvasLayer() {
|
||||||
|
|||||||
@@ -52,6 +52,7 @@ class CanvasLayer : public Node {
|
|||||||
Viewport *vp = nullptr;
|
Viewport *vp = nullptr;
|
||||||
|
|
||||||
int sort_index = 0;
|
int sort_index = 0;
|
||||||
|
bool visible = true;
|
||||||
|
|
||||||
bool follow_viewport = false;
|
bool follow_viewport = false;
|
||||||
float follow_viewport_scale = 1.0;
|
float follow_viewport_scale = 1.0;
|
||||||
@@ -69,6 +70,9 @@ public:
|
|||||||
void set_layer(int p_xform);
|
void set_layer(int p_xform);
|
||||||
int get_layer() const;
|
int get_layer() const;
|
||||||
|
|
||||||
|
void set_visible(bool p_visible);
|
||||||
|
bool is_visible() const;
|
||||||
|
|
||||||
void set_transform(const Transform2D &p_xform);
|
void set_transform(const Transform2D &p_xform);
|
||||||
Transform2D get_transform() const;
|
Transform2D get_transform() const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user