Merge pull request #7382 from volzhs/fix-visibility

Able to change visibility when ancestor node is hidden
This commit is contained in:
Rémi Verschelde 2017-01-02 14:17:42 +01:00 committed by GitHub
commit 3e1b5ad223
5 changed files with 30 additions and 23 deletions

View File

@ -261,16 +261,13 @@ void CanvasItem::show() {
if (!hidden) if (!hidden)
return; return;
hidden=false; hidden=false;
VisualServer::get_singleton()->canvas_item_set_visible(canvas_item,true); VisualServer::get_singleton()->canvas_item_set_visible(canvas_item,true);
if (!is_inside_tree()) if (!is_inside_tree())
return; return;
if (is_visible()) { _propagate_visibility_changed(true);
_propagate_visibility_changed(true);
}
_change_notify("visibility/visible"); _change_notify("visibility/visible");
} }
@ -280,15 +277,13 @@ void CanvasItem::hide() {
if (hidden) if (hidden)
return; return;
bool propagate=is_inside_tree() && is_visible();
hidden=true; hidden=true;
VisualServer::get_singleton()->canvas_item_set_visible(canvas_item,false); VisualServer::get_singleton()->canvas_item_set_visible(canvas_item,false);
if (!is_inside_tree()) if (!is_inside_tree())
return; return;
if (propagate)
_propagate_visibility_changed(false);
_propagate_visibility_changed(false);
_change_notify("visibility/visible"); _change_notify("visibility/visible");
} }

View File

@ -569,6 +569,15 @@ void TreeItem::set_button(int p_column,int p_idx,const Ref<Texture>& p_button){
} }
void TreeItem::set_button_color(int p_column,int p_idx,const Color& p_color) {
ERR_FAIL_INDEX( p_column, cells.size() );
ERR_FAIL_INDEX( p_idx, cells[p_column].buttons.size() );
cells[p_column].buttons[p_idx].color=p_color;
_changed_notify(p_column);
}
void TreeItem::set_editable(int p_column,bool p_editable) { void TreeItem::set_editable(int p_column,bool p_editable) {
ERR_FAIL_INDEX( p_column, cells.size() ); ERR_FAIL_INDEX( p_column, cells.size() );
@ -1061,7 +1070,7 @@ int Tree::draw_item(const Point2i& p_pos,const Point2& p_draw_ofs, const Size2&
o.y+=(label_h-s.height)/2; o.y+=(label_h-s.height)/2;
o+=cache.button_pressed->get_offset(); o+=cache.button_pressed->get_offset();
b->draw(ci,o,p_item->cells[i].buttons[j].disabled?Color(1,1,1,0.5):Color(1,1,1,1)); b->draw(ci,o,p_item->cells[i].buttons[j].disabled?Color(1,1,1,0.5):p_item->cells[i].buttons[j].color);
w-=s.width+cache.button_margin; w-=s.width+cache.button_margin;
bw+=s.width+cache.button_margin; bw+=s.width+cache.button_margin;
} }

View File

@ -93,7 +93,8 @@ friend class Tree;
int id; int id;
bool disabled; bool disabled;
Ref<Texture> texture; Ref<Texture> texture;
Button() { id=0; disabled=false; } Color color;
Button() { id=0; disabled=false; color=Color(1,1,1,1); }
}; };
Vector< Button > buttons; Vector< Button > buttons;
@ -189,6 +190,7 @@ public:
int get_button_by_id(int p_column,int p_id) const; int get_button_by_id(int p_column,int p_id) const;
bool is_button_disabled(int p_column,int p_idx) const; bool is_button_disabled(int p_column,int p_idx) const;
void set_button(int p_column,int p_idx,const Ref<Texture>& p_button); void set_button(int p_column,int p_idx,const Ref<Texture>& p_button);
void set_button_color(int p_column,int p_idx,const Color& p_color);
/* range works for mode number or mode combo */ /* range works for mode number or mode combo */

View File

