Skip to content

Commit 575f2ee

Browse files
committed
Merge branch 'drag-button' of https://github.com/Kingminer7/DevTools into drag-button
2 parents 8355e0e + d724b1a commit 575f2ee

File tree

8 files changed

+269
-14
lines changed

8 files changed

+269
-14
lines changed

mod.json

+5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
"url": "https://github.com/geode-sdk/DevTools/issues",
1818
"info": "If you encounter an issue using DevTools, please report it to the GitHub issues page."
1919
},
20+
"resources": {
21+
"sprites": [
22+
"resources/*.png"
23+
]
24+
},
2025
"settings": {
2126
"should-use-gd-window": {
2227
"type": "bool",

resources/devtools.png

6.2 KB
Loading

src/DevTools.cpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ struct matjson::Serialize<Settings> {
2626
.showMemoryViewer = value["show_memory_viewer"].asBool().unwrapOr(std::move(defaults.showMemoryViewer)),
2727
.showModGraph = value["show_mod_graph"].asBool().unwrapOr(std::move(defaults.showModGraph)),
2828
.theme = value["theme"].asString().unwrapOr(std::move(defaults.theme)),
29-
.themeColor = value["theme_color"].as<ccColor4B>().isOk() ? value["theme_color"].as<ccColor4B>().unwrap() : std::move(defaults.themeColor)
29+
.themeColor = value["theme_color"].as<ccColor4B>().isOk() ? value["theme_color"].as<ccColor4B>().unwrap() : std::move(defaults.themeColor),
30+
.buttonScale = value["button_scale"].as<float>().unwrapOr(std::move(defaults.buttonScale)),
31+
.buttonOpacity = value["button_opacity"].as<int>().unwrapOr(std::move(defaults.buttonOpacity)),
32+
.buttonInGameplay = value["button_gameplay"].asBool().unwrapOr(std::move(defaults.buttonInGameplay)),
33+
.buttonInEditor = value["button_editor"].asBool().unwrapOr(std::move(defaults.buttonInEditor)),
3034
});
3135
}
3236

@@ -43,6 +47,10 @@ struct matjson::Serialize<Settings> {
4347
{ "show_mod_graph", settings.showModGraph },
4448
{ "theme", settings.theme },
4549
{ "theme_color", settings.themeColor },
50+
{ "button_scale", settings.buttonScale },
51+
{ "button_opacity", settings.buttonOpacity },
52+
{ "button_gameplay", settings.buttonInGameplay },
53+
{ "button_editor", settings.buttonInEditor },
4654
});
4755
}
4856
};
@@ -54,7 +62,9 @@ DevTools* DevTools::get() {
5462
return inst;
5563
}
5664

57-
void DevTools::loadSettings() { m_settings = Mod::get()->getSavedValue<Settings>("settings"); }
65+
void DevTools::loadSettings() {
66+
m_settings = Mod::get()->getSavedValue<Settings>("settings");
67+
}
5868
void DevTools::saveSettings() { Mod::get()->setSavedValue("settings", m_settings); }
5969
Settings DevTools::getSettings() { return m_settings; }
6070

src/DevTools.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ struct Settings {
2929
bool showModGraph = false;
3030
std::string theme = DARK_THEME;
3131
ccColor4B themeColor = {2, 119, 189, 255};
32+
33+
float buttonScale = 1.f;
34+
int buttonOpacity = 255;
35+
bool buttonInGameplay = false;
36+
bool buttonInEditor = false;
3237
};
3338

3439
class DevTools {

src/main.cpp

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
#include "platform/platform.hpp"
32
#include <Geode/modify/CCKeyboardDispatcher.hpp>
43
#include <Geode/modify/AchievementNotifier.hpp>
@@ -30,17 +29,6 @@ class $modify(CCKeyboardDispatcher) {
3029
}
3130
};
3231

