chore: merge breaking changes

This commit is contained in:
Johannes Frohnmeyer 2023-09-22 17:46:00 +02:00
commit ee554fe748
Signed by: Johannes
GPG Key ID: E76429612C2929F4
152 changed files with 1637 additions and 1361 deletions

View File

@ -6,8 +6,8 @@ allprojects {
group = "io.gitlab.jfronny.libjf"
}
val fabricVersion by extra("0.86.1+1.20.1")
val commonsVersion by extra("1.3-SNAPSHOT")
val fabricVersion by extra("0.87.1+1.20.2")
val commonsVersion by extra("1.4-SNAPSHOT")
val gsonCompileVersion by extra("1.3-SNAPSHOT")
val modmenuVersion by extra("7.2.1")
@ -15,8 +15,8 @@ val annotationsVersion by extra("24.0.1")
val javapoetVersion by extra("1.13.0")
jfMod {
minecraftVersion = "1.20.1"
yarn("build.10")
minecraftVersion = "23w33a"
yarn("build.7")
loaderVersion = "0.14.22"
modrinth {
@ -37,11 +37,18 @@ allprojects {
}
dependencies {
modLocalRuntime("com.terraformersmc:modmenu:$modmenuVersion") {
exclude("net.fabricmc") // required to work around duplicate fabric loaders
}
// Temporarily disabled since modmenu doesn't support snapshots
// modLocalRuntime("com.terraformersmc:modmenu:$modmenuVersion") {
// exclude("net.fabricmc") // required to work around duplicate fabric loaders
// }
modLocalRuntime(fabricApi.module("fabric-command-api-v2", fabricVersion))
compileOnly("io.gitlab.jfronny:commons:$commonsVersion")
compileOnly("io.gitlab.jfronny:commons-gson:$commonsVersion")
// temporary workaround for snapshot versions since these were previously provided by modmenu. Remove once out of use!
modLocalRuntime(fabricApi.module("fabric-resource-loader-v0", fabricVersion))
modLocalRuntime(fabricApi.module("fabric-lifecycle-events-v1", fabricVersion))
modLocalRuntime(fabricApi.module("fabric-screen-api-v1", fabricVersion))
modLocalRuntime(fabricApi.module("fabric-key-binding-api-v1", fabricVersion))
}
}

View File

@ -20,8 +20,8 @@ repositories {
and include LibJF modules like this:
```groovy
dependencies {
include modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v1:${project.libjf_version}")
include modRuntimeOnly("io.gitlab.jfronny.libjf:libjf-config-ui-tiny-v1:${project.libjf_version}")
include modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v2:${project.libjf_version}")
include modRuntimeOnly("io.gitlab.jfronny.libjf:libjf-config-ui-tiny:${project.libjf_version}")
include("io.gitlab.jfronny.libjf:libjf-base:${project.libjf_version}")
modLocalRuntime("io.gitlab.jfronny.libjf:libjf-config-reflect-v1:${project.libjf_version}")

View File

@ -6,14 +6,13 @@
- [libjf-base](./libjf-base.md)
- [Config](./config/README.md)
- [libjf-config-core-v1](./config/libjf-config-core-v1.md)
- [libjf-config-reflect-v1](./config/libjf-config-reflect-v1.md)
- [libjf-config-compiler-plugin](./config/libjf-config-compiler-plugin.md)
- [libjf-config-commands-v1](./config/libjf-config-commands-v1.md)
- [libjf-config-ui-tiny-v1](./config/libjf-config-ui-tiny-v1.md)
- [libjf-config-core-v2](./config/libjf-config-core-v2.md)
- [libjf-config-compiler-plugin-v2](./config/libjf-config-compiler-plugin-v2.md)
- [libjf-config-commands](./config/libjf-config-commands.md)
- [libjf-config-ui-tiny](./config/libjf-config-ui-tiny.md)
- [libjf-devutil](./libjf-devutil.md)
- [libjf-data-v0](./libjf-data-v0.md)
- [libjf-data-manipulation-v0](./libjf-data-manipulation-v0.md)
- [libjf-translate-v1](./libjf-translate-v1.md)
- [libjf-unsafe-v0](./libjf-unsafe-v0.md)
- [libjf-web-v0](./libjf-web-v0.md)
- [libjf-web-v1](./libjf-web-v1.md)

View File

@ -11,8 +11,8 @@ repositories {
}
dependencies {
include modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v1:${project.libjf_version}")
include modRuntimeOnly("io.gitlab.jfronny.libjf:libjf-config-ui-tiny-v1:${project.libjf_version}")
include modImplementation("io.gitlab.jfronny.libjf:libjf-config-core-v2:${project.libjf_version}")
include modRuntimeOnly("io.gitlab.jfronny.libjf:libjf-config-ui-tiny:${project.libjf_version}")
include("io.gitlab.jfronny.libjf:libjf-base:${project.libjf_version}")
annotationProcessor("io.gitlab.jfronny.libjf:libjf-config-compiler-plugin-v2:${project.libjf_version}")

View File

@ -1,4 +1,4 @@
# libjf-config-commands-v1
# libjf-config-commands
This serverside module provides commands for modifying configs using this library.
If you are developing a serverside mod, you may wish to include it to enable easier configuration.
The commands are available under `/libjf config`, using auto-complete is recommended.

View File

@ -1,4 +1,4 @@
# libjf-config-core-v1
# libjf-config-core-v2
The core module contains the abstractions and annotations used by other modules to interact with configs.
It also contains the code for registering configs to mods, serialization and automatic reloads on change.

View File

@ -1,8 +0,0 @@
# libjf-config-reflect-v1
This module uses reflection to register configs from files using the annotations as presented [here](./libjf-config-core-v1.md)
In order to register a config, simply add the class annotated as `@JfConfig` to the `libjf:config` entrypoint.
Please be aware that this module may load your config class before the game classes are available.
Using them there WILL result in problems!
Instead of using this implementation, you should use the [compiler plugin](./libjf-config-compiler-plugin-v2.md),
which removes the runtime overhead of this implementation.

View File

@ -1,4 +0,0 @@
# libjf-config-ui-tiny-v1
This module provides an automatically registered, TinyConfig-based UI for all mods using libjf-config.
Embedding this is recommended when developing client-side mods.
Manually generating config screens is also possible through `ConfigScreen.create(config, parent)`

View File

@ -0,0 +1,4 @@
# libjf-config-ui-tiny
This module provides an automatically registered, TinyConfig-based UI for all mods using libjf-config.
Embedding this is recommended when developing client-side mods.
libjf-config-ui-tiny implements the config-core-provided `ConfigScreenFactory`, so you can `ConfigScreenFactory.getInstance().create(config, parent).get()` to obtain a screen for your config.

View File

@ -1,7 +1,7 @@
# libjf-web-v0
libjf-web-v0 provides an HTTP web server you can use in your serverside (and technically also clientside) mods
# libjf-web-v1
libjf-web-v1 provides an HTTP web server you can use in your serverside (and technically also clientside) mods
to serve web content through a unified port.
libjf-web-v0 depends on libjf-config-v1 to provide its config, libjf-base, fabric-lifecycle-events-v1 and fabric-command-api-v1
libjf-web-v1 depends on libjf-config-core-v2 to provide its config, libjf-base, fabric-lifecycle-events-v1 and fabric-command-api-v1
### Getting started
Implement WebInit and register it as a libjf:web entrypoint. To enable the server, also add the following to your fabric.mod.json:

View File

@ -27,9 +27,8 @@ public class CoProcessManager implements ModInitializer {
}
private void stop() {
Iterator<CoProcess> procs = coProcesses.iterator();
while (procs.hasNext()) {
CoProcess coProcess = procs.next();
for (Iterator<CoProcess> iter = coProcesses.iterator(); iter.hasNext(); ) {
CoProcess coProcess = iter.next();
coProcess.stop();
if (coProcess instanceof Closeable cl) {
try {
@ -38,7 +37,7 @@ public class CoProcessManager implements ModInitializer {
LibJf.LOGGER.error("Could not close co-process", e);
}
}
procs.remove();
iter.remove();
}
}
}

View File

@ -5,12 +5,12 @@ plugins {
}
base {
archivesName.set("libjf-config-commands-v1")
archivesName.set("libjf-config-commands")
}
dependencies {
val fabricVersion: String by rootProject.extra
api(devProject(":libjf-base"))
api(devProject(":libjf-config-core-v1"))
api(devProject(":libjf-config-core-v2"))
include(modImplementation(fabricApi.module("fabric-command-api-v2", fabricVersion))!!)
}

View File

@ -8,11 +8,12 @@ import com.mojang.brigadier.exceptions.DynamicCommandExceptionType;
import io.gitlab.jfronny.commons.throwable.ThrowingRunnable;
import io.gitlab.jfronny.commons.throwable.ThrowingSupplier;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import java.util.function.Consumer;
@ -22,6 +23,12 @@ import static net.minecraft.server.command.CommandManager.argument;
import static net.minecraft.server.command.CommandManager.literal;
public class JfConfigCommand implements ModInitializer {
private static final String MOD_ID = "libjf-config-commands";
private MutableText text(String text) {
return Text.literal("[" + MOD_ID + "] " + text);
}
@Override
public void onInitialize() {
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> {
@ -29,25 +36,24 @@ public class JfConfigCommand implements ModInitializer {
LiteralArgumentBuilder<ServerCommandSource> c_config = literal("config")
.requires((serverCommandSource) -> serverCommandSource.hasPermissionLevel(4))
.executes(context -> {
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] Loaded configs for:"), false);
ConfigHolder.getInstance().getRegistered().forEach((s, config) -> {
context.getSource().sendFeedback(() -> Text.literal("- " + s), false);
});
MutableText text = text("Loaded configs for:");
ConfigHolder.getInstance().getRegistered().forEach((s, config) -> text.append("\n- " + s));
context.getSource().sendFeedback(() -> text, false);
return Command.SINGLE_SUCCESS;
});
LiteralArgumentBuilder<ServerCommandSource> c_reload = literal("reload").executes(context -> {
ConfigHolder.getInstance().getRegistered().forEach((mod, config) -> config.load());
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] Reloaded configs"), true);
context.getSource().sendFeedback(() -> text("Reloaded configs"), true);
return Command.SINGLE_SUCCESS;
});
LiteralArgumentBuilder<ServerCommandSource> c_reset = literal("reset").executes(context -> {
context.getSource().sendError(Text.literal("[libjf-config-v1] Please specify a config to reset"));
context.getSource().sendError(text("Please specify a config to reset"));
return Command.SINGLE_SUCCESS;
});
ConfigHolder.getInstance().getRegistered().forEach((id, config) -> {
c_reload.then(literal(id).executes(context -> {
config.load();
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] Reloaded config for " + id), true);
context.getSource().sendFeedback(() -> text("Reloaded config for " + id), true);
return Command.SINGLE_SUCCESS;
}));
registerEntries(config, id, c_config, c_reset, cns -> {
@ -63,7 +69,7 @@ public class JfConfigCommand implements ModInitializer {
private void registerEntries(ConfigCategory config, String subpath, LiteralArgumentBuilder<ServerCommandSource> c_config, LiteralArgumentBuilder<ServerCommandSource> c_reset, Function<Consumer<LiteralArgumentBuilder<ServerCommandSource>>, LiteralArgumentBuilder<ServerCommandSource>> pathGen) {
c_config.then(pathGen.apply(cns -> {
cns.executes(context -> {
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] " + subpath + " is a category"), false);
context.getSource().sendFeedback(() -> text(subpath + " is a category"), false);
return Command.SINGLE_SUCCESS;
});
for (EntryInfo<?> entry : config.getEntries()) {
@ -73,13 +79,13 @@ public class JfConfigCommand implements ModInitializer {
c_reset.then(pathGen.apply(cns -> {
cns.executes(context -> {
config.reset();
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] Reset config for " + subpath), true);
context.getSource().sendFeedback(() -> text("Reset config for " + subpath), true);
return Command.SINGLE_SUCCESS;
});
config.getPresets().forEach((id2, preset) -> {
cns.then(literal(id2).executes(context -> {
preset.run();
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] Loaded preset " + id2 + " for " + subpath), true);
context.getSource().sendFeedback(() -> text("Loaded preset " + id2 + " for " + subpath), true);
return Command.SINGLE_SUCCESS;
}));
});
@ -103,8 +109,8 @@ public class JfConfigCommand implements ModInitializer {
private <T> void registerEntry(ConfigCategory config, String subpath, LiteralArgumentBuilder<ServerCommandSource> cns, EntryInfo<T> entry) {
LiteralArgumentBuilder<ServerCommandSource> c_entry = literal(entry.getName()).executes(context -> {
String msg = "[libjf-config-v1] The value of " + subpath + "." + entry.getName() + " is " + tryRun(entry::getValue);
context.getSource().sendFeedback(() -> Text.literal(msg), false);
String msg = "The value of " + subpath + "." + entry.getName() + " is " + tryRun(entry::getValue);
context.getSource().sendFeedback(() -> text(msg), false);
return Command.SINGLE_SUCCESS;
});
ArgumentType<?> type = getType(entry);
@ -115,7 +121,7 @@ public class JfConfigCommand implements ModInitializer {
entry.setValue(value);
config.getRoot().write();
});
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] Set " + subpath + "." + entry.getName() + " to " + value), true);
context.getSource().sendFeedback(() -> text("Set " + subpath + "." + entry.getName() + " to " + value), true);
return Command.SINGLE_SUCCESS;
}));
}
@ -126,7 +132,7 @@ public class JfConfigCommand implements ModInitializer {
entry.setValue(enumConstant);
config.getRoot().write();
});
context.getSource().sendFeedback(() -> Text.literal("[libjf-config-v1] Set " + subpath + "." + entry.getName() + " to " + enumConstant), true);
context.getSource().sendFeedback(() -> text("Set " + subpath + "." + entry.getName() + " to " + enumConstant), true);
return Command.SINGLE_SUCCESS;
}));
}

View File

@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"id": "libjf-config-commands-v1",
"id": "libjf-config-commands",
"name": "LibJF Config Commands",
"version": "${version}",
"authors": ["JFronny"],
@ -20,7 +20,7 @@
"minecraft": "*",
"fabric-command-api-v2": "*",
"libjf-base": ">=${version}",
"libjf-config-core-v1": ">=${version}"
"libjf-config-core-v2": ">=${version}"
},
"custom": {
"modmenu": {

View File

@ -22,7 +22,7 @@ dependencies {
val annotationsVersion: String by rootProject.extra
val javapoetVersion: String by rootProject.extra
implementation("io.gitlab.jfronny.gson:gson-compile-processor-core:$gsonCompileVersion")
implementation(devProject(":libjf-config-core-v1"))
implementation(devProject(":libjf-config-core-v2"))
implementation("org.jetbrains:annotations:$annotationsVersion")
implementation("io.gitlab.jfronny:commons:$commonsVersion")
implementation("io.gitlab.jfronny:commons-gson:$commonsVersion")

View File

@ -4,9 +4,9 @@ import com.squareup.javapoet.*;
import io.gitlab.jfronny.commons.StringFormatter;
import io.gitlab.jfronny.gson.compile.processor.core.*;
import io.gitlab.jfronny.gson.reflect.TypeToken;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import javax.annotation.processing.*;
import javax.lang.model.SourceVersion;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.libjf.config.plugin.test;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import java.util.Map;

View File

@ -1,16 +0,0 @@
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;
@Deprecated
public interface ConfigScreenFactory<S extends Screen> {
static ConfigScreenFactory<?> getInstance() {
return ConfigScreenFactoryDiscovery.getConfigured();
}
S create(ConfigInstance config, Screen parent);
int getPriority();
}

View File

@ -1,29 +0,0 @@
package io.gitlab.jfronny.libjf.config.impl.ui;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory;
import net.minecraft.client.gui.screen.Screen;
public record ConfigScreenFactory1To2<S extends Screen>(io.gitlab.jfronny.libjf.config.api.v1.ui.ConfigScreenFactory<S> impl) implements ConfigScreenFactory<S, ConfigScreenFactory1To2.Built<S>> {
@Override
public Built<S> create(ConfigInstance config, Screen parent) {
return new Built<>(impl.create(config, parent));
}
@Override
public int getPriority() {
return impl.getPriority();
}
public record Built<S extends Screen>(S screen) implements ConfigScreenFactory.Built<S> {
@Override
public S get() {
return null;
}
@Override
public void onSave(Runnable action) {
throw new UnsupportedOperationException();
}
}
}

View File

@ -1,17 +0,0 @@
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 record ConfigScreenFactory2To1<S extends Screen, B extends io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory.Built<S>>(io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory<S, B> impl) implements ConfigScreenFactory<S> {
@Override
public S create(ConfigInstance config, Screen parent) {
return impl.create(config, parent).get();
}
@Override
public int getPriority() {
return impl.getPriority();
}
}

View File

@ -1,55 +0,0 @@
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;
import java.util.List;
public class ConfigScreenFactoryDiscovery {
private static ConfigScreenFactory<?> discovered1 = null;
private static io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory discovered2 = null;
@Deprecated
public static ConfigScreenFactory<?> getConfigured() {
if (discovered1 == null) {
List<Object> entrypoints = getEntrypoints();
discovered1 = entrypoints
.stream()
.filter(it -> it instanceof io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory<?,?>)
.map(it -> (io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory) it)
.max(Comparator.comparing(io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory::getPriority))
.<ConfigScreenFactory>map(ConfigScreenFactory2To1::new)
.orElseGet(() -> entrypoints
.stream()
.filter(it -> it instanceof ConfigScreenFactory<?>)
.map(it -> (ConfigScreenFactory) it)
.max(Comparator.comparing(ConfigScreenFactory::getPriority))
.orElseGet(() -> new ConfigScreenFactory2To1(new PlaceholderScreenFactory())));
}
return discovered1;
}
public static io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory<?, ?> getConfigured2() {
if (discovered2 == null) {
List<Object> entrypoints = getEntrypoints();
discovered2 = entrypoints
.stream()
.filter(it -> it instanceof io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory<?,?>)
.map(it -> (io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory) it)
.max(Comparator.comparing(io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory::getPriority))
.orElseGet(() -> entrypoints
.stream()
.filter(it -> it instanceof ConfigScreenFactory<?>)
.map(it -> (ConfigScreenFactory) it)
.<io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory>map(ConfigScreenFactory1To2::new)
.max(Comparator.comparing(io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory::getPriority))
.orElseGet(PlaceholderScreenFactory::new));
}
return discovered2;
}
private static List<Object> getEntrypoints() {
return FabricLoader.getInstance().getEntrypoints("libjf:config_screen", Object.class);
}
}

View File

@ -1,9 +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",
"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.",
"libjf-config-core-v1.edit": "Edit"
}

View File

@ -1,5 +0,0 @@
{
"libjf-config-core-v1.jfconfig.title": "LibJF Config",
"libjf-config-core-v1.jfconfig.watchForChanges": "Watch for changes",
"libjf-config-core-v1.jfconfig.watchForChanges.tooltip": "Automatically reload configs when they are changed"
}

View File

@ -5,7 +5,7 @@ plugins {
}
base {
archivesName.set("libjf-config-core-v1")
archivesName.set("libjf-config-core-v2")
}
dependencies {

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.libjf.config.api.v2.ui;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.ui.ConfigScreenFactoryDiscovery;
import net.minecraft.client.gui.screen.Screen;

View File

@ -0,0 +1,27 @@
package io.gitlab.jfronny.libjf.config.impl.ui;
import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory;
import net.fabricmc.loader.api.FabricLoader;
import java.util.Comparator;
import java.util.List;
public class ConfigScreenFactoryDiscovery {
private static ConfigScreenFactory<?, ?> discovered2 = null;
public static io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory<?, ?> getConfigured2() {
if (discovered2 == null) {
discovered2 = getEntrypoints()
.stream()
.filter(it -> it instanceof io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory<?,?>)
.<ConfigScreenFactory<?, ?>>map(it -> (ConfigScreenFactory<?, ?>) it)
.max(Comparator.comparing(io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory::getPriority))
.orElseGet(PlaceholderScreenFactory::new);
}
return discovered2;
}
private static List<Object> getEntrypoints() {
return FabricLoader.getInstance().getEntrypoints("libjf:config_screen", Object.class);
}
}

View File

@ -3,8 +3,8 @@ package io.gitlab.jfronny.libjf.config.impl.ui;
import com.terraformersmc.modmenu.api.ConfigScreenFactory;
import com.terraformersmc.modmenu.api.ModMenuApi;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import java.util.HashMap;

View File

@ -1,6 +1,5 @@
package io.gitlab.jfronny.libjf.config.impl.ui;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.text.Text;
@ -8,18 +7,14 @@ 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");
private final Text description = Text.translatable("libjf-config-core-v2.no-screen.description");
protected PlaceholderScreen(Screen parent) {
super(Text.translatable("libjf-config-core-v1.no-screen"));
super(Text.translatable("libjf-config-core-v2.no-screen"));
this.parent = parent;
}
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
renderBackground(context);
context.drawCenteredTextWithShadow(textRenderer, description, width / 2, (height - textRenderer.fontHeight) / 2, 0xFFFFFF);
super.render(context, mouseX, mouseY, delta);
addDrawable((context, mouseX, mouseY, delta) -> {
context.drawCenteredTextWithShadow(textRenderer, description, width / 2, (height - textRenderer.fontHeight) / 2, 0xFFFFFF);
});
}
@Override

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.libjf.config.impl.ui;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory;
import net.minecraft.client.gui.screen.Screen;

View File

@ -0,0 +1,12 @@
{
"libjf-config-core-v2.jfconfig.title": "LibJF Config",
"libjf-config-core-v2.jfconfig.watchForChanges": "Watch for changes",
"libjf-config-core-v2.jfconfig.watchForChanges.tooltip": "Automatically reload configs when they are changed",
"libjf-config-core-v2.presets": "Presets",
"libjf-config-core-v2.default": "Default",
"libjf-config-core-v2.see-also": "See also: %s",
"libjf-config-core-v2.reset": "Reset",
"libjf-config-core-v2.no-screen": "No screen",
"libjf-config-core-v2.no-screen.description": "No mod for rendering config UIs was discovered. Install LibJF to add one.",
"libjf-config-core-v2.edit": "Edit"
}

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import java.lang.annotation.*;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import io.gitlab.jfronny.libjf.LibJf;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.impl.ConfigHolderImpl;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import java.nio.file.Path;
import java.util.Optional;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import java.lang.annotation.*;

View File

@ -1,9 +1,7 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import io.gitlab.jfronny.gson.JsonElement;
import io.gitlab.jfronny.gson.JsonParseException;
import io.gitlab.jfronny.gson.stream.*;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import io.gitlab.jfronny.libjf.config.impl.dsl.DslEntryInfo;
import org.jetbrains.annotations.ApiStatus;
@ -58,19 +56,6 @@ public interface EntryInfo<T> {
*/
void fix();
/**
* Set this entry's value to that of the element
* @param element The element to read from
*/
@Deprecated
default void loadFromJson(JsonElement element) throws IllegalAccessException {
try {
loadFromJson(new JsonTreeReader(element));
} catch (IOException e) {
throw new JsonParseException("Could not read Json", e);
}
}
/**
* Set this entry's value to that of the element
* @param reader The reader to read from

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import java.lang.annotation.*;

View File

@ -1,6 +1,6 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.DSL;
/**
* The interface for entrypoints performing custom config registrations

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import java.lang.annotation.*;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1;
package io.gitlab.jfronny.libjf.config.api.v2;
import java.lang.annotation.*;

View File

@ -1,8 +1,9 @@
package io.gitlab.jfronny.libjf.config.api.v1.dsl;
package io.gitlab.jfronny.libjf.config.api.v2.dsl;
import io.gitlab.jfronny.commons.SamWithReceiver;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import org.jetbrains.annotations.ApiStatus;
import java.util.List;
@ -14,7 +15,7 @@ import java.util.function.Supplier;
* @param <Builder> The class implementing this builder
*/
public interface CategoryBuilder<Builder extends CategoryBuilder<Builder>> {
String CONFIG_PRESET_DEFAULT = "libjf-config-v1.default";
String CONFIG_PRESET_DEFAULT = ConfigCore.MOD_ID + ".default";
Builder setTranslationPrefix(String translationPrefix);
String getTranslationPrefix();

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.libjf.config.api.v1.dsl;
package io.gitlab.jfronny.libjf.config.api.v2.dsl;
import io.gitlab.jfronny.commons.SamWithReceiver;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import java.nio.file.Path;
import java.util.function.Consumer;

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.libjf.config.api.v1.dsl;
package io.gitlab.jfronny.libjf.config.api.v2.dsl;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.dsl.DSLImpl;
/**

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1.dsl;
package io.gitlab.jfronny.libjf.config.api.v2.dsl;
import io.gitlab.jfronny.gson.stream.JsonReader;

View File

@ -1,4 +1,4 @@
package io.gitlab.jfronny.libjf.config.api.v1.type;
package io.gitlab.jfronny.libjf.config.api.v2.type;
import org.jetbrains.annotations.Nullable;

View File

@ -1,9 +1,9 @@
package io.gitlab.jfronny.libjf.config.impl;
import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders;
import io.gitlab.jfronny.libjf.config.api.v1.Category;
import io.gitlab.jfronny.libjf.config.api.v1.JfConfig;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.Category;
import io.gitlab.jfronny.libjf.config.api.v2.JfConfig;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.gson.FabricLoaderGsonGenerator;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.metadata.CustomValue;

View File

@ -1,15 +1,17 @@
package io.gitlab.jfronny.libjf.config.impl;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.DSL;
public class ConfigCore {
public static final String MOD_ID = "libjf-config-core-v1";
public static final String MOD_ID = "libjf-config-core-v2";
public static final String MODULE_ID = "libjf:config";
public static boolean watchForChanges = true;
public static final ConfigInstance CONFIG_INSTANCE;
static {
ConfigHolder.getInstance().migrateFiles(MOD_ID);
CONFIG_INSTANCE = DSL.create(MOD_ID).register(builder -> builder
.value("watchForChanges", watchForChanges, () -> watchForChanges, b -> watchForChanges = b)
);

View File

@ -2,8 +2,8 @@ package io.gitlab.jfronny.libjf.config.impl;
import com.google.common.collect.ImmutableMap;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import net.fabricmc.loader.api.FabricLoader;
import org.jetbrains.annotations.ApiStatus;

View File

@ -3,10 +3,10 @@ package io.gitlab.jfronny.libjf.config.impl.dsl;
import io.gitlab.jfronny.commons.throwable.Coerce;
import io.gitlab.jfronny.gson.stream.JsonReader;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.Migration;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.Migration;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import java.util.*;
import java.util.function.Consumer;

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.libjf.config.impl.dsl;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.ConfigBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.ConfigBuilder;
import net.fabricmc.loader.api.FabricLoader;
import java.nio.file.Path;

View File

@ -1,9 +1,9 @@
package io.gitlab.jfronny.libjf.config.impl.dsl;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.ConfigBuilder;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.ConfigBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.DSL;
public class DSLImpl implements DSL {
@Override

View File

@ -4,7 +4,7 @@ import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders;
import io.gitlab.jfronny.gson.*;
import io.gitlab.jfronny.gson.stream.*;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe;
import io.gitlab.jfronny.libjf.config.impl.watch.JfConfigWatchService;

View File

@ -1,8 +1,8 @@
package io.gitlab.jfronny.libjf.config.impl.dsl;
import io.gitlab.jfronny.gson.stream.JsonReader;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.CategoryBuilder;
import org.jetbrains.annotations.ApiStatus;
import java.util.*;

View File

@ -1,8 +1,8 @@
package io.gitlab.jfronny.libjf.config.impl.dsl;
import io.gitlab.jfronny.gson.stream.JsonReader;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.CategoryBuilder;
import org.jetbrains.annotations.Nullable;
import java.nio.file.Path;

View File

@ -5,9 +5,9 @@ import io.gitlab.jfronny.commons.throwable.ThrowingConsumer;
import io.gitlab.jfronny.commons.throwable.ThrowingSupplier;
import io.gitlab.jfronny.gson.stream.*;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.Entry;
import io.gitlab.jfronny.libjf.config.api.v1.EntryInfo;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.Entry;
import io.gitlab.jfronny.libjf.config.api.v2.EntryInfo;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe;
import java.io.IOException;

View File

@ -1,8 +1,8 @@
package io.gitlab.jfronny.libjf.config.impl.entrypoint;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.JfCustomConfig;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v2.JfCustomConfig;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.DSL;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;

View File

@ -2,7 +2,7 @@ package io.gitlab.jfronny.libjf.config.impl.watch;
import io.gitlab.jfronny.commons.throwable.ThrowingRunnable;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder;
import net.fabricmc.loader.api.FabricLoader;
import java.io.IOException;

View File

@ -1,6 +1,7 @@
{
"schemaVersion": 1,
"id": "libjf-config-core-v1",
"id": "libjf-config-core-v2",
"provides": ["libjf-config-core-v1"],
"name": "LibJF Config",
"version": "${version}",
"authors": ["JFronny"],

View File

@ -1,15 +0,0 @@
import io.gitlab.jfronny.scripts.*
plugins {
id("jfmod.module")
}
base {
archivesName.set("libjf-config-reflect-v1")
}
dependencies {
api(devProject(":libjf-base"))
api(devProject(":libjf-unsafe-v0"))
api(devProject(":libjf-config-core-v1"))
}

View File

@ -1,10 +0,0 @@
package io.gitlab.jfronny.libjf.config.api.v1.reflect;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.ConfigBuilder;
import io.gitlab.jfronny.libjf.config.impl.reflect.ReflectiveConfigBuilderImpl;
public interface ReflectiveConfigBuilder extends ConfigBuilder.ConfigBuilderFunction {
static ReflectiveConfigBuilder of(String id, Class<?> klazz) {
return new ReflectiveConfigBuilderImpl(id, klazz);
}
}

View File

@ -1,84 +0,0 @@
package io.gitlab.jfronny.libjf.config.impl.reflect;
import io.gitlab.jfronny.commons.reflect.Reflect;
import io.gitlab.jfronny.commons.throwable.ThrowingConsumer;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.ConfigBuilder;
import io.gitlab.jfronny.libjf.config.api.v1.reflect.ReflectiveConfigBuilder;
import io.gitlab.jfronny.libjf.config.impl.AuxiliaryMetadata;
import io.gitlab.jfronny.libjf.config.impl.dsl.DslEntryInfo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Objects;
import java.util.function.Function;
public class ReflectiveConfigBuilderImpl implements ReflectiveConfigBuilder {
private final AuxiliaryMetadata rootMeta;
private final Class<?> rootClass;
private final Class<?> rootTweaker;
private final String id;
public ReflectiveConfigBuilderImpl(String id, Class<?> klazz) {
this.id = id;
this.rootClass = Objects.requireNonNull(klazz);
JfConfig annotation = klazz.getAnnotation(JfConfig.class);
rootTweaker = annotation.tweaker();
this.rootMeta = AuxiliaryMetadata.of(annotation).merge(AuxiliaryMetadata.forMod(id));
}
@Override
public ConfigBuilder<?> apply(ConfigBuilder<?> builder) {
return applyCategory(builder, rootClass, findTweaker(rootTweaker, ConfigBuilder.class), rootMeta);
}
private <T extends CategoryBuilder<?>> T applyCategory(T builder, Class<?> configClass, Function<T, T> tweaker, AuxiliaryMetadata meta) {
meta.applyTo(builder);
for (Field field : configClass.getFields()) {
if (field.isAnnotationPresent(Entry.class)) {
builder.value(DslEntryInfo.ofField(field));
}
}
for (Method method : configClass.getMethods()) {
try {
if (method.isAnnotationPresent(Preset.class)) {
builder.addPreset(builder.getTranslationPrefix() + method.getName(), ReflectiveConfigBuilderImpl.<ConfigCategory>staticToConsumer(configClass, method).addHandler(e -> LibJf.LOGGER.error("Could not apply preset", e)));
} else if (method.isAnnotationPresent(Verifier.class)) {
builder.addVerifier(ReflectiveConfigBuilderImpl.<ConfigCategory>staticToConsumer(configClass, method).addHandler(e -> LibJf.LOGGER.error("Could not run verifier", e)));
}
} catch (Throwable t) {
LibJf.LOGGER.error("Could not process method " + method.getName() + " of config class " + configClass.getName());
}
}
for (Class<?> categoryClass : configClass.getClasses()) {
if (categoryClass.isAnnotationPresent(Category.class)) {
Category annotation = categoryClass.getAnnotation(Category.class);
String name = categoryClass.getSimpleName();
name = Character.toLowerCase(name.charAt(0)) + name.substring(1); // camelCase
var categoryTweaker = findTweaker(annotation.tweaker(), CategoryBuilder.class);
builder.category(name, builder1 -> applyCategory(builder1, categoryClass, categoryTweaker, AuxiliaryMetadata.of(categoryClass.getAnnotation(Category.class))));
}
}
return tweaker.apply(builder);
}
private <T> Function<T, T> findTweaker(Class<?> targetClass, Class<T> tweakedClass) {
try {
return Objects.equals(targetClass, void.class)
? Function.identity()
: Reflect.staticFunction(targetClass, "tweak", tweakedClass, tweakedClass);
} catch (Throwable t) {
LibJf.LOGGER.error("Could not find tweaker " + targetClass + " for mod " + id, t);
return Function.identity();
}
}
public static <T> ThrowingConsumer<T, Throwable> staticToConsumer(Class<?> klazz, Method method) throws Throwable {
Runnable rn = Reflect.staticProcedure(klazz, method.getName());
return c -> rn.run();
}
}

View File

@ -1,37 +0,0 @@
package io.gitlab.jfronny.libjf.config.impl.reflect.entrypoint;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v1.reflect.ReflectiveConfigBuilder;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe;
import net.fabricmc.loader.api.FabricLoader;
import net.fabricmc.loader.api.entrypoint.EntrypointContainer;
import net.fabricmc.loader.api.entrypoint.PreLaunchEntrypoint;
public class JfConfigReflectSafe implements PreLaunchEntrypoint {
@Override
public void onPreLaunch() {
LibJf.setup();
for (EntrypointContainer<Object> config : FabricLoader.getInstance().getEntrypointContainers(ConfigCore.MODULE_ID, Object.class)) {
registerIfMissing(config.getProvider().getMetadata().getId(), config.getEntrypoint());
}
}
public static void registerIfMissing(String modId, Object config) {
if (JfConfigSafe.REGISTERED_MODS.add(modId)) {
ConfigHolder.getInstance().migrateFiles(modId);
if (config instanceof JfCustomConfig cfg) {
cfg.register(DSL.create(modId));
} else {
Class<?> klazz = config.getClass();
if (klazz.isAnnotationPresent(JfConfig.class)) {
DSL.create(modId).register(ReflectiveConfigBuilder.of(modId, klazz));
} else {
LibJf.LOGGER.error("Attempted to register improper config for mod " + modId + " (missing @JfConfig annotation or JfCustomConfig interface)");
}
}
}
}
}

View File

@ -1,16 +0,0 @@
package io.gitlab.jfronny.libjf.config.impl.reflect.entrypoint;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import io.gitlab.jfronny.libjf.unsafe.DynamicEntry;
import io.gitlab.jfronny.libjf.unsafe.UltraEarlyInit;
public class JfConfigUnsafe implements UltraEarlyInit {
@Override
public void init() {
DynamicEntry.execute(ConfigCore.MODULE_ID, Object.class,
s -> JfConfigReflectSafe.registerIfMissing(s.modId(), s.instance())
);
LibJf.LOGGER.info("Finished LibJF config entrypoint");
}
}

View File

@ -1,36 +0,0 @@
{
"schemaVersion": 1,
"id": "libjf-config-reflect-v1",
"name": "LibJF Config Reflect",
"version": "${version}",
"authors": ["JFronny"],
"contact": {
"email": "projects.contact@frohnmeyer-wds.de",
"homepage": "https://jfronny.gitlab.io",
"issues": "https://git.frohnmeyer-wds.de/JfMods/LibJF/issues",
"sources": "https://git.frohnmeyer-wds.de/JfMods/LibJF"
},
"license": "MIT",
"environment": "*",
"entrypoints": {
"libjf:preEarly": [
"io.gitlab.jfronny.libjf.config.impl.reflect.entrypoint.JfConfigUnsafe"
],
"preLaunch": [
"io.gitlab.jfronny.libjf.config.impl.reflect.entrypoint.JfConfigReflectSafe"
]
},
"depends": {
"fabricloader": ">=0.12.0",
"minecraft": "*",
"libjf-base": ">=${version}",
"libjf-unsafe-v0": ">=${version}",
"libjf-config-core-v1": ">=${version}"
},
"custom": {
"modmenu": {
"badges": ["library"],
"parent": "libjf"
}
}
}

View File

@ -1,57 +0,0 @@
package io.gitlab.jfronny.libjf.config.test.reflect;
import io.gitlab.jfronny.commons.serialize.gson.api.v1.Ignore;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import java.util.ArrayList;
import java.util.List;
@JfConfig(referencedConfigs = {"libjf-web-v0"}, tweaker = TestConfigTweaker.class)
public class TestConfig {
@Entry public static boolean disablePacks = false;
@Entry public static Boolean disablePacks2 = false;
@Entry public static int intTest = 20;
@Entry(min = -5, max = 12) public static int intTestB = 20;
@Entry(min = -6) public static float floatTest = -5;
@Entry(min = 2, max = 21) public static double doubleTest = 20;
@Entry public static String dieStr = "lolz";
@Entry @Ignore public static String guiOnlyStr = "lolz";
public static String gsonOnlyStr = "lolz";
@Entry public static Test enumTest = Test.Test;
@Entry public static List<String> stringList;
@Preset
public static void moskau() {
disablePacks = true;
disablePacks2 = true;
intTest = -5;
floatTest = -6;
doubleTest = 4;
dieStr = "Moskau";
}
@Verifier
public static void setIntTestIfDisable() {
if (disablePacks) intTest = 0;
}
@Verifier
public static void stringListVerifier() {
if (stringList == null) stringList = new ArrayList<>(List.of("Obama"));
}
public enum Test {
Test, ER
}
@Category
public static class Subcategory {
@Entry public static boolean boolInSub = false;
@Entry public static int intIbSub = 15;
@Category
public static class Inception {
@Entry public static Test yesEnum = Test.ER;
}
}
}

View File

@ -1,16 +0,0 @@
package io.gitlab.jfronny.libjf.config.test.reflect;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.ConfigBuilder;
import java.util.Objects;
public class TestConfigTweaker {
public static ConfigBuilder<?> tweak(ConfigBuilder<?> builder) {
if (!Objects.equals("libjf-config-reflect-v1-testmod", builder.getId())) throw new IllegalStateException("No!");
LibJf.LOGGER.info("Called config tweaker");
return builder.addMigration("joe", reader -> {
TestConfig.disablePacks = reader.nextBoolean();
});
}
}

View File

@ -1,15 +0,0 @@
{
"libjf-config-reflect-v1-testmod.jfconfig.title": "JfConfig example",
"libjf-config-reflect-v1-testmod.jfconfig.disablePacks": "Disable resource packs",
"libjf-config-reflect-v1-testmod.jfconfig.intTest": "Int Test",
"libjf-config-reflect-v1-testmod.jfconfig.decimalTest": "Decimal Test",
"libjf-config-reflect-v1-testmod.jfconfig.dieStr": "String Test",
"libjf-config-reflect-v1-testmod.jfconfig.gsonOnlyStr.tooltip": "George",
"libjf-config-reflect-v1-testmod.jfconfig.enumTest": "Enum Test",
"libjf-config-reflect-v1-testmod.jfconfig.enumTest.tooltip": "Enum Test Tooltip",
"libjf-config-reflect-v1-testmod.jfconfig.enum.Test.Test": "Test",
"libjf-config-reflect-v1-testmod.jfconfig.enum.Test.ER": "ER",
"libjf-config-reflect-v1-testmod.jfconfig.moskau": "Moskau",
"libjf-config-reflect-v1-testmod.jfconfig.stringList": "String list",
"libjf-config-reflect-v1-testmod.jfconfig.stringList.tooltip": "Tooltip of the String list"
}

View File

@ -1,17 +0,0 @@
{
"schemaVersion": 1,
"id": "libjf-config-reflect-v1-testmod",
"name": "LibJF Config Reflect",
"version": "1.0",
"environment": "*",
"entrypoints": {
"libjf:config": [
"io.gitlab.jfronny.libjf.config.test.reflect.TestConfig"
]
},
"custom": {
"modmenu": {
"parent": "libjf-testmod"
}
}
}

View File

@ -1,13 +0,0 @@
package io.gitlab.jfronny.libjf.config.api.v1.ui.tiny;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.TinyConfigScreenFactory;
import net.minecraft.client.gui.screen.Screen;
@Deprecated
public interface ConfigScreen {
TinyConfigScreenFactory FACTORY = new TinyConfigScreenFactory();
static Screen create(ConfigInstance config, Screen parent) {
return FACTORY.create(config, parent).get();
}
}

View File

@ -1,4 +0,0 @@
{
"libjf-config-ui-tiny-v1.entry.json.read.fail.title": "Could not read",
"libjf-config-ui-tiny-v1.entry.json.read.fail.description": "The given entry could not be stringified. Please edit the config manually"
}

View File

@ -1,22 +0,0 @@
{
"libjf-config-ui-tiny-v1-testmod.jfconfig.title": "JfConfig Tiny Example",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca1.title": "Category 1",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca1.tooltip": "This is category 1\nIt has an excessively long description to test multiline descriptions and wrapping, which are required for this to look good.\nThis is supported btw.",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca1.value1": "Value 1",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca1.doubleValue": "Double Value",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca2.title": "Category 2",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca2.tooltip": "This is category 2",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca2.value2": "Value 2",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca3.title": "Category 3",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca3.tooltip": "This is category 3",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca3.value3": "Value 3",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca4.title": "Category 4",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca4.tooltip": "This is category 4",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca4.value4": "Value 4",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca5.title": "Category 5",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca5.tooltip": "This is category 5",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca5.value5": "Value 5",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca6.title": "Category 6",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca6.tooltip": "This is category 6",
"libjf-config-ui-tiny-v1-testmod.jfconfig.ca6.value6": "Value 6"
}

View File

@ -5,12 +5,12 @@ plugins {
}
base {
archivesName.set("libjf-config-ui-tiny-v1")
archivesName.set("libjf-config-ui-tiny")
}
dependencies {
val fabricVersion: String by rootProject.extra
api(devProject(":libjf-base"))
api(devProject(":libjf-config-core-v1"))
api(devProject(":libjf-config-core-v2"))
include(fabricApi.module("fabric-resource-loader-v0", fabricVersion))
}

View File

@ -11,6 +11,7 @@ import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.util.NarratorManager;
import net.minecraft.client.util.SelectionManager;
import net.minecraft.client.util.math.Rect2i;
@ -283,7 +284,7 @@ public class EditorScreen extends ScreenWithSaveHook {
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
renderBackground(context);
super.render(context, mouseX, mouseY, delta);
if (subtitle == null) {
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, (HEADER_SIZE - textRenderer.fontHeight) / 2, 0xFFFFFF);
} else {
@ -292,9 +293,12 @@ public class EditorScreen extends ScreenWithSaveHook {
}
this.setFocused(null);
final int maxScroll = this.getMaxScroll();
final boolean showScrollbar = maxScroll > 0;
if (client.world == null) {
RenderSystem.setShaderColor(0.125f, 0.125f, 0.125f, 1.0f);
context.drawTexture(Screen.OPTIONS_BACKGROUND_TEXTURE, 0, HEADER_SIZE, width - SCROLLBAR_SIZE, height - FOOTER_SIZE + (int)scrollAmount, width - SCROLLBAR_SIZE, height - HEADER_SIZE - FOOTER_SIZE, 32, 32);
context.drawTexture(Screen.OPTIONS_BACKGROUND_TEXTURE, 0, HEADER_SIZE, showScrollbar ? width - SCROLLBAR_SIZE : width, height - FOOTER_SIZE + (int)scrollAmount, width - SCROLLBAR_SIZE, height - HEADER_SIZE - FOOTER_SIZE, 32, 32);
RenderSystem.setShaderColor(1.0f, 1.0f, 1.0f, 1.0f);
}
@ -307,20 +311,17 @@ public class EditorScreen extends ScreenWithSaveHook {
this.drawCursor(context, pageContent.position);
context.disableScissor();
int i = this.getScrollbarPositionX();
int j = i + 6;
int m;
if ((m = this.getMaxScroll()) > 0) {
int scrollbarX = this.getScrollbarPositionX();
int scrollbarXEnd = scrollbarX + 6;
if (showScrollbar) {
int n = (getViewportHeight() * getViewportHeight()) / getMaxPosition();
n = MathHelper.clamp(n, 32, getViewportHeight() - 8);
int o = (int)scrollAmount * (getViewportHeight() - n) / m + HEADER_SIZE;
int o = (int)scrollAmount * (getViewportHeight() - n) / maxScroll + HEADER_SIZE;
if (o < HEADER_SIZE) o = HEADER_SIZE;
context.fill(i, HEADER_SIZE, j, height - FOOTER_SIZE, 0xFF000000);
context.fill(i, o, j, o + n, 0xFF808080);
context.fill(i, o, j - 1, o + n - 1, 0xFFC0C0C0);
context.fill(scrollbarX, HEADER_SIZE, scrollbarXEnd, height - FOOTER_SIZE, 0xFF000000);
context.fill(scrollbarX, o, scrollbarXEnd, o + n, 0xFF808080);
context.fill(scrollbarX, o, scrollbarXEnd - 1, o + n - 1, 0xFFC0C0C0);
}
super.render(context, mouseX, mouseY, delta);
}
private void drawCursor(DrawContext context, Position position) {
@ -331,16 +332,13 @@ public class EditorScreen extends ScreenWithSaveHook {
}
private void drawSelection(DrawContext context, Rect2i[] selectionRectangles) {
RenderSystem.enableColorLogicOp();
RenderSystem.logicOp(GlStateManager.LogicOp.OR_REVERSE);
for (Rect2i rect2i : selectionRectangles) {
int i = rect2i.getX();
int j = rect2i.getY();
int k = i + rect2i.getWidth();
int l = j + rect2i.getHeight();
context.fill(i, j, k, l, 0xFF0000FF);
context.fill(RenderLayer.getGuiTextHighlight(), i, j, k, l, 0xFF0000FF);
}
RenderSystem.disableColorLogicOp();
}
private Position screenPositionToAbsolutePosition(Position position) {
@ -409,8 +407,8 @@ public class EditorScreen extends ScreenWithSaveHook {
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
setScrollAmount(scrollAmount - amount * textRenderer.fontHeight * 2);
public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) {
setScrollAmount(scrollAmount - verticalAmount * textRenderer.fontHeight * 2);
return true;
}

View File

@ -4,7 +4,6 @@ import net.minecraft.client.gui.*;
import net.minecraft.client.gui.navigation.GuiNavigation;
import net.minecraft.client.gui.navigation.GuiNavigationPath;
import net.minecraft.client.gui.screen.narration.NarrationMessageBuilder;
import net.minecraft.client.util.math.MatrixStack;
import org.jetbrains.annotations.Nullable;
public final class Placeholder<T extends Element & Selectable & Drawable> implements Element, Selectable, Drawable {
@ -63,8 +62,8 @@ public final class Placeholder<T extends Element & Selectable & Drawable> implem
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double amount) {
return child.mouseScrolled(mouseX, mouseY, amount);
public boolean mouseScrolled(double mouseX, double mouseY, double horizontalAmount, double verticalAmount) {
return child.mouseScrolled(mouseX, mouseY, horizontalAmount, verticalAmount);
}
@Override

View File

@ -2,8 +2,9 @@ package io.gitlab.jfronny.libjf.config.impl.ui.tiny;
import io.gitlab.jfronny.commons.throwable.Try;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.EntryListWidget;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.WidgetState;
@ -70,12 +71,6 @@ public class TinyConfigScreen extends ScreenWithSaveHook {
&& JfConfigSafe.TRANSLATION_SUPPLIER.apply(config.getTranslationPrefix() + "tooltip") == null;
}
@Override
public void tick() {
super.tick();
tabManager.tick();
}
@Override
protected void init() {
super.init();
@ -111,13 +106,13 @@ public class TinyConfigScreen extends ScreenWithSaveHook {
this.addDrawableChild(done);
if (tabs.size() == 1 && !config.getPresets().isEmpty()) {
this.addDrawableChild(ButtonWidget.builder(Text.translatable("libjf-config-v1.presets"),
this.addDrawableChild(ButtonWidget.builder(Text.translatable(ConfigCore.MOD_ID + ".presets"),
button -> Objects.requireNonNull(client).setScreen(new PresetsScreen(this, config, this::afterSelectPreset)))
.dimensions(4, 6, 80, 20)
.build());
}
this.addSelectableChild(this.placeholder);
this.addDrawableChild(this.placeholder);
// Sizing is also done in TinyConfigTab. Keep these in sync!
tabManager.setTabArea(new ScreenRect(0, 32, width, height - 68));
@ -167,8 +162,7 @@ public class TinyConfigScreen extends ScreenWithSaveHook {
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
this.renderBackground(context);
this.placeholder.render(context, mouseX, mouseY, delta);
super.render(context, mouseX, mouseY, delta);
if (tabs.size() == 1) context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 16 - textRenderer.fontHeight, 0xFFFFFF);
@ -192,7 +186,6 @@ public class TinyConfigScreen extends ScreenWithSaveHook {
}
}
}
super.render(context, mouseX, mouseY, delta);
}
@Override

View File

@ -2,10 +2,10 @@ package io.gitlab.jfronny.libjf.config.impl.ui.tiny;
import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v1.EntryInfo;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v2.EntryInfo;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.CategoryBuilder;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
@ -45,8 +45,8 @@ public class TinyConfigScreenFactory implements ConfigScreenFactory<Screen, Tiny
SystemToast.add(
MinecraftClient.getInstance().getToastManager(),
SystemToast.Type.PACK_LOAD_FAILURE,
Text.translatable("libjf-config-ui-tiny-v1.entry.json.write.fail.title"),
Text.translatable("libjf-config-ui-tiny-v1.entry.json.write.fail.description")
Text.translatable("libjf-config-ui-tiny.entry.json.write.fail.title"),
Text.translatable("libjf-config-ui-tiny.entry.json.write.fail.description")
);
}
}

View File

@ -1,8 +1,9 @@
package io.gitlab.jfronny.libjf.config.impl.ui.tiny;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigInstance;
import io.gitlab.jfronny.libjf.config.api.v1.ui.tiny.WidgetFactory;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigInstance;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.WidgetFactory;
import io.gitlab.jfronny.libjf.config.impl.entrypoint.JfConfigSafe;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.*;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.presets.PresetsScreen;
@ -40,7 +41,7 @@ public class TinyConfigTab implements Tab {
}
if (!isRoot && !config.getPresets().isEmpty()) {
this.list.addReference(Text.translatable("libjf-config-v1.presets"),
this.list.addReference(Text.translatable(ConfigCore.MOD_ID + ".presets"),
() -> new PresetsScreen(screen, config, screen::afterSelectPreset));
}
@ -51,7 +52,7 @@ public class TinyConfigTab implements Tab {
for (WidgetState<?> info : widgets) {
MutableText name = Text.translatable(config.getTranslationPrefix() + info.entry.getName());
WidgetFactory.Widget control = info.factory == null ? null : info.factory.build(screen, textRenderer);
ButtonWidget resetButton = ButtonWidget.builder(Text.translatable("libjf-config-v1.reset"), (button -> info.reset()))
ButtonWidget resetButton = ButtonWidget.builder(Text.translatable(ConfigCore.MOD_ID + ".reset"), (button -> info.reset()))
.dimensions(screen.width - 155, 0, 40, 20)
.build();
BooleanSupplier resetVisible = () -> {
@ -68,7 +69,7 @@ public class TinyConfigTab implements Tab {
}
for (ConfigInstance ci : config.getReferencedConfigs()) {
if (ci != null) {
this.list.addReference(Text.translatable("libjf-config-v1.see-also", TinyConfigScreen.getTitle(ci.getTranslationPrefix())),
this.list.addReference(Text.translatable(ConfigCore.MOD_ID + ".see-also", TinyConfigScreen.getTitle(ci.getTranslationPrefix())),
() -> new TinyConfigScreen(ci, screen));
}
}
@ -89,11 +90,6 @@ public class TinyConfigTab implements Tab {
list.refreshGrid(tabArea);
}
@Override
public void tick() {
Tab.super.tick();
}
public EntryListWidget getList() {
return list;
}

View File

@ -4,10 +4,9 @@ import io.gitlab.jfronny.commons.ref.R;
import io.gitlab.jfronny.commons.serialize.gson.api.v1.GsonHolders;
import io.gitlab.jfronny.commons.throwable.Try;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v1.EntryInfo;
import io.gitlab.jfronny.libjf.config.api.v1.type.Type;
import io.gitlab.jfronny.libjf.config.api.v1.ui.tiny.WidgetFactory;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v2.EntryInfo;
import io.gitlab.jfronny.libjf.config.api.v2.type.Type;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.EditorScreen;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@ -157,7 +156,7 @@ public class EntryInfoWidgetBuilder {
state.managedTemp = false;
state.tempValue = null;
return (screen, textRenderer) -> {
final ButtonWidget button = ButtonWidget.builder(Text.translatable("libjf-config-core-v1.edit"), $ -> {
final ButtonWidget button = ButtonWidget.builder(Text.translatable("libjf-config-core-v2.edit"), $ -> {
final String jsonified;
if (state.tempValue == null) {
try {
@ -167,8 +166,8 @@ public class EntryInfoWidgetBuilder {
SystemToast.add(
screen.getClient().getToastManager(),
SystemToast.Type.PACK_LOAD_FAILURE,
Text.translatable("libjf-config-ui-tiny-v1.entry.json.read.fail.title"),
Text.translatable("libjf-config-ui-tiny-v1.entry.json.read.fail.description")
Text.translatable("libjf-config-ui-tiny.entry.json.read.fail.title"),
Text.translatable("libjf-config-ui-tiny.entry.json.read.fail.description")
);
return;
}
@ -190,8 +189,8 @@ public class EntryInfoWidgetBuilder {
SystemToast.add(
screen.getClient().getToastManager(),
SystemToast.Type.PACK_LOAD_FAILURE,
Text.translatable("libjf-config-ui-tiny-v1.entry.json.write.fail.title"),
Text.translatable("libjf-config-ui-tiny-v1.entry.json.write.fail.description")
Text.translatable("libjf-config-ui-tiny.entry.json.write.fail.title"),
Text.translatable("libjf-config-ui-tiny.entry.json.write.fail.description")
);
state.tempValue = json;
}

View File

@ -27,7 +27,6 @@ public class EntryListWidget extends ElementListWidget<EntryListWidget.ConfigEnt
textRenderer = tr;
background = client.world == null;
setRenderBackground(background);
setRenderHorizontalShadows(background);
}
@Override

View File

@ -1,8 +1,6 @@
package io.gitlab.jfronny.libjf.config.api.v1.ui.tiny;
package io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.TinyConfigScreen;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.Reflowable;
import io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry.WidgetState;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.widget.ClickableWidget;

View File

@ -2,8 +2,7 @@ package io.gitlab.jfronny.libjf.config.impl.ui.tiny.entry;
import io.gitlab.jfronny.commons.ref.R;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.EntryInfo;
import io.gitlab.jfronny.libjf.config.api.v1.ui.tiny.WidgetFactory;
import io.gitlab.jfronny.libjf.config.api.v2.EntryInfo;
import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;

View File

@ -1,13 +1,13 @@
package io.gitlab.jfronny.libjf.config.impl.ui.tiny.presets;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigCategory;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigCategory;
import io.gitlab.jfronny.libjf.config.impl.ConfigCore;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.Text;
import java.util.Map;
@ -18,10 +18,9 @@ public class PresetsScreen extends Screen {
private final Screen parent;
private final ConfigCategory config;
private final Runnable afterSelect;
private PresetListWidget list;
public PresetsScreen(Screen parent, ConfigCategory config, Runnable afterSelect) {
super(Text.translatable("libjf-config-v1.presets"));
super(Text.translatable(ConfigCore.MOD_ID + ".presets"));
this.parent = parent;
this.config = config;
this.afterSelect = afterSelect;
@ -30,9 +29,9 @@ public class PresetsScreen extends Screen {
@Override
protected void init() {
super.init();
this.list = new PresetListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
PresetListWidget list = new PresetListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
for (Map.Entry<String, Runnable> entry : config.getPresets().entrySet()) {
this.list.addButton(ButtonWidget.builder(Text.translatable(entry.getKey()),
list.addButton(ButtonWidget.builder(Text.translatable(entry.getKey()),
button -> {
LibJf.LOGGER.info("Preset selected: " + entry.getKey());
entry.getValue().run();
@ -43,7 +42,7 @@ public class PresetsScreen extends Screen {
.dimensions(width / 2 - 100, 0, 200, 20)
.build());
}
this.addSelectableChild(this.list);
this.addDrawableChild(list);
}
@Override
@ -53,11 +52,7 @@ public class PresetsScreen extends Screen {
@Override
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
this.renderBackground(context);
this.list.render(context, mouseX, mouseY, delta);
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 16 - textRenderer.fontHeight / 2, 0xFFFFFF);
super.render(context, mouseX, mouseY, delta);
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 16 - textRenderer.fontHeight / 2, 0xFFFFFF);
}
}

View File

@ -0,0 +1,4 @@
{
"libjf-config-ui-tiny.entry.json.read.fail.title": "Could not read",
"libjf-config-ui-tiny.entry.json.read.fail.description": "The given entry could not be stringified. Please edit the config manually"
}

View File

@ -1,6 +1,6 @@
{
"schemaVersion": 1,
"id": "libjf-config-ui-tiny-v1",
"id": "libjf-config-ui-tiny",
"name": "LibJF Config UI: Tiny",
"version": "${version}",
"authors": ["JFronny"],
@ -20,7 +20,7 @@
"minecraft": "*",
"fabric-resource-loader-v0": "*",
"libjf-base": ">=${version}",
"libjf-config-core-v1": ">=${version}"
"libjf-config-core-v2": ">=${version}"
},
"custom": {
"modmenu": {

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.libjf.config.test.tiny;
import io.gitlab.jfronny.libjf.config.api.v1.JfCustomConfig;
import io.gitlab.jfronny.libjf.config.api.v1.dsl.DSL;
import io.gitlab.jfronny.libjf.config.api.v2.JfCustomConfig;
import io.gitlab.jfronny.libjf.config.api.v2.dsl.DSL;
public class TestConfig implements JfCustomConfig {
private int value1 = 0;

View File

@ -0,0 +1,38 @@
package io.gitlab.jfronny.libjf.config.test.tiny.mixin;
import io.gitlab.jfronny.libjf.config.api.v2.ConfigHolder;
import io.gitlab.jfronny.libjf.config.api.v2.ui.ConfigScreenFactory;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.option.OptionsScreen;
import net.minecraft.client.gui.widget.ButtonWidget;
import net.minecraft.client.gui.widget.GridWidget;
import net.minecraft.text.Text;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import java.util.function.Supplier;
@Mixin(OptionsScreen.class)
public abstract class OptionsScreenMixin extends Screen {
@Shadow @Final private Screen parent;
@Shadow protected abstract ButtonWidget createButton(Text message, Supplier<Screen> screenSupplier);
protected OptionsScreenMixin(Text title) {
super(title);
}
@Inject(method = "init()V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/GridWidget;refreshPositions()V"), locals = LocalCapture.CAPTURE_FAILHARD)
void injectButton(CallbackInfo ci, GridWidget gridWidget, GridWidget.Adder adder) {
ConfigHolder.getInstance().getRegistered().forEach((key, config) -> {
adder.add(
createButton(Text.translatable(key + ".jfconfig.title"), () -> ConfigScreenFactory.getInstance()
.create(config, this)
.get())
);
});
}
}

View File

@ -0,0 +1,22 @@
{
"libjf-config-ui-tiny-testmod.jfconfig.title": "JfConfig Tiny Example",
"libjf-config-ui-tiny-testmod.jfconfig.ca1.title": "Category 1",
"libjf-config-ui-tiny-testmod.jfconfig.ca1.tooltip": "This is category 1\nIt has an excessively long description to test multiline descriptions and wrapping, which are required for this to look good.\nThis is supported btw.",
"libjf-config-ui-tiny-testmod.jfconfig.ca1.value1": "Value 1",
"libjf-config-ui-tiny-testmod.jfconfig.ca1.doubleValue": "Double Value",
"libjf-config-ui-tiny-testmod.jfconfig.ca2.title": "Category 2",
"libjf-config-ui-tiny-testmod.jfconfig.ca2.tooltip": "This is category 2",
"libjf-config-ui-tiny-testmod.jfconfig.ca2.value2": "Value 2",
"libjf-config-ui-tiny-testmod.jfconfig.ca3.title": "Category 3",
"libjf-config-ui-tiny-testmod.jfconfig.ca3.tooltip": "This is category 3",
"libjf-config-ui-tiny-testmod.jfconfig.ca3.value3": "Value 3",
"libjf-config-ui-tiny-testmod.jfconfig.ca4.title": "Category 4",
"libjf-config-ui-tiny-testmod.jfconfig.ca4.tooltip": "This is category 4",
"libjf-config-ui-tiny-testmod.jfconfig.ca4.value4": "Value 4",
"libjf-config-ui-tiny-testmod.jfconfig.ca5.title": "Category 5",
"libjf-config-ui-tiny-testmod.jfconfig.ca5.tooltip": "This is category 5",
"libjf-config-ui-tiny-testmod.jfconfig.ca5.value5": "Value 5",
"libjf-config-ui-tiny-testmod.jfconfig.ca6.title": "Category 6",
"libjf-config-ui-tiny-testmod.jfconfig.ca6.tooltip": "This is category 6",
"libjf-config-ui-tiny-testmod.jfconfig.ca6.value6": "Value 6"
}

View File

@ -1,9 +1,10 @@
{
"schemaVersion": 1,
"id": "libjf-config-ui-tiny-v1-testmod",
"id": "libjf-config-ui-tiny-testmod",
"name": "LibJF Config UI: Tiny",
"version": "1.0",
"environment": "*",
"mixins": ["libjf-config-ui-tiny-testmod.mixins.json"],
"entrypoints": {
"libjf:config": [
"io.gitlab.jfronny.libjf.config.test.tiny.TestConfig"

View File

@ -0,0 +1,14 @@
{
"required": true,
"minVersion": "0.8",
"package": "io.gitlab.jfronny.libjf.config.test.tiny.mixin",
"compatibilityLevel": "JAVA_16",
"mixins": [
],
"client": [
"OptionsScreenMixin"
],
"injectors": {
"defaultRequire": 1
}
}

View File

@ -57,8 +57,8 @@ public class UserResourceEvents {
public static final Event<FindResource> FIND_RESOURCE = EventFactory.createArrayBacked(FindResource.class,
listeners -> (type, namespace, prefix, previous, pack) -> {
ResourcePack.ResultConsumer lazy = previous;
for (FindResource listener : listeners) {
lazy = listener.findResources(type, namespace, prefix, lazy, pack);
for (int i = listeners.length - 1; i >= 0; i--) {
lazy = listeners[i].findResources(type, namespace, prefix, lazy, pack);
}
return lazy;
});

View File

@ -0,0 +1,12 @@
plugins {
id("jfmod.module")
}
base {
archivesName.set("libjf-mainhttp-v0")
}
dependencies {
val fabricVersion: String by rootProject.extra
implementation(fabricApi.module("fabric-api-base", fabricVersion))
}

View File

@ -0,0 +1,11 @@
package io.gitlab.jfronny.libjf.mainhttp.api.v0;
import org.jetbrains.annotations.Nullable;
public interface MainHttpHandler {
default boolean isActive() {
return true;
}
byte @Nullable [] handle(byte[] request);
}

View File

@ -0,0 +1,17 @@
package io.gitlab.jfronny.libjf.mainhttp.api.v0;
import io.gitlab.jfronny.libjf.mainhttp.impl.MainHttp;
public interface ServerState {
static void onActivate(Runnable listener) {
MainHttp.ON_ACTIVATE.register(listener);
}
static boolean isActive() {
return !MainHttp.GAME_PORT.isEmpty();
}
static int getPort() {
return MainHttp.GAME_PORT.getTopmost();
}
}

Some files were not shown because too many files have changed in this diff Show More