Skip to content

Commit cb7dbc6

Browse files
authored
Fixed InstantStateManager (#293)
- Added new test instantBoolean - Added new test category - Fixed test mod for fabric
1 parent 5bf53ce commit cb7dbc6

File tree

5 files changed

+62
-25
lines changed

5 files changed

+62
-25
lines changed

src/main/java/dev/isxander/yacl3/impl/InstantStateManager.java

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,59 +3,68 @@
33
import dev.isxander.yacl3.api.Binding;
44
import dev.isxander.yacl3.api.StateManager;
55

6-
import java.util.Objects;
7-
86
public class InstantStateManager<T> implements StateManager<T>, ProvidesBindingForDeprecation<T> {
9-
private final Binding<T> binding;
10-
private StateListener<T> stateListener;
7+
8+
private final Binding<T> binding;
9+
private final T previousValue;
10+
private T pendingValue;
11+
private StateListener<T> stateListener;
12+
private boolean requiresSave = false;
1113

1214
public InstantStateManager(Binding<T> binding) {
13-
this.binding = binding;
14-
this.stateListener = StateListener.noop();
15+
this.binding = binding;
16+
this.previousValue = binding.getValue();
17+
this.pendingValue = binding.getValue();
18+
this.stateListener = StateListener.noop();
1519
}
1620

1721
@Override
1822
public void set(T value) {
19-
boolean changed = !Objects.equals(this.get(), value);
20-
21-
this.binding.setValue(value);
22-
23-
if (changed) stateListener.onStateChange(this.get(), value);
23+
boolean changed = !this.pendingValue.equals(value);
24+
boolean previousValue = this.previousValue.equals(value);
25+
26+
this.binding.setValue(value);
27+
this.pendingValue = value;
28+
29+
if (previousValue) {
30+
this.requiresSave = false;
31+
}
32+
if (changed && !previousValue) {
33+
this.requiresSave = true;
34+
}
35+
if (changed) {
36+
this.stateListener.onStateChange(this.pendingValue, value);
37+
}
2438
}
2539

2640
@Override
2741
public T get() {
28-
return this.binding.getValue();
42+
return this.pendingValue;
2943
}
3044

3145
@Override
3246
public void apply() {
33-
// no-op, state is always applied
47+
this.requiresSave = false;
3448
}
3549

3650
@Override
3751
public void resetToDefault(ResetAction action) {
38-
this.set(binding.defaultValue());
52+
this.set(this.binding.defaultValue());
3953
}
4054

4155
@Override
4256
public void sync() {
43-
// no-op, state is always synced
57+
this.set(this.previousValue);
4458
}
4559

4660
@Override
4761
public boolean isSynced() {
48-
return true;
49-
}
50-
51-
@Override
52-
public boolean isAlwaysSynced() {
53-
return true;
62+
return !this.requiresSave;
5463
}
5564

5665
@Override
5766
public boolean isDefault() {
58-
return binding.defaultValue().equals(this.get());
67+
return this.binding.defaultValue().equals(this.pendingValue);
5968
}
6069

6170
@Override
@@ -65,6 +74,6 @@ public void addListener(StateListener<T> stateListener) {
6574

6675
@Override
6776
public Binding<T> getBinding() {
68-
return binding;
77+
return this.binding;
6978
}
7079
}

src/testmod/java/dev/isxander/yacl3/test/ConfigTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ public class ConfigTest {
8282
@SerialEntry
8383
public int scrollingSlider = 0;
8484

85+
@SerialEntry
86+
public boolean instantBoolean;
87+
8588
public enum Alphabet {
8689
A, B, C
8790
}

src/testmod/java/dev/isxander/yacl3/test/Entrypoint.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
1-
/*? if neoforge {*/
1+
/*? if fabric {*/
2+
package dev.isxander.yacl3.test;
3+
import net.fabricmc.api.ClientModInitializer;
4+
5+
public class Entrypoint implements ClientModInitializer {
6+
@Override
7+
public void onInitializeClient() {
8+
9+
}
10+
}
11+
12+
/*?} elif neoforge {*/
213
/*package dev.isxander.yacl3.test;
314
415
import net.neoforged.fml.common.Mod;

src/testmod/java/dev/isxander/yacl3/test/GuiTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,7 @@ private static Screen getFullTestSuite(Screen parent) {
466466
.build())
467467
.build())
468468
.category(sharedStateCategory())
469+
.category(instantStateManager(defaults, config))
469470
.category(ConfigCategory.createBuilder()
470471
.name(Component.literal("Category Test"))
471472
.option(LabelOption.create(Component.literal("This is a test category!")))
@@ -571,6 +572,19 @@ private static ConfigCategory sharedStateCategory() {
571572
return builder.build();
572573
}
573574

575+
private static ConfigCategory instantStateManager(ConfigTest defaults, ConfigTest config) {
576+
ConfigCategory.Builder builder = ConfigCategory.createBuilder()
577+
.name(Component.literal("InstantStateManager Test"));
578+
579+
builder.option(Option.<Boolean>createBuilder()
580+
.name(Component.literal("Instant Boolean"))
581+
.stateManager(StateManager.createInstant(Binding.generic(defaults.instantBoolean, () -> config.instantBoolean, (bl) -> config.instantBoolean = bl)))
582+
.controller(BooleanControllerBuilder::create)
583+
.build());
584+
585+
return builder.build();
586+
}
587+
574588
private static ResourceLocation imageSample(String name) {
575589
return YACLPlatform.rl("yacl_test", "textures/images/" + name);
576590
}

src/testmod/resources/fabric.mod.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
],
2323
"entrypoints": {
2424
"client": [
25-
"dev.isxander.yacl3.platform.PlatformEntrypoint"
25+
"dev.isxander.yacl3.test.Entrypoint"
2626
]
2727
},
2828
"custom": {

0 commit comments

Comments
 (0)