33-
#ifdef GEODE_IS_MOBILE
34-
// lol
35-
#include <Geode/modify/MenuLayer.hpp>
36-
class $modify(MenuLayer) {
37-
void onMoreGames(CCObject*) {
38-
DevTools::get()->toggle();
39-
}
40-
};
41-
42-
#endif
43-
4432
class $modify(CCDirector) {
4533
void willSwitchToScene(CCScene* scene) {
4634
CCDirector::willSwitchToScene(scene);
@@ -112,3 +100,16 @@ class $modify(CCEGLView) {
112100
CCEGLView::swapBuffers();
113101
}
114102
};
103+
104+
105+
// For the one eclipse shortcut
106+
struct ToggleDevToolsEvent : geode::Event {
107+
ToggleDevToolsEvent() {}
108+
};
109+
110+
$on_mod(Loaded) {
111+
new EventListener<EventFilter<ToggleDevToolsEvent>>(+[](ToggleDevToolsEvent* e) {
112+
DevTools::get()->toggle();
113+
return ListenerResult::Stop;
114+
});
115+
}

src/nodes/DragButton.cpp

+177
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
#include "../DevTools.hpp"
2+
#include "DragButton.hpp"
3+
4+
DragButton *DragButton::m_instance = nullptr;
5+
6+
bool DragButton::init() {
7+
if (!CCMenu::init())
8+
return false;
9+
m_sprite = CircleButtonSprite::createWithSprite("devtools.png"_spr, 1,
10+
CircleBaseColor::Green, CircleBaseSize::MediumAlt);
11+
m_sprite->setScale(.8f);
12+
m_sprite->setID("sprite");
13+
addChild(m_sprite);
14+
setContentSize(m_sprite->getScaledContentSize());
15+
m_sprite->setPosition(getContentSize() / 2);
16+
17+
CCScene::get()->addChild(this);
18+
SceneManager::get()->keepAcrossScenes(this);
19+
scheduleUpdate();
20+
21+
setZOrder(70000);
22+
23+
auto x = Mod::get()->getSavedValue<float>("button-x", 50.f);
24+
auto y = Mod::get()->getSavedValue<float>("button-y", 50.f);
25+
x = std::clamp(x, -getContentWidth() / 2, CCDirector::get()->getWinSize().width - getContentWidth() / 2);
26+
y = std::clamp(y, -getContentHeight() / 2, CCDirector::get()->getWinSize().height - getContentHeight() / 2);
27+
setPosition({x, y});
28+
29+
Mod::get()->setSavedValue<float>("button-x", x);
30+
Mod::get()->setSavedValue<float>("button-y", y);
31+
auto settings = DevTools::get()->getSettings();
32+
setOpacity(settings.buttonOpacity);
33+
setScale(settings.buttonScale);
34+
35+
setID("drag-button"_spr);
36+
37+
return true;
38+
};
39+
40+
DragButton *DragButton::get() {
41+
if (m_instance)
42+
return m_instance;
43+
m_instance = new DragButton();
44+
if (m_instance && m_instance->init()) {
45+
m_instance->autorelease();
46+
return m_instance;
47+
} else {
48+
delete m_instance;
49+
return nullptr;
50+
}
51+
}
52+
53+
void DragButton::registerWithTouchDispatcher() {
54+
CCTouchDispatcher::get()->addTargetedDelegate(this, -512, true);
55+
}
56+
57+
bool DragButton::ccTouchBegan(CCTouch *touch, CCEvent *evt) {
58+
if (!m_handleTouch || !m_bVisible)
59+
return false;
60+
if (getScaledContentSize().width / 2 <
61+
ccpDistance(m_sprite->getPosition(), convertToNodeSpace(touch->getLocation()))) {
62+
return false;
63+
}
64+
65+
m_diff = getPosition() - touch->getLocation();
66+
m_startPos = new CCPoint(touch->getLocation());
67+
68+
m_moving = false;
69+
70+
m_sprite->stopAllActions();
71+
72+
// For some reason I could not get a recreation of CCEaseSineOut working on ios.
73+
#ifdef GEODE_IS_IOS
74+
m_sprite->runAction(CCEaseOut::create(CCScaleTo::create(0.3f, .8 * m_scale * m_multiplier), 1.6f));
75+
#else
76+
m_sprite->runAction(CCEaseSineOut::create(CCScaleTo::create(0.3f, .8 * m_scale * m_multiplier)));
77+
#endif
78+
return true;
79+
}
80+
81+
void DragButton::ccTouchCancelled(CCTouch *touch, CCEvent *event) {
82+
ccTouchEnded(touch, event);
83+
}
84+
85+
void DragButton::ccTouchEnded(CCTouch *touch, CCEvent *evt) {
86+
m_sprite->stopAllActions();
87+
88+
// For some reason I could not get a recreation of CCEaseSineOut working on ios.
89+
#ifdef GEODE_IS_IOS
90+
m_sprite->runAction(CCEaseOut::create(CCScaleTo::create(0.3f, .8 * m_scale), 1.6f));
91+
#else
92+
m_sprite->runAction(CCEaseSineOut::create(CCScaleTo::create(0.3f, .8 * m_scale)));
93+
#endif
94+
if (m_moving) {
95+
Mod::get()->setSavedValue<float>("button-x", getPositionX());
96+
Mod::get()->setSavedValue<float>("button-y", getPositionY());
97+
return;
98+
}
99+
activate();
100+
}
101+
102+
void DragButton::ccTouchMoved(CCTouch *touch, CCEvent *evt) {
103+
if (!m_moving)
104+
if (ccpDistance(*m_startPos, touch->getLocation()) > 3)
105+
m_moving = true;
106+
if (m_moving) {
107+
auto pos = touch->getLocation() + m_diff;
108+
pos.x = std::clamp(pos.x, -getContentWidth() / 2, CCDirector::get()->getWinSize().width - getContentWidth() / 2);
109+
pos.y = std::clamp(pos.y, -getContentHeight() / 2, CCDirector::get()->getWinSize().height - getContentHeight() / 2);
110+
setPosition(pos);
111+
}
112+
}
113+
114+
void DragButton::update(float delta) {
115+
static auto devtools = DevTools::get();
116+
bool shouldRender = true;
117+
if (auto pl = PlayLayer::get(); pl && !pl->m_isPaused) {
118+
shouldRender = devtools->getSettings().buttonInGameplay;
119+
} else if(auto el = LevelEditorLayer::get()) {
120+
if (devtools->getSettings().buttonInEditor) {
121+
shouldRender = el->m_playbackMode != PlaybackMode::Playing || devtools->getSettings().buttonInGameplay;
122+
} else {
123+
shouldRender = false;
124+
}
125+
}
126+
setVisible(shouldRender && m_render);
127+
}
128+
129+
bool DragButton::isRendered() {
130+
return m_render;
131+
}
132+
133+
void DragButton::setRendered(bool render) {
134+
m_render = render;
135+
}
136+
137+
bool DragButton::isHandlingTouch() {
138+
return m_render && m_handleTouch;
139+
}
140+
141+
void DragButton::setHandlingTouch(bool handle) { m_handleTouch = handle; }
142+
143+
void DragButton::activate() {
144+
DevTools::get()->toggle();
145+
}
146+
147+
// Only make it show if on mobile
148+
#ifdef GEODE_IS_MOBILE
149+
#include <Geode/modify/CCScene.hpp>
150+
151+
class $modify(CCScene) {
152+
int getHighestChildZ() {
153+
int btnZ;
154+
auto btn = DragButton::get();
155+
if (btn) {
156+
btnZ = btn->getZOrder();
157+
btn->setZOrder(-1);
158+
}
159+
auto highest = CCScene::getHighestChildZ();
160+
if (btn) {
161+
btn->setZOrder(btnZ);
162+
}
163+
return highest;
164+
}
165+
};
166+
167+
#include <Geode/modify/MenuLayer.hpp>
168+
169+
class $modify(MenuLayer) {
170+
bool init() {
171+
if (!MenuLayer::init()) return false;
172+
173+
DragButton::get();
174+
return true;
175+
}
176+
};
177+
#endif

src/nodes/DragButton.hpp

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#pragma once
2+
3+
#include <Geode/Geode.hpp>
4+
5+
using namespace geode::prelude;
6+
7+
class DragButton : public cocos2d::CCMenu {
8+
protected:
9+
static DragButton *m_instance;
10+
11+
bool m_handleTouch = true;
12+
bool m_render = true;
13+
bool m_moving = false;
14+
15+
cocos2d::CCPoint *m_startPos;
16+
cocos2d::CCPoint m_diff;
17+
cocos2d::CCSprite *m_sprite;
18+
19+
float m_scale = 1.0f;
20+
float m_multiplier = 0.8f;
21+
22+
bool init() override;
23+
void update(float delta) override;
24+
bool ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) override;
25+
void ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) override;
26+
void ccTouchMoved(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) override;
27+
void ccTouchCancelled(cocos2d::CCTouch *touch, cocos2d::CCEvent *event) override;
28+
void registerWithTouchDispatcher() override;
29+
public:
30+
static DragButton *get();
31+
void activate();
32+
bool isRendered();
33+
void setRendered(bool render);
34+
bool isHandlingTouch();
35+
void setHandlingTouch(bool handle);
36+
};

