Skip to content

Commit

Permalink
add exit confirmation to custom mode screen
Browse files Browse the repository at this point in the history
  • Loading branch information
ix0rai committed May 25, 2024
1 parent 7f7bfbe commit 1214128
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 19 deletions.
39 changes: 32 additions & 7 deletions src/main/java/io/ix0rai/rainglow/config/CustomModeScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,10 @@
import java.util.ArrayList;
import java.util.List;

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

private static final Text TITLE = Rainglow.translatableText("config.custom");

Expand Down Expand Up @@ -79,13 +80,17 @@ public void init() {
HeaderFooterLayoutWidget headerFooterWidget = new HeaderFooterLayoutWidget(this, 61, 33);
headerFooterWidget.addToHeader(new TextWidget(TITLE, this.textRenderer), settings -> settings.alignHorizontallyCenter().setBottomPadding(28));

ButtonListWidget buttonListWidget = headerFooterWidget.addToContents(new ButtonListWidget(this.client, this.width, this.height, this));
createColourToggles();
buttonListWidget.addEntries(this.options.toArray(new Option<?>[0]));
if (!this.isConfirming) {
ButtonListWidget buttonListWidget = headerFooterWidget.addToContents(new ButtonListWidget(this.client, this.width, this.height, 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);
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();
Expand All @@ -95,4 +100,24 @@ 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);
}
}
}
24 changes: 12 additions & 12 deletions src/main/java/io/ix0rai/rainglow/config/RainglowConfigScreen.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
import java.util.HashMap;
import java.util.Map;

public class RainglowConfigScreen extends Screen {
public class RainglowConfigScreen extends Screen implements ScreenWithUnsavedWarning {
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));
Expand Down Expand Up @@ -93,17 +93,7 @@ public void init() {
linearLayout.add(ButtonWidget.builder(CommonTexts.DONE, button -> this.closeScreen()).build());
linearLayout.add(this.saveButton);
} else {
LinearLayoutWidget contentWidget = headerFooterWidget.addToContents(new LinearLayoutWidget(250, 100, LinearLayoutWidget.Orientation.VERTICAL).setSpacing(8));
contentWidget.add(new TextWidget(Rainglow.translatableText("config.unsaved_warning"), this.textRenderer), LayoutSettings::alignHorizontallyCenter);

LinearLayoutWidget buttons = new LinearLayoutWidget(250, 20, LinearLayoutWidget.Orientation.HORIZONTAL).setSpacing(8);
buttons.add(ButtonWidget.builder(Rainglow.translatableText("config.continue_editing"), (buttonWidget) -> {
this.isConfirming = false;
this.clearAndInit();
}).build());
buttons.add(ButtonWidget.builder(CommonTexts.YES, (buttonWidget) -> MinecraftClient.getInstance().setScreen(this.parent)).build());

contentWidget.add(buttons, LayoutSettings::alignHorizontallyCenter);
this.setUpUnsavedWarning(headerFooterWidget, this.textRenderer, this.parent);
}

headerFooterWidget.visitWidgets(this::addDrawableSelectableElement);
Expand Down Expand Up @@ -203,4 +193,14 @@ public void closeScreen() {
MinecraftClient.getInstance().setScreen(this.parent);
}
}

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

@Override
public void clearAndInit() {
super.clearAndInit();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package io.ix0rai.rainglow.config;

import io.ix0rai.rainglow.Rainglow;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.button.ButtonWidget;
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.text.CommonTexts;

public interface ScreenWithUnsavedWarning {
void setConfirming(boolean confirming);

void clearAndInit();

default void setUpUnsavedWarning(HeaderFooterLayoutWidget headerFooterWidget, TextRenderer renderer, Screen parent) {
LinearLayoutWidget contentWidget = headerFooterWidget.addToContents(new LinearLayoutWidget(250, 100, LinearLayoutWidget.Orientation.VERTICAL).setSpacing(8));
contentWidget.add(new TextWidget(Rainglow.translatableText("config.unsaved_warning"), renderer), LayoutSettings::alignHorizontallyCenter);

LinearLayoutWidget buttons = new LinearLayoutWidget(250, 20, LinearLayoutWidget.Orientation.HORIZONTAL).setSpacing(8);
buttons.add(ButtonWidget.builder(Rainglow.translatableText("config.continue_editing"), (buttonWidget) -> {
this.setConfirming(false);
this.clearAndInit();
}).build());
buttons.add(ButtonWidget.builder(CommonTexts.YES, (buttonWidget) -> MinecraftClient.getInstance().setScreen(parent)).build());

contentWidget.add(buttons, LayoutSettings::alignHorizontallyCenter);
}
}

0 comments on commit 1214128

Please sign in to comment.