22#include < Geode/utils/cocos.hpp>
33#include " ../DevTools.hpp"
44#include " ../platform/utils.hpp"
5+ #include < misc/cpp/imgui_stdlib.h>
56#ifndef GEODE_IS_WINDOWS
67#include < cxxabi.h>
78#endif
89
910using namespace geode ::prelude;
1011
1112void DevTools::drawTreeBranch (CCNode* node, size_t index) {
13+ if (!searchBranch (node)) {
14+ return ;
15+ }
16+
1217 auto selected = DevTools::get ()->getSelectedNode () == node;
1318
1419 ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_None;
@@ -23,6 +28,14 @@ void DevTools::drawTreeBranch(CCNode* node, size_t index) {
2328 {
2429 flags |= ImGuiTreeNodeFlags_OpenOnArrow;
2530 }
31+
32+ if (m_searchQuery.empty ()) {
33+ ImGui::SetNextItemOpen (m_nodeOpen.contains (node) ? m_nodeOpen[node] : false );
34+ }
35+ else if (m_searchQuery != m_prevQuery) {
36+ ImGui::SetNextItemOpen (true );
37+ }
38+
2639 std::stringstream name;
2740 name << " [" << index << " ] " << getNodeName (node) << " " ;
2841 if (node->getTag () != -1 ) {
@@ -36,13 +49,31 @@ void DevTools::drawTreeBranch(CCNode* node, size_t index) {
3649 }
3750 // The order here is unusual due to imgui weirdness; see the second-to-last paragraph in https://kahwei.dev/2022/06/20/imgui-tree-node/
3851 bool expanded = ImGui::TreeNodeEx (node, flags, " %s" , name.str ().c_str ());
39- if (ImGui::IsItemClicked ()) {
52+ if (ImGui::IsItemClicked ()) {
4053 DevTools::get ()->selectNode (node);
4154 selected = true ;
55+
56+ if (!m_searchQuery.empty ()) {
57+ CCNode* parent = node->getParent ();
58+ while (parent) {
59+ m_nodeOpen[parent] = true ;
60+ parent = parent->getParent ();
61+ }
62+ }
4263 }
4364 if (ImGui::IsItemHovered () && (m_settings.alwaysHighlight || ImGui::IsKeyDown (ImGuiMod_Shift))) {
4465 DevTools::get ()->highlightNode (node, HighlightMode::Hovered);
4566 }
67+ if (ImGui::IsItemToggledOpen () && (m_searchQuery.empty () || m_searchQuery == m_prevQuery)) {
68+ if (!m_searchQuery.empty () && expanded) {
69+ CCNode* parent = node->getParent ();
70+ while (parent) {
71+ m_nodeOpen[parent] = true ;
72+ parent = parent->getParent ();
73+ }
74+ }
75+ m_nodeOpen[node] = expanded;
76+ }
4677 if (expanded) {
4778 if (m_settings.attributesInTree ) {
4879 this ->drawNodeAttributes (node);
@@ -59,6 +90,30 @@ void DevTools::drawTree() {
5990#ifdef GEODE_IS_MOBILE
6091 ImGui::Dummy ({0 .f , 60 .f });
6192#endif
93+ m_prevQuery = m_searchQuery;
94+ ImGui::InputText (" Search Tree" , &m_searchQuery, 256 );
6295
6396 this ->drawTreeBranch (CCDirector::get ()->getRunningScene (), 0 );
6497}
98+
99+ bool DevTools::searchBranch (CCNode* node) {
100+ if (m_searchQuery.empty ()) return true ;
101+
102+ std::string name = getNodeName (node);
103+ std::string id = node->getID ();
104+ std::string query = m_searchQuery;
105+
106+ std::ranges::transform (name, name.begin (), ::tolower);
107+ std::ranges::transform (id.begin (), id.end (), id.begin (), ::tolower);
108+ std::ranges::transform (query.begin (), query.end (), query.begin (), ::tolower);
109+
110+ if (name.find (query) != std::string::npos || id.find (query) != std::string::npos) {
111+ return true ;
112+ }
113+ for (auto child : node->getChildrenExt <CCNode>()) {
114+ if (searchBranch (child)) {
115+ return true ;
116+ }
117+ }
118+ return false ;
119+ }
0 commit comments