From 12141281cce0d1007bf76cae0a2ba5cbbbef65af Mon Sep 17 00:00:00 2001 From: ix0rai Date: Sat, 25 May 2024 18:56:22 -0500 Subject: [PATCH] add exit confirmation to custom mode screen @orifu --- .../rainglow/config/CustomModeScreen.java | 39 +++++++++++++++---- .../rainglow/config/RainglowConfigScreen.java | 24 ++++++------ .../config/ScreenWithUnsavedWarning.java | 32 +++++++++++++++ 3 files changed, 76 insertions(+), 19 deletions(-) create mode 100644 src/main/java/io/ix0rai/rainglow/config/ScreenWithUnsavedWarning.java diff --git a/src/main/java/io/ix0rai/rainglow/config/CustomModeScreen.java b/src/main/java/io/ix0rai/rainglow/config/CustomModeScreen.java index 95a7a25..02df6b1 100644 --- a/src/main/java/io/ix0rai/rainglow/config/CustomModeScreen.java +++ b/src/main/java/io/ix0rai/rainglow/config/CustomModeScreen.java @@ -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> options = new ArrayList<>(); + private boolean isConfirming; private static final Text TITLE = Rainglow.translatableText("config.custom"); @@ -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(); @@ -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); + } + } } diff --git a/src/main/java/io/ix0rai/rainglow/config/RainglowConfigScreen.java b/src/main/java/io/ix0rai/rainglow/config/RainglowConfigScreen.java index c5603d8..18dbbe8 100644 --- a/src/main/java/io/ix0rai/rainglow/config/RainglowConfigScreen.java +++ b/src/main/java/io/ix0rai/rainglow/config/RainglowConfigScreen.java @@ -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)); @@ -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); @@ -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(); + } } diff --git a/src/main/java/io/ix0rai/rainglow/config/ScreenWithUnsavedWarning.java b/src/main/java/io/ix0rai/rainglow/config/ScreenWithUnsavedWarning.java new file mode 100644 index 0000000..389d003 --- /dev/null +++ b/src/main/java/io/ix0rai/rainglow/config/ScreenWithUnsavedWarning.java @@ -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); + } +}