diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/AbstractEnchantConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/AbstractEnchantConfigGui.java index c1e57c6..ae04fb2 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/AbstractEnchantConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/AbstractEnchantConfigGui.java @@ -1,6 +1,7 @@ package xyz.alexcrea.cuanvil.gui.config; import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import com.github.stefvanschie.inventoryframework.pane.Orientable; import com.github.stefvanschie.inventoryframework.pane.OutlinePane; import com.github.stefvanschie.inventoryframework.pane.Pane; @@ -19,16 +20,40 @@ import java.util.Arrays; import java.util.Comparator; import java.util.List; +/** + * Abstract Global Config gui for enchantment setting configuration. + * @param Type of the factory of the type of setting the gui should edit. + */ public abstract class AbstractEnchantConfigGui extends ValueUpdatableGui { private final static Material SECONDARY_BACKGROUND_MATERIAL = Material.BLACK_STAINED_GLASS_PANE; - protected AbstractEnchantConfigGui(String title){ + private final Gui backGui; + + /** + * Constructor for a gui displaying available enchantment to edit a enchantment setting. + * @param title Title of the gui. + * @param backGui Gui to go back on click on the "back" button. + */ + protected AbstractEnchantConfigGui(String title, Gui backGui){ super(6, title, CustomAnvil.instance); + this.backGui = backGui; + } + /** + * Constructor for a gui displaying available enchantment to edit a enchantment setting. + * @param title Title of the gui. + */ + protected AbstractEnchantConfigGui(String title){ + this(title, MainConfigGui.INSTANCE); } - PatternPane backItems; + PatternPane backgroundItems; OutlinePane filledEnchant; + + // Why is called like it is rn + /** + * Initialise value updatable gui pattern + */ protected void init(){ // Back item panel Pattern pattern = new Pattern( @@ -39,25 +64,29 @@ public abstract class AbstractEnchantConfigGui bookItemFactoryList; + + /** + * Prepare enchantment config gui displayed items factory. + */ protected void prepareValues(){ bookItemFactoryList = new ArrayList<>(); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/BasicConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/BasicConfigGui.java index 8f1d1a5..7b39d8f 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/BasicConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/BasicConfigGui.java @@ -19,6 +19,9 @@ import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; import java.util.Collections; +/** + * Global config to edit basic basic settings. + */ public class BasicConfigGui extends ValueUpdatableGui { public final static BasicConfigGui INSTANCE = new BasicConfigGui(); @@ -27,12 +30,18 @@ public class BasicConfigGui extends ValueUpdatableGui { INSTANCE.init(); } + /** + * Constructor of this Global gui for basic settings. + */ private BasicConfigGui(){ super(3, "\u00A78Basic Config", CustomAnvil.instance); - } PatternPane pane; + + /** + * Initialise Basic gui + */ private void init(){ Pattern pattern = new Pattern( "000000000", @@ -58,6 +67,9 @@ public class BasicConfigGui extends ValueUpdatableGui { private IntSettingsGui.IntSettingFactory itemRenameCost; private IntSettingsGui.IntSettingFactory sacrificeIllegalEnchantCost; + /** + * Prepare basic gui displayed items factory and static items.. + */ protected void prepareValues(){ // limit repair item this.limitRepairFactory = BoolSettingsGui.boolFactory("\u00A78Limit Repair Cost ?",this, diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/EnchantCostConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/EnchantCostConfigGui.java index 1f6ee75..b5a2a50 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/EnchantCostConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/EnchantCostConfigGui.java @@ -10,11 +10,14 @@ import xyz.alexcrea.cuanvil.enchant.EnchantmentProperties; import xyz.alexcrea.cuanvil.enchant.EnchantmentRarity; import xyz.alexcrea.cuanvil.gui.config.settings.EnchantCostSettingsGui; import xyz.alexcrea.cuanvil.gui.util.GuiGlobalItems; -import xyz.alexcrea.cuanvil.util.StringUtil; +import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Arrays; import java.util.Locale; +/** + * Global Config gui for enchantment cost settings. + */ public class EnchantCostConfigGui extends AbstractEnchantConfigGui { private final static String SECTION_NAME = "enchant_values"; @@ -25,6 +28,9 @@ public class EnchantCostConfigGui extends AbstractEnchantConfigGui { private final static String SECTION_NAME = "enchant_limits"; @@ -20,6 +23,9 @@ public class EnchantLimitConfigGui extends AbstractEnchantConfigGui + *
  • S: save setting button.
  • + *
  • B: "back to previous gui" button.
  • + *
  • 0: default background item.
  • + * + * @return The gui's pattern. + */ protected abstract Pattern getGuiPattern(); + /** + * Called when the associated setting need to be saved. + * @return true if the save was successful. false otherwise + */ public abstract boolean onSave(); + /** + * If this function return true + * the gui assume the associated setting can be saved. + * @return true if there is a change to the setting. false otherwise + */ public abstract boolean hadChange(); - + /** + * Most of the time a setting gui will be called from a global gui. + *

    + * It is better to keep a factory that hold setting data than find what parameters to use every time. + */ public abstract static class SettingGuiFactory{ protected String configPath; protected ConfigHolder config; + /** + * Constructor for settings gui factory + * @param configPath Configuration path of this setting. + * @param config Configuration holder of this setting. + */ protected SettingGuiFactory(String configPath, ConfigHolder config){ this.configPath = configPath; this.config = config; } + /** + * @return Configuration path of this setting. + */ public String getConfigPath() { return configPath; } + /** + * @return Configuration holder of this setting. + */ public ConfigHolder getConfigHolder() { return config; } + /** + * Create a gui using setting parameters and current setting value. + * @return A new instance of the implemented setting gui. + */ public abstract AbstractSettingGui create(); } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/BoolSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/BoolSettingsGui.java index 793b171..d3c56be 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/BoolSettingsGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/BoolSettingsGui.java @@ -17,14 +17,22 @@ import xyz.alexcrea.cuanvil.util.MetricsUtil; import java.util.Collections; import java.util.function.Consumer; +/** + * An instance of a gui used to edit a boolean setting. + */ public class BoolSettingsGui extends AbstractSettingGui{ private final BoolSettingFactory holder; private final boolean before; private boolean now; + /** + * Create a boolean setting config gui. + * @param holder Configuration factory of this setting. + * @param now The defined value of this setting. + */ protected BoolSettingsGui(BoolSettingFactory holder, boolean now) { - super(3, holder.title, holder.parent); + super(3, holder.getTitle(), holder.parent); this.holder = holder; this.before = now; this.now = now; @@ -42,7 +50,12 @@ public class BoolSettingsGui extends AbstractSettingGui{ "B0000000S" ); } - GuiItem returnToDefault; + + protected GuiItem returnToDefault; + + /** + * Prepare "return to default value" gui item. + */ protected void prepareReturnToDefault(){ ItemStack item = new ItemStack(Material.COMMAND_BLOCK); ItemMeta meta = item.getItemMeta(); @@ -58,8 +71,10 @@ public class BoolSettingsGui extends AbstractSettingGui{ }, CustomAnvil.instance); } + /** + * Update item using the setting value to match the new value + */ protected void updateValueDisplay(){ - PatternPane pane = getPane(); // Get displayed value for this config. @@ -93,6 +108,9 @@ public class BoolSettingsGui extends AbstractSettingGui{ } + /** + * @return A consumer to update the current setting's value. + */ protected Consumer inverseNowConsumer(){ return event->{ event.setCancelled(true); @@ -118,6 +136,15 @@ public class BoolSettingsGui extends AbstractSettingGui{ return now != before; } + /** + * Create a bool setting factory from setting's parameters. + * @param title The title of the gui. + * @param parent Parent gui to go back when completed. + * @param configPath Configuration path of this setting. + * @param config Configuration holder of this setting. + * @param defaultVal Default value if not found on the config. + * @return A factory for a boolean setting gui. + */ public static BoolSettingFactory boolFactory(@NotNull String title, ValueUpdatableGui parent, String configPath, ConfigHolder config, boolean defaultVal){ @@ -127,11 +154,21 @@ public class BoolSettingsGui extends AbstractSettingGui{ defaultVal); } - + /** + * A factory for a boolean setting gui that hold setting's information. + */ public static class BoolSettingFactory extends SettingGuiFactory{ @NotNull String title; ValueUpdatableGui parent; boolean defaultVal; + /** + * Constructor for a boolean setting gui factory. + * @param title The title of the gui. + * @param parent Parent gui to go back when completed. + * @param configPath Configuration path of this setting. + * @param config Configuration holder of this setting. + * @param defaultVal Default value if not found on the config. + */ protected BoolSettingFactory( @NotNull String title, ValueUpdatableGui parent, String configPath, ConfigHolder config, @@ -143,18 +180,24 @@ public class BoolSettingsGui extends AbstractSettingGui{ this.defaultVal = defaultVal; } + /** + * @return Get setting's gui title. + */ @NotNull public String getTitle() { return title; } + /** + * @return The configured value for the associated setting. + */ public boolean getConfiguredValue(){ return this.config.getConfig().getBoolean(this.configPath, this.defaultVal); } @Override public AbstractSettingGui create() { - // Get value or default + // Get current value or default boolean now = getConfiguredValue(); // create new gui return new BoolSettingsGui(this, now); diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java index bd70b64..200323d 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/EnchantCostSettingsGui.java @@ -19,6 +19,10 @@ import xyz.alexcrea.cuanvil.util.MetricsUtil; import java.util.Arrays; import java.util.function.Consumer; +/** + * An instance of a gui used to edit an enchantment cost setting. + * May be considered as a 2 int setting. + */ public class EnchantCostSettingsGui extends IntSettingsGui { protected final static String ITEM_PATH = ".item"; @@ -27,6 +31,11 @@ public class EnchantCostSettingsGui extends IntSettingsGui { private int beforeBook; private int nowBook; + /** + * Create an enchantment cost setting config gui. + * @param holder Configuration factory of this setting. + * @param nowItem The defined value of this setting item's value. + */ protected EnchantCostSettingsGui(EnchantCostSettingFactory holder, int nowItem) { super(holder, nowItem); @@ -35,6 +44,11 @@ public class EnchantCostSettingsGui extends IntSettingsGui { initStaticItem(); } + /** + * Initialise step items. + * Also bypassed init sequence to initialise books value + * as it used as one of the first call from the init sequence of the gui + */ @Override protected void initStepsValue() { super.initStepsValue(); @@ -53,6 +67,9 @@ public class EnchantCostSettingsGui extends IntSettingsGui { ); } + /** + * Initialise item that should not be updated late. + */ private void initStaticItem() { PatternPane pane = getPane(); @@ -166,6 +183,10 @@ public class EnchantCostSettingsGui extends IntSettingsGui { } + /** + * @param planned Value to change current book cost setting to. + * @return A consumer to update the current book cost setting's value. + */ protected Consumer updateNowBookConsumer(int planned){ return event->{ event.setCancelled(true); @@ -197,21 +218,55 @@ public class EnchantCostSettingsGui extends IntSettingsGui { return super.hadChange() || nowBook != beforeBook; } - public static EnchantCostSettingFactory enchFactory(@NotNull String title, ValueUpdatableGui parent, - String configPath, ConfigHolder config, - int min, int max, int defaultItemVal, int defaultBookVal, - int... steps){ + /** + * Create an int setting factory from setting's parameters. + * @param title The title of the gui. + * @param parent Parent gui to go back when completed. + * @param configPath Configuration path of this setting. + * @param config Configuration holder of this setting. + * @param min Minimum value of this setting. + * @param max Maximum value of this setting. + * @param defaultItemVal Default item value if not found on the config. + * @param defaultBookVal Default book value if not found on the config. + * @param steps List of step the value can increment/decrement. + * List's size should be between 1 (included) and 3 (included). + * it is visually preferable to have an odd number of step. + * If step only contain 1 value, no step item should be displayed. + * @return A factory for an enchant cost setting gui. + */ + public static EnchantCostSettingFactory enchantCostFactory( + @NotNull String title, ValueUpdatableGui parent, + String configPath, ConfigHolder config, + int min, int max, int defaultItemVal, int defaultBookVal, + int... steps){ return new EnchantCostSettingFactory( title,parent, configPath, config, min, max, defaultItemVal, defaultBookVal, steps); } - + /** + * A factory for an enchantment cost setting gui that hold setting's information. + */ public static class EnchantCostSettingFactory extends IntSettingsGui.IntSettingFactory { int defaultBookVal; + /** + * Constructor for an enchantment cost setting gui factory. + * @param title The title of the gui. + * @param parent Parent gui to go back when completed. + * @param configPath Configuration path of this setting. + * @param config Configuration holder of this setting. + * @param min Minimum value of this setting. + * @param max Maximum value of this setting. + * @param defaultItemVal Default item value if not found on the config. + * @param defaultBookVal Default book value if not found on the config. + * @param steps List of step the value can increment/decrement. + * List's size should be between 1 (included) and 3 (included). + * it is visually preferable to have an odd number of step. + * If step only contain 1 value, no step item should be displayed. + */ protected EnchantCostSettingFactory( @NotNull String title, ValueUpdatableGui parent, String configPath, ConfigHolder config, @@ -224,16 +279,17 @@ public class EnchantCostSettingsGui extends IntSettingsGui { this.defaultBookVal = defaultBookVal; } - @NotNull - public String getTitle() { - return title; - } - + /** + * @return The configured value for the enchant setting item value. + */ @Override public int getConfiguredValue() { return this.config.getConfig().getInt(this.configPath+ITEM_PATH, this.defaultVal); } + /** + * @return The configured value for the enchant setting book value. + */ public int getConfiguredBookValue(){ return this.config.getConfig().getInt(this.configPath+BOOK_PATH, this.defaultBookVal); } @@ -248,5 +304,4 @@ public class EnchantCostSettingsGui extends IntSettingsGui { } -} - +} \ No newline at end of file diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java index ef3c7e6..f8ef20a 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java @@ -19,6 +19,9 @@ import java.util.Collections; import java.util.List; import java.util.function.Consumer; +/** + * An instance of a gui used to edit an int setting. + */ public class IntSettingsGui extends AbstractSettingGui{ protected final IntSettingFactory holder; @@ -26,8 +29,13 @@ public class IntSettingsGui extends AbstractSettingGui{ protected int now; protected int step; + /** + * Create an int setting config gui. + * @param holder Configuration factory of this setting. + * @param now The defined value of this setting. + */ protected IntSettingsGui(IntSettingFactory holder, int now) { - super(3, holder.title, holder.parent); + super(3, holder.getTitle(), holder.parent); assert holder.steps.length > 0 && holder.steps.length <= 9; this.holder = holder; this.before = now; @@ -50,6 +58,9 @@ public class IntSettingsGui extends AbstractSettingGui{ } protected GuiItem returnToDefault; + /** + * Prepare "return to default value" gui item. + */ protected void prepareReturnToDefault(){ ItemStack item = new ItemStack(Material.COMMAND_BLOCK); ItemMeta meta = item.getItemMeta(); @@ -65,6 +76,9 @@ public class IntSettingsGui extends AbstractSettingGui{ }, CustomAnvil.instance); } + /** + * Update item using the setting value to match the new value. + */ protected void updateValueDisplay(){ PatternPane pane = getPane(); @@ -123,6 +137,10 @@ public class IntSettingsGui extends AbstractSettingGui{ } + /** + * @param planned Value to change current setting to. + * @return A consumer to update the current setting's value. + */ protected Consumer updateNowConsumer(int planned){ return event->{ event.setCancelled(true); @@ -132,6 +150,9 @@ public class IntSettingsGui extends AbstractSettingGui{ }; } + /** + * Initialise step items. + */ protected void initStepsValue(){ // Put background glass on the background of 'a' to 'b' GuiItem background = GuiGlobalItems.backgroundItem(); @@ -143,11 +164,15 @@ public class IntSettingsGui extends AbstractSettingGui{ // Then update legit step values updateStepValue(); } + + /** + * Update steps items value. + */ protected void updateStepValue(){ if(holder.steps.length <= 1) return; // We assume steps have a length of 2k+1 cause its more pretty char val = getMidStepChar(); - // Offset + // Offset to start (not the best way to do it) val -= (char) ((holder.steps.length-1)/2); // Then place items @@ -158,10 +183,19 @@ public class IntSettingsGui extends AbstractSettingGui{ } + /** + * Step use lower case character from 'a' to a certain char. + * @return The middle value of the character set for steps. + */ protected char getMidStepChar(){ return 'e'; } + /** + * Create a step item from a step value. + * @param stepIndex the index of the step item. + * @return A step item corresponding to its index value. + */ protected GuiItem stepGuiItem(int stepIndex){ int stepValue = holder.steps[stepIndex]; @@ -194,6 +228,10 @@ public class IntSettingsGui extends AbstractSettingGui{ return new GuiItem(item, clickEvent, CustomAnvil.instance); } + /** + * @param stepValue Value to change current step to. + * @return A consumer to update the current step of this setting. + */ protected Consumer updateStepValue(int stepValue){ return event -> { event.setCancelled(true); @@ -220,6 +258,21 @@ public class IntSettingsGui extends AbstractSettingGui{ return now != before; } + /** + * Create an int setting factory from setting's parameters. + * @param title The title of the gui. + * @param parent Parent gui to go back when completed. + * @param configPath Configuration path of this setting. + * @param config Configuration holder of this setting. + * @param min Minimum value of this setting. + * @param max Maximum value of this setting. + * @param defaultVal Default value if not found on the config. + * @param steps List of step the value can increment/decrement. + * List's size should be between 1 (included) and 5 (included). + * it is visually preferable to have an odd number of step. + * If step only contain 1 value, no step item should be displayed. + * @return A factory for an int setting gui. + */ public static IntSettingFactory intFactory(@NotNull String title, ValueUpdatableGui parent, String configPath, ConfigHolder config, int min, int max, int defaultVal, int... steps){ @@ -229,11 +282,27 @@ public class IntSettingsGui extends AbstractSettingGui{ min, max, defaultVal, steps); } - + /** + * A factory for an int setting gui that hold setting's information. + */ public static class IntSettingFactory extends SettingGuiFactory{ @NotNull String title; ValueUpdatableGui parent; int min; int max; int defaultVal; int[] steps; + /** + * Constructor for an int setting gui factory. + * @param title The title of the gui. + * @param parent Parent gui to go back when completed. + * @param configPath Configuration path of this setting. + * @param config Configuration holder of this setting. + * @param min Minimum value of this setting. + * @param max Maximum value of this setting. + * @param defaultVal Default value if not found on the config. + * @param steps List of step the value can increment/decrement. + * List's size should be between 1 (included) and 5 (included). + * it is visually preferable to have an odd number of step. + * If step only contain 1 value, no step item should be displayed. + */ protected IntSettingFactory( @NotNull String title, ValueUpdatableGui parent, String configPath, ConfigHolder config, @@ -247,11 +316,17 @@ public class IntSettingsGui extends AbstractSettingGui{ this.steps = steps; } + /** + * @return Get setting's gui title + */ @NotNull public String getTitle() { return title; } + /** + * @return The configured value for the associated setting. + */ public int getConfiguredValue(){ return this.config.getConfig().getInt(this.configPath, this.defaultVal); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java index 500f975..0322fc5 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalActions.java @@ -12,12 +12,27 @@ import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.function.Consumer; +/** + * A utility class to store function that create generic GUI actions. + */ public class GuiGlobalActions { public final static String NO_EDIT_PERM = "§cYou do not have permission to edit the config"; + + /** + * A Consumer that should be used if the item goal is to do nothing on click. + */ public final static Consumer stayInPlace = (event) -> event.setCancelled(true); - + /** + * Create a consumer to create and open a new GUI. + * Used with InventoryClickEvent as the consumer argument as it is planned to be used on click on an GuiItem. + * @param clazz The class of the gui to open. + * It is assumed this class contain a constructor requiring arguments of argClass in the same order as argClass array. + * @param argClass Classes of the argument that will be passed to the constructor of the GUI class. + * @param args Arguments for the constructor the GUI class. + * @return A consumer to create a new gui and open it. + */ public static @NotNull Consumer openGuiAction( @NotNull Class clazz, @NotNull Class[] argClass, @@ -44,11 +59,24 @@ public class GuiGlobalActions { }; } + /** + * Create a consumer to create and open a new GUI. + * Used with InventoryClickEvent as the consumer argument as it is planned to be used on click on an GuiItem. + * @param clazz The class of the gui to open. + * It is assumed this class contain a constructor with no argument. + * @return A consumer to create a new gui and open it. + */ public static @NotNull Consumer openGuiAction( @NotNull Class clazz){ return openGuiAction(clazz, new Class[0]); } + /** + * Create a consumer to open a setting gui from a setting GUI factory. + * Used with InventoryClickEvent as the consumer argument as it is planned to be used on click on an GuiItem. + * @param factory The setting gui factory. + * @return A consumer to create and open a new setting GUI. + */ public static @NotNull Consumer openSettingGuiAction(AbstractSettingGui.SettingGuiFactory factory){ return event -> { event.setCancelled(true); @@ -57,6 +85,12 @@ public class GuiGlobalActions { }; } + /** + * Create a consumer to open a global GUI. + * Used with InventoryClickEvent as the consumer argument as it is planned to be used on click on an GuiItem. + * @param goal The gui to open when consumer is run. + * @return A consumer to open a global GUI. + */ public static @NotNull Consumer openGuiAction(@NotNull Gui goal) { return event -> { HumanEntity player = event.getWhoClicked(); @@ -71,6 +105,14 @@ public class GuiGlobalActions { }; } + /** + * Create a consumer to update and open an updatable GUI. + * Used with InventoryClickEvent as the consumer argument as it is planned to be used on click on an GuiItem. + * This consumer check if the player who interacted with the item have the permission to save before saving. + * @param setting The gui that contain the modified setting. + * @param goal The gui to update and open when consumer is run. + * @return A consumer to open a global GUI. + */ public static @NotNull Consumer saveSettingAction( @NotNull AbstractSettingGui setting, @NotNull ValueUpdatableGui goal) { @@ -86,12 +128,13 @@ public class GuiGlobalActions { // Save setting if(!setting.onSave()){ - player.sendMessage("\u00A7cSomething wrong happen while saving the change of value."); + player.sendMessage("\u00A7cSomething went wrong while saving the change of value."); } - // Update gui for the one who have it open + // Update gui for those who have it open. goal.updateGuiValues(); // Then show goal.show(player); }; } + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java index 68df6df..bc959fb 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/util/GuiGlobalItems.java @@ -12,36 +12,63 @@ import xyz.alexcrea.cuanvil.gui.ValueUpdatableGui; import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui; import xyz.alexcrea.cuanvil.gui.config.settings.BoolSettingsGui; import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui; -import xyz.alexcrea.cuanvil.util.StringUtil; +import xyz.alexcrea.cuanvil.util.CasedStringUtil; import java.util.Collections; -// maybe use builder patern ? +/** + * A utility class to store function that create generic GUI item. + */ public class GuiGlobalItems { - // return - public static GuiItem goToGuiItem(@NotNull ItemStack item, @NotNull Gui goal){ - return new GuiItem(item, GuiGlobalActions.openGuiAction(goal), CustomAnvil.instance); - } - - // statically create back itemstack - private static final ItemStack BACK_ITEM = new ItemStack(Material.BARRIER); + // statically create default back itemstack + private static final ItemStack BACK_ITEM; static { - // todo add what I need to add to the back item + BACK_ITEM = new ItemStack(Material.BARRIER); ItemMeta meta = BACK_ITEM.getItemMeta(); meta.setDisplayName("\u00A7cBack"); BACK_ITEM.setItemMeta(meta); } + + /** + * Create a GuiItem that open the given GUi. + * @param item The item to display in the GUI. + * @param goal The GUI to open on click. + * @return An GuiItem that open goal on click. + */ + public static GuiItem goToGuiItem(@NotNull ItemStack item, @NotNull Gui goal){ + return new GuiItem(item, GuiGlobalActions.openGuiAction(goal), CustomAnvil.instance); + } + + /** + * Create back button item from default back GuiItem. + * The back item will open the goal inventory when clicked. + * @param goal The GUI to go back to. + * @return An GuiItem that go back to goal on click. + */ public static GuiItem backItem(@NotNull Gui goal){ - // simple go back item return goToGuiItem(BACK_ITEM, goal); } + + /** + * Add default back item to a GUI pattern with the reserved character key B. + * The back item will open the target inventory when clicked. + * @param target The pattern to add the back item. + * @param goal The GUI to go back to. + */ public static void addBackItem(@NotNull PatternPane target, @NotNull Gui goal){ target.bindItem('B', backItem(goal)); } private static final Material DEFAULT_BACKGROUND_MAT = Material.LIGHT_GRAY_STAINED_GLASS_PANE; + + /** + * Get a background item with backgroundMat as the displayed material. + * A background item is a GuiItem that do nothing when interacted with and have an empty name. + * @param backgroundMat The material to which the background item should be made of. + * @return A background item with backgroundMat as material. + */ public static GuiItem backgroundItem(Material backgroundMat){ ItemStack item = new ItemStack(backgroundMat); ItemMeta meta = item.getItemMeta(); @@ -49,19 +76,46 @@ public class GuiGlobalItems { item.setItemMeta(meta); return new GuiItem(item, GuiGlobalActions.stayInPlace, CustomAnvil.instance); } + /** + * Get default background GuiItem. + * A background item is a GuiItem that do nothing when interacted with and have an empty name. + * @return A new instance of the default background item. + */ public static GuiItem backgroundItem(){ return backgroundItem(DEFAULT_BACKGROUND_MAT); } + + /** + * Add default background item to a GUI pattern with the reserved character key 0. + * A background item is a GuiItem that do nothing when interacted with and have an empty name. + * @param target The pattern to add the background item. + * @param backgroundMat The material of the background item. + */ public static void addBackgroundItem(@NotNull PatternPane target, - @NotNull Material backgroundMat){ + @NotNull Material backgroundMat){ target.bindItem('0', backgroundItem(backgroundMat)); } + + /** + * Add default background item to a GUI pattern with the reserved character key 0. + * A background item is a GuiItem that do nothing when interacted with and have an empty name. + * @param target The pattern to add the background item. + */ public static void addBackgroundItem(@NotNull PatternPane target){ addBackgroundItem(target, DEFAULT_BACKGROUND_MAT); } private static final Material DEFAULT_SAVE_ITEM = Material.LIME_DYE; private static final Material DEFAULT_NO_CHANGE_ITEM = Material.GRAY_DYE; + + /** + * Create a new save setting GuiItem. + * A save setting item is a GuiItem that save a changed setting when clicked. + * This item also check if the player who interacted with the item have the permission to save before saving. + * @param setting The setting to change. + * @param goal Parent GUI of this setting GUI. as setting will be change the display of goal GUI will be updated. + * @return A save setting item. + */ public static GuiItem saveItem( @NotNull AbstractSettingGui setting, @NotNull ValueUpdatableGui goal){ @@ -75,6 +129,7 @@ public class GuiGlobalItems { CustomAnvil.instance); } + // Create static non change item private static final GuiItem NO_CHANGE_ITEM; static { ItemStack item = new ItemStack(DEFAULT_NO_CHANGE_ITEM); @@ -84,10 +139,22 @@ public class GuiGlobalItems { NO_CHANGE_ITEM = new GuiItem(item,GuiGlobalActions.stayInPlace, CustomAnvil.instance); } + /** + * Get the global "no change" GuiItem. + * The no change item do nothing when interacted, only the title is change to show there is no change. + * @return The global "no change" item. + */ public static GuiItem noChangeItem(){ return NO_CHANGE_ITEM; } + /** + * Create a new "create and go to the setting GUI" GuiItem. + * This item will create and open a setting GUI from the factory. + * @param item The item that will be displayed. + * @param factory The setting's GUI factory. + * @return A formatted GuiItem that will create and open a GUI for the setting. + */ public static GuiItem openSettingGuiItem( @NotNull ItemStack item, @NotNull AbstractSettingGui.SettingGuiFactory factory @@ -95,8 +162,17 @@ public class GuiGlobalItems { return new GuiItem(item, GuiGlobalActions.openSettingGuiAction(factory), CustomAnvil.instance); } + // Prefix of the one line lore that will be added to setting's item. public static final String SETTING_ITEM_LORE_PREFIX = "\u00A77value: "; + /** + * Create a new Boolean setting GuiItem. + * This item will create and open a boolean setting GUI from the factory. + * The item will have its value written in the lore part of the item. + * @param factory The setting's GUI factory. + * @param name Name of the item. + * @return A formatted GuiItem that will create and open a GUI for the boolean setting. + */ public static GuiItem boolSettingGuiItem( @NotNull BoolSettingsGui.BoolSettingFactory factory, @NotNull String name @@ -118,14 +194,30 @@ public class GuiGlobalItems { return createGuiItemFromProperties(factory, itemMat, itemName, value); } + /** + * Create a new boolean setting GuiItem. + * This item will create and open a boolean setting GUI from the factory. + * The item will have its value written in the lore part of the item. + * Item's name will be the factory set title. + * @param factory The setting's GUI factory. + * @return A formatted GuiItem that will create and open a GUI for the boolean setting. + */ public static GuiItem boolSettingGuiItem( @NotNull BoolSettingsGui.BoolSettingFactory factory ){ String configPath = getConfigNameFromPath(factory.getConfigPath()); - return boolSettingGuiItem(factory, StringUtil.snakeToUpperSpacedCase(configPath)); + return boolSettingGuiItem(factory, CasedStringUtil.snakeToUpperSpacedCase(configPath)); } - + /** + * Create a new int setting GuiItem. + * This item will create and open an int setting GUI from the factory. + * The item will have its value written in the lore part of the item. + * @param factory The setting's GUI factory. + * @param itemMat Displayed material of the item. + * @param name Name of the item. + * @return A formatted GuiItem that will create and open a GUI for the int setting. + */ public static GuiItem intSettingGuiItem( @NotNull IntSettingsGui.IntSettingFactory factory, @NotNull Material itemMat, @@ -138,21 +230,39 @@ public class GuiGlobalItems { return createGuiItemFromProperties(factory, itemMat, itemName, value); } - + /** + * Create a new int setting GuiItem. + * This item will create and open an int setting GUI from the factory. + * The item will have its value written in the lore part of the item. + * Item's name will be the factory set title. + * @param factory The setting's GUI factory. + * @param itemMat Displayed material of the item. + * @return A formatted GuiItem that will create and open a GUI for the int setting. + */ public static GuiItem intSettingGuiItem( @NotNull IntSettingsGui.IntSettingFactory factory, @NotNull Material itemMat ){ String configPath = getConfigNameFromPath(factory.getConfigPath()); - return intSettingGuiItem(factory, itemMat, StringUtil.snakeToUpperSpacedCase(configPath)); + return intSettingGuiItem(factory, itemMat, CasedStringUtil.snakeToUpperSpacedCase(configPath)); } + + /** + * Create an arbitrary GuiItem from a unique setting and item's property. + * @param factory The setting's GUI factory. + * @param itemMat Displayed material of the item. + * @param itemName Name of the item. + * @param value Value of the setting when the item is created. + * Will not update automatically, if the setting's value change, the item need to be created again. + * @return A formatted GuiItem that will create and open a GUI for the setting. + */ private static GuiItem createGuiItemFromProperties( @NotNull AbstractSettingGui.SettingGuiFactory factory, @NotNull Material itemMat, @NotNull StringBuilder itemName, @NotNull Object value ){ - // Create item + // Create & initialise item ItemStack item = new ItemStack(itemMat); ItemMeta itemMeta = item.getItemMeta(); @@ -160,13 +270,20 @@ public class GuiGlobalItems { itemMeta.setLore(Collections.singletonList(SETTING_ITEM_LORE_PREFIX+value)); item.setItemMeta(itemMeta); + // Create GuiItem return openSettingGuiItem(item, factory); } + /** + * Get the setting name from the setting path. + * For example: "gui.command.name" will return "name". + * @param path The setting's path. + * @return The setting's name. + */ public static String getConfigNameFromPath(String path){ + // Get index of first dot int indexOfDot = path.indexOf("."); - //if(indexOfDot == -1) return path; - // indexOfDot == -1 (not fond) imply indexOfDot+1 = 0. substring will keep the full path as expected + // when indexOfDot == -1 (not fond), it is implied that indexOfDot+1 = 0. substring will keep the full path as expected return path.substring(indexOfDot+1); } diff --git a/src/main/java/xyz/alexcrea/cuanvil/util/StringUtil.java b/src/main/java/xyz/alexcrea/cuanvil/util/CasedStringUtil.java similarity index 54% rename from src/main/java/xyz/alexcrea/cuanvil/util/StringUtil.java rename to src/main/java/xyz/alexcrea/cuanvil/util/CasedStringUtil.java index 9a36bdb..28525f8 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/util/StringUtil.java +++ b/src/main/java/xyz/alexcrea/cuanvil/util/CasedStringUtil.java @@ -1,8 +1,18 @@ package xyz.alexcrea.cuanvil.util; -public class StringUtil { +/** + * An incomplete cased string util + */ +public class CasedStringUtil { - //we assume snake_cased_string is in snake case + /** + * Transform a snake cased string to an upper-cased spaced string. + *

    + * for example: if we use "hello_world" as an input this function will return "Hello World". + * @param snake_cased_string The input string. + * This argument NEED to be a snake cased string, or it will not work + * @return The input as an upper-cased string with space separator. + */ public static String snakeToUpperSpacedCase(String snake_cased_string){ if(snake_cased_string.contentEquals("")) return ""; StringBuilder result = new StringBuilder();