Skip to content

Commit 7319bd8

Browse files
committed
wip ui
1 parent 1a1c6cd commit 7319bd8

10 files changed

Lines changed: 316 additions & 7 deletions

File tree

resources/translations

src/Client/Module.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,17 @@ bool Module::getRealEnabled()
4444
return false;
4545
}
4646

47+
if (auto pl = PlayLayer::get(); pl && pl->m_started)
48+
{
49+
bool inRange;
50+
auto ret = enableRanges.getEnable(pl->getCurrentPercent(), userEnabled, &inRange);
51+
52+
if (inRange && ret != userEnabled)
53+
SafeMode::get()->onModuleToggled(this);
54+
55+
return ret;
56+
}
57+
4758
return userEnabled;
4859
}
4960

@@ -72,6 +83,16 @@ std::string Module::getDisabledMessage()
7283
return disabledMessage;
7384
}
7485

86+
void Module::genericLoad()
87+
{
88+
enableRanges.load(Mod::get()->getSavedValue<matjson::Value>(fmt::format("{}_enableranges", getID()), {}));
89+
}
90+
91+
void Module::genericSave()
92+
{
93+
Mod::get()->setSavedValue<matjson::Value>(fmt::format("{}_enableranges", getID()), enableRanges.save());
94+
}
95+
7596
bool Module::shouldSave()
7697
{
7798
if (getID() == "test")
@@ -456,6 +477,11 @@ std::string Module::getNotificationString()
456477
return utils::string::replace(LocalisationManager::get()->getLocalisedString(str), "%s", getName());
457478
}
458479

480+
qolmod::Ranges* Module::getRanges()
481+
{
482+
return &enableRanges;
483+
}
484+
459485
#include <rapidfuzz/fuzz.hpp>
460486

461487
float Module::getSearchWeight(std::string query)

src/Client/Module.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "../Keybinds/KeyConfigStruct.hpp"
66
#include "../Keybinds/KeyState.hpp"
77
#include "ModuleShortcutConfig.hpp"
8+
#include <Ranges.hpp>
89

910
#define SUBMIT_HACK(func) \
1011
$on_mod(Loaded) \
@@ -26,6 +27,7 @@ static func* get() \
2627
{ \
2728
instance = new func(); \
2829
instance->load(); \
30+
instance->genericLoad(); \
2931
Module::moduleMap.push_back(instance); \
3032
} \
3133
return instance; \
@@ -70,6 +72,7 @@ class Module
7072
int sortPriority = 8008135;
7173
KeyConfigStruct keyConfig = {};
7274
bool showSeperateOptionsInfo = false;
75+
qolmod::Ranges enableRanges = {};
7376

7477
bool shortcutEnabled = false;
7578
cocos2d::CCNode* shortcutNode = nullptr;
@@ -121,13 +124,17 @@ class Module
121124

122125
bool getRealEnabled();
123126

127+
void genericLoad();
128+
void genericSave();
129+
124130
void addOption(Module* option);
125131
std::vector<Module*>& getOptions();
126132

127133
void setKeybind(KeyConfigStruct key);
128134
void removeKeybind();
129135

130136
KeyConfigStruct getKeybind();
137+
qolmod::Ranges* getRanges();
131138

132139
void setShortcutConfig(bool enabled, ModuleShortcutConfig conf);
133140
bool isShortcutEnabled();

src/Client/Ranges.cpp

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,47 @@ using namespace qolmod;
55

66
void Ranges::sort()
77
{
8-
8+
// TODO: implement
9+
// purpose: stop overlapped ranges
910
}
1011

11-
bool Ranges::getEnable(float value, bool def)
12+
bool Ranges::getEnable(float value, bool def, bool* inAnyRange)
1213
{
14+
*inAnyRange = false;
15+
1316
for (auto& range : ranges)
1417
{
1518
if (range.inRange(value))
19+
{
20+
*inAnyRange = true;
1621
return range.enable;
22+
}
1723
}
1824

1925
return def;
2026
}
2127

28+
void Ranges::addRange(qolmod::Range range)
29+
{
30+
ranges.push_back(range);
31+
sort();
32+
}
33+
34+
void Ranges::addRange(float min, float max, bool enable)
35+
{
36+
ranges.push_back(qolmod::Range({
37+
.min = min,
38+
.max = max,
39+
.enable = enable
40+
}));
41+
sort();
42+
}
43+
44+
void Ranges::clear()
45+
{
46+
ranges.clear();
47+
}
48+
2249
matjson::Value Ranges::save()
2350
{
2451
sort();

src/Client/Ranges.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ namespace qolmod
99
std::vector<Range> ranges = {};
1010

1111
void sort();
12-
13-
bool getEnable(float value, bool def);
12+
bool getEnable(float value, bool def, bool* inAnyRange = nullptr);
13+
void addRange(float min, float max, bool enable);
14+
void addRange(qolmod::Range range);
15+
void clear();
1416

1517
matjson::Value save();
1618
void load(const matjson::Value& value);

src/GUI/OptionsUI.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,15 @@ void OptionsUI::onInfo(CCObject* sender)
145145
ModuleInfoAlert::create(module)->show();
146146
}
147147

