From d7560d5ef382971a730c916609a6c745b3e1aadd Mon Sep 17 00:00:00 2001 From: Shiewk Date: Mon, 29 Jul 2024 17:07:45 +0200 Subject: [PATCH] Add ability to filter by type in SMod menu --- .../smoderation/inventory/SModMenu.java | 58 ++++++++++++++++++- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/src/main/java/de/shiewk/smoderation/inventory/SModMenu.java b/src/main/java/de/shiewk/smoderation/inventory/SModMenu.java index de7b74f..c2bb440 100644 --- a/src/main/java/de/shiewk/smoderation/inventory/SModMenu.java +++ b/src/main/java/de/shiewk/smoderation/inventory/SModMenu.java @@ -28,6 +28,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.function.Consumer; import java.util.function.Predicate; import static de.shiewk.smoderation.SModeration.*; @@ -75,8 +76,10 @@ public class SModMenu extends PageableCustomInventory { private ItemStack sortStack = null; private ItemStack filterStack = null; private ItemStack searchStack = null; + private ItemStack typeStack = null; private int sort = 0; private int filter = 0; + private int type = -1; private String searchQuery = null; public SModMenu(Player player, PunishmentContainer container) { @@ -94,8 +97,12 @@ public class SModMenu extends PageableCustomInventory { return Filter.values()[filter]; } + public PunishmentType getType(){ + return type == -1 ? null : PunishmentType.values()[type]; + } + private void reload(){ - this.punishments = container.copy().stream().filter(getFilter().filter).filter(p -> p.matchesSearchQuery(searchQuery)).sorted(getSort().comparator).toList(); + this.punishments = container.copy().stream().filter(getFilter().filter).filter(p -> getType() == null || p.type == getType()).filter(p -> p.matchesSearchQuery(searchQuery)).sorted(getSort().comparator).toList(); } public void promptSearchQuery(){ @@ -152,6 +159,25 @@ public class SModMenu extends PageableCustomInventory { refresh(); } + public void cycleType(boolean backwards){ + player.playSound(player, Sound.UI_BUTTON_CLICK, 1f, backwards ? 0.8f : 2f); + if (backwards){ + if (type <= -1){ + type = PunishmentType.values().length-1; + } else { + type--; + } + } else { + if (type >= PunishmentType.values().length-1){ + type = -1; + } else { + type++; + } + } + reload(); + refresh(); + } + @Override public void switchPage() { player.playSound(player, Sound.BLOCK_STONE_HIT, 0.75f, 1f); @@ -177,6 +203,29 @@ public class SModMenu extends PageableCustomInventory { return stack; } + private ItemStack createTypeItem(){ + final PunishmentType type = getType(); + final ItemStack stack = new ItemStack(Material.CHEST); + stack.editMeta(meta -> { + meta.displayName(applyFormatting(text("Type: " + (type == null ? "All" : type.name)).color(PRIMARY_COLOR))); + ArrayList lore = new ArrayList<>(); + lore.add(Component.empty()); + final Consumer addToLore = value -> { + final boolean selected = type == value; + Component typeText = applyFormatting(text((selected ? "\u00BB " : "") + (value == null ? "All" : value.name)).color(selected ? SECONDARY_COLOR : INACTIVE_COLOR)); + lore.add(typeText); + }; + addToLore.accept(null); + for (PunishmentType value : PunishmentType.values()) { + addToLore.accept(value); + } + lore.add(Component.empty()); + lore.add(applyFormatting(text("\u00BB Click to switch type").color(NamedTextColor.GOLD))); + meta.lore(lore); + }); + return typeStack = stack; + } + private ItemStack createSortItem(){ final Sort sort = getSort(); final ItemStack stack = new ItemStack(Sort.ICON); @@ -260,9 +309,10 @@ public class SModMenu extends PageableCustomInventory { } inventory.setItem(45, createPreviousPageStack()); inventory.setItem(53, createNextPageStack()); - inventory.setItem(51, createFilterItem()); - inventory.setItem(49, createSortItem()); inventory.setItem(47, createSearchItem()); + inventory.setItem(48, createTypeItem()); + inventory.setItem(50, createFilterItem()); + inventory.setItem(51, createSortItem()); for (int i = 0; i < 45; i++) { int ci = i + (getPage() * 45); @@ -299,6 +349,8 @@ public class SModMenu extends PageableCustomInventory { player.playSound(player, Sound.UI_BUTTON_CLICK, 1f, 2f); promptSearchQuery(); } + } else if (stack.equals(typeStack)) { + cycleType(event.isRightClick()); } final ItemMeta itemMeta = stack.getItemMeta(); if (itemMeta != null) {