diff --git a/cloth-config/src/main/java/net/xolt/freecam/clothconfig/ClothConfigScreenProvider.java b/cloth-config/src/main/java/net/xolt/freecam/clothconfig/ClothConfigScreenProvider.java index 479e65b9c..1ebcfd803 100644 --- a/cloth-config/src/main/java/net/xolt/freecam/clothconfig/ClothConfigScreenProvider.java +++ b/cloth-config/src/main/java/net/xolt/freecam/clothconfig/ClothConfigScreenProvider.java @@ -3,6 +3,7 @@ import net.minecraft.client.gui.screens.Screen; import net.xolt.freecam.config.controller.ConfigControllerRegistry; import net.xolt.freecam.config.gui.ConfigScreenProvider; +import net.xolt.freecam.config.gui.DependencyDescription; import net.xolt.freecam.config.gui.OptionalProvider; import net.xolt.freecam.config.model.ModConfigDTO; import org.jetbrains.annotations.Nullable; @@ -11,6 +12,8 @@ public class ClothConfigScreenProvider implements ConfigScreenProvider, OptionalProvider { + public static final DependencyDescription REQUIREMENTS = new DependencyDescription.Literal("Cloth Config"); + private @Nullable ModConfigScreenFactory factory; /** @@ -45,4 +48,9 @@ public boolean isAvailable() { return false; } } + + @Override + public DependencyDescription getRequirement() { + return REQUIREMENTS; + } } diff --git a/common/src/main/java/net/xolt/freecam/config/gui/ConfigScreenProvider.java b/common/src/main/java/net/xolt/freecam/config/gui/ConfigScreenProvider.java index 7132365c9..d95a1ab67 100644 --- a/common/src/main/java/net/xolt/freecam/config/gui/ConfigScreenProvider.java +++ b/common/src/main/java/net/xolt/freecam/config/gui/ConfigScreenProvider.java @@ -52,7 +52,14 @@ private Holder() {} .filter(Objects::nonNull) .filter(provider -> !(provider instanceof OptionalProvider optional) || optional.isAvailable()) .findFirst() - .orElseGet(FallbackConfigScreenProvider::new); + .orElseGet(() -> new FallbackConfigScreenProvider( + providers.stream() + .filter(provider -> OptionalProvider.class.isAssignableFrom(provider.type())) + .map(Holder::attemptLoad) + .filter(Objects::nonNull) + .map(OptionalProvider.class::cast) + .toList() + )); LOGGER.info("Using {}", INSTANCE.getName()); } diff --git a/common/src/main/java/net/xolt/freecam/config/gui/DependencyDescription.java b/common/src/main/java/net/xolt/freecam/config/gui/DependencyDescription.java new file mode 100644 index 000000000..34e2fbe07 --- /dev/null +++ b/common/src/main/java/net/xolt/freecam/config/gui/DependencyDescription.java @@ -0,0 +1,13 @@ +package net.xolt.freecam.config.gui; + +import java.util.Collections; +import java.util.List; + +public /*? if java: >=17 >>*/sealed interface DependencyDescription { + record Literal(String text) implements DependencyDescription {} + record Translatable(String key, List args) implements DependencyDescription { + public Translatable(String key) { + this(key, Collections.emptyList()); + } + } +} diff --git a/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreen.java b/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreen.java index 0ab68f427..f04b556ca 100644 --- a/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreen.java +++ b/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreen.java @@ -4,15 +4,43 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.network.chat.Component; +import java.util.Collection; +import java.util.List; + final class FallbackConfigScreen extends GenericMessageScreen { private static final Component TITLE = Component.translatable("text.freecam.missingConfigGui.title"); private final Screen parent; + private final List requirementText; - FallbackConfigScreen(Screen parent) { + FallbackConfigScreen(Screen parent, Collection supportedProviders) { super(TITLE); this.parent = parent; + requirementText = supportedProviders.stream() + .map(provider -> renderRequirement(provider.getRequirement())) + .toList(); + } + + private static Component renderRequirement(DependencyDescription requirement) { + //? if java: >=21 { + return switch (requirement) { + case DependencyDescription.Literal literal -> renderRequirement(literal); + case DependencyDescription.Translatable translatable -> renderRequirement(translatable); + }; + //? } else { + /*if (requirement instanceof DependencyDescription.Literal literal) return renderRequirement(literal); + if (requirement instanceof DependencyDescription.Translatable translatable) return renderRequirement(translatable); + throw new IllegalStateException(); + *///? } + } + + private static Component renderRequirement(DependencyDescription.Literal requirement) { + return Component.literal(requirement.text()); + } + + private static Component renderRequirement(DependencyDescription.Translatable requirement) { + return Component.translatable(requirement.key(), requirement.args().toArray()); } @Override diff --git a/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreenProvider.java b/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreenProvider.java index f5bee1d7a..47e18501a 100644 --- a/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreenProvider.java +++ b/common/src/main/java/net/xolt/freecam/config/gui/FallbackConfigScreenProvider.java @@ -2,11 +2,19 @@ import net.minecraft.client.gui.screens.Screen; +import java.util.Collection; + final class FallbackConfigScreenProvider implements ConfigScreenProvider { + private final Collection supportedProviders; + + public FallbackConfigScreenProvider(Collection supportedProviders) { + this.supportedProviders = supportedProviders; + } + @Override public Screen getConfigScreen(Screen parent) { - return new FallbackConfigScreen(parent); + return new FallbackConfigScreen(parent, supportedProviders); } @Override diff --git a/common/src/main/java/net/xolt/freecam/config/gui/OptionalProvider.java b/common/src/main/java/net/xolt/freecam/config/gui/OptionalProvider.java index deac9dd42..dc27b989b 100644 --- a/common/src/main/java/net/xolt/freecam/config/gui/OptionalProvider.java +++ b/common/src/main/java/net/xolt/freecam/config/gui/OptionalProvider.java @@ -2,4 +2,5 @@ public interface OptionalProvider { boolean isAvailable(); + DependencyDescription getRequirement(); }