Skip to content

Commit 795e289

Browse files
committed
Made It work with any button
1 parent 963f30e commit 795e289

File tree

4 files changed

+201
-110
lines changed

4 files changed

+201
-110
lines changed

mod.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@
1414
"resources": {
1515
"spritesheets": {
1616
"loadGIF":["resources/loadGIF/*.png"]}
17-
}
17+
},
18+
"links": {"source": "https://github.com/beproact/Hold-Button"}
1819
}

src/HoldButtonManager.hpp

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
// I dont't want to make a singleton
2+
#include <Geode/Geode.hpp>
3+
4+
using namespace geode::prelude;
5+
6+
#include <Geode/modify/CCMenuItemSpriteExtra.hpp>
7+
class $modify(MyCCMenuItemSpriteExtra, CCMenuItemSpriteExtra) {
8+
public:
9+
struct Fields {
10+
SEL_MenuHandler m_selectCallback = nullptr;
11+
SEL_MenuHandler m_originalCallback = nullptr;
12+
};
13+
14+
void selected() {
15+
if(m_fields->m_selectCallback){
16+
(m_pListener->*(m_fields->m_selectCallback))(this);
17+
}
18+
CCMenuItemSpriteExtra::selected();
19+
}
20+
21+
void activate() {
22+
//log::debug("{}",rect().size);
23+
CCMenuItemSpriteExtra::activate();
24+
}
25+
};
26+
27+
class HoldButtonManager {
28+
static HoldButtonManager* instance;
29+
30+
31+
public:
32+
static utils::Timer<std::chrono::high_resolution_clock>* m_timer;
33+
static CCAnimate* m_animate;
34+
35+
HoldButtonManager(){
36+
embodyAnimate();
37+
//m_timer = new utils::Timer();
38+
//m_timer = new utils::Timer();
39+
}
40+
~HoldButtonManager(){
41+
m_animate->release();
42+
delete(m_timer);
43+
}
44+
45+
46+
static HoldButtonManager* get() {
47+
//log::debug("FUNKNJDFSNK");
48+
if(!instance){
49+
instance = new HoldButtonManager();
50+
log::debug("this should only happen once");
51+
}
52+
return instance;
53+
}
54+
55+
void registerWithBtn(MyCCMenuItemSpriteExtra* button,CircleBaseSize size) {
56+
57+
auto gif = CCAnimatedSprite::createWithSpriteFrame(
58+
CCSpriteFrameCache::get()->spriteFrameByName("HoldLoadingA.png"_spr)
59+
);
60+
auto selectSprite = CircleButtonSprite::create(gif, CircleBaseColor::Green, size);
61+
62+
button->setSelectedImage(selectSprite);
63+
button->m_fields->m_originalCallback = button->m_pfnSelector;
64+
button->m_pfnSelector = menu_selector(HoldButtonManager::btnActivate);
65+
(button->m_fields)->m_selectCallback = menu_selector(HoldButtonManager::btnSelect);
66+
}
67+
68+
void registerBtn(std::string_view id, CCNode* menu, CircleBaseSize size){
69+
auto node = menu->getChildByIDRecursive(id);
70+
if(!node) {
71+
log::error("failed to find {}", id);
72+
return;
73+
}
74+
auto button = static_cast<MyCCMenuItemSpriteExtra*>(node); // I feel like this should break but it doesn't somehow
75+
if(!button){
76+
log::error("failed to cast {}", id);
77+
return;
78+
}
79+
log::debug("Making {} a hold button", id);
80+
registerWithBtn(button, size);
81+
}
82+
83+
void registerBtn(std::string_view id, CCNode* menu) {
84+
registerBtn(id, menu, CircleBaseSize::Medium);
85+
}
86+
87+
void btnActivate(CCObject* sender) {
88+
auto button = static_cast<MyCCMenuItemSpriteExtra*>(sender);
89+
if(m_timer && m_timer->elapsed() > 500) {
90+
((button->m_pListener)->*(button->m_fields->m_originalCallback))(sender);
91+
}
92+
}
93+
94+
void btnSelect(CCObject* sender){
95+
auto button = static_cast<CCMenuItemSpriteExtra*>(sender);
96+
//log::debug("<<<<");
97+
if(!m_timer){
98+
log::debug("timer is null");
99+
m_timer = new utils::Timer();
100+
}
101+
m_timer->reset();
102+
//log::debug(">>>>");
103+
104+
105+
CircleButtonSprite* sprite = typeinfo_cast<CircleButtonSprite*>(button->getSelectedImage());
106+
if(sprite) {
107+
auto animSprite = static_cast<CCAnimatedSprite*>(sprite->getTopNode());
108+
if (animSprite) {
109+
animSprite->stopAllActions();
110+
animSprite->runAction(m_animate);
111+
}
112+
}
113+
}
114+
115+
private:
116+
//https://www.merriam-webster.com/thesaurus/instantiate
117+
void embodyAnimate(){
118+
auto frames = CCArray::create();
119+
120+
for(int i = 'A'; i<='T'; i++) {
121+
auto frameName = fmt::format("HoldLoading{}.png"_spr, static_cast<char>(i));
122+
//log::debug("{}",frameName);
123+
124+
auto frame = CCSpriteFrameCache::get()->spriteFrameByName(frameName.c_str());
125+
if(!frame) {
126+
log::warn("Failed to get the frame {}", frameName);
127+
}
128+
frames->addObject(frame);
129+
//m_fields->m_animation->addSpriteFrame(CCSpriteFrameCache::get()->spriteFrameByName(ahhh));
130+
}
131+
auto animation = CCAnimation::createWithSpriteFrames(frames, 0.025);
132+
m_animate = CCAnimate::create(animation);
133+
m_animate->retain();
134+
}
135+
136+
137+
};
138+
HoldButtonManager* HoldButtonManager::instance = nullptr;
139+
utils::Timer<std::chrono::high_resolution_clock>* HoldButtonManager::m_timer = nullptr;
140+
CCAnimate* HoldButtonManager::m_animate = nullptr;
141+
//ok making a singleton was not hard at all

