Skip to content

Commit 8db9421

Browse files
committed
move to enum, use clearer var names
1 parent fd61f80 commit 8db9421

6 files changed

Lines changed: 40 additions & 30 deletions

File tree

loader/include/Geode/loader/ModSettingsManager.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ namespace geode {
1616
friend class ::geode::Mod;
1717

1818
void markRestartRequired();
19-
void markDirty();
20-
void unmarkDirty();
19+
void queueSave();
20+
void saveFinished();
2121

2222
public:
2323
static ModSettingsManager* from(Mod* mod);
@@ -70,6 +70,6 @@ namespace geode {
7070
*/
7171
void addDependant(Mod* mod);
7272

73-
bool dirty() const;
73+
bool shouldSave() const;
7474
};
7575
}

loader/src/loader/ModImpl.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,17 @@ VersionInfo Mod::Impl::getVersion() const {
167167
matjson::Value& Mod::Impl::getSaveContainer() {
168168
// saved value taken, so we need to save it every time
169169
// since we dont know what the caller will do with the container
170-
m_savedTaken = true;
170+
m_saveRequestState = SaveRequestState::SaveUntilExit;
171171

172172
return m_saved;
173173
}
174174

175175
matjson::Value& Mod::Impl::getSaveContainerTemp() {
176176
// saved value dirty - caller promises to get rid
177177
// of its ref before next save
178-
m_savedDirty = true;
178+
if(m_saveRequestState == SaveRequestState::Clean) {
179+
m_saveRequestState = SaveRequestState::SaveOnce;
180+
}
179181

180182
return m_saved;
181183
}
@@ -232,11 +234,11 @@ Result<> Mod::Impl::loadData() {
232234
}
233235
} else {
234236
// this used to early return but skipping saved values is not great behavior here imo
235-
m_settings->markDirty();
237+
m_settings->queueSave();
236238
log::warn("Unable to load settings: {}", json.unwrapErr());
237239
}
238240
} else {
239-
m_settings->markDirty();
241+
m_settings->queueSave();
240242
}
241243

242244
// Saved values
@@ -266,7 +268,7 @@ Result<> Mod::Impl::saveData() {
266268
}
267269

