From 93320d3ef99a5c7ad03c08823a69f9955aa7380f Mon Sep 17 00:00:00 2001 From: kam <100500023+Kingminer7@users.noreply.github.com> Date: Sun, 16 Nov 2025 15:01:32 -0500 Subject: [PATCH 1/3] make button no longer a singleton, fix button appearing on save regardless of platform, allow showing button on pc --- src/DevTools.cpp | 33 ++++++++++++++++++++++++++++----- src/DevTools.hpp | 9 +++++++++ src/main.cpp | 9 +++------ src/nodes/DragButton.cpp | 25 +++++-------------------- src/nodes/DragButton.hpp | 2 -- src/pages/Settings.cpp | 29 +++++++++++++++++++++-------- 6 files changed, 66 insertions(+), 41 deletions(-) diff --git a/src/DevTools.cpp b/src/DevTools.cpp index 8d752c9..c332c83 100644 --- a/src/DevTools.cpp +++ b/src/DevTools.cpp @@ -9,7 +9,6 @@ #include #include #include "ImGui.hpp" -#include "nodes/DragButton.hpp" template<> struct matjson::Serialize { @@ -35,6 +34,7 @@ struct matjson::Serialize { assign(value["button_y"], s.buttonPos.y); assign(value["button_editor"], s.buttonInEditor); assign(value["button_game"], s.buttonInGame); + GEODE_DESKTOP(assign(value["button_enabled"], s.buttonEnabled);) assign(value["tree_drag_reorder"], s.treeDragReorder); return Ok(s); @@ -57,6 +57,7 @@ struct matjson::Serialize { { "button_y", settings.buttonPos.y }, { "button_editor", settings.buttonInEditor }, { "button_game", settings.buttonInGame }, + GEODE_DESKTOP({ "button_enabled", settings.buttonEnabled },) { "tree_drag_reorder", settings.treeDragReorder } }); } @@ -70,11 +71,9 @@ DevTools* DevTools::get() { } void DevTools::loadSettings() { m_settings = Mod::get()->getSavedValue("settings"); } -void DevTools::saveSettings() { - m_settings.buttonPos = DragButton::get()->getPosition(); - Mod::get()->setSavedValue("settings", m_settings); -} +void DevTools::saveSettings() { Mod::get()->setSavedValue("settings", m_settings); } Settings DevTools::getSettings() { return m_settings; } +void DevTools::setBallPosition(CCPoint pos) { m_settings.buttonPos = std::move(pos); } bool DevTools::shouldPopGame() const { return m_visible && m_settings.GDInWindow; @@ -116,6 +115,30 @@ void DevTools::addCustomCallback(std::function callback) { m_customCallbacks.push_back(std::move(callback)); } +DragButton* DevTools::getDragButton() { + return m_dragButton; +} + +void DevTools::setupDragButton() { + auto spr = CircleButtonSprite::createWithSprite("devtools.png"_spr, 1, CircleBaseColor::Green, CircleBaseSize::MediumAlt); + spr->setScale(.8f); + m_dragButton = DragButton::create(spr, [this](){ + this->toggle(); + }); + m_dragButton->setPosition(m_settings.buttonPos); + m_dragButton->setZOrder(10000); + m_dragButton->setID("devtools-button"_spr); + SceneManager::get()->keepAcrossScenes(m_dragButton); +} + +void DevTools::removeDragButton() { + if (m_dragButton) { + SceneManager::get()->forget(m_dragButton); + m_dragButton->removeFromParent(); + m_dragButton = nullptr; + } +} + // Scroll when dragging empty space void mobileScrollBehavior() { auto* ctx = ImGui::GetCurrentContext(); diff --git a/src/DevTools.hpp b/src/DevTools.hpp index f6a808a..b006c00 100644 --- a/src/DevTools.hpp +++ b/src/DevTools.hpp @@ -9,6 +9,8 @@ #include #include +#include "nodes/DragButton.hpp" + using namespace geode::prelude; enum class HighlightMode { @@ -32,6 +34,7 @@ struct Settings { CCPoint buttonPos = {50, 50}; bool buttonInEditor = false; bool buttonInGame = false; + GEODE_DESKTOP(bool buttonEnabled = false;) bool treeDragReorder = false; }; @@ -57,6 +60,7 @@ class DevTools { std::string m_searchQuery; std::string m_prevQuery; std::unordered_map m_nodeOpen; + DragButton* m_dragButton = nullptr; void setupFonts(); void setupPlatform(); @@ -103,6 +107,7 @@ class DevTools { void loadSettings(); void saveSettings(); Settings getSettings(); + void setBallPosition(CCPoint pos); bool shouldUseGDWindow() const; bool shouldPopGame() const; @@ -118,6 +123,10 @@ class DevTools { void addCustomCallback(std::function callback); + DragButton* getDragButton(); + void setupDragButton(); + void removeDragButton(); + void sceneChanged(); void render(GLRenderCtx* ctx); diff --git a/src/main.cpp b/src/main.cpp index 99c24ed..8de0eab 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,19 +33,18 @@ class $modify(CCKeyboardDispatcher) { } }; -#ifdef GEODE_IS_MOBILE - #include $execute { new EventListener(+[](GameEvent*) { - DragButton::get(); + GEODE_DESKTOP(if (DevTools::get()->getSettings().buttonEnabled)) DevTools::get()->setupDragButton(); }, GameEventFilter(GameEventType::Loaded)); } #include class $modify(CCScene) { int getHighestChildZ() { - auto btn = DragButton::get(); + auto btn = DevTools::get()->getDragButton(); + if (!btn) return CCScene::getHighestChildZ(); int z = btn->getZOrder(); btn->setZOrder(-1); int ret = CCScene::getHighestChildZ(); @@ -54,8 +53,6 @@ class $modify(CCScene) { } }; -#endif - class $modify(GameToolbox) { static void preVisitWithClippingRect(CCNode* node, CCRect clipRect) { if (!node->isVisible() || !DevTools::get()->isVisible()) diff --git a/src/nodes/DragButton.cpp b/src/nodes/DragButton.cpp index 19e7369..716d99e 100644 --- a/src/nodes/DragButton.cpp +++ b/src/nodes/DragButton.cpp @@ -2,6 +2,7 @@ #include "../DevTools.hpp" #include +#include using namespace geode::prelude; @@ -15,7 +16,7 @@ bool DragButton::init(CCNode* node, std::function onPress) { this->setContentSize(node->getScaledContentSize()); this->addChildAtPosition(node, Anchor::Center, CCPoint{0, 0}); } - this->m_onPress = onPress; + this->m_onPress = std::move(onPress); return true; } @@ -59,7 +60,7 @@ void DragButton::registerWithTouchDispatcher() { DragButton* DragButton::create(CCNode* node, std::function onPress) { auto ret = new DragButton; - if (ret->init(node, onPress)) { + if (ret->init(node, std::move(onPress))) { ret->autorelease(); return ret; } @@ -84,22 +85,6 @@ void DragButton::setPosition(cocos2d::CCPoint const& pos_) { auto pos = pos_; pos.x = std::clamp(pos.x, pad, winSize.width - pad); pos.y = std::clamp(pos.y, pad, winSize.height - pad); + DevTools::get()->setBallPosition(pos); CCNode::setPosition(pos); -} - -DragButton* DragButton::get() { - static DragButton* instance = nullptr; - if (!instance) { - auto spr = CircleButtonSprite::createWithSprite("devtools.png"_spr, 1, CircleBaseColor::Green, CircleBaseSize::MediumAlt); - spr->setScale(.8f); - instance = DragButton::create(spr, [](){ - DevTools::get()->toggle(); - }); - instance->setPosition(DevTools::get()->getSettings().buttonPos); - instance->setZOrder(10000); - instance->setID("devtools-button"_spr); - CCScene::get()->addChild(instance); - SceneManager::get()->keepAcrossScenes(instance); - } - return instance; -} +} \ No newline at end of file diff --git a/src/nodes/DragButton.hpp b/src/nodes/DragButton.hpp index e4b70c0..9325b51 100644 --- a/src/nodes/DragButton.hpp +++ b/src/nodes/DragButton.hpp @@ -2,7 +2,6 @@ #include "Geode/cocos/base_nodes/CCNode.h" #include "Geode/cocos/layers_scenes_transitions_nodes/CCLayer.h" -#include "Geode/cocos/touch_dispatcher/CCTouchDelegateProtocol.h" class DragButton : public cocos2d::CCLayer { protected: @@ -20,7 +19,6 @@ class DragButton : public cocos2d::CCLayer { void update(float dt) override; public: static DragButton* create(cocos2d::CCNode* node, std::function onPress); - static DragButton* get(); void setPosition(cocos2d::CCPoint const& position) override; }; diff --git a/src/pages/Settings.cpp b/src/pages/Settings.cpp index eb5d95f..7519787 100644 --- a/src/pages/Settings.cpp +++ b/src/pages/Settings.cpp @@ -161,19 +161,32 @@ void DevTools::drawSettings() { static_cast(frameSize.width / ratio), static_cast(frameSize.height / ratio) ); -#else - ImGui::Checkbox("Button In Editor", &m_settings.buttonInEditor); - if (ImGui::IsItemHovered()) { - ImGui::SetTooltip( - "Shows the mobile button in the editor." - ); + if (ImGui::Checkbox("Button Enabled", &m_settings.buttonEnabled)) { + log::info("Test"); + if (m_settings.buttonEnabled) setupDragButton(); + else removeDragButton(); } - ImGui::Checkbox("Button In Game", &m_settings.buttonInGame); if (ImGui::IsItemHovered()) { ImGui::SetTooltip( - "Shows the mobile button in levels." + "Shows the mobile button." ); } + if (m_settings.buttonEnabled) { +#endif + ImGui::Checkbox("Button In Editor", &m_settings.buttonInEditor); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "Shows the mobile button in the editor." + ); + } + ImGui::Checkbox("Button In Game", &m_settings.buttonInGame); + if (ImGui::IsItemHovered()) { + ImGui::SetTooltip( + "Shows the mobile button in levels." + ); + } +#ifdef GEODE_IS_DESKTOP + } #endif #if 0 From 3bd831aea8e388a9bd1a9600bc3d779831a31528 Mon Sep 17 00:00:00 2001 From: km7dev <100500023+Kingminer7@users.noreply.github.com> Date: Sun, 16 Nov 2025 15:26:14 -0500 Subject: [PATCH 2/3] oops --- src/pages/Settings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pages/Settings.cpp b/src/pages/Settings.cpp index 7519787..fb10003 100644 --- a/src/pages/Settings.cpp +++ b/src/pages/Settings.cpp @@ -162,7 +162,6 @@ void DevTools::drawSettings() { static_cast(frameSize.height / ratio) ); if (ImGui::Checkbox("Button Enabled", &m_settings.buttonEnabled)) { - log::info("Test"); if (m_settings.buttonEnabled) setupDragButton(); else removeDragButton(); } @@ -274,3 +273,4 @@ void DevTools::drawSettings() { } } };*/ + From 61644ac51485f13dbfc0820d76d3fb45c2e2f614 Mon Sep 17 00:00:00 2001 From: kam <100500023+Kingminer7@users.noreply.github.com> Date: Sun, 16 Nov 2025 16:50:30 -0500 Subject: [PATCH 3/3] add DevTools::isButtonEnabled instead of using GEODE_DESKTOP everywhere --- src/DevTools.cpp | 12 ++++++++++-- src/DevTools.hpp | 3 ++- src/main.cpp | 2 +- src/pages/Settings.cpp | 4 +--- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/DevTools.cpp b/src/DevTools.cpp index c332c83..9694496 100644 --- a/src/DevTools.cpp +++ b/src/DevTools.cpp @@ -34,7 +34,7 @@ struct matjson::Serialize { assign(value["button_y"], s.buttonPos.y); assign(value["button_editor"], s.buttonInEditor); assign(value["button_game"], s.buttonInGame); - GEODE_DESKTOP(assign(value["button_enabled"], s.buttonEnabled);) + assign(value["button_enabled"], s.buttonEnabled); assign(value["tree_drag_reorder"], s.treeDragReorder); return Ok(s); @@ -57,7 +57,7 @@ struct matjson::Serialize { { "button_y", settings.buttonPos.y }, { "button_editor", settings.buttonInEditor }, { "button_game", settings.buttonInGame }, - GEODE_DESKTOP({ "button_enabled", settings.buttonEnabled },) + { "button_enabled", settings.buttonEnabled }, { "tree_drag_reorder", settings.treeDragReorder } }); } @@ -139,6 +139,14 @@ void DevTools::removeDragButton() { } } +bool DevTools::isButtonEnabled() { +#ifdef GEODE_IS_MOBILE + return true; +#else + return m_settings.buttonEnabled; +#endif +} + // Scroll when dragging empty space void mobileScrollBehavior() { auto* ctx = ImGui::GetCurrentContext(); diff --git a/src/DevTools.hpp b/src/DevTools.hpp index b006c00..0a223e5 100644 --- a/src/DevTools.hpp +++ b/src/DevTools.hpp @@ -34,7 +34,7 @@ struct Settings { CCPoint buttonPos = {50, 50}; bool buttonInEditor = false; bool buttonInGame = false; - GEODE_DESKTOP(bool buttonEnabled = false;) + bool buttonEnabled = false; bool treeDragReorder = false; }; @@ -126,6 +126,7 @@ class DevTools { DragButton* getDragButton(); void setupDragButton(); void removeDragButton(); + bool isButtonEnabled(); void sceneChanged(); diff --git a/src/main.cpp b/src/main.cpp index 8de0eab..edcd624 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,7 +36,7 @@ class $modify(CCKeyboardDispatcher) { #include $execute { new EventListener(+[](GameEvent*) { - GEODE_DESKTOP(if (DevTools::get()->getSettings().buttonEnabled)) DevTools::get()->setupDragButton(); + if (DevTools::get()->isButtonEnabled()) DevTools::get()->setupDragButton(); }, GameEventFilter(GameEventType::Loaded)); } diff --git a/src/pages/Settings.cpp b/src/pages/Settings.cpp index fb10003..57f4b4e 100644 --- a/src/pages/Settings.cpp +++ b/src/pages/Settings.cpp @@ -170,8 +170,8 @@ void DevTools::drawSettings() { "Shows the mobile button." ); } - if (m_settings.buttonEnabled) { #endif + if (isButtonEnabled()) { ImGui::Checkbox("Button In Editor", &m_settings.buttonInEditor); if (ImGui::IsItemHovered()) { ImGui::SetTooltip( @@ -184,9 +184,7 @@ void DevTools::drawSettings() { "Shows the mobile button in levels." ); } -#ifdef GEODE_IS_DESKTOP } -#endif #if 0 static Ref PAUSED_TARGETS = nullptr;