Skip to content

Commit

Permalink
rewrite saveable options screen to work better with thing
Browse files Browse the repository at this point in the history
saveable looks nicer than savable crowder my mind
  • Loading branch information
orifu committed Jun 5, 2024
1 parent 85d9adc commit e0b706a
Show file tree
Hide file tree
Showing 4 changed files with 174 additions and 246 deletions.
119 changes: 25 additions & 94 deletions src/main/java/io/ix0rai/rainglow/config/CustomModeScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,54 +4,43 @@
import io.ix0rai.rainglow.data.RainglowColour;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.option.GameOptionsScreen;
import net.minecraft.client.gui.widget.button.ButtonWidget;
import net.minecraft.client.gui.widget.layout.HeaderFooterLayoutWidget;
import net.minecraft.client.gui.widget.layout.LinearLayoutWidget;
import net.minecraft.client.gui.widget.list.ButtonListWidget;
import net.minecraft.client.gui.widget.text.TextWidget;
import net.minecraft.client.option.Option;
import net.minecraft.client.toast.SystemToast;
import net.minecraft.client.toast.Toast;
import net.minecraft.text.CommonTexts;
import net.minecraft.text.Text;

import java.util.ArrayList;
import java.util.List;

public class CustomModeScreen extends GameOptionsScreen implements ScreenWithUnsavedWarning {
private final ButtonWidget saveButton;
private final List<DeferredSaveOption<Boolean>> options = new ArrayList<>();
private boolean isConfirming;

public class CustomModeScreen extends SaveableGameOptionsScreen {
private static final Text TITLE = Rainglow.translatableText("config.custom");

public CustomModeScreen(Screen parent) {
super(parent, MinecraftClient.getInstance().options, TITLE);
super(parent, TITLE);
}

this.saveButton = ButtonWidget.builder(
Rainglow.translatableText("config.save"),
button -> {
boolean hasColourSelected = false;
for (DeferredSaveOption<Boolean> option : this.options) {
if (option.deferredValue) {
hasColourSelected = true;
break;
}
}
@Override
protected boolean validate() {
boolean hasColourSelected = false;
for (DeferredSaveOption<?> option : this.options) {
if ((boolean) option.deferredValue) {
hasColourSelected = true;
break;
}
}

if (!hasColourSelected) {
sendNoColoursToast();
} else {
this.save();
}
}).build();
this.saveButton.active = false;
if (!hasColourSelected) {
sendNoColoursToast();
}
return hasColourSelected;
}

private void createColourToggles() {
this.options.clear();
@Override
protected void save() {
Rainglow.CONFIG.customColours.getRealValue().clear();
super.save();
Rainglow.CONFIG.save();
}

@Override
protected void method_60325() {
for (RainglowColour colour : RainglowColour.values()) {
this.options.add(DeferredSaveOption.createDeferredBoolean(
"colour." + colour.getId(),
Expand All @@ -65,70 +54,12 @@ private void createColourToggles() {
enabled -> this.saveButton.active = true
));
}
}

private void save() {
Rainglow.CONFIG.customColours.getRealValue().clear();

for (DeferredSaveOption<?> option : this.options) {
option.save();
}

Rainglow.CONFIG.save();
this.saveButton.active = false;
}

@Override
public void init() {
HeaderFooterLayoutWidget headerFooterWidget = new HeaderFooterLayoutWidget(this, 61, 33);
headerFooterWidget.addToHeader(new TextWidget(TITLE, this.textRenderer), settings -> settings.alignHorizontallyCenter().setBottomPadding(28));

if (!this.isConfirming) {
ButtonListWidget buttonListWidget = headerFooterWidget.addToContents(new ButtonListWidget(this.client, this.width, this));
createColourToggles();
buttonListWidget.addEntries(this.options.toArray(new Option<?>[0]));

LinearLayoutWidget linearLayout = headerFooterWidget.addToFooter(LinearLayoutWidget.createHorizontal().setSpacing(8));
linearLayout.add(ButtonWidget.builder(CommonTexts.DONE, button -> this.closeScreen()).build());
linearLayout.add(this.saveButton);
} else {
this.setUpUnsavedWarning(headerFooterWidget, this.textRenderer, this.parent);
}

headerFooterWidget.visitWidgets(this::addDrawableSelectableElement);
headerFooterWidget.arrangeElements();
}

@Override
protected void method_60325() {}

@Override
protected void repositionElements() {
this.clearAndInit();
this.field_51824.addEntries(this.options.toArray(new Option<?>[0]));
}

private static void sendNoColoursToast() {
Toast toast = new SystemToast(SystemToast.Id.PACK_LOAD_FAILURE, Rainglow.translatableText("config.no_custom_colours"), Rainglow.translatableText("config.no_custom_colours_description"));
MinecraftClient.getInstance().getToastManager().add(toast);
}

@Override
public void setConfirming(boolean confirming) {
this.isConfirming = confirming;
}

@Override
public void clearAndInit() {
super.clearAndInit();
}

@Override
public void closeScreen() {
if (this.saveButton.active) {
this.isConfirming = true;
this.clearAndInit();
} else {
MinecraftClient.getInstance().setScreen(this.parent);
}
}
}
181 changes: 61 additions & 120 deletions src/main/java/io/ix0rai/rainglow/config/RainglowConfigScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,41 +10,25 @@
import net.minecraft.client.gui.widget.button.ButtonWidget;
import net.minecraft.client.gui.widget.button.CyclingButtonWidget;
import net.minecraft.client.gui.widget.layout.GridWidget;
import net.minecraft.client.gui.widget.layout.HeaderFooterLayoutWidget;
import net.minecraft.client.gui.widget.layout.LayoutSettings;
import net.minecraft.client.gui.widget.layout.LinearLayoutWidget;
import net.minecraft.client.gui.widget.text.TextWidget;
import net.minecraft.client.option.Option;
import net.minecraft.text.CommonTexts;
import net.minecraft.text.Style;
import net.minecraft.text.Text;
import net.minecraft.util.Language;
import org.jetbrains.annotations.Nullable;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

public class RainglowConfigScreen extends Screen implements ScreenWithUnsavedWarning {
public class RainglowConfigScreen extends SaveableGameOptionsScreen {
private static final Text TITLE = Rainglow.translatableText("config.title");
public static final Text YES = Text.translatable("gui.yes").styled(style -> style.withColor(0x00FF00));
public static final Text NO = Text.translatable("gui.no").styled(style -> style.withColor(0xFF0000));

private final Screen parent;
private final Map<RainglowEntity, DeferredSaveOption<Boolean>> toggles = new HashMap<>();
private final Map<RainglowEntity, DeferredSaveOption<Integer>> sliders = new HashMap<>();
private final ButtonWidget saveButton;

private RainglowMode mode;
private boolean isConfirming;

public RainglowConfigScreen(@Nullable Screen parent) {
super(TITLE);
this.parent = parent;
super(parent, TITLE);

this.mode = getMode();
this.saveButton = ButtonWidget.builder(Rainglow.translatableText("config.save"), button -> this.save()).build();
this.saveButton.active = false;
}

private void setMode(RainglowMode mode) {
Expand Down Expand Up @@ -74,104 +58,81 @@ private TextWidget getInfoText() {
}

@Override
public void init() {
HeaderFooterLayoutWidget headerFooterWidget = new HeaderFooterLayoutWidget(this, 61, 33);
LinearLayoutWidget headerLayout = headerFooterWidget.addToHeader(LinearLayoutWidget.createVertical().setSpacing(8));

if (!this.isConfirming) {
// header
headerLayout.add(new TextWidget(TITLE, this.textRenderer), settings -> settings.alignHorizontallyCenter().alignVerticallyTop().setPadding(12));
headerLayout.add(createModeButton(), LayoutSettings::alignVerticallyBottom);
headerLayout.add(getInfoText(), LayoutSettings::alignHorizontallyCenter);

// contents
LinearLayoutWidget contentLayout = LinearLayoutWidget.createVertical();

GridWidget gridWidget = new GridWidget();
gridWidget.getDefaultSettings().setHorizontalPadding(4).setBottomPadding(4).alignHorizontallyCenter();
protected void save() {
super.save();
this.setMode(this.mode);
}

GridWidget.AdditionHelper mainAdditionHelper = gridWidget.createAdditionHelper(2);
for (RainglowEntity entity : RainglowEntity.values()) {
DeferredSaveOption<Boolean> entityToggle = createEntityToggle(entity);
mainAdditionHelper.add(entityToggle.createButton(MinecraftClient.getInstance().options));
entityToggle.set(entityToggle.deferredValue);
@Override
protected void method_60325() {
LinearLayoutWidget contentLayout = LinearLayoutWidget.createVertical().setSpacing(8);

mainAdditionHelper.add(createColourRaritySlider(entity).createButton(MinecraftClient.getInstance().options));
}
contentLayout.add(createModeButton(), LayoutSettings::alignVerticallyBottom);
contentLayout.add(getInfoText(), LayoutSettings::alignHorizontallyCenter);

contentLayout.add(gridWidget);
contentLayout.add(ButtonWidget.builder(
Rainglow.translatableText("config.custom"),
button -> MinecraftClient.getInstance().setScreen(new CustomModeScreen(this))
).width(308).position(4, 0).build(),
LayoutSettings.create().setPadding(4, 0));
GridWidget gridWidget = new GridWidget();
gridWidget.getDefaultSettings().setHorizontalPadding(4).setBottomPadding(4).alignHorizontallyCenter();

headerFooterWidget.addToContents(contentLayout);
GridWidget.AdditionHelper mainAdditionHelper = gridWidget.createAdditionHelper(2);
for (RainglowEntity entity : RainglowEntity.values()) {
DeferredSaveOption<Boolean> entityToggle = createEntityToggle(entity);
mainAdditionHelper.add(entityToggle.createButton(MinecraftClient.getInstance().options));
entityToggle.set(entityToggle.deferredValue);
this.options.add(entityToggle);

// footer
LinearLayoutWidget linearLayout = headerFooterWidget.addToFooter(LinearLayoutWidget.createHorizontal().setSpacing(8));
linearLayout.add(ButtonWidget.builder(CommonTexts.DONE, button -> this.closeScreen()).build());
linearLayout.add(this.saveButton);
} else {
this.setUpUnsavedWarning(headerFooterWidget, this.textRenderer, this.parent);
DeferredSaveOption<Integer> raritySlider = createColourRaritySlider(entity);
mainAdditionHelper.add(raritySlider.createButton(MinecraftClient.getInstance().options));
this.options.add(raritySlider);
}

headerFooterWidget.visitWidgets(this::addDrawableSelectableElement);
headerFooterWidget.arrangeElements();
contentLayout.add(gridWidget);
contentLayout.add(ButtonWidget.builder(
Rainglow.translatableText("config.custom"),
button -> MinecraftClient.getInstance().setScreen(new CustomModeScreen(this))
).width(308).position(4, 0).build(),
LayoutSettings.create().setPadding(4, 0));

this.field_49503.addToContents(contentLayout);
}

private DeferredSaveOption<Boolean> createEntityToggle(RainglowEntity entity) {
return toggles.computeIfAbsent(entity, e -> DeferredSaveOption.createDeferredBoolean(
"config.enable_" + e.getId(),
"tooltip.entity_toggle",
Rainglow.CONFIG.toggles.getRealValue().get(e.getId()),
enabled -> Rainglow.CONFIG.toggles.getRealValue().put(e.getId(), enabled),
enabled -> this.saveButton.active = true
));
return DeferredSaveOption.createDeferredBoolean(
"config.enable_" + entity.getId(),
"tooltip.entity_toggle",
Rainglow.CONFIG.toggles.getRealValue().get(entity.getId()),
enabled -> Rainglow.CONFIG.toggles.getRealValue().put(entity.getId(), enabled),
enabled -> this.saveButton.active = true
);
}

private DeferredSaveOption<Integer> createColourRaritySlider(RainglowEntity entity) {
return sliders.computeIfAbsent(entity, e -> DeferredSaveOption.createDeferredRangedInt(
"config." + e.getId() + "_rarity",
"tooltip.rarity",
Rainglow.CONFIG.rarities.getRealValue().get(e.getId()),
0,
100,
rarity -> Rainglow.CONFIG.rarities.getRealValue().put(e.getId(), rarity),
rarity -> this.saveButton.active = true
));
return DeferredSaveOption.createDeferredRangedInt(
"config." + entity.getId() + "_rarity",
"tooltip.rarity",
Rainglow.CONFIG.rarities.getRealValue().get(entity.getId()),
0,
100,
rarity -> Rainglow.CONFIG.rarities.getRealValue().put(entity.getId(), rarity),
rarity -> this.saveButton.active = true
);
}

public CyclingButtonWidget<RainglowMode> createModeButton() {
return CyclingButtonWidget.builder(RainglowMode::getText)
.values(RainglowMode.values())
.initially(this.mode)
.tooltip(this::createColourListLabel)
.build(
0,
0,
308,
20,
Rainglow.translatableText("config.mode"),
(cyclingButtonWidget, mode) -> {
this.saveButton.active = true;
RainglowConfigScreen.this.mode = mode;
}
);
}

private void save() {
Collection<Option<?>> options = new ArrayList<>(this.sliders.values());
options.addAll(this.toggles.values());

for (Option<?> option : options) {
if (option instanceof DeferredSaveOption) {
((DeferredSaveOption<?>) option).save();
}
}

this.setMode(this.mode);
this.saveButton.active = false;
.values(RainglowMode.values())
.initially(this.mode)
.tooltip(this::createColourListLabel)
.build(
0,
0,
308,
20,
Rainglow.translatableText("config.mode"),
(cyclingButtonWidget, mode) -> {
this.saveButton.active = true;
this.mode = mode;
}
);
}

private Tooltip createColourListLabel(RainglowMode mode) {
Expand Down Expand Up @@ -203,24 +164,4 @@ private Tooltip createColourListLabel(RainglowMode mode) {
Style style = Style.EMPTY.withColor(mode.getText().getStyle().getColor());
return Tooltip.create(Text.literal(text.toString()).setStyle(style));
}

@Override
public void closeScreen() {
if (this.saveButton.active) {
this.isConfirming = true;
this.clearAndInit();
} else {
MinecraftClient.getInstance().setScreen(this.parent);
}
}

@Override
public void setConfirming(boolean confirming) {
this.isConfirming = confirming;
}

@Override
public void clearAndInit() {
super.clearAndInit();
}
}
Loading

0 comments on commit e0b706a

Please sign in to comment.