[config] Framework for UI providers
This commit is contained in:
parent
3dd4e5f84f
commit
fa2a152507
|
@ -1,7 +1,7 @@
|
|||
import io.gitlab.jfronny.scripts.*
|
||||
|
||||
plugins {
|
||||
id("jfmod") version "1.2-SNAPSHOT"
|
||||
id("jfmod") version "1.3-SNAPSHOT"
|
||||
}
|
||||
|
||||
val nonModSubprojects: List<String> by extra
|
||||
|
|
|
@ -6,4 +6,5 @@ base {
|
|||
|
||||
dependencies {
|
||||
api(devProject(":libjf-base"))
|
||||
modCompileOnly("com.terraformersmc:modmenu:${prop("modmenu_version")}")
|
||||
}
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
package io.gitlab.jfronny.libjf.config.api.v1.ui;
|
||||
|
||||
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
|
||||
import io.gitlab.jfronny.libjf.config.impl.ui.ConfigScreenFactoryDiscovery;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
|
||||
public interface ConfigScreenFactory<S extends Screen> {
|
||||
static ConfigScreenFactory<?> getInstance() {
|
||||
return ConfigScreenFactoryDiscovery.getConfigured();
|
||||
}
|
||||
|
||||
S create(ConfigInstance config, Screen parent);
|
||||
|
||||
int getPriority();
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
package io.gitlab.jfronny.libjf.config.impl.ui;
|
||||
|
||||
import io.gitlab.jfronny.libjf.config.api.v1.ui.ConfigScreenFactory;
|
||||
import net.fabricmc.loader.api.FabricLoader;
|
||||
|
||||
import java.util.Comparator;
|
||||
|
||||
public class ConfigScreenFactoryDiscovery {
|
||||
private static ConfigScreenFactory<?> discovered = null;
|
||||
|
||||
public static ConfigScreenFactory<?> getConfigured() {
|
||||
if (discovered == null) {
|
||||
discovered = FabricLoader.getInstance()
|
||||
.getEntrypoints("libjf:config_screen", ConfigScreenFactory.class)
|
||||
.stream()
|
||||
.max(Comparator.comparing(ConfigScreenFactory::getPriority))
|
||||
.orElse(new PlaceholderScreenFactory());
|
||||
}
|
||||
return discovered;
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.impl.ui.tiny;
|
||||
package io.gitlab.jfronny.libjf.config.impl.ui;
|
||||
|
||||
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
|
||||
import com.terraformersmc.modmenu.api.ModMenuApi;
|
||||
|
@ -21,6 +21,6 @@ public class ModMenuAdapter implements ModMenuApi {
|
|||
}
|
||||
|
||||
private static ConfigScreenFactory<?> buildFactory(ConfigInstance config) {
|
||||
return s -> new TinyConfigScreen(config, s);
|
||||
return s -> io.gitlab.jfronny.libjf.config.api.v1.ui.ConfigScreenFactory.getInstance().create(config, s);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,29 @@
|
|||
package io.gitlab.jfronny.libjf.config.impl.ui;
|
||||
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
import net.minecraft.client.util.math.MatrixStack;
|
||||
import net.minecraft.text.Text;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class PlaceholderScreen extends Screen {
|
||||
private final Screen parent;
|
||||
private final Text description = Text.translatable("libjf-config-core-v1.no-screen.description");
|
||||
|
||||
protected PlaceholderScreen(Screen parent) {
|
||||
super(Text.translatable("libjf-config-core-v1.no-screen"));
|
||||
this.parent = parent;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
|
||||
renderBackground(matrices);
|
||||
drawCenteredText(matrices, textRenderer, description, width / 2, (height - textRenderer.fontHeight) / 2, 0xFFFFFF);
|
||||
super.render(matrices, mouseX, mouseY, delta);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void close() {
|
||||
Objects.requireNonNull(client).setScreen(parent);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
package io.gitlab.jfronny.libjf.config.impl.ui;
|
||||
|
||||
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
|
||||
import io.gitlab.jfronny.libjf.config.api.v1.ui.ConfigScreenFactory;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
|
||||
public class PlaceholderScreenFactory implements ConfigScreenFactory<PlaceholderScreen> {
|
||||
@Override
|
||||
public PlaceholderScreen create(ConfigInstance config, Screen parent) {
|
||||
return new PlaceholderScreen(parent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return -100;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
{
|
||||
"libjf-config-v1.presets": "Presets",
|
||||
"libjf-config-v1.default": "Default",
|
||||
"libjf-config-v1.see-also": "See also: %s",
|
||||
"libjf-config-v1.reset": "Reset",
|
||||
"libjf-config-core-v1.no-screen": "No screen",
|
||||
"libjf-config-core-v1.no-screen.description": "No mod for rendering config UIs was discovered. Install LibJF to add one."
|
||||
}
|
|
@ -14,7 +14,9 @@
|
|||
"environment": "*",
|
||||
"entrypoints": {
|
||||
"preLaunch": ["io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe"],
|
||||
"libjf:coprocess": ["io.gitlab.jfronny.libjf.config.impl.JfConfigWatchService"]
|
||||
"libjf:coprocess": ["io.gitlab.jfronny.libjf.config.impl.JfConfigWatchService"],
|
||||
"libjf:config_screen": ["io.gitlab.jfronny.libjf.config.impl.ui.PlaceholderScreenFactory"],
|
||||
"modmenu": ["io.gitlab.jfronny.libjf.config.impl.ui.ModMenuAdapter"]
|
||||
},
|
||||
"depends": {
|
||||
"fabricloader": ">=0.12.0",
|
||||
|
|
|
@ -6,7 +6,6 @@ base {
|
|||
|
||||
dependencies {
|
||||
api(devProject(":libjf-base"))
|
||||
api(devProject(":libjf-config-core-v1"))
|
||||
api(project(":libjf-config-core-v1", "namedElements"))
|
||||
include(fabricApi.module("fabric-resource-loader-v0", prop("fabric_version")))
|
||||
modCompileOnly("com.terraformersmc:modmenu:${prop("modmenu_version")}")
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
|
|||
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.TinyConfigScreen;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
|
||||
@Deprecated
|
||||
public interface ConfigScreen {
|
||||
static Screen create(ConfigInstance config, Screen parent) {
|
||||
return new TinyConfigScreen(config, parent);
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
package io.gitlab.jfronny.libjf.config.impl.ui.tiny;
|
||||
|
||||
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
|
||||
import io.gitlab.jfronny.libjf.config.api.v1.ui.ConfigScreenFactory;
|
||||
import net.minecraft.client.gui.screen.Screen;
|
||||
|
||||
// IDEA doesn't like this, but it does work in practice
|
||||
public class TinyConfigScreenFactory implements ConfigScreenFactory<TinyConfigScreen> {
|
||||
@Override
|
||||
public TinyConfigScreen create(ConfigInstance config, Screen parent) {
|
||||
return new TinyConfigScreen(config, parent);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getPriority() {
|
||||
return 0;
|
||||
}
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
{
|
||||
"libjf-config-v1.presets": "Presets",
|
||||
"libjf-config-v1.default": "Default",
|
||||
"libjf-config-v1.see-also": "See also: %s",
|
||||
"libjf-config-v1.reset": "Reset"
|
||||
}
|
|
@ -13,7 +13,7 @@
|
|||
"license": "MIT",
|
||||
"environment": "client",
|
||||
"entrypoints": {
|
||||
"modmenu": ["io.gitlab.jfronny.libjf.config.impl.ui.tiny.ModMenuAdapter"]
|
||||
"libjf:config_screen": ["io.gitlab.jfronny.libjf.config.impl.ui.tiny.TinyConfigScreenFactory"]
|
||||
},
|
||||
"depends": {
|
||||
"fabricloader": ">=0.12.0",
|
||||
|
|
Loading…
Reference in New Issue