268270
// ModSettingsManager keeps track of the whole savedata
269-
if (m_settings->dirty()) {
271+
if (m_settings->shouldSave()) {
270272
log::debug("Saving settings for mod {}", m_metadata.getID());
271273

272274
matjson::Value json = m_settings->save();
@@ -278,22 +280,24 @@ Result<> Mod::Impl::saveData() {
278280
if (!res) {
279281
log::error("Unable to save settings: {}", res.unwrapErr());
280282
} else {
281-
m_settings->unmarkDirty();
283+
m_settings->saveFinished();
282284
}
283285
} else {
284286
// duplicated line to retain old expectations of saveData being called after json dump but before file write
285287
ModStateEvent(ModEventType::DataSaved, std::move(m_self)).send();
286288
}
287289

288-
if (m_savedTaken || m_savedDirty) {
290+
if (m_saveRequestState != SaveRequestState::Clean) {
289291
log::debug("Saving values for mod {}", m_metadata.getID());
290292

291293
auto res2 = utils::file::writeStringSafe(m_saveDirPath / "saved.json", m_saved.dump());
292294
if (!res2) {
293295
log::error("Unable to save values: {}", res2.unwrapErr());
294296
}
295297

296-
m_savedDirty = false;
298+
if(m_saveRequestState == SaveRequestState::SaveOnce) {
299+
m_saveRequestState = SaveRequestState::Clean;
300+
}
297301
}
298302

299303
return Ok();

loader/src/loader/ModImpl.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@
88
#include <Geode/loader/Signal.hpp>
99

1010
namespace geode {
11+
enum class SaveRequestState {
12+
Clean,
13+
SaveOnce,
14+
SaveUntilExit,
15+
};
16+
1117
class Mod::Impl {
1218
public:
1319
Mod* m_self;
@@ -53,12 +59,7 @@ namespace geode {
5359
* Whether the saved values need to be saved to disk one time
5460
* (container dirty)
5561
*/
56-
bool m_savedDirty = false;
57-
/**
58-
* Whether the saved values need to be always re-saved until game exit
59-
* (container taken by a mod)
60-
*/
61-
bool m_savedTaken = false;
62+
SaveRequestState m_saveRequestState = SaveRequestState::Clean;
6263
/**
6364
* Setting values. This is behind unique_ptr for interior mutability
6465
*/

loader/src/loader/ModSettingsManager.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,7 @@ class ModSettingsManager::Impl final {
188188
// update this by calling saveSettingValueToSave
189189
matjson::Value savedata;
190190
bool restartRequired = false;
191-
bool dirty = false;
192-
bool taken = false;
191+
SaveRequestState saveRequestState = SaveRequestState::Clean;
193192

194193
bool loadSettingValueFromSave(std::string const& key) {
195194
if (this->savedata.contains(key) && this->settings.contains(key)) {
@@ -209,7 +208,9 @@ class ModSettingsManager::Impl final {
209208
else {
210209
if (!this->savedata.contains(key)) {
211210
log::error("Unable to load setting '{}' for mod {} (not found in savedata)", key, this->modID);
212-
dirty = true;
211+
if(saveRequestState == SaveRequestState::Clean) {
212+
saveRequestState = SaveRequestState::SaveOnce;
213+
}
213214
}
214215
return false;
215216
}
@@ -288,16 +289,20 @@ void ModSettingsManager::markRestartRequired() {
288289
m_impl->restartRequired = true;
289290
}
290291

291-
void ModSettingsManager::markDirty() {
292-
m_impl->dirty = true;
292+
void ModSettingsManager::queueSave() {
293+
if(m_impl->saveRequestState == SaveRequestState::Clean) {
294+
m_impl->saveRequestState = SaveRequestState::SaveOnce;
295+
}
293296
}
294297

295-
void ModSettingsManager::unmarkDirty() {
296-
m_impl->dirty = false;
298+
void ModSettingsManager::saveFinished() {
299+
if(m_impl->saveRequestState == SaveRequestState::SaveOnce) {
300+
m_impl->saveRequestState = SaveRequestState::Clean;
301+
}
297302
}
298303

299-
bool ModSettingsManager::dirty() const {
300-
return m_impl->dirty || m_impl->taken;
304+
bool ModSettingsManager::shouldSave() const {
305+
return m_impl->saveRequestState != SaveRequestState::Clean;
301306
}
302307

303308
Result<> ModSettingsManager::registerCustomSettingType(std::string_view type, SettingGenerator generator) {
@@ -334,7 +339,7 @@ Result<> ModSettingsManager::load(matjson::Value const& json) {
334339
for (auto const& [key, _] : m_impl->settings) {
335340
if (!json.contains(key)) {
336341
log::error("Unable to load setting '{}' for mod {} (not found in savedata)", key, m_impl->modID);
337-
m_impl->dirty = true;
342+
this->queueSave();
338343
break;
339344
}
340345
}
@@ -351,7 +356,7 @@ matjson::Value ModSettingsManager::save() {
351356
}
352357

353358
matjson::Value& ModSettingsManager::getSaveData() {
354-
m_impl->taken = true;
359+
m_impl->saveRequestState = SaveRequestState::SaveUntilExit;
355360

356361
return m_impl->savedata;
357362
}

loader/src/loader/SettingV3.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ void SettingV3::markChanged() {
579579
if (m_impl->requiresRestart) {
580580
manager->markRestartRequired();
581581
}
582-
manager->markDirty();
582+
manager->queueSave();
583583
}
584584
SettingChangedEventV3(this->getModID(), this->getKey()).send(shared_from_this());
585585
}

loader/src/ui/mods/settings/ModSettingsPopup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ void ModSettingsPopup::updateState(SettingNode* invoker) {
7171

7272
// frame delay for debounce (avoids repeating save for every changed setting)
7373
Loader::get()->queueInMainThread([mod = m_mod, manager] {
74-
if (manager->dirty()) {
74+
if (manager->shouldSave()) {
7575
(void) mod->saveData();
7676
}
7777
});

0 commit comments

Comments
 (0)