chore: clean up config modules

This commit is contained in:
Johannes Frohnmeyer 2023-08-30 14:14:20 +02:00
parent f03f1c306d
commit 09466ce897
Signed by: Johannes
GPG Key ID: E76429612C2929F4
94 changed files with 190 additions and 495 deletions

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,11 +6,10 @@
- [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)

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

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

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

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

@ -7,10 +7,10 @@ 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;
addDrawable((context, mouseX, mouseY, delta) -> {
context.drawCenteredTextWithShadow(textRenderer, description, width / 2, (height - textRenderer.fontHeight) / 2, 0xFFFFFF);

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;

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,10 +1,10 @@
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.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;

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,6 @@
{
"schemaVersion": 1,
"id": "libjf-config-core-v1",
"id": "libjf-config-core-v2",
"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,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,21 +0,0 @@
{
"libjf-config-ui-tiny-v1-testmod.jfconfig.title": "JfConfig 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.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

@ -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;
@ -98,7 +99,7 @@ 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());

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,7 +1,8 @@
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.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.*;
@ -46,14 +47,14 @@ public class TinyConfigTab implements Tab {
}
} else {
if (!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));
}
}
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 = () -> {
@ -70,7 +71,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));
}
}

View File

@ -4,9 +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.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;
@ -156,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 {
@ -166,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;
}
@ -189,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

@ -2,7 +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.v2.EntryInfo;
import net.minecraft.text.Text;
import org.jetbrains.annotations.Nullable;

View File

@ -1,7 +1,8 @@
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;
@ -19,7 +20,7 @@ public class PresetsScreen extends Screen {
private final Runnable afterSelect;
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;

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

@ -1,6 +1,6 @@
package io.gitlab.jfronny.libjf.config.test.tiny.mixin;
import io.gitlab.jfronny.libjf.config.api.v1.ConfigHolder;
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;

View File

@ -0,0 +1,21 @@
{
"libjf-config-ui-tiny-testmod.jfconfig.title": "JfConfig 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.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,10 +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-v1-testmod.mixins.json"],
"mixins": ["libjf-config-ui-tiny-testmod.mixins.json"],
"entrypoints": {
"libjf:config": [
"io.gitlab.jfronny.libjf.config.test.tiny.TestConfig"

View File

@ -10,5 +10,5 @@ base {
dependencies {
api(devProject(":libjf-base"))
api(devProject(":libjf-config-core-v1"))
api(devProject(":libjf-config-core-v2"))
}

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.libjf.translate.impl;
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.translate.api.TranslateService;
import io.gitlab.jfronny.libjf.translate.impl.google.GoogleTranslateService;
import io.gitlab.jfronny.libjf.translate.impl.libretranslate.LibreTranslateService;

View File

@ -11,7 +11,7 @@ base {
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))!!)
annotationProcessor(project(":libjf-config-compiler-plugin-v2"))

View File

@ -1,7 +1,7 @@
package io.gitlab.jfronny.libjf.web.impl;
import io.gitlab.jfronny.libjf.LibJf;
import io.gitlab.jfronny.libjf.config.api.v1.*;
import io.gitlab.jfronny.libjf.config.api.v2.*;
import java.io.IOException;
import java.net.ServerSocket;

View File

@ -23,7 +23,7 @@
"fabricloader": ">=0.12.0",
"minecraft": "*",
"libjf-base": ">=${version}",
"libjf-config-core-v1": ">=${version}",
"libjf-config-core-v2": ">=${version}",
"fabric-command-api-v2": "*"
},
"custom": {

View File

@ -14,10 +14,9 @@ rootProject.name = "libjf"
include("libjf-base")
include("libjf-config-core-v1")
include("libjf-config-reflect-v1")
include("libjf-config-commands-v1")
include("libjf-config-ui-tiny-v1")
include("libjf-config-core-v2")
include("libjf-config-commands")
include("libjf-config-ui-tiny")
include("libjf-data-v0")
include("libjf-data-manipulation-v0")
include("libjf-devutil")