Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -11,6 +12,8 @@

public class ClothConfigScreenProvider implements ConfigScreenProvider, OptionalProvider {

public static final DependencyDescription REQUIREMENTS = new DependencyDescription.Literal("Cloth Config");

private @Nullable ModConfigScreenFactory factory;

/**
Expand Down Expand Up @@ -45,4 +48,9 @@ public boolean isAvailable() {
return false;
}
}

@Override
public DependencyDescription getRequirement() {
return REQUIREMENTS;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<Component> requirementText;

FallbackConfigScreen(Screen parent) {
FallbackConfigScreen(Screen parent, Collection<OptionalProvider> 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,19 @@

import net.minecraft.client.gui.screens.Screen;

import java.util.Collection;

final class FallbackConfigScreenProvider implements ConfigScreenProvider {

private final Collection<OptionalProvider> supportedProviders;

public FallbackConfigScreenProvider(Collection<OptionalProvider> supportedProviders) {
this.supportedProviders = supportedProviders;
}

@Override
public Screen getConfigScreen(Screen parent) {
return new FallbackConfigScreen(parent);
return new FallbackConfigScreen(parent, supportedProviders);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,5 @@

public interface OptionalProvider {
boolean isAvailable();
DependencyDescription getRequirement();
}
Loading