2
0
Эх сурвалжийг харах

Merge pull request #15239 from sersoong/2.1-batchtoggle

Enhanced Toggle Visibility button in Scene tree editor
Rémi Verschelde 7 жил өмнө
parent
commit
646ce0b2d2

+ 37 - 17
editor/scene_tree_editor.cpp

@@ -197,23 +197,10 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
 			emit_signal("open_script", script);
 
 	} else if (p_id == BUTTON_VISIBILITY) {
-
-		if (n->is_type("Spatial")) {
-
-			bool v = !bool(n->call("is_hidden"));
-			undo_redo->create_action(TTR("Toggle Spatial Visible"));
-			undo_redo->add_do_method(n, "_set_visible_", !v);
-			undo_redo->add_undo_method(n, "_set_visible_", v);
-			undo_redo->commit_action();
-		} else if (n->is_type("CanvasItem")) {
-
-			bool v = !bool(n->call("is_hidden"));
-			undo_redo->create_action(TTR("Toggle CanvasItem Visible"));
-			undo_redo->add_do_method(n, v ? "hide" : "show");
-			undo_redo->add_undo_method(n, v ? "show" : "hide");
-			undo_redo->commit_action();
-		}
-
+		undo_redo->create_action(TTR("Toggle Visible"));
+		undo_redo->add_do_method(this, "toggle_visible", n);
+		undo_redo->add_undo_method(this, "toggle_visible", n);
+		undo_redo->commit_action();
 	} else if (p_id == BUTTON_LOCK) {
 
 		if (n->is_type("CanvasItem")) {
@@ -259,6 +246,37 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i
 	}
 }
 
+void SceneTreeEditor::_toggle_visible(Node *p_node) {
+	if (p_node->is_type("Spatial")) {
+		bool v = bool(p_node->call("is_visible"));
+		p_node->call("set_visible", !v);
+	}
+	else if (p_node->is_type("CanvasItem")) {
+		bool v = bool(p_node->call("is_visible"));
+		if (v) {
+			p_node->call("hide");
+		}
+		else {
+			p_node->call("show");
+		}
+	}
+}
+
+void SceneTreeEditor::toggle_visible(Node *p_node) {
+	_toggle_visible(p_node);
+	List<Node *> selection = editor_selection->get_selected_node_list();
+	if (selection.size() > 1) {
+		for (List<Node *>::Element *E = selection.front(); E; E = E->next()) {
+			Node *nv = E->get();
+			ERR_FAIL_COND(!nv);
+			if (nv == p_node) {
+				continue;
+			}
+			_toggle_visible(nv);
+		}
+	}
+}
+
 bool SceneTreeEditor::_add_nodes(Node *p_node, TreeItem *p_parent) {
 
 	if (!p_node)
@@ -1062,6 +1080,8 @@ void SceneTreeEditor::_bind_methods() {
 	ObjectTypeDB::bind_method("_subscene_option", &SceneTreeEditor::_subscene_option);
 	ObjectTypeDB::bind_method("_rmb_select", &SceneTreeEditor::_rmb_select);
 	ObjectTypeDB::bind_method("_warning_changed", &SceneTreeEditor::_warning_changed);
+	ObjectTypeDB::bind_method("_toggle_visible", &SceneTreeEditor::_toggle_visible);
+	ObjectTypeDB::bind_method("toggle_visible", &SceneTreeEditor::toggle_visible);
 
 	ObjectTypeDB::bind_method("_node_script_changed", &SceneTreeEditor::_node_script_changed);
 	ObjectTypeDB::bind_method("_node_visibility_changed", &SceneTreeEditor::_node_visibility_changed);

+ 2 - 0
editor/scene_tree_editor.h

@@ -81,6 +81,7 @@ class SceneTreeEditor : public Control {
 	int blocked;
 
 	void _compute_hash(Node *p_node, uint64_t &hash);
+	void toggle_visible(Node *p_node);
 
 	bool _add_nodes(Node *p_node, TreeItem *p_parent);
 	void _test_update_tree();
@@ -114,6 +115,7 @@ class SceneTreeEditor : public Control {
 	static void _bind_methods();
 
 	void _cell_button_pressed(Object *p_item, int p_column, int p_id);
+	void _toggle_visible(Node *p_node);
 	void _cell_multi_selected(Object *p_object, int p_cel, bool p_selected);
 	void _update_selection(TreeItem *item);
 	void _node_script_changed(Node *p_node);