src/SelectCallback.hpp

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/main.cpp

Lines changed: 58 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -1,124 +1,79 @@
11
#include <Geode/Geode.hpp>
2-
#include "SelectCallback.hpp"
3-
2+
#include "HoldButtonManager.hpp"
43

54
using namespace geode::prelude;
65

7-
#include <Geode/modify/CCMenuItemSpriteExtra.hpp>
8-
class $modify(MyCCMenuItemSpriteExtra, CCMenuItemSpriteExtra) {
9-
public:
10-
struct Fields {
11-
SEL_MenuHandler m_selectCallback = nullptr;
12-
SEL_MenuHandler m_originalCallback = nullptr;
13-
};
14-
15-
void selected() {
16-
if(m_fields->m_selectCallback){
17-
(m_pListener->*(m_fields->m_selectCallback))(this);
18-
}
19-
CCMenuItemSpriteExtra::selected();
20-
}
21-
22-
void activate() {
23-
log::debug("{}",rect().size);
24-
CCMenuItemSpriteExtra::activate();
25-
}
6+
#include <Geode/modify/CCScene.hpp>
7+
class $modify(MyCCScene, CCScene){
8+
// bool init(){
9+
// if(!CCScene::init()) return false;
10+
// //log::debug("{}",this->getChildren()->count());
11+
// auto btnManager = HoldButtonManager::get();
12+
// btnManager->registerBtn("help-button", this);
13+
// btnManager->registerBtn("delete-button", this);
14+
// //MyEditLevelLayer::registerBtn("edit-button", ffff, CircleBaseSize::Large);
15+
// btnManager->registerBtn("play-button", this, CircleBaseSize::Large);
16+
// btnManager->registerBtn("edit-button", this, CircleBaseSize::Large);
17+
// return true;
18+
// }
19+
/*CCScene* create(){
20+
auto ret = CCScene::create();
21+
22+
auto btnManager = HoldButtonManager::get();
23+
btnManager->registerBtn("help-button", this);
24+
btnManager->registerBtn("delete-button", this);
25+
//MyEditLevelLayer::registerBtn("edit-button", ffff, CircleBaseSize::Large);
26+
btnManager->registerBtn("play-button", this, CircleBaseSize::Large);
27+
btnManager->registerBtn("edit-button", this, CircleBaseSize::Large);
28+
return ret;
29+
}*/
2630
};
2731

28-
struct BtnParameters: public CCObject {
29-
SEL_MenuHandler m_originalCallback;
30-
utils::Timer<std::chrono::high_resolution_clock> m_timer;
31-
BtnParameters(SEL_MenuHandler callback) : m_originalCallback(callback){
32-
m_timer = utils::Timer();
33-
this->autorelease();
32+
#include <Geode/modify/CCLayer.hpp>
33+
class $modify(MyCCLayer, CCLayer) {
34+
void onEnterTransitionDidFinish() {
35+
auto parent = typeinfo_cast<CCScene*>(getParent());
36+
if(!parent){
37+
return;
38+
}
39+
if(this->getID() == ""){
40+
return;
41+
}
42+
log::debug("This is from the {} with {} children", this->getID(), this->getChildrenCount());
43+
//auto node = typeinfo_cast<CCTransitionFade
44+
auto btnManager = HoldButtonManager::get();
45+
btnManager->registerBtn("help-button", this);
46+
btnManager->registerBtn("delete-button", this);
47+
//MyEditLevelLayer::registerBtn("edit-button", ffff, CircleBaseSize::Large);
48+
btnManager->registerBtn("play-button", this, CircleBaseSize::Large);
49+
btnManager->registerBtn("edit-button", this, CircleBaseSize::Large);
50+
log::debug("this should fail"); // but hopefully not crash
51+
btnManager->registerBtn("pause-button", this);
3452
}
53+
/*bool init(){
54+
if(!CCLayer::init()) return false;
55+
log::debug("yah");
56+
return true;
57+
}*/
3558
};
3659

37-
38-
#include <Geode/modify/EditLevelLayer.hpp>
60+
/*#include <Geode/modify/EditLevelLayer.hpp>
3961
class $modify(MyEditLevelLayer, EditLevelLayer) {
40-
struct Fields{
41-
CCArray* m_frames;
42-
utils::Timer<std::chrono::high_resolution_clock>* m_timer = new utils::Timer();
43-
};
4462
4563
bool init(GJGameLevel* p1){
4664
if (!EditLevelLayer::init(p1)) return false;
65+
4766
auto menu = static_cast<CCMenu*>(getChildByID("level-actions-menu"));
4867
auto ffff = static_cast<CCMenu*>(getChildByID("level-edit-menu"));
49-
if(!menu) {
50-
log::error("failed to find level-actions-menu");
51-
return true;
52-
}
53-
54-
auto frames = CCArray::create();
55-
frames->retain();
56-
57-
for(int i = 'A'; i<='T'; i++) {
58-
auto frameName = fmt::format("HoldLoading{}.png"_spr, static_cast<char>(i));
59-
log::debug("{}",frameName);
60-
61-
auto frame = CCSpriteFrameCache::get()->spriteFrameByName(frameName.c_str());
62-
if(!frame) {
63-
log::warn("Failed to get the frame {}", frameName);
64-
}
65-
frames->addObject(frame);
66-
//m_fields->m_animation->addSpriteFrame(CCSpriteFrameCache::get()->spriteFrameByName(ahhh));
67-
}
68-
auto animation = CCAnimation::createWithSpriteFrames(frames, 0.1f);
69-
m_fields->m_frames=frames;
70-
7168
7269
73-
MyEditLevelLayer::registerBtn("help-button", menu);
74-
MyEditLevelLayer::registerBtn("delete-button", menu);
70+
auto btnManager = HoldButtonManager::get();
71+
btnManager->registerBtn("help-button", this);
72+
btnManager->registerBtn("delete-button", this);
7573
//MyEditLevelLayer::registerBtn("edit-button", ffff, CircleBaseSize::Large);
76-
MyEditLevelLayer::registerBtn("play-button", ffff, CircleBaseSize::Large);
77-
MyEditLevelLayer::registerBtn("edit-button", ffff, CircleBaseSize::Large);
74+
btnManager->registerBtn("play-button", this, CircleBaseSize::Large);
75+
btnManager->registerBtn("edit-button", this, CircleBaseSize::Large);
7876
7977
return true;
8078
}
81-
82-
void registerBtn(std::string_view id,CCMenu* menu) {
83-
registerBtn(id, menu, CircleBaseSize::Medium);
84-
}
85-
86-
void registerBtn(std::string_view id, CCMenu* menu, CircleBaseSize size){
87-
auto gif = CCAnimatedSprite::createWithSpriteFrame(static_cast<CCSpriteFrame*>(m_fields->m_frames->objectAtIndex(5)));
88-
auto selectSprite = CircleButtonSprite::create(gif, CircleBaseColor::Green, size);
89-
auto button = static_cast<MyCCMenuItemSpriteExtra*>(menu->getChildByID(id));
90-
if(!button){
91-
log::error("failed to find delete-button");
92-
return;
93-
}
94-
button->setSelectedImage(selectSprite);
95-
button->setUserObject(new BtnParameters(button->m_pfnSelector));
96-
button->m_fields->m_originalCallback = button->m_pfnSelector;
97-
button->m_pfnSelector = menu_selector(MyEditLevelLayer::btnActivate);
98-
(button->m_fields)->m_selectCallback = menu_selector(MyEditLevelLayer::btnSelect);
99-
}
100-
101-
void btnActivate(CCObject* sender) {
102-
auto button = static_cast<MyCCMenuItemSpriteExtra*>(sender);
103-
auto params = typeinfo_cast<BtnParameters*>(button->getUserObject());
104-
if(m_fields->m_timer && m_fields->m_timer->elapsed() > 500) {
105-
((button->m_pListener)->*(button->m_fields->m_originalCallback))(this);
106-
}
107-
}
108-
109-
void btnSelect(CCObject* sender){
110-
auto button = static_cast<CCMenuItemSpriteExtra*>(sender);
111-
if(m_fields->m_timer){
112-
m_fields->m_timer->reset();
113-
}
114-
115-
CircleButtonSprite* sprite = typeinfo_cast<CircleButtonSprite*>(button->getSelectedImage());
116-
if(sprite) {
117-
auto animSprite = static_cast<CCAnimatedSprite*>(sprite->getTopNode());
118-
if (animSprite) {
119-
animSprite->stopAllActions();
120-
animSprite->runAction(CCAnimate::create(CCAnimation::createWithSpriteFrames(m_fields->m_frames, 0.025f)));
121-
}
122-
}
123-
}
124-
};
79+
};*/

0 commit comments

Comments
 (0)