Skip to content

Commit e0b706a

Browse files
committed
rewrite saveable options screen to work better with thing
saveable looks nicer than savable crowder my mind
1 parent 85d9adc commit e0b706a

File tree

4 files changed

+174
-246
lines changed

4 files changed

+174
-246
lines changed

src/main/java/io/ix0rai/rainglow/config/CustomModeScreen.java

Lines changed: 25 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -4,54 +4,43 @@
44
import io.ix0rai.rainglow.data.RainglowColour;
55
import net.minecraft.client.MinecraftClient;
66
import net.minecraft.client.gui.screen.Screen;
7-
import net.minecraft.client.gui.screen.option.GameOptionsScreen;
8-
import net.minecraft.client.gui.widget.button.ButtonWidget;
9-
import net.minecraft.client.gui.widget.layout.HeaderFooterLayoutWidget;
10-
import net.minecraft.client.gui.widget.layout.LinearLayoutWidget;
11-
import net.minecraft.client.gui.widget.list.ButtonListWidget;
12-
import net.minecraft.client.gui.widget.text.TextWidget;
137
import net.minecraft.client.option.Option;
148
import net.minecraft.client.toast.SystemToast;
159
import net.minecraft.client.toast.Toast;
16-
import net.minecraft.text.CommonTexts;
1710
import net.minecraft.text.Text;
1811

