[config] Framework for UI providers
ci/woodpecker/push/docs Pipeline was successful Details
ci/woodpecker/push/jfmod Pipeline failed Details

This commit is contained in:
Johannes Frohnmeyer 2023-01-21 12:32:49 +01:00
parent 3dd4e5f84f
commit fa2a152507
Signed by: Johannes
GPG Key ID: E76429612C2929F4
14 changed files with 118 additions and 13 deletions

View File

@ -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

View File

@ -6,4 +6,5 @@ base {
dependencies {
api(devProject(":libjf-base"))
modCompileOnly("com.terraformersmc:modmenu:${prop("modmenu_version")}")
}

View File

@ -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();
}

View File

@ -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;
}
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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."
}

View File

@ -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",

View File

@ -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")}")
}

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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"
}

View File

@ -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",