From 032a0ff4989fdb276e0b4c8b6b15bb60ac723bff Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 23 Oct 2023 21:45:09 +0800 Subject: [PATCH] Close #1505 --- .../client/config/entries/ReloadPluginsEntry.java | 4 ++-- .../client/gui/screen/ConfigReloadingScreen.java | 15 ++++++++++++++- .../gui/widget/CraftableFilterButtonWidget.java | 12 ++++++++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java index ed30fba94..adcd084ea 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/config/entries/ReloadPluginsEntry.java @@ -56,7 +56,7 @@ public class ReloadPluginsEntry extends AbstractConfigListEntry { public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { if (PluginManager.areAnyReloading()) { Screen screen = Minecraft.getInstance().screen; - Minecraft.getInstance().setScreen(new ConfigReloadingScreen(Component.translatable("text.rei.config.is.reloading"), PluginManager::areAnyReloading, () -> Minecraft.getInstance().setScreen(screen))); + Minecraft.getInstance().setScreen(new ConfigReloadingScreen(Component.translatable("text.rei.config.is.reloading"), PluginManager::areAnyReloading, () -> Minecraft.getInstance().setScreen(screen), null)); } else { super.render(matrices, mouseX, mouseY, delta); } @@ -86,7 +86,7 @@ public Optional getDefaultValue() { @Override public void save() { - + } @Override diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java index 7111c964c..4bfbad115 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/screen/ConfigReloadingScreen.java @@ -25,7 +25,9 @@ import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.Util; +import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; @@ -39,12 +41,14 @@ public class ConfigReloadingScreen extends Screen { private final BooleanSupplier predicate; private Supplier<@Nullable Component> subtitle = () -> null; private final Runnable parent; + private final Runnable cancel; - public ConfigReloadingScreen(Component title, BooleanSupplier predicate, Runnable parent) { + public ConfigReloadingScreen(Component title, BooleanSupplier predicate, Runnable parent, Runnable cancel) { super(Component.empty()); this.title = title; this.predicate = predicate; this.parent = parent; + this.cancel = cancel; } public void setSubtitle(Supplier<@Nullable Component> subtitle) { @@ -56,6 +60,15 @@ public boolean shouldCloseOnEsc() { return false; } + @Override + public void init() { + super.init(); + if (cancel == null) return; + this.addRenderableWidget(new Button(this.width / 2 - 100, this.height / 4 + 120 + 12, 200, 20, CommonComponents.GUI_CANCEL, button -> { + cancel.run(); + })); + } + @Override public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { this.renderDirtBackground(0); diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java index 71effe086..a4926f524 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/gui/widget/CraftableFilterButtonWidget.java @@ -24,6 +24,7 @@ package me.shedaniel.rei.impl.client.gui.widget; import com.mojang.math.Vector4f; +import dev.architectury.platform.Platform; import dev.architectury.utils.value.BooleanValue; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; @@ -150,15 +151,22 @@ public static List createInputMethodEntries(MenuAccess access ConfigReloadingScreen reloadingScreen = new ConfigReloadingScreen(Component.translatable("text.rei.input.methods.initializing"), () -> !future.isDone(), () -> { Minecraft.getInstance().setScreen(screen); + }, () -> { + Minecraft.getInstance().setScreen(screen); + InternalLogger.getInstance().error("Failed to prepare input method: cancelled"); + ConfigManagerImpl.getInstance().getConfig().setInputMethodId(new ResourceLocation("rei:default")); + future.cancel(Platform.isFabric()); + service.shutdown(); }); reloadingScreen.setSubtitle(() -> Component.translatable("text.rei.input.methods.reload.progress", String.format("%.2f", progress[0] * 100))); Minecraft.getInstance().setScreen(reloadingScreen); access.close(); future.whenComplete((unused, throwable) -> { service.shutdown(); + if (throwable != null) return; + ScreenOverlayImpl.getInstance().getHintsContainer().addHint(12, () -> new Point(getCraftableFilterBounds().getCenterX(), getCraftableFilterBounds().getCenterY()), + "text.rei.hint.input.methods", List.of(Component.translatable("text.rei.hint.input.methods"))); }); - ScreenOverlayImpl.getInstance().getHintsContainer().addHint(12, () -> new Point(getCraftableFilterBounds().getCenterX(), getCraftableFilterBounds().getCenterY()), - "text.rei.hint.input.methods", List.of(Component.translatable("text.rei.hint.input.methods"))); }) .withActive(() -> !Objects.equals(config.getInputMethodId(), pair.getKey())) .withTooltip(() -> Tooltip.create(Widget.mouse(), pair.getValue().getDescription()))