19-
import java.util.ArrayList;
20-
import java.util.List;
21-
22-
public class CustomModeScreen extends GameOptionsScreen implements ScreenWithUnsavedWarning {
23-
private final ButtonWidget saveButton;
24-
private final List<DeferredSaveOption<Boolean>> options = new ArrayList<>();
25-
private boolean isConfirming;
26-
12+
public class CustomModeScreen extends SaveableGameOptionsScreen {
2713
private static final Text TITLE = Rainglow.translatableText("config.custom");
2814

2915
public CustomModeScreen(Screen parent) {
30-
super(parent, MinecraftClient.getInstance().options, TITLE);
16+
super(parent, TITLE);
17+
}
3118

32-
this.saveButton = ButtonWidget.builder(
33-
Rainglow.translatableText("config.save"),
34-
button -> {
35-
boolean hasColourSelected = false;
36-
for (DeferredSaveOption<Boolean> option : this.options) {
37-
if (option.deferredValue) {
38-
hasColourSelected = true;
39-
break;
40-
}
41-
}
19+
@Override
20+
protected boolean validate() {
21+
boolean hasColourSelected = false;
22+
for (DeferredSaveOption<?> option : this.options) {
23+
if ((boolean) option.deferredValue) {
24+
hasColourSelected = true;
25+
break;
26+
}
27+
}
4228

43-
if (!hasColourSelected) {
44-
sendNoColoursToast();
45-
} else {
46-
this.save();
47-
}
48-
}).build();
49-
this.saveButton.active = false;
29+
if (!hasColourSelected) {
30+
sendNoColoursToast();
31+
}
32+
return hasColourSelected;
5033
}
5134

52-
private void createColourToggles() {
53-
this.options.clear();
35+
@Override
36+
protected void save() {
37+
Rainglow.CONFIG.customColours.getRealValue().clear();
38+
super.save();
39+
Rainglow.CONFIG.save();
40+
}
5441

42+
@Override
43+
protected void method_60325() {
5544
for (RainglowColour colour : RainglowColour.values()) {
5645
this.options.add(DeferredSaveOption.createDeferredBoolean(
5746
"colour." + colour.getId(),
@@ -65,70 +54,12 @@ private void createColourToggles() {
6554
enabled -> this.saveButton.active = true
6655
));
6756
}
68-
}
69-
70-
private void save() {
71-
Rainglow.CONFIG.customColours.getRealValue().clear();
72-
73-
for (DeferredSaveOption<?> option : this.options) {
74-
option.save();
75-
}
76-
77-
Rainglow.CONFIG.save();
78-
this.saveButton.active = false;
79-
}
80-
81-
@Override
82-
public void init() {
83-
HeaderFooterLayoutWidget headerFooterWidget = new HeaderFooterLayoutWidget(this, 61, 33);
84-
headerFooterWidget.addToHeader(new TextWidget(TITLE, this.textRenderer), settings -> settings.alignHorizontallyCenter().setBottomPadding(28));
85-
86-
if (!this.isConfirming) {
87-
ButtonListWidget buttonListWidget = headerFooterWidget.addToContents(new ButtonListWidget(this.client, this.width, this));
88-
createColourToggles();
89-
buttonListWidget.addEntries(this.options.toArray(new Option<?>[0]));
90-
91-
LinearLayoutWidget linearLayout = headerFooterWidget.addToFooter(LinearLayoutWidget.createHorizontal().setSpacing(8));
92-
linearLayout.add(ButtonWidget.builder(CommonTexts.DONE, button -> this.closeScreen()).build());
93-
linearLayout.add(this.saveButton);
94-
} else {
95-
this.setUpUnsavedWarning(headerFooterWidget, this.textRenderer, this.parent);
96-
}
9757

98-
headerFooterWidget.visitWidgets(this::addDrawableSelectableElement);
99-
headerFooterWidget.arrangeElements();
100-
}
101-
102-
@Override
103-
protected void method_60325() {}
104-
105-
@Override
106-
protected void repositionElements() {
107-
this.clearAndInit();
58+
this.field_51824.addEntries(this.options.toArray(new Option<?>[0]));
10859
}
10960

11061
private static void sendNoColoursToast() {
11162
Toast toast = new SystemToast(SystemToast.Id.PACK_LOAD_FAILURE, Rainglow.translatableText("config.no_custom_colours"), Rainglow.translatableText("config.no_custom_colours_description"));
11263
MinecraftClient.getInstance().getToastManager().add(toast);
11364
}
114-
115-
@Override
116-
public void setConfirming(boolean confirming) {
117-
this.isConfirming = confirming;
118-
}
119-
120-
@Override
121-
public void clearAndInit() {
122-
super.clearAndInit();
123-
}
124-
125-
@Override
126-
public void closeScreen() {
127-
if (this.saveButton.active) {
128-
this.isConfirming = true;
129-
this.clearAndInit();
130-
} else {
131-
MinecraftClient.getInstance().setScreen(this.parent);
132-
}
133-
}
13465
}

src/main/java/io/ix0rai/rainglow/config/RainglowConfigScreen.java

Lines changed: 61 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -10,41 +10,25 @@
1010
import net.minecraft.client.gui.widget.button.ButtonWidget;
1111
import net.minecraft.client.gui.widget.button.CyclingButtonWidget;
1212
import net.minecraft.client.gui.widget.layout.GridWidget;
13-
import net.minecraft.client.gui.widget.layout.HeaderFooterLayoutWidget;
1413
import net.minecraft.client.gui.widget.layout.LayoutSettings;
1514
import net.minecraft.client.gui.widget.layout.LinearLayoutWidget;
1615
import net.minecraft.client.gui.widget.text.TextWidget;
17-
import net.minecraft.client.option.Option;
18-
import net.minecraft.text.CommonTexts;
1916
import net.minecraft.text.Style;
2017
import net.minecraft.text.Text;
2118
import net.minecraft.util.Language;
2219
import org.jetbrains.annotations.Nullable;
2320

24-
import java.util.ArrayList;
25-
import java.util.Collection;
26-
import java.util.HashMap;
27-
import java.util.Map;
28-
29-
public class RainglowConfigScreen extends Screen implements ScreenWithUnsavedWarning {
21+
public class RainglowConfigScreen extends SaveableGameOptionsScreen {
3022
private static final Text TITLE = Rainglow.translatableText("config.title");
3123
public static final Text YES = Text.translatable("gui.yes").styled(style -> style.withColor(0x00FF00));
3224
public static final Text NO = Text.translatable("gui.no").styled(style -> style.withColor(0xFF0000));
3325

34-
private final Screen parent;
35-
private final Map<RainglowEntity, DeferredSaveOption<Boolean>> toggles = new HashMap<>();
36-
private final Map<RainglowEntity, DeferredSaveOption<Integer>> sliders = new HashMap<>();
37-
private final ButtonWidget saveButton;
38-
3926
private RainglowMode mode;
40-
private boolean isConfirming;
4127

4228
public RainglowConfigScreen(@Nullable Screen parent) {
43-
super(TITLE);
44-
this.parent = parent;
29+
super(parent, TITLE);
30+
4531
this.mode = getMode();
46-
this.saveButton = ButtonWidget.builder(Rainglow.translatableText("config.save"), button -> this.save()).build();
47-
this.saveButton.active = false;
4832
}
4933

5034
private void setMode(RainglowMode mode) {
@@ -74,104 +58,81 @@ private TextWidget getInfoText() {
7458
}
7559

7660
@Override
77-
public void init() {
78-
HeaderFooterLayoutWidget headerFooterWidget = new HeaderFooterLayoutWidget(this, 61, 33);
79-
LinearLayoutWidget headerLayout = headerFooterWidget.addToHeader(LinearLayoutWidget.createVertical().setSpacing(8));
80-
81-
if (!this.isConfirming) {
82-
// header
83-
headerLayout.add(new TextWidget(TITLE, this.textRenderer), settings -> settings.alignHorizontallyCenter().alignVerticallyTop().setPadding(12));
84-
headerLayout.add(createModeButton(), LayoutSettings::alignVerticallyBottom);
85-
headerLayout.add(getInfoText(), LayoutSettings::alignHorizontallyCenter);
86-
87-
// contents
88-
LinearLayoutWidget contentLayout = LinearLayoutWidget.createVertical();
89-
90-
GridWidget gridWidget = new GridWidget();
91-
gridWidget.getDefaultSettings().setHorizontalPadding(4).setBottomPadding(4).alignHorizontallyCenter();
61+
protected void save() {
62+
super.save();
63+
this.setMode(this.mode);
64+
}
9265

93-
GridWidget.AdditionHelper mainAdditionHelper = gridWidget.createAdditionHelper(2);
94-
for (RainglowEntity entity : RainglowEntity.values()) {
95-
DeferredSaveOption<Boolean> entityToggle = createEntityToggle(entity);
96-
mainAdditionHelper.add(entityToggle.createButton(MinecraftClient.getInstance().options));
97-
entityToggle.set(entityToggle.deferredValue);
66+
@Override
67+
protected void method_60325() {
68+
LinearLayoutWidget contentLayout = LinearLayoutWidget.createVertical().setSpacing(8);
9869

99-
mainAdditionHelper.add(createColourRaritySlider(entity).createButton(MinecraftClient.getInstance().options));
100-
}
70+
contentLayout.add(createModeButton(), LayoutSettings::alignVerticallyBottom);
71+
contentLayout.add(getInfoText(), LayoutSettings::alignHorizontallyCenter);
10172

102-
contentLayout.add(gridWidget);
103-
contentLayout.add(ButtonWidget.builder(
104-
Rainglow.translatableText("config.custom"),
105-
button -> MinecraftClient.getInstance().setScreen(new CustomModeScreen(this))
106-
).width(308).position(4, 0).build(),
107-
LayoutSettings.create().setPadding(4, 0));
73+
GridWidget gridWidget = new GridWidget();
74+
gridWidget.getDefaultSettings().setHorizontalPadding(4).setBottomPadding(4).alignHorizontallyCenter();
10875

109-
headerFooterWidget.addToContents(contentLayout);
76+
GridWidget.AdditionHelper mainAdditionHelper = gridWidget.createAdditionHelper(2);
77+
for (RainglowEntity entity : RainglowEntity.values()) {
78+
DeferredSaveOption<Boolean> entityToggle = createEntityToggle(entity);
79+
mainAdditionHelper.add(entityToggle.createButton(MinecraftClient.getInstance().options));
80+
entityToggle.set(entityToggle.deferredValue);
81+
this.options.add(entityToggle);
11082

111-
// footer
112-
LinearLayoutWidget linearLayout = headerFooterWidget.addToFooter(LinearLayoutWidget.createHorizontal().setSpacing(8));
113-
linearLayout.add(ButtonWidget.builder(CommonTexts.DONE, button -> this.closeScreen()).build());
114-
linearLayout.add(this.saveButton);
115-
} else {
116-
this.setUpUnsavedWarning(headerFooterWidget, this.textRenderer, this.parent);
83+
DeferredSaveOption<Integer> raritySlider = createColourRaritySlider(entity);
84+
mainAdditionHelper.add(raritySlider.createButton(MinecraftClient.getInstance().options));
85+
this.options.add(raritySlider);
11786
}
11887

119-
headerFooterWidget.visitWidgets(this::addDrawableSelectableElement);
120-
headerFooterWidget.arrangeElements();
88+
contentLayout.add(gridWidget);
89+
contentLayout.add(ButtonWidget.builder(
90+
Rainglow.translatableText("config.custom"),
91+
button -> MinecraftClient.getInstance().setScreen(new CustomModeScreen(this))
92+
).width(308).position(4, 0).build(),
93+
LayoutSettings.create().setPadding(4, 0));
94+
95+
this.field_49503.addToContents(contentLayout);
12196
}
12297

12398
private DeferredSaveOption<Boolean> createEntityToggle(RainglowEntity entity) {
124-
return toggles.computeIfAbsent(entity, e -> DeferredSaveOption.createDeferredBoolean(
125-
"config.enable_" + e.getId(),
126-
"tooltip.entity_toggle",
127-
Rainglow.CONFIG.toggles.getRealValue().get(e.getId()),
128-
enabled -> Rainglow.CONFIG.toggles.getRealValue().put(e.getId(), enabled),
129-
enabled -> this.saveButton.active = true
130-
));
99+
return DeferredSaveOption.createDeferredBoolean(
100+
"config.enable_" + entity.getId(),
101+
"tooltip.entity_toggle",
102+
Rainglow.CONFIG.toggles.getRealValue().get(entity.getId()),
103+
enabled -> Rainglow.CONFIG.toggles.getRealValue().put(entity.getId(), enabled),
104+
enabled -> this.saveButton.active = true
105+
);
131106
}
132107

133108
private DeferredSaveOption<Integer> createColourRaritySlider(RainglowEntity entity) {
134-
return sliders.computeIfAbsent(entity, e -> DeferredSaveOption.createDeferredRangedInt(
135-
"config." + e.getId() + "_rarity",
136-
"tooltip.rarity",
137-
Rainglow.CONFIG.rarities.getRealValue().get(e.getId()),
138-
0,
139-
100,
140-
rarity -> Rainglow.CONFIG.rarities.getRealValue().put(e.getId(), rarity),
141-
rarity -> this.saveButton.active = true
142-
));
109+
return DeferredSaveOption.createDeferredRangedInt(
110+
"config." + entity.getId() + "_rarity",
111+
"tooltip.rarity",
112+
Rainglow.CONFIG.rarities.getRealValue().get(entity.getId()),
113+
0,
114+
100,
115+
rarity -> Rainglow.CONFIG.rarities.getRealValue().put(entity.getId(), rarity),
116+
rarity -> this.saveButton.active = true
117+
);
143118
}
144119

145120
public CyclingButtonWidget<RainglowMode> createModeButton() {
146121
return CyclingButtonWidget.builder(RainglowMode::getText)
147-
.values(RainglowMode.values())
148-
.initially(this.mode)
149-
.tooltip(this::createColourListLabel)
150-
.build(
151-
0,
152-
0,
153-
308,
154-
20,
155-
Rainglow.translatableText("config.mode"),
156-
(cyclingButtonWidget, mode) -> {
157-
this.saveButton.active = true;
158-
RainglowConfigScreen.this.mode = mode;
159-
}
160-
);
161-
}
162-
163-
private void save() {
164-
Collection<Option<?>> options = new ArrayList<>(this.sliders.values());
165-
options.addAll(this.toggles.values());
166-
167-
for (Option<?> option : options) {
168-
if (option instanceof DeferredSaveOption) {
169-
((DeferredSaveOption<?>) option).save();
170-
}
171-
}
172-
173-
this.setMode(this.mode);
174-
this.saveButton.active = false;
122+
.values(RainglowMode.values())
123+
.initially(this.mode)
124+
.tooltip(this::createColourListLabel)
125+
.build(
126+
0,
127+
0,
128+
308,
129+
20,
130+
Rainglow.translatableText("config.mode"),
131+
(cyclingButtonWidget, mode) -> {
132+
this.saveButton.active = true;
133+
this.mode = mode;
134+
}
135+
);
175136
}
176137

177138
private Tooltip createColourListLabel(RainglowMode mode) {
@@ -203,24 +164,4 @@ private Tooltip createColourListLabel(RainglowMode mode) {
203164
Style style = Style.EMPTY.withColor(mode.getText().getStyle().getColor());
204165
return Tooltip.create(Text.literal(text.toString()).setStyle(style));
205166
}
206-
207-
@Override
208-
public void closeScreen() {
209-
if (this.saveButton.active) {
210-
this.isConfirming = true;
211-
this.clearAndInit();
212-
} else {
213-
MinecraftClient.getInstance().setScreen(this.parent);
214-
}
215-
}
216-
217-
@Override
218-
public void setConfirming(boolean confirming) {
219-
this.isConfirming = confirming;
220-
}
221-
222-
@Override
223-
public void clearAndInit() {
224-
super.clearAndInit();
225-
}
226167
}

0 commit comments

Comments
 (0)