Skip to content

Commit d591dab

Browse files
author
kam
committed
searching (please review i dont trust myself)
1 parent 711fbca commit d591dab

2 files changed

Lines changed: 61 additions & 1 deletion

File tree

src/DevTools.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ class DevTools {
5252
Ref<CCNode> m_selectedNode;
5353
std::vector<std::pair<CCNode*, HighlightMode>> m_toHighlight;
5454
std::vector<std::function<void(CCNode*)>> m_customCallbacks;
55+
std::string m_searchQuery;
56+
std::string m_prevQuery;
57+
std::unordered_map<CCNode*, bool> m_nodeOpen;
5558

5659
void setupFonts();
5760
void setupPlatform();
@@ -87,6 +90,8 @@ class DevTools {
8790
void renderDrawData(ImDrawData*);
8891
void renderDrawDataFallback(ImDrawData*);
8992

93+
bool searchBranch(CCNode* node);
94+
9095
bool hasExtension(const std::string& ext) const;
9196

9297
DevTools() { loadSettings(); }

src/pages/Tree.cpp

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,18 @@
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

910
using namespace geode::prelude;
1011

1112
void 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

Comments
 (0)