Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<Identifier> iconSupplier;
private Supplier<List<OptionPage>> optionPageSupplier;
private Runnable onApply;
private final VkPagesBuilder pageBuilder = new VkPagesBuilder();

private Supplier<List<OptionPage>> 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<Identifier> iconSupplier) {
this.iconSupplier = iconSupplier;
return this;
}

public VkModSettingsEntryBuilder setOptionPageSupplier(Supplier<List<OptionPage>> 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
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package net.vulkanmod.config.api;

import net.vulkanmod.config.gui.ModSettingsEntry;

public interface VkModSettingsFactory {
ModSettingsEntry build(VkModSettingsEntryBuilder builder);
}
30 changes: 30 additions & 0 deletions src/main/java/net/vulkanmod/config/api/page/VkOptionsBuilder.java
Original file line number Diff line number Diff line change
@@ -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<Option<?>> options = new ArrayList<>();

public VkOptionsBuilder(VkPageOptionsBuilder parent) {
this.parent = parent;
}

public <T> VkOptionsBuilder addOption(Option<T> 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;
}
}
Original file line number Diff line number Diff line change
@@ -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<String, VkOptionsBuilder> 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<String, VkOptionsBuilder> entry : optionBlockBuilders.entrySet()) {
blocks[i] = new OptionBlock(
entry.getKey(),
entry.getValue().build()
);
i++;
}
return blocks;
}
}
30 changes: 30 additions & 0 deletions src/main/java/net/vulkanmod/config/api/page/VkPagesBuilder.java
Original file line number Diff line number Diff line change
@@ -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<String, VkPageOptionsBuilder> pageBuilders = new LinkedHashMap<>();

public VkPageOptionsBuilder withPage(String name, VkModSettingsEntryBuilder parent) {
VkPageOptionsBuilder builder = new VkPageOptionsBuilder(parent);
pageBuilders.put(name, builder);
return builder;
}

public List<OptionPage> build() {
final List<OptionPage> pages = new ArrayList<>();
for (Map.Entry<String, VkPageOptionsBuilder> entry : pageBuilders.entrySet()) {
pages.add(new OptionPage(
entry.getKey(),
entry.getValue().build()
));
}
return pages;
}
}
15 changes: 14 additions & 1 deletion src/main/java/net/vulkanmod/config/gui/ModSettingsRegistry.java
Original file line number Diff line number Diff line change
@@ -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();

Expand All @@ -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<VkModSettingsFactory> entryPointContainer : entryPointContainers) {
VkModSettingsFactory modSettingsFactory = entryPointContainer.getEntrypoint();
VkModSettingsEntryBuilder builder = new VkModSettingsEntryBuilder();

this.addModEntry(modSettingsFactory.build(builder));
}
}

public void addModEntry(ModSettingsEntry entry) {
Expand Down