chore: merge breaking changes
This commit is contained in:
commit
ee554fe748
|
@ -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))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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}")
|
||||
|
|
|
@ -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)
|
|
@ -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}")
|
||||
|
|
|
@ -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.
|
|
@ -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.
|
||||
|
|
@ -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.
|
|
@ -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)`
|
|
@ -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.
|
|
@ -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:
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))!!)
|
||||
}
|
|
@ -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;
|
||||
}));
|
||||
}
|
|
@ -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": {
|
|
@ -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")
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -5,7 +5,7 @@ plugins {
|
|||
}
|
||||
|
||||
base {
|
||||
archivesName.set("libjf-config-core-v1")
|
||||
archivesName.set("libjf-config-core-v2")
|
||||
}
|
||||
|
||||
dependencies {
|
|
@ -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;
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
|
@ -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
|
|
@ -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;
|
||||
|
|
@ -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"
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.api.v1;
|
||||
package io.gitlab.jfronny.libjf.config.api.v2;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
|
@ -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;
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.api.v1;
|
||||
package io.gitlab.jfronny.libjf.config.api.v2;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
|
@ -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
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.api.v1;
|
||||
package io.gitlab.jfronny.libjf.config.api.v2;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
|
@ -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
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.api.v1;
|
||||
package io.gitlab.jfronny.libjf.config.api.v2;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package io.gitlab.jfronny.libjf.config.api.v1;
|
||||
package io.gitlab.jfronny.libjf.config.api.v2;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
|
@ -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();
|
|
@ -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;
|
|
@ -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;
|
||||
|
||||
/**
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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;
|
|
@ -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)
|
||||
);
|
|
@ -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;
|
||||
|
|
@ -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;
|
|
@ -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;
|
|
@ -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
|
|
@ -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;
|
||||
|
|
@ -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.*;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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;
|
|
@ -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"],
|
|
@ -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"))
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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)");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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))
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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
|
|
@ -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
|
|
@ -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")
|
||||
);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -27,7 +27,6 @@ public class EntryListWidget extends ElementListWidget<EntryListWidget.ConfigEnt
|
|||
textRenderer = tr;
|
||||
background = client.world == null;
|
||||
setRenderBackground(background);
|
||||
setRenderHorizontalShadows(background);
|
||||
}
|
||||
|
||||
@Override
|
|
@ -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;
|
||||
|
|
@ -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;
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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": {
|
|
@ -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;
|
|
@ -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())
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
|
@ -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"
|
||||
}
|
|
@ -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"
|
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
});
|
||||
|
|
|
@ -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))
|
||||
}
|
|
@ -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);
|
||||
}
|
|
@ -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
Loading…
Reference in New Issue