浏览代码

Merge pull request #17080 from simedis/pretty_print_tree

Made Node.print_tree() print prettily
Rémi Verschelde 7 年之前
父节点
当前提交
866cb2805f
共有 3 个文件被更改,包括 44 次插入5 次删除
  1. 24 1
      doc/classes/Node.xml
  2. 18 4
      scene/main/node.cpp
  3. 2 0
      scene/main/node.h

+ 24 - 1
doc/classes/Node.xml

@@ -453,7 +453,30 @@
 			<return type="void">
 			</return>
 			<description>
-				Prints the scene hierarchy of this node and all it's children to stdout. Used mainly for debugging purposes.
+				Prints the tree to stdout. Used mainly for debugging purposes. This version displays the path relative to the current node, and is good for copy/pasting into the [method get_node] function. Example output:
+				[codeblock]
+				TheGame
+				TheGame/Menu
+				TheGame/Menu/Label
+				TheGame/Menu/Camera2D
+				TheGame/SplashScreen
+				TheGame/SplashScreen/Camera2D
+				[/codeblock]
+			</description>
+		</method>
+		<method name="print_tree_pretty">
+			<return type="void">
+			</return>
+			<description>
+				Similar to [method print_tree], this prints the tree to stdout. This version displays a more graphical representation similar to what is displayed in the scene inspector. It is useful for inspecting larger trees. Example output:
+				[codeblock]
+				 ┖╴TheGame
+				    ┠╴Menu
+				    ┃  ┠╴Label
+				    ┃  ┖╴Camera2D
+				    ┖-SplashScreen
+				       ┖╴Camera2D
+				[/codeblock]
 			</description>
 		</method>
 		<method name="propagate_call">

+ 18 - 4
scene/main/node.cpp

@@ -1708,11 +1708,18 @@ bool Node::has_persistent_groups() const {
 
 	return false;
 }
-void Node::_print_tree(const Node *p_node) {
+void Node::_print_tree_pretty(const String prefix, const bool last) {
 
-	print_line(String(p_node->get_path_to(this)));
-	for (int i = 0; i < data.children.size(); i++)
-		data.children[i]->_print_tree(p_node);
+	String new_prefix = last ? String::utf8(" ┖╴") : String::utf8(" ┠╴");
+	print_line(prefix + new_prefix + String(get_name()));
+	for (int i = 0; i < data.children.size(); i++) {
+		new_prefix = last ? String::utf8("   ") : String::utf8(" ┃ ");
+		data.children[i]->_print_tree_pretty(prefix + new_prefix, i == data.children.size() - 1);
+	}
+}
+
+void Node::print_tree_pretty() {
+	_print_tree_pretty("", true);
 }
 
 void Node::print_tree() {
@@ -1720,6 +1727,12 @@ void Node::print_tree() {
 	_print_tree(this);
 }
 
+void Node::_print_tree(const Node *p_node) {
+	print_line(String(p_node->get_path_to(this)));
+	for (int i = 0; i < data.children.size(); i++)
+		data.children[i]->_print_tree(p_node);
+}
+
 void Node::_propagate_reverse_notification(int p_notification) {
 
 	data.blocked++;
@@ -2668,6 +2681,7 @@ void Node::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("remove_and_skip"), &Node::remove_and_skip);
 	ClassDB::bind_method(D_METHOD("get_index"), &Node::get_index);
 	ClassDB::bind_method(D_METHOD("print_tree"), &Node::print_tree);
+	ClassDB::bind_method(D_METHOD("print_tree_pretty"), &Node::print_tree_pretty);
 	ClassDB::bind_method(D_METHOD("set_filename", "filename"), &Node::set_filename);
 	ClassDB::bind_method(D_METHOD("get_filename"), &Node::get_filename);
 	ClassDB::bind_method(D_METHOD("propagate_notification", "what"), &Node::propagate_notification);

+ 2 - 0
scene/main/node.h

@@ -153,6 +153,7 @@ private:
 
 	Ref<MultiplayerAPI> multiplayer_api;
 
+	void _print_tree_pretty(const String prefix, const bool last);
 	void _print_tree(const Node *p_node);
 
 	Node *_get_node(const NodePath &p_path) const;
@@ -289,6 +290,7 @@ public:
 	int get_index() const;
 
 	void print_tree();
+	void print_tree_pretty();
 
 	void set_filename(const String &p_filename);
 	String get_filename() const;