@ -208,13 +208,6 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item,int p_column,int p_id)
if (n->is_type("Spatial")) { if (n->is_type("Spatial")) {
Spatial *ci = n->cast_to<Spatial>();
if (!ci->is_visible() && ci->get_parent_spatial() && !ci->get_parent_spatial()->is_visible()) {
error->set_text(TTR("This item cannot be made visible because the parent is hidden. Unhide the parent first."));
error->popup_centered_minsize();
return;
}
bool v = !bool(n->call("is_hidden")); bool v = !bool(n->call("is_hidden"));
undo_redo->create_action(TTR("Toggle Spatial Visible")); undo_redo->create_action(TTR("Toggle Spatial Visible"));
undo_redo->add_do_method(n,"_set_visible_",!v); undo_redo->add_do_method(n,"_set_visible_",!v);
@ -222,12 +215,6 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item,int p_column,int p_id)
undo_redo->commit_action(); undo_redo->commit_action();
} else if (n->is_type("CanvasItem")) { } else if (n->is_type("CanvasItem")) {
CanvasItem *ci = n->cast_to<CanvasItem>();
if (!ci->is_visible() && ci->get_parent_item() && !ci->get_parent_item()->is_visible()) {
error->set_text(TTR("This item cannot be made visible because the parent is hidden. Unhide the parent first."));
error->popup_centered_minsize();
return;
}
bool v = !bool(n->call("is_hidden")); bool v = !bool(n->call("is_hidden"));
undo_redo->create_action(TTR("Toggle CanvasItem Visible")); undo_redo->create_action(TTR("Toggle CanvasItem Visible"));
undo_redo->add_do_method(n,v?"hide":"show"); undo_redo->add_do_method(n,v?"hide":"show");
@ -415,6 +402,7 @@ bool SceneTreeEditor::_add_nodes(Node *p_node,TreeItem *p_parent) {
if (!p_node->is_connected("visibility_changed",this,"_node_visibility_changed")) if (!p_node->is_connected("visibility_changed",this,"_node_visibility_changed"))
p_node->connect("visibility_changed",this,"_node_visibility_changed",varray(p_node)); p_node->connect("visibility_changed",this,"_node_visibility_changed",varray(p_node));
_update_visibility_color(p_node, item);
} else if (p_node->is_type("Spatial")) { } else if (p_node->is_type("Spatial")) {
bool h = p_node->call("is_hidden"); bool h = p_node->call("is_hidden");
@ -426,6 +414,7 @@ bool SceneTreeEditor::_add_nodes(Node *p_node,TreeItem *p_parent) {
if (!p_node->is_connected("visibility_changed",this,"_node_visibility_changed")) if (!p_node->is_connected("visibility_changed",this,"_node_visibility_changed"))
p_node->connect("visibility_changed",this,"_node_visibility_changed",varray(p_node)); p_node->connect("visibility_changed",this,"_node_visibility_changed",varray(p_node));
_update_visibility_color(p_node, item);
} }
} }
@ -491,9 +480,20 @@ void SceneTreeEditor::_node_visibility_changed(Node *p_node) {
else else
item->set_button(0,idx,get_icon("Visible","EditorIcons")); item->set_button(0,idx,get_icon("Visible","EditorIcons"));
_update_visibility_color(p_node, item);
} }
void SceneTreeEditor::_update_visibility_color(Node *p_node, TreeItem *p_item) {
if (p_node->is_type("CanvasItem") || p_node->is_type("Spatial")) {
Color color(1,1,1,1);
bool visible_on_screen = p_node->call("is_visible");
if (!visible_on_screen) {
color = Color(0.6,0.6,0.6,1);
}
int idx=p_item->get_button_by_id(0,BUTTON_VISIBILITY);
p_item->set_button_color(0,idx,color);
}
}
void SceneTreeEditor::_node_script_changed(Node *p_node) { void SceneTreeEditor::_node_script_changed(Node *p_node) {

View File

@ -117,6 +117,7 @@ class SceneTreeEditor : public Control {
void _update_selection(TreeItem *item); void _update_selection(TreeItem *item);
void _node_script_changed(Node *p_node); void _node_script_changed(Node *p_node);
void _node_visibility_changed(Node *p_node); void _node_visibility_changed(Node *p_node);
void _update_visibility_color(Node *p_node, TreeItem *p_item);
void _subscene_option(int p_idx); void _subscene_option(int p_idx);
void _node_replace_owner(Node* p_base,Node* p_node,Node* p_root); void _node_replace_owner(Node* p_base,Node* p_node,Node* p_root);