diff --git a/mod.json b/mod.json index 27b6ef6..1dbf406 100644 --- a/mod.json +++ b/mod.json @@ -1,5 +1,5 @@ { - "geode": "5.0.1", + "geode": "5.3.0", "version": "v1.13.1", "gd": { "win": "2.2081", diff --git a/src/API.cpp b/src/API.cpp index fe23616..940c0ec 100644 --- a/src/API.cpp +++ b/src/API.cpp @@ -18,6 +18,7 @@ static void handleType() { sizeof(T) == 4 ? (isSigned ? ImGuiDataType_S32 : ImGuiDataType_U32) : isSigned ? ImGuiDataType_S64 : ImGuiDataType_U64; fnPtr = +[](ZStringView name, T& prop) { + DevTools::get()->setUsedAPI(true); return ImGui::DragScalar(name.c_str(), dataType, &prop); }; return ListenerResult::Stop; @@ -25,6 +26,7 @@ static void handleType() { devtools::EnumerableFnEvent().listen([](typename devtools::EnumerableFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView label, T* value, std::span const> items) { + DevTools::get()->setUsedAPI(true); ImGui::Text("%s:", label.c_str()); size_t i = 0; bool changed = false; @@ -112,6 +114,7 @@ bool devtools::button(ZStringView label) { // checkbox devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, bool& prop) { + DevTools::get()->setUsedAPI(true); return ImGui::Checkbox(name.c_str(), &prop); }; return ListenerResult::Stop; @@ -120,6 +123,7 @@ bool devtools::button(ZStringView label) { // string devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, std::string& prop) { + DevTools::get()->setUsedAPI(true); return ImGui::InputText(name.c_str(), &prop); }; return ListenerResult::Stop; @@ -128,6 +132,7 @@ bool devtools::button(ZStringView label) { // colors devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, ccColor3B& prop) { + DevTools::get()->setUsedAPI(true); auto color = ImVec4( prop.r / 255.f, prop.g / 255.f, @@ -140,12 +145,14 @@ bool devtools::button(ZStringView label) { prop.b = static_cast(color.z * 255); return true; } + return false; }; return ListenerResult::Stop; }).leak(); devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, ccColor4B& prop) { + DevTools::get()->setUsedAPI(true); auto color = ImVec4( prop.r / 255.f, prop.g / 255.f, @@ -165,6 +172,7 @@ bool devtools::button(ZStringView label) { }).leak(); devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, ccColor4F& prop) { + DevTools::get()->setUsedAPI(true); return ImGui::ColorEdit4(name.c_str(), reinterpret_cast(&prop)); }; return ListenerResult::Stop; @@ -173,6 +181,7 @@ bool devtools::button(ZStringView label) { // points/sizes devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, CCPoint& prop) { + DevTools::get()->setUsedAPI(true); return ImGui::DragFloat2(name.c_str(), reinterpret_cast(&prop)); }; return ListenerResult::Stop; @@ -180,12 +189,14 @@ bool devtools::button(ZStringView label) { devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, CCSize& prop) { + DevTools::get()->setUsedAPI(true); return ImGui::DragFloat2(name.c_str(), reinterpret_cast(&prop)); }; return ListenerResult::Stop; }).leak(); devtools::PropertyFnEvent().listen([](devtools::PropertyFnEvent::Fn*& fnPtr) { fnPtr = +[](ZStringView name, CCRect& prop) { + DevTools::get()->setUsedAPI(true); return ImGui::DragFloat4(name.c_str(), reinterpret_cast(&prop)); }; return ListenerResult::Stop; diff --git a/src/DevTools.cpp b/src/DevTools.cpp index ffe7243..3406011 100644 --- a/src/DevTools.cpp +++ b/src/DevTools.cpp @@ -374,3 +374,11 @@ bool DevTools::shouldUseGDWindow() const { return Mod::get()->getSettingValue("should-use-gd-window"); } + +bool DevTools::usedAPI() { + return m_usedAPI; +} + +void DevTools::setUsedAPI(bool used) { + m_usedAPI = used; +} \ No newline at end of file diff --git a/src/DevTools.hpp b/src/DevTools.hpp index 3838f37..c076f30 100644 --- a/src/DevTools.hpp +++ b/src/DevTools.hpp @@ -46,6 +46,7 @@ class DevTools { bool m_shouldRelayout = false; bool m_showModGraph = false; bool m_pauseGame = false; + bool m_usedAPI = false; Settings m_settings; ImGuiID m_dockspaceID; ImFont* m_defaultFont = nullptr; @@ -140,4 +141,7 @@ class DevTools { void toggle(); bool isVisible(); + + bool usedAPI(); + void setUsedAPI(bool used); }; diff --git a/src/pages/Attributes.cpp b/src/pages/Attributes.cpp index fa49020..de6bbe2 100644 --- a/src/pages/Attributes.cpp +++ b/src/pages/Attributes.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include using namespace geode::prelude; @@ -49,15 +51,19 @@ void DevTools::drawNodeAttributes(CCNode* node) { drawTextureAttributes(node); drawMenuItemAttributes(node); + setUsedAPI(false); for (auto& callback : m_customCallbacks) { ImGui::PushID(&callback); callback(node); ImGui::PopID(); } - ImGui::NewLine(); - ImGui::Separator(); - ImGui::NewLine(); + // fixes that extra separator for nodes that the API isn't used on + if (usedAPI()) { + ImGui::NewLine(); + ImGui::Separator(); + ImGui::NewLine(); + } drawLayoutOptionsAttributes(node); @@ -280,6 +286,9 @@ void DevTools::drawAxisGapAttribute(CCNode* node) { } void DevTools::drawTextureAttributes(CCNode* node) { + if (auto nineSlice = typeinfo_cast(node)) { + node = nineSlice->getBatchNode(); + } if (auto textureProtocol = typeinfo_cast(node)) { if (auto texture = textureProtocol->getTexture()) { if (auto spriteNode = typeinfo_cast(node)) { @@ -309,8 +318,8 @@ void DevTools::drawTextureAttributes(CCNode* node) { if (ImGui::Checkbox("Rotate Rect", &isRectRotated)) { spriteNode->setTextureRect(spriteNode->getTextureRect(), isRectRotated, spriteNode->getContentSize()); } + ImGui::NewLine(); } - ImGui::NewLine(); auto* cachedTextures = CCTextureCache::sharedTextureCache()->m_pTextures; for (auto [key, obj] : CCDictionaryExt(cachedTextures)) { if (obj == texture) { @@ -373,6 +382,48 @@ void DevTools::drawMenuItemAttributes(CCNode* node) { } } + ImGui::NewLine(); + ImGui::Separator(); + ImGui::NewLine(); + } + if (auto button = typeinfo_cast(node)) { + + if (ImGui::Button(U8STR(FEATHER_LINK " Activate##activatebutton"))) { + button->selected(); + button->activate(); + } + checkbox("Enabled##enabledbutton", button, &geode::Button::isEnabled, &geode::Button::setEnabled); + + float touchMult = button->getTouchMultiplier(); + if (ImGui::DragFloat("Touch Size Multiplier##buttonsizemult", &touchMult, .1f)) { + button->setTouchMultiplier(touchMult); + } + + float scaleMult = button->getScaleMultiplier(); + if (ImGui::DragFloat("Scale Multiplier (AnimationType::Scale)##buttonscalemult", &scaleMult, .1f)) { + button->setScaleMultiplier(scaleMult); + } + + float selectedDuration = button->getSelectedDuration(); + if (ImGui::DragFloat("Selected Duration##buttonselectedduration", &selectedDuration, .1f)) { + button->setSelectedDuration(selectedDuration); + } + + float unselectedDuration = button->getUnselectedDuration(); + if (ImGui::DragFloat("Unselected Duration##buttonunselectedduration", &unselectedDuration, .1f)) { + button->setUnselectedDuration(unselectedDuration); + } + + auto moveOffset = button->getMoveOffset(); + + float moveOffsetArr[2] = { + moveOffset.x, + moveOffset.y + }; + if (ImGui::DragFloat2("Move Offset (AnimationType::Move)##buttonmoveoffset", moveOffsetArr)) { + button->setMoveOffset({moveOffsetArr[0], moveOffsetArr[1]}); + } + ImGui::NewLine(); ImGui::Separator(); ImGui::NewLine();