浏览代码

Merge pull request #7382 from volzhs/fix-visibility

Able to change visibility when ancestor node is hidden
Rémi Verschelde 8 年之前
父节点
当前提交
3e1b5ad223
共有 5 个文件被更改,包括 30 次插入23 次删除
  1. 2 7
      scene/2d/canvas_item.cpp
  2. 10 1
      scene/gui/tree.cpp
  3. 3 1
      scene/gui/tree.h
  4. 14 14
      tools/editor/scene_tree_editor.cpp
  5. 1 0
      tools/editor/scene_tree_editor.h

+ 2 - 7
scene/2d/canvas_item.cpp

@@ -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");
 }
 }
 
 

+ 10 - 1
scene/gui/tree.cpp

@@ -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;
 			}
 			}

+ 3 - 1
scene/gui/tree.h

@@ -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 */
 
 

+ 14 - 14
tools/editor/scene_tree_editor.cpp

@@ -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) {
 
 

+ 1 - 0
tools/editor/scene_tree_editor.h

@@ -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);