148+
#include <SetupRangeUI.hpp>
149+
148150
void OptionsUI::onSeperateOptionsInfo(CCObject* sender)
149151
{
152+
// DO NOT UPLOAD THIS IS FOR TESTING
153+
SetupRangeUI::create(module)->show();
154+
155+
return;
156+
150157
Mod::get()->setSavedValue<bool>("has-shown-seperate-info", true);
151158

152159
if (pulsingCircle)

src/GUI/OptionsUI.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
using namespace geode::prelude;
1111

12-
class OptionsUI : public PopupBase, public CCCircleWaveDelegate
12+
class OptionsUI : public PopupBase
1313
{
1414
protected:
1515
static inline OptionsUI* instance = nullptr;

src/GUI/SetupRangeUI.cpp

Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
#include "SetupRangeUI.hpp"
2+
#include <BetterButtonSprite.hpp>
3+
#include <AdvancedLabel/AdvLabelBMFont.hpp>
4+
#include <Button.hpp>
5+
#include <Utils.hpp>
6+
#include <BetterAlertLayer.hpp>
7+
8+
using namespace geode::prelude;
9+
using namespace qolmod;
10+
11+
SetupRangeUI* SetupRangeUI::create(Module* mod)
12+
{
13+
auto pRet = new SetupRangeUI();
14+
15+
pRet->module = mod;
16+
auto size = CCSizeMake(340 + 20, 250);
17+
18+
if (pRet && pRet->initAnchored(size.width, size.height))
19+
{
20+
pRet->autorelease();
21+
return pRet;
22+
}
23+
24+
CC_SAFE_DELETE(pRet);
25+
return nullptr;
26+
}
27+
28+
29+
bool SetupRangeUI::setup()
30+
{
31+
m_bgSprite->setVisible(false);
32+
bg = BackgroundSprite::create();
33+
bg->setContentSize(this->m_size);
34+
bg->setPosition(this->m_size / 2);
35+
this->setUserData(module);
36+
37+
m_buttonMenu->setVisible(false);
38+
m_mainLayer->addChild(bg);
39+
40+
auto title = AdvLabelBMFont::createWithLocalisation("edit-range-ui/title", "goldFont.fnt");
41+
title->setScale(0.7f);
42+
43+
auto menu = CCMenu::create();
44+
auto spr = BetterButtonSprite::createWithLocalisation(ccp(54.25f, 30), "ui/ok-button", "goldFont.fnt", "GJ_button_01.png");
45+
auto btn = Button::create(spr, this, menu_selector(PopupBase::onClose));
46+
menu->addChild(btn);
47+
48+
auto trashSpr = CCSprite::createWithSpriteFrameName("GJ_trashBtn_001.png");
49+
trashSpr->setScale(0.75f);
50+
51+
auto trashBtn = Button::create(trashSpr, this, menu_selector(SetupRangeUI::onClear));
52+
auto trashMenu = CCMenu::create(trashBtn, nullptr);
53+
54+
auto area = CCMenu::create();
55+
56+
auto dash = CCLabelBMFont::create("-", "bigFont.fnt");
57+
dash->setPositionY(2.0f);
58+
dash->setScale(0.8f);
59+
min = BetterInputNode::create(60, "min");
60+
max = BetterInputNode::create(60, "max");
61+
min->setString("0.00");
62+
max->setString("0.00");
63+
min->setPositionX(-42);
64+
max->setPositionX(42);
65+
66+
area->addChild(min);
67+
area->addChild(dash);
68+
area->addChild(max);
69+
70+
auto add = Button::create(BetterButtonSprite::createWithLocalisation(ccp(67, 30), "edit-range-ui/add-button", "goldFont.fnt", "GJ_button_01.png"), this, menu_selector(SetupRangeUI::onAdd));
71+
72+
menu->addChild(add);
73+
add->setPositionY(75);
74+
75+
m_mainLayer->addChildAtPosition(area, Anchor::Center, ccp(50, 0));
76+
m_mainLayer->addChildAtPosition(createProgress(), Anchor::Top, ccp(0, -75));
77+
m_mainLayer->addChildAtPosition(trashMenu, Anchor::Top, ccp(135, -75));
78+
m_mainLayer->addChildAtPosition(title, Anchor::Top, ccp(0, -18));
79+
m_mainLayer->addChildAtPosition(menu, Anchor::Bottom, ccp(0, 24.5f));
80+
m_mainLayer->addChildAtPosition(createInfo(), Anchor::TopRight, ccp(-16, -18));
81+
return true;
82+
}
83+
84+
CCMenu* SetupRangeUI::createInfo()
85+
{
86+
auto menu = CCMenu::create();
87+
88+
auto infoBtn = Button::create(CCSprite::createWithSpriteFrameName("GJ_infoIcon_001.png"), this, menu_selector(SetupRangeUI::onInfo));
89+
infoBtn->getNormalImage()->setScale(0.75f);
90+
91+
menu->addChild(infoBtn, 67);
92+
93+
if (!Mod::get()->getSavedValue<bool>("has-shown-range-info"))
94+
{
95+
pulsing = []{
96+
auto circle = PulsingCircle::create(2.5f, 18, 1.0f, false, false);
97+
circle->color = ccWHITE;
98+
return circle;
99+
}();
100+
menu->addChild(pulsing);
101+
}
102+
103+
return menu;
104+
}
105+
106+
CCSprite* SetupRangeUI::createProgress()
107+
{
108+
auto progress = CCSprite::create("slidergroove2.png");
109+
110+
auto progressBG = EasyBG::create();
111+
progressBG->setTargettingNode(progress);
112+
progressBG->setTargettingOffset(ccp(5, 5));
113+
progressBG->setPosition(progress->getContentSize() / 2);
114+
progress->addChild(progressBG, -3);
115+
116+
std::function<CCSprite*()> createSpr = [progress]{
117+
auto progressInner = CCSprite::create("sliderBar2.png");
118+
progressInner->setAnchorPoint(ccp(0, 0.5f));
119+
120+
ccTexParams params = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_CLAMP_TO_EDGE};
121+
122+
progressInner->getTexture()->setTexParameters(&params);
123+
progressInner->setContentWidth(progress->getContentWidth() - 2.0f * 2);
124+
progressInner->setTextureRect({0, 0, progressInner->getContentWidth(), progressInner->getContentHeight()});
125+
return progressInner;
126+
};
127+
128+
auto white = createSpr();
129+
auto green = createSpr();
130+
auto red = createSpr();
131+
132+
white->setPosition(ccp(2, 8));
133+
green->setColor(ccc3(0, 255, 0));
134+
red->setColor(ccc3(255, 0, 0));
135+
136+
auto redStencil = CCNode::create();
137+
auto greenStencil = CCNode::create();
138+
redStencil->setScaleX(red->getContentWidth() / 100.0f);
139+
greenStencil->setScaleX(red->getContentWidth() / 100.0f);
140+
redClip = CCClippingNode::create(redStencil);
141+
greenClip = CCClippingNode::create(greenStencil);
142+
143+
redClip->setPosition(ccp(2, 8));
144+
greenClip->setPosition(ccp(2, 8));
145+
redClip->addChild(red);
146+
greenClip->addChild(green);
147+
148+
progress->addChild(white, -2);
149+
progress->addChild(greenClip, -2);
150+
progress->addChild(redClip, -2);
151+
152+
updateProgress();
153+
return progress;
154+
}
155+
156+
void SetupRangeUI::updateProgress()
157+
{
158+
redClip->getStencil()->removeAllChildren();
159+
greenClip->getStencil()->removeAllChildren();
160+
161+
for (auto& range : module->getRanges()->ranges)
162+
{
163+
auto n = CCLayerColor::create(ccc4(255, 255, 255, 255), range.max - range.min, 10);
164+
n->setAnchorPoint(ccp(0, 0.5f));
165+
n->ignoreAnchorPointForPosition(false);
166+
n->setPosition(ccp(range.min, 0));
167+
168+
(range.enable ? greenClip->getStencil() : redClip->getStencil())->addChild(n);
169+
}
170+
}
171+
172+
void SetupRangeUI::onInfo(CCObject* sender)
173+
{
174+
Mod::get()->setSavedValue<bool>("has-shown-range-info", true);
175+
176+
if (pulsing)
177+
{
178+
pulsing->removeFromParent();
179+
pulsing = nullptr;
180+
}
181+
182+
BetterAlertLayer::createWithLocalisation("edit-range-ui/info-alert/title", "edit-range-ui/info-alert/text", "ui/ok-button")->show();
183+
}
184+
185+
void SetupRangeUI::onClear(CCObject* sender)
186+
{
187+
module->getRanges()->clear();
188+
updateProgress();
189+
module->genericSave();
190+
191+
qolmod::utils::addCircleToNode(static_cast<CCNode*>(sender));
192+
}
193+
194+
void SetupRangeUI::onAdd(CCObject* sender)
195+
{
196+
module->getRanges()->addRange(qolmod::Range({
197+
.min = geode::utils::numFromString<double>(min->getString()).unwrapOr(0),
198+
.max = geode::utils::numFromString<double>(max->getString()).unwrapOr(0),
199+
.enable = true
200+
}));
201+
202+
updateProgress();
203+
module->genericSave();
204+
}

0 commit comments

Comments
 (0)