src/pages/Settings.cpp

+21
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <fmod.hpp>
88
#include <numeric>
99
#include <Geode/binding/GameManager.hpp>
10+
#include "../nodes/DragButton.hpp"
1011

1112
using namespace geode::prelude;
1213

@@ -230,6 +231,26 @@ void DevTools::drawSettings() {
230231
if (ImGui::Button("Reset Layout")) {
231232
m_shouldRelayout = true;
232233
}
234+
235+
#ifdef GEODE_IS_MOBILE
236+
auto button = DragButton::get();
237+
238+
ImGui::Separator();
239+
240+
ImGui::Text("Draggable Button");
241+
242+
if (ImGui::DragFloat("Scale", &m_settings.buttonScale, 0.05f, 0.5f, 1.f)) {
243+
button->setScale(m_settings.buttonScale);
244+
}
245+
246+
if (ImGui::DragInt("Opacity", &m_settings.buttonOpacity, 1, 0, 255)) {
247+
button->setOpacity(m_settings.buttonOpacity);
248+
}
249+
250+
ImGui::Checkbox("Visible in Game", &m_settings.buttonInGameplay);
251+
ImGui::Checkbox("Visible in Editor", &m_settings.buttonInEditor);
252+
253+
#endif
233254
}
234255

235256
// TODO: this hook also isnt gd *

0 commit comments

Comments
 (0)