Skip to content

Commit

Permalink
Implement Config Addons, Close shedaniel#908
Browse files Browse the repository at this point in the history
  • Loading branch information
shedaniel committed Jun 20, 2022
1 parent 1379931 commit 025fc75
Show file tree
Hide file tree
Showing 11 changed files with 485 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* This file is licensed under the MIT License, part of Roughly Enough Items.
* Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package me.shedaniel.rei.api.client.config.addon;

import net.minecraft.client.gui.screens.Screen;
import net.minecraft.network.chat.Component;
import org.jetbrains.annotations.ApiStatus;

/**
* A config addon, which will be shown in the REI config screen.
*
* @since 8.3
*/
@ApiStatus.Experimental
public interface ConfigAddon {
/**
* Returns the name of the addon, this will be shown in the addons list.
*
* @return the name of the addon
*/
Component getName();

/**
* Returns the description of the addon, this will be shown in the addons list.
*
* @return the description of the addon
*/
Component getDescription();

/**
* Opens the config screen for this addon, given the parent screen.
* Do not call {@link net.minecraft.client.Minecraft#setScreen(Screen)} directly,
* and make sure to set the screen as the parent screen to exit the config screen.
*
* @param parent the parent screen
*/
Screen createScreen(Screen parent);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* This file is licensed under the MIT License, part of Roughly Enough Items.
* Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package me.shedaniel.rei.api.client.config.addon;

import me.shedaniel.rei.api.client.plugins.REIClientPlugin;
import me.shedaniel.rei.api.common.plugins.PluginManager;
import me.shedaniel.rei.api.common.registry.Reloadable;
import org.jetbrains.annotations.ApiStatus;

/**
* Registry for {@link ConfigAddon}s.
* Registered config addons will show up at the top of the config screen,
* and allow users to search and configure them easily.
* <p>
* REI does not provide serialization for config addons,
* that is up to the developer to implement.
*
* @since 8.3
*/
@ApiStatus.Experimental
public interface ConfigAddonRegistry extends Reloadable<REIClientPlugin> {
/**
* @return the {@link PluginManager} instance
*/
static ConfigAddonRegistry getInstance() {
return PluginManager.getClientInstance().get(ConfigAddonRegistry.class);
}

/**
* Registers a config addon. The addons displayed will be sorted by their name alphabetically.
*
* @param addon the addon to register
*/
void register(ConfigAddon addon);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

package me.shedaniel.rei.api.client.plugins;

import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry;
import me.shedaniel.rei.api.client.entry.renderer.EntryRendererRegistry;
import me.shedaniel.rei.api.client.favorites.FavoriteEntryType;
import me.shedaniel.rei.api.client.registry.category.CategoryRegistry;
Expand Down Expand Up @@ -121,6 +122,17 @@ default void registerSubsets(SubsetsRegistry registry) {
default void registerTransferHandlers(TransferHandlerRegistry registry) {
}

/**
* Registers new config addons.
*
* @param registry the registry
* @since 8.3
*/
@ApiStatus.OverrideOnly
@ApiStatus.Experimental
default void registerConfigAddons(ConfigAddonRegistry registry) {
}

@Override
default Class<REIClientPlugin> getPluginProviderClass() {
return REIClientPlugin.class;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
import me.shedaniel.rei.impl.ClientInternals;
import me.shedaniel.rei.impl.client.REIRuntimeImpl;
import me.shedaniel.rei.impl.client.config.ConfigManagerImpl;
import me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl;
import me.shedaniel.rei.impl.client.entry.renderer.EntryRendererRegistryImpl;
import me.shedaniel.rei.impl.client.favorites.DelegatingFavoriteEntryProviderImpl;
import me.shedaniel.rei.impl.client.favorites.FavoriteEntryTypeRegistryImpl;
Expand Down Expand Up @@ -234,7 +235,8 @@ public Stream<CategoryIdentifier<?>> getCategories() {
new FavoriteEntryTypeRegistryImpl(),
new SubsetsRegistryImpl(),
new TransferHandlerRegistryImpl(),
new REIRuntimeImpl()), "clientPluginManager");
new REIRuntimeImpl(),
new ConfigAddonRegistryImpl()), "clientPluginManager");
}

public void onInitializeClient() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
import me.shedaniel.rei.RoughlyEnoughItemsCore;
import me.shedaniel.rei.api.client.REIRuntime;
import me.shedaniel.rei.api.client.config.ConfigManager;
import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry;
import me.shedaniel.rei.api.client.config.entry.EntryStackProvider;
import me.shedaniel.rei.api.client.favorites.FavoriteEntry;
import me.shedaniel.rei.api.client.gui.config.CheatingMode;
Expand All @@ -60,6 +61,7 @@
import me.shedaniel.rei.api.common.util.CollectionUtils;
import me.shedaniel.rei.api.common.util.ImmutableTextComponent;
import me.shedaniel.rei.impl.client.REIRuntimeImpl;
import me.shedaniel.rei.impl.client.config.addon.ConfigAddonRegistryImpl;
import me.shedaniel.rei.impl.client.config.entries.*;
import me.shedaniel.rei.impl.client.entry.filtering.FilteringRule;
import me.shedaniel.rei.impl.client.entry.filtering.rules.ManualFilteringRule;
Expand Down Expand Up @@ -376,6 +378,13 @@ public List<? extends NarratableEntry> narratables() {
builder.getOrCreateCategory(new TranslatableComponent("config.roughlyenoughitems.advanced")).getEntries().add(0, new PerformanceEntry(220));
}
return builder.setAfterInitConsumer(screen -> {
ConfigAddonRegistryImpl addonRegistry = (ConfigAddonRegistryImpl) ConfigAddonRegistry.getInstance();
if (!addonRegistry.getAddons().isEmpty()) {
((GlobalizedClothConfigScreen) screen).listWidget.children().add(0, (AbstractConfigEntry) new EmptyEntry(4));
ConfigAddonsEntry configAddonsEntry = new ConfigAddonsEntry(220);
configAddonsEntry.setScreen((AbstractConfigScreen) screen);
((GlobalizedClothConfigScreen) screen).listWidget.children().add(0, (AbstractConfigEntry) configAddonsEntry);
}
((GlobalizedClothConfigScreen) screen).listWidget.children().add(0, (AbstractConfigEntry) new EmptyEntry(4));
TextListEntry supportText = ConfigEntryBuilder.create().startTextDescription(
new TranslatableComponent("text.rei.support.me.desc",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
/*
* This file is licensed under the MIT License, part of Roughly Enough Items.
* Copyright (c) 2018, 2019, 2020, 2021, 2022 shedaniel
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/

package me.shedaniel.rei.impl.client.config.addon;

import me.shedaniel.rei.api.client.config.addon.ConfigAddon;
import me.shedaniel.rei.api.client.config.addon.ConfigAddonRegistry;
import me.shedaniel.rei.api.client.plugins.REIClientPlugin;

import java.util.ArrayList;
import java.util.List;

public class ConfigAddonRegistryImpl implements ConfigAddonRegistry {
private final List<ConfigAddon> addons = new ArrayList<>();

@Override
public void startReload() {
this.addons.clear();
}

@Override
public void register(ConfigAddon addon) {
this.addons.add(addon);
}

@Override
public void acceptPlugin(REIClientPlugin plugin) {
plugin.registerConfigAddons(this);
}

public List<ConfigAddon> getAddons() {
return this.addons;
}
}
Loading

0 comments on commit 025fc75

Please sign in to comment.