From 22e1181b4741d44eccaab2c01bfa03b2e1570158 Mon Sep 17 00:00:00 2001 From: alexcrea Date: Wed, 28 Feb 2024 19:03:16 +0100 Subject: [PATCH] progress on int setting gui. --- .../cuanvil/gui/GuiGlobalActions.java | 29 +++- .../alexcrea/cuanvil/gui/GuiGlobalItems.java | 24 ++- .../alexcrea/cuanvil/gui/MainConfigGui.java | 22 ++- .../cuanvil/gui/config/BasicConfigGui.java | 15 +- .../config/settings/AbstractSettingGui.java | 50 ++++++ .../gui/config/settings/IntSettingsGui.java | 147 ++++++++++++++++++ 6 files changed, 272 insertions(+), 15 deletions(-) create mode 100644 src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/AbstractSettingGui.java create mode 100644 src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalActions.java b/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalActions.java index de1fb6a..936b75b 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalActions.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalActions.java @@ -3,6 +3,7 @@ package xyz.alexcrea.cuanvil.gui; import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; import org.bukkit.event.inventory.InventoryClickEvent; import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -13,7 +14,7 @@ public class GuiGlobalActions { public static Consumer stayInPlace = (event) -> event.setCancelled(true); - public static @NotNull Consumer openGuiFactory( + public static @NotNull Consumer openGuiAction( @NotNull Class clazz, @NotNull Class[] argClass, @NotNull Object... args){ @@ -32,15 +33,35 @@ public class GuiGlobalActions { }; } - public static @NotNull Consumer openGuiFactory( + public static @NotNull Consumer openGuiAction( @NotNull Class clazz){ - return openGuiFactory(clazz, new Class[0]); + return openGuiAction(clazz, new Class[0]); } - public static @NotNull Consumer openGuiFactory(@NotNull Gui goal) { + public static @NotNull Consumer openSettingGuiAction(AbstractSettingGui.SettingGuiFactory factory){ + return event -> { + event.setCancelled(true); + Gui gui = factory.create(); + gui.show(event.getWhoClicked()); + }; + } + + public static @NotNull Consumer openGuiAction(@NotNull Gui goal) { return event -> { event.setCancelled(true); goal.show(event.getWhoClicked()); }; } + + public static @NotNull Consumer saveSettingAction( + @NotNull AbstractSettingGui setting, + @NotNull Gui goal) { + return event -> { + event.setCancelled(true); + // Save setting + setting.onSave(); + // Then show + goal.show(event.getWhoClicked()); + }; + } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalItems.java b/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalItems.java index 42ecaa3..2a588d4 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalItems.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/GuiGlobalItems.java @@ -8,13 +8,14 @@ import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui; // maybe use builder patern ? public class GuiGlobalItems { // return public static GuiItem toGuiItem(@NotNull ItemStack item, @NotNull Gui goal){ - return new GuiItem(item, GuiGlobalActions.openGuiFactory(goal), CustomAnvil.instance); + return new GuiItem(item, GuiGlobalActions.openGuiAction(goal), CustomAnvil.instance); } // statically create back itemstack @@ -53,4 +54,25 @@ public class GuiGlobalItems { addBackgroundItem(target, DEFAULT_BACKGROUND_MAT); } + private static final Material DEFAULT_SAVE_ITEM = Material.LIME_TERRACOTTA; + public static GuiItem saveItem( + @NotNull AbstractSettingGui setting, + @NotNull Gui goal){ + + ItemStack item = new ItemStack(DEFAULT_SAVE_ITEM); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName("\u00A7aSave"); + item.setItemMeta(meta); + return new GuiItem(item, + GuiGlobalActions.saveSettingAction(setting, goal), + CustomAnvil.instance); + } + + public static GuiItem openSettingGuiItem( + @NotNull ItemStack item, + @NotNull AbstractSettingGui.SettingGuiFactory factory + ){ + return new GuiItem(item, GuiGlobalActions.openSettingGuiAction(factory), CustomAnvil.instance); + } + } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/MainConfigGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/MainConfigGui.java index c2214ac..9282432 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/MainConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/MainConfigGui.java @@ -25,7 +25,7 @@ public class MainConfigGui extends ChestGui { Pattern pattern = new Pattern( "000000000", "001234500", - "000000000" + "Q00000000" ); PatternPane pane = new PatternPane(0, 0, 9, 3, pattern); addPane(pane); @@ -41,14 +41,20 @@ public class MainConfigGui extends ChestGui { GuiItem placeholder5 = new GuiItem(stonePlaceholder,CustomAnvil.instance); - pane.bindItem('2', placeholder1); - pane.bindItem('3', placeholder2); - pane.bindItem('4', placeholder3); - pane.bindItem('5', placeholder4); - pane.bindItem('6', placeholder5); + pane.bindItem('1', placeholder1); + pane.bindItem('2', placeholder2); + pane.bindItem('3', placeholder3); + pane.bindItem('4', placeholder4); + pane.bindItem('5', placeholder5); + + // quit item + ItemStack quitItemstack = new ItemStack(Material.BARRIER); + GuiItem quitItem = new GuiItem(quitItemstack, event -> { + event.setCancelled(true); + event.getWhoClicked().closeInventory(); + },CustomAnvil.instance); + pane.bindItem('Q', quitItem); } - - } 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 6a4aa9b..0922825 100644 --- a/src/main/java/xyz/alexcrea/cuanvil/gui/config/BasicConfigGui.java +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/BasicConfigGui.java @@ -1,11 +1,16 @@ package xyz.alexcrea.cuanvil.gui.config; +import com.github.stefvanschie.inventoryframework.gui.GuiItem; import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; import com.github.stefvanschie.inventoryframework.pane.PatternPane; import com.github.stefvanschie.inventoryframework.pane.util.Pattern; import io.delilaheve.CustomAnvil; -import xyz.alexcrea.cuanvil.gui.MainConfigGui; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; import xyz.alexcrea.cuanvil.gui.GuiGlobalItems; +import xyz.alexcrea.cuanvil.gui.MainConfigGui; +import xyz.alexcrea.cuanvil.gui.config.settings.AbstractSettingGui; +import xyz.alexcrea.cuanvil.gui.config.settings.IntSettingsGui; public class BasicConfigGui extends ChestGui { @@ -23,7 +28,7 @@ public class BasicConfigGui extends ChestGui { private void init(){ Pattern pattern = new Pattern( "000000000", - "000000000", + "010000000", "B00000000" ); PatternPane pane = new PatternPane(0, 0, 9, 3, pattern); @@ -32,6 +37,12 @@ public class BasicConfigGui extends ChestGui { GuiGlobalItems.addBackItem(pane, MainConfigGui.INSTANCE); GuiGlobalItems.addBackgroundItem(pane); + ItemStack setting1Item = new ItemStack(Material.STONE); + AbstractSettingGui.SettingGuiFactory factory1 = IntSettingsGui.factory( "Test GUI", this, "test", CustomAnvil.instance.getConfig(), 0,42,2,1); + GuiItem setting1 = GuiGlobalItems.openSettingGuiItem(setting1Item, factory1); + pane.bindItem('1', setting1); + + } } diff --git a/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/AbstractSettingGui.java b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/AbstractSettingGui.java new file mode 100644 index 0000000..0e4b010 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/AbstractSettingGui.java @@ -0,0 +1,50 @@ +package xyz.alexcrea.cuanvil.gui.config.settings; + +import com.github.stefvanschie.inventoryframework.adventuresupport.StringHolder; +import com.github.stefvanschie.inventoryframework.adventuresupport.TextHolder; +import com.github.stefvanschie.inventoryframework.gui.type.ChestGui; +import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; +import com.github.stefvanschie.inventoryframework.pane.PatternPane; +import com.github.stefvanschie.inventoryframework.pane.util.Pattern; +import io.delilaheve.CustomAnvil; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.gui.GuiGlobalItems; + +public abstract class AbstractSettingGui extends ChestGui { + + public AbstractSettingGui(int rows, @NotNull TextHolder title, Gui parent) { + super(rows, title, CustomAnvil.instance); + initBase(parent); + } + + public AbstractSettingGui(int rows, @NotNull String title, Gui parent) { + this(rows, StringHolder.of(title), parent); + } + + private PatternPane pane; + private void initBase(Gui parent){ + Pattern pattern = getGuiPattern(); + pane = new PatternPane(0, 0, pattern.getLength(), pattern.getHeight(), pattern); + addPane(pane); + + GuiGlobalItems.addBackItem(pane, parent); + GuiGlobalItems.addBackgroundItem(pane); + + pane.bindItem('S', GuiGlobalItems.saveItem(this, parent)); + + } + + protected PatternPane getPane() { + return pane; + } + + // S, b, 0 is used by: save, back, background + protected abstract Pattern getGuiPattern(); + + public abstract void onSave(); + + + public abstract static class SettingGuiFactory{ + public abstract AbstractSettingGui create(); + }; +} 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 new file mode 100644 index 0000000..5275104 --- /dev/null +++ b/src/main/java/xyz/alexcrea/cuanvil/gui/config/settings/IntSettingsGui.java @@ -0,0 +1,147 @@ +package xyz.alexcrea.cuanvil.gui.config.settings; + +import com.github.stefvanschie.inventoryframework.gui.GuiItem; +import com.github.stefvanschie.inventoryframework.gui.type.util.Gui; +import com.github.stefvanschie.inventoryframework.pane.PatternPane; +import com.github.stefvanschie.inventoryframework.pane.util.Pattern; +import io.delilaheve.CustomAnvil; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; +import xyz.alexcrea.cuanvil.gui.GuiGlobalActions; +import xyz.alexcrea.cuanvil.gui.GuiGlobalItems; + +import java.util.function.Consumer; + +public class IntSettingsGui extends AbstractSettingGui{ + + private final IntSettingFactory holder; + private int now; + private int step; + + private IntSettingsGui(IntSettingFactory holder, int now) { + super(3, holder.title, holder.parent); + assert holder.steps.length > 0 && holder.steps.length <= 9; + this.holder = holder; + this.now = now; + this.step = holder.steps[0]; + + updateValueDisplay(); + } + + + @Override + public Pattern getGuiPattern() { + return new Pattern( + "000000000", + "00-0v0+00", + "B0000000S" + ); + } + + protected void updateValueDisplay(){ + + PatternPane pane = getPane(); + + // minus item + GuiItem minusItem; + if(now > holder.min){ + int planned = Math.max(holder.min, now - step); + ItemStack item = new ItemStack(Material.RED_TERRACOTTA); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(planned + " (-"+(now-planned)+")"); //TODO add color + item.setItemMeta(meta); + + minusItem = new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance); + }else{ + minusItem = GuiGlobalItems.backgroundItem(); + } + pane.bindItem('-', minusItem); + + //plus item + // may do a function to generalise ? + GuiItem plusItem; + if(now < holder.max){ + int planned = Math.min(holder.max, now + step); + ItemStack item = new ItemStack(Material.GREEN_TERRACOTTA); + ItemMeta meta = item.getItemMeta(); + meta.setDisplayName(planned + " (+"+(planned-now)+")"); //TODO add color + item.setItemMeta(meta); + + plusItem = new GuiItem(item, updateNowConsumer(planned), CustomAnvil.instance); + }else{ + plusItem = GuiGlobalItems.backgroundItem(); + } + pane.bindItem('+', plusItem); + + // "result" display + ItemStack resultPaper = new ItemStack(Material.PAPER); + ItemMeta resultMeta = resultPaper.getItemMeta(); + resultMeta.setDisplayName(""+now); //TODO color and text + resultPaper.setItemMeta(resultMeta); + GuiItem resultItem = new GuiItem(resultPaper, GuiGlobalActions.stayInPlace, CustomAnvil.instance); + + pane.bindItem('v', resultItem); + + } + + protected Consumer updateNowConsumer(int planned){ + return event->{ + event.setCancelled(true); + now = planned; + updateValueDisplay(); + update(); + }; + } + + @Override + public void onSave() { + holder.section.set(holder.configPath, now); + // TODO SAVE (also backup before) + + } + + public static SettingGuiFactory factory(@NotNull String title, Gui parent, + String configPath, ConfigurationSection section, + int min, int max, int defaultVal, int... steps){ + return new IntSettingFactory( + title,parent, + configPath, section, + min, max, defaultVal, steps); + } + + + public static class IntSettingFactory extends SettingGuiFactory{ + @NotNull String title; Gui parent; + String configPath; ConfigurationSection section; + int min; int max; int defaultVal; int[] steps; + + private IntSettingFactory(@NotNull String title, Gui parent, + String configPath, ConfigurationSection section, + int min, int max, int defaultVal, int... steps){ + this.title = title; + this.parent = parent; + this.configPath = configPath; + this.section = section; + this.min = min; + this.max = max; + this.defaultVal = defaultVal; + this.steps = steps; + } + + @Override + public AbstractSettingGui create() { + // Get value or default + //TODO maybe get section dynamically (and maybe same for save ?) + int now = section.getInt(this.configPath, this.defaultVal); + // create new gui + return new IntSettingsGui(this, now); + } + + } + +} +