diff --git a/src/DevTools.cpp b/src/DevTools.cpp index fd35834..3ae7eea 100644 --- a/src/DevTools.cpp +++ b/src/DevTools.cpp @@ -36,6 +36,7 @@ struct matjson::Serialize { assign(value["button_game"], s.buttonInGame); assign(value["button_enabled"], s.buttonEnabled); assign(value["tree_drag_reorder"], s.treeDragReorder); + assign(value["show_touch_prio"], s.showTouchPrio); return Ok(s); } @@ -58,7 +59,8 @@ struct matjson::Serialize { { "button_editor", settings.buttonInEditor }, { "button_game", settings.buttonInGame }, { "button_enabled", settings.buttonEnabled }, - { "tree_drag_reorder", settings.treeDragReorder } + { "tree_drag_reorder", settings.treeDragReorder }, + { "show_touch_prio", settings.showTouchPrio }, }); } }; @@ -254,6 +256,13 @@ void DevTools::drawPages() { &DevTools::drawMemory ); } + + if (m_settings.showTouchPrio) { + this->drawPage( + U8STR(FEATHER_TABLET " Touch Priority Viewer###devtools/touchprio"), + &DevTools::drawPrioTree + ); + } } void DevTools::draw(GLRenderCtx* ctx) { diff --git a/src/DevTools.hpp b/src/DevTools.hpp index 3838f37..14311fe 100644 --- a/src/DevTools.hpp +++ b/src/DevTools.hpp @@ -36,6 +36,7 @@ struct Settings { bool buttonInGame = false; bool buttonEnabled = false; bool treeDragReorder = false; + bool showTouchPrio = false; }; class DevTools { @@ -66,6 +67,8 @@ class DevTools { void setupPlatform(); void drawTree(); + void drawPrioTree(); + void drawPrioHandler(CCTouchHandler* handler); void drawTreeBranch(CCNode* node, size_t index, bool drag, bool visible); void drawSettings(); void drawAdvancedSettings(); diff --git a/src/pages/PrioTree.cpp b/src/pages/PrioTree.cpp new file mode 100644 index 0000000..cc63367 --- /dev/null +++ b/src/pages/PrioTree.cpp @@ -0,0 +1,63 @@ +#include +#include "../DevTools.hpp" +#include +#include + +using namespace geode::prelude; + +std::string formatNodeName(CCNode* node, int prio) { + std::string name = fmt::format("[{}] {} ", prio, geode::cocos::getObjectName(node)); + if (node->getTag() != -1) { + name += fmt::format("({}) ", node->getTag()); + } + if (node->getID().size()) { + name += fmt::format("\"{}\" ", node->getID()); + } + return name; +} + +void DevTools::drawPrioHandler(CCTouchHandler* handler) { + auto node = typeinfo_cast(handler->getDelegate()); + if (node) { + bool selected = DevTools::get()->getSelectedNode() == node; + + ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf; + if (selected) { + flags |= ImGuiTreeNodeFlags_Selected; + } + + const auto name = formatNodeName(node, handler->getPriority()); + bool expanded = ImGui::TreeNodeEx(node, flags, "%s", name.c_str()); + + if (ImGui::IsItemClicked()) { + DevTools::get()->selectNode(node); + selected = true; + + CCNode* parent = node->getParent(); + while (parent) { + m_nodeOpen[parent] = true; + parent = parent->getParent(); + } + } + if (expanded) { + ImGui::TreePop(); + } + } +} + +void DevTools::drawPrioTree() { +#ifdef GEODE_IS_MOBILE + ImGui::Dummy({0.f, 60.f}); +#endif + ImGui::Text("Standard Handlers"); + + for (auto d : CCTouchDispatcher::get()->m_pStandardHandlers->asExt()) { + drawPrioHandler(d); + } + + ImGui::Text("Targeted Handlers"); + + for (auto d : CCTouchDispatcher::get()->m_pTargetedHandlers->asExt()) { + drawPrioHandler(d); + } +} \ No newline at end of file diff --git a/src/pages/Settings.cpp b/src/pages/Settings.cpp index 57f4b4e..aba8ea9 100644 --- a/src/pages/Settings.cpp +++ b/src/pages/Settings.cpp @@ -82,6 +82,12 @@ void DevTools::drawSettings() { "Shows the mod graph window." ); } + ImGui::Checkbox("Show Touch Priority Viewer", &m_settings.showTouchPrio); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "Shows the touch priority viewer window." + ); + } ImGui::PopStyleVar(); ImGui::Separator();