diff --git a/src/main/java/net/vulkanmod/config/api/VkModSettingsEntryBuilder.java b/src/main/java/net/vulkanmod/config/api/VkModSettingsEntryBuilder.java new file mode 100644 index 000000000..6550d3302 --- /dev/null +++ b/src/main/java/net/vulkanmod/config/api/VkModSettingsEntryBuilder.java @@ -0,0 +1,64 @@ +package net.vulkanmod.config.api; + +import net.minecraft.network.chat.FormattedText; +import net.minecraft.resources.Identifier; +import net.vulkanmod.config.api.page.VkPageOptionsBuilder; +import net.vulkanmod.config.api.page.VkPagesBuilder; +import net.vulkanmod.config.gui.ModSettingsEntry; +import net.vulkanmod.config.option.OptionPage; + +import java.util.List; +import java.util.function.Supplier; + +public class VkModSettingsEntryBuilder { + private FormattedText modName; + private Supplier iconSupplier; + private Supplier> optionPageSupplier; + private Runnable onApply; + private final VkPagesBuilder pageBuilder = new VkPagesBuilder(); + + private Supplier> getOptionPageSupplier() { + if (optionPageSupplier != null) { + return optionPageSupplier; + } + return this.pageBuilder::build; + } + + public VkModSettingsEntryBuilder setModName(FormattedText modName) { + this.modName = modName; + return this; + } + + public VkModSettingsEntryBuilder setIcon(Identifier icon) { + this.iconSupplier = () -> icon; + return this; + } + + public VkModSettingsEntryBuilder setIconSupplier(Supplier iconSupplier) { + this.iconSupplier = iconSupplier; + return this; + } + + public VkModSettingsEntryBuilder setOptionPageSupplier(Supplier> optionPageSupplier) { + this.optionPageSupplier = optionPageSupplier; + return this; + } + + public VkPageOptionsBuilder withPage(String name) { + return pageBuilder.withPage(name, this); + } + + public VkModSettingsEntryBuilder setOnApply(Runnable onApply) { + this.onApply = onApply; + return this; + } + + public ModSettingsEntry build() { + return new ModSettingsEntry( + modName, + iconSupplier, + getOptionPageSupplier(), + onApply + ); + } +} diff --git a/src/main/java/net/vulkanmod/config/api/VkModSettingsFactory.java b/src/main/java/net/vulkanmod/config/api/VkModSettingsFactory.java new file mode 100644 index 000000000..1e55fd7d3 --- /dev/null +++ b/src/main/java/net/vulkanmod/config/api/VkModSettingsFactory.java @@ -0,0 +1,7 @@ +package net.vulkanmod.config.api; + +import net.vulkanmod.config.gui.ModSettingsEntry; + +public interface VkModSettingsFactory { + ModSettingsEntry build(VkModSettingsEntryBuilder builder); +} diff --git a/src/main/java/net/vulkanmod/config/api/page/VkOptionsBuilder.java b/src/main/java/net/vulkanmod/config/api/page/VkOptionsBuilder.java new file mode 100644 index 000000000..fe57e4d69 --- /dev/null +++ b/src/main/java/net/vulkanmod/config/api/page/VkOptionsBuilder.java @@ -0,0 +1,30 @@ +package net.vulkanmod.config.api.page; + +import net.vulkanmod.config.option.Option; + +import java.util.ArrayList; +import java.util.List; + +public class VkOptionsBuilder { + private final VkPageOptionsBuilder parent; + private final List> options = new ArrayList<>(); + + public VkOptionsBuilder(VkPageOptionsBuilder parent) { + this.parent = parent; + } + + public VkOptionsBuilder addOption(Option option) { + options.add(option); + return this; + } + + public VkPageOptionsBuilder finish() { + return parent; + } + + public Option[] build() { + Option[] optionsArray = new Option[options.size()]; + options.toArray(optionsArray); + return optionsArray; + } +} diff --git a/src/main/java/net/vulkanmod/config/api/page/VkPageOptionsBuilder.java b/src/main/java/net/vulkanmod/config/api/page/VkPageOptionsBuilder.java new file mode 100644 index 000000000..68bf68466 --- /dev/null +++ b/src/main/java/net/vulkanmod/config/api/page/VkPageOptionsBuilder.java @@ -0,0 +1,39 @@ +package net.vulkanmod.config.api.page; + +import net.vulkanmod.config.api.VkModSettingsEntryBuilder; +import net.vulkanmod.config.gui.OptionBlock; + +import java.util.LinkedHashMap; +import java.util.Map; + +public class VkPageOptionsBuilder { + private final VkModSettingsEntryBuilder parent; + private final Map optionBlockBuilders = new LinkedHashMap<>(); + + public VkPageOptionsBuilder(VkModSettingsEntryBuilder parent) { + this.parent = parent; + } + + public VkOptionsBuilder withOptionBlock(String name) { + VkOptionsBuilder builder = new VkOptionsBuilder(this); + optionBlockBuilders.put(name, builder); + return builder; + } + + public VkModSettingsEntryBuilder finish() { + return parent; + } + + public OptionBlock[] build() { + final OptionBlock[] blocks = new OptionBlock[optionBlockBuilders.size()]; + int i = 0; + for (Map.Entry entry : optionBlockBuilders.entrySet()) { + blocks[i] = new OptionBlock( + entry.getKey(), + entry.getValue().build() + ); + i++; + } + return blocks; + } +} diff --git a/src/main/java/net/vulkanmod/config/api/page/VkPagesBuilder.java b/src/main/java/net/vulkanmod/config/api/page/VkPagesBuilder.java new file mode 100644 index 000000000..ffac98de2 --- /dev/null +++ b/src/main/java/net/vulkanmod/config/api/page/VkPagesBuilder.java @@ -0,0 +1,30 @@ +package net.vulkanmod.config.api.page; + +import net.vulkanmod.config.api.VkModSettingsEntryBuilder; +import net.vulkanmod.config.option.OptionPage; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class VkPagesBuilder { + private final Map pageBuilders = new LinkedHashMap<>(); + + public VkPageOptionsBuilder withPage(String name, VkModSettingsEntryBuilder parent) { + VkPageOptionsBuilder builder = new VkPageOptionsBuilder(parent); + pageBuilders.put(name, builder); + return builder; + } + + public List build() { + final List pages = new ArrayList<>(); + for (Map.Entry entry : pageBuilders.entrySet()) { + pages.add(new OptionPage( + entry.getKey(), + entry.getValue().build() + )); + } + return pages; + } +} diff --git a/src/main/java/net/vulkanmod/config/gui/ModSettingsRegistry.java b/src/main/java/net/vulkanmod/config/gui/ModSettingsRegistry.java index 1d1044a17..d76a93b04 100644 --- a/src/main/java/net/vulkanmod/config/gui/ModSettingsRegistry.java +++ b/src/main/java/net/vulkanmod/config/gui/ModSettingsRegistry.java @@ -1,16 +1,20 @@ package net.vulkanmod.config.gui; import it.unimi.dsi.fastutil.objects.ObjectArraySet; -import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.loader.api.entrypoint.EntrypointContainer; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; import net.minecraft.resources.Identifier; import net.vulkanmod.Initializer; +import net.vulkanmod.config.api.VkModSettingsEntryBuilder; +import net.vulkanmod.config.api.VkModSettingsFactory; import net.vulkanmod.config.option.Options; import java.util.Set; public class ModSettingsRegistry { + private static final String CONFIG_ENTRY_POINT_KEY = "vulkanmod:mod_settings_registry"; public static final ModSettingsRegistry INSTANCE = new ModSettingsRegistry(); @@ -22,6 +26,15 @@ public class ModSettingsRegistry { Options::getOptionPages, () -> Initializer.CONFIG.write()); this.addModEntry(vulkanModSettings); + + // build and add vulkanmod settings entrypoints + var entryPointContainers = FabricLoader.getInstance().getEntrypointContainers(CONFIG_ENTRY_POINT_KEY, VkModSettingsFactory.class); + for (EntrypointContainer entryPointContainer : entryPointContainers) { + VkModSettingsFactory modSettingsFactory = entryPointContainer.getEntrypoint(); + VkModSettingsEntryBuilder builder = new VkModSettingsEntryBuilder(); + + this.addModEntry(modSettingsFactory.build(builder)); + } } public void addModEntry(ModSettingsEntry entry) {