From 99c6666384fc154aca842c5ce991e10c5ec7ac12 Mon Sep 17 00:00:00 2001 From: Esophose Date: Wed, 16 Sep 2020 15:37:36 -0600 Subject: [PATCH] Made the group and preset group gui pages paginated --- .gitignore | 1 + .../gui/GuiInventoryDefault.java | 4 +- .../gui/GuiInventoryLoadPresetGroups.java | 60 +++++++++++---- .../gui/GuiInventoryManageGroups.java | 76 +++++++++++++------ .../playerparticles/manager/GuiManager.java | 2 +- src/main/resources/preset_groups.yml | 1 - 6 files changed, 102 insertions(+), 42 deletions(-) diff --git a/.gitignore b/.gitignore index ba8d38c..c4a2298 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ target/ /bin/ /docs/ /images/ +/LocaleTransformer diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java index ed838f0..92a02fc 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryDefault.java @@ -93,7 +93,7 @@ public class GuiInventoryDefault extends GuiInventory { GuiIcon.GROUPS.get(), localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-manage-your-groups"), new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-manage-your-groups-description")}, - (button, isShiftClick) -> guiManager.transition(new GuiInventoryManageGroups(pplayer))); + (button, isShiftClick) -> guiManager.transition(new GuiInventoryManageGroups(pplayer, 1))); this.actionButtons.add(manageYourGroupsButton); } @@ -104,7 +104,7 @@ public class GuiInventoryDefault extends GuiInventory { GuiIcon.PRESET_GROUPS.get(), localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-load-a-preset-group"), new String[]{localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-load-a-preset-group-description")}, - (button, isShiftClick) -> guiManager.transition(new GuiInventoryLoadPresetGroups(pplayer, false))); + (button, isShiftClick) -> guiManager.transition(new GuiInventoryLoadPresetGroups(pplayer, false, 1))); this.actionButtons.add(loadPresetGroups); } diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java index 2f701a5..06e6ee3 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryLoadPresetGroups.java @@ -16,11 +16,12 @@ import dev.esophose.playerparticles.util.StringPlaceholders; import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import java.util.stream.Collectors; import org.bukkit.Bukkit; public class GuiInventoryLoadPresetGroups extends GuiInventory { - public GuiInventoryLoadPresetGroups(PPlayer pplayer, boolean isEndPoint) { + public GuiInventoryLoadPresetGroups(PPlayer pplayer, boolean isEndPoint, int pageNumber) { super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-load-a-preset-group"))); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); @@ -28,32 +29,39 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { this.fillBorder(BorderColor.GREEN); - int index = 10; + List groups = PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class) + .getPresetGroupsForPlayer(pplayer) + .stream() + .filter(x -> x.canPlayerUse(pplayer)) + .collect(Collectors.toList()); + + int numberOfItems = groups.size(); + int itemsPerPage = 28; + int maxPages = (int) Math.max(1, Math.ceil((double) numberOfItems / itemsPerPage)); + int slot = 10; int nextWrap = 17; int maxIndex = 43; - List groups = PlayerParticles.getInstance().getManager(ParticleGroupPresetManager.class).getPresetGroupsForPlayer(pplayer); - for (ParticleGroupPreset group : groups) { - if (!group.canPlayerUse(pplayer)) - continue; + for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) { + ParticleGroupPreset group = groups.get(i); List particles = new ArrayList<>(group.getGroup().getParticles().values()); particles.sort(Comparator.comparingInt(ParticlePair::getId)); String[] lore = new String[particles.size() + 1]; lore[0] = localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("gui-click-to-load", StringPlaceholders.single("amount", particles.size())); - int i = 1; + int n = 1; for (ParticlePair particle : particles) { StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", particle.getId()) .addPlaceholder("effect", ParticleUtils.formatName(particle.getEffect().getName())) .addPlaceholder("style", ParticleUtils.formatName(particle.getStyle().getName())) .addPlaceholder("data", particle.getDataString()) .build(); - lore[i] = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders); - i++; + lore[n] = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders); + n++; } // Load Group Buttons - GuiActionButton groupButton = new GuiActionButton(index, group.getGuiIcon(), localeManager.getLocaleMessage("gui-color-icon-name") + group.getDisplayName(), lore, (button, isShiftClick) -> { + GuiActionButton groupButton = new GuiActionButton(slot, group.getGuiIcon(), localeManager.getLocaleMessage("gui-color-icon-name") + group.getDisplayName(), lore, (button, isShiftClick) -> { ParticleGroup activeGroup = pplayer.getActiveParticleGroup(); activeGroup.getParticles().clear(); for (ParticlePair particle : particles) { @@ -68,12 +76,34 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { }); this.actionButtons.add(groupButton); - index++; - if (index == nextWrap) { // Loop around border + slot++; + if (slot == nextWrap) { // Loop around border nextWrap += 9; - index += 2; + slot += 2; } - if (index > maxIndex) break; // Overflowed the available space + if (slot > maxIndex) break; // Overflowed the available space + } + + // Previous page button + if (pageNumber != 1) { + GuiActionButton previousPageButton = new GuiActionButton( + INVENTORY_SIZE - 6, + GuiIcon.PREVIOUS_PAGE.get(), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()), + new String[]{}, + (button, isShiftClick) -> guiManager.transition(new GuiInventoryLoadPresetGroups(pplayer, isEndPoint, pageNumber - 1))); + this.actionButtons.add(previousPageButton); + } + + // Next page button + if (pageNumber != maxPages) { + GuiActionButton nextPageButton = new GuiActionButton( + INVENTORY_SIZE - 4, + GuiIcon.NEXT_PAGE.get(), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()), + new String[]{}, + (button, isShiftClick) -> guiManager.transition(new GuiInventoryLoadPresetGroups(pplayer, isEndPoint, pageNumber + 1))); + this.actionButtons.add(nextPageButton); } if (!isEndPoint) { @@ -87,7 +117,7 @@ public class GuiInventoryLoadPresetGroups extends GuiInventory { } else { // Reset Particles Button GuiActionButton resetParticles = new GuiActionButton( - 49, + INVENTORY_SIZE - 5, GuiIcon.RESET.get(), localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-reset-particles"), new String[]{localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-reset-particles-description")}, diff --git a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java index 9a047b7..1f351ec 100644 --- a/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java +++ b/src/main/java/dev/esophose/playerparticles/gui/GuiInventoryManageGroups.java @@ -19,11 +19,12 @@ import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; import org.bukkit.Bukkit; public class GuiInventoryManageGroups extends GuiInventory { - public GuiInventoryManageGroups(PPlayer pplayer) { + public GuiInventoryManageGroups(PPlayer pplayer, int pageNumber) { super(pplayer, Bukkit.createInventory(pplayer.getPlayer(), INVENTORY_SIZE, PlayerParticles.getInstance().getManager(LocaleManager.class).getLocaleMessage("gui-manage-your-groups"))); LocaleManager localeManager = PlayerParticles.getInstance().getManager(LocaleManager.class); @@ -31,35 +32,43 @@ public class GuiInventoryManageGroups extends GuiInventory { this.fillBorder(BorderColor.BROWN); - int index = 10; - int nextWrap = 17; - int maxIndex = 35; - List groups = new ArrayList<>(pplayer.getParticleGroups().values()); - groups.sort(Comparator.comparing(ParticleGroup::getName)); + List groups = pplayer.getParticleGroups().values().stream() + .filter(x -> !x.getName().equals(ParticleGroup.DEFAULT_NAME)) + .sorted(Comparator.comparing(ParticleGroup::getName)) + .collect(Collectors.toList()); - for (ParticleGroup group : groups) { - if (group.getName().equals(ParticleGroup.DEFAULT_NAME)) continue; + int numberOfItems = groups.size(); + int itemsPerPage = 28; + int maxPages = (int) Math.max(1, Math.ceil((double) numberOfItems / itemsPerPage)); + int slot = 10; + int nextWrap = 17; + int maxIndex = 43; + + for (int i = (pageNumber - 1) * itemsPerPage; i < numberOfItems; i++) { + ParticleGroup group = groups.get(i); + if (group.getName().equals(ParticleGroup.DEFAULT_NAME)) + continue; List particles = new ArrayList<>(group.getParticles().values()); particles.sort(Comparator.comparingInt(ParticlePair::getId)); String[] lore = new String[particles.size() + 2]; lore[0] = localeManager.getLocaleMessage("gui-color-subtext") + localeManager.getLocaleMessage("gui-click-to-load", StringPlaceholders.single("amount", particles.size())); - int i = 1; + int n = 1; for (ParticlePair particle : particles) { StringPlaceholders stringPlaceholders = StringPlaceholders.builder("id", particle.getId()) .addPlaceholder("effect", ParticleUtils.formatName(particle.getEffect().getName())) .addPlaceholder("style", ParticleUtils.formatName(particle.getStyle().getName())) .addPlaceholder("data", particle.getDataString()) .build(); - lore[i] = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders); - i++; + lore[n] = localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-particle-info", stringPlaceholders); + n++; } - lore[i] = localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-shift-click-to-delete"); + lore[n] = localeManager.getLocaleMessage("gui-color-unavailable") + localeManager.getLocaleMessage("gui-shift-click-to-delete"); // Load Group Buttons GuiActionButton groupButton = new GuiActionButton( - index, + slot, GuiIcon.GROUPS.get(), localeManager.getLocaleMessage("gui-color-icon-name") + group.getName(), lore, @@ -82,12 +91,34 @@ public class GuiInventoryManageGroups extends GuiInventory { }); this.actionButtons.add(groupButton); - index++; - if (index == nextWrap) { // Loop around border + slot++; + if (slot == nextWrap) { // Loop around border nextWrap += 9; - index += 2; + slot += 2; } - if (index > maxIndex) break; // Overflowed the available space + if (slot > maxIndex) break; // Overflowed the available space + } + + // Previous page button + if (pageNumber != 1) { + GuiActionButton previousPageButton = new GuiActionButton( + INVENTORY_SIZE - 6, + GuiIcon.PREVIOUS_PAGE.get(), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-previous-page-button", StringPlaceholders.builder("start", pageNumber - 1).addPlaceholder("end", maxPages).build()), + new String[]{}, + (button, isShiftClick) -> guiManager.transition(new GuiInventoryManageGroups(pplayer, pageNumber - 1))); + this.actionButtons.add(previousPageButton); + } + + // Next page button + if (pageNumber != maxPages) { + GuiActionButton nextPageButton = new GuiActionButton( + INVENTORY_SIZE - 4, + GuiIcon.NEXT_PAGE.get(), + localeManager.getLocaleMessage("gui-color-info") + localeManager.getLocaleMessage("gui-next-page-button", StringPlaceholders.builder("start", pageNumber + 1).addPlaceholder("end", maxPages).build()), + new String[]{}, + (button, isShiftClick) -> guiManager.transition(new GuiInventoryManageGroups(pplayer, pageNumber + 1))); + this.actionButtons.add(nextPageButton); } boolean hasReachedMax = PlayerParticles.getInstance().getManager(PermissionManager.class).hasPlayerReachedMaxGroups(pplayer); @@ -109,17 +140,16 @@ public class GuiInventoryManageGroups extends GuiInventory { // Save Group Button GuiActionButton saveGroupButton = new GuiActionButton( - 40, + INVENTORY_SIZE - 5, GuiIcon.CREATE.get(), localeManager.getLocaleMessage("gui-color-icon-name") + localeManager.getLocaleMessage("gui-save-group"), lore, (button, isShiftClick) -> { - if (hasReachedMax || !hasParticles) return; + if (hasReachedMax || !hasParticles) + return; PlayerChatHook.addHook(new PlayerChatHookData(pplayer.getUniqueId(), 15, (textEntered) -> { - if (textEntered == null || textEntered.equalsIgnoreCase("cancel")) { - guiManager.transition(new GuiInventoryManageGroups(pplayer)); - } else { + if (textEntered != null && !textEntered.equalsIgnoreCase("cancel")) { String groupName = textEntered.split(" ")[0]; // Check that the groupName isn't the reserved name @@ -153,8 +183,8 @@ public class GuiInventoryManageGroups extends GuiInventory { localeManager.sendMessage(pplayer, "group-save-success", StringPlaceholders.single("name", groupName)); } - guiManager.transition(new GuiInventoryManageGroups(pplayer)); } + guiManager.transition(new GuiInventoryManageGroups(pplayer, pageNumber)); })); this.close(); }); diff --git a/src/main/java/dev/esophose/playerparticles/manager/GuiManager.java b/src/main/java/dev/esophose/playerparticles/manager/GuiManager.java index 554d360..4b8c7f2 100644 --- a/src/main/java/dev/esophose/playerparticles/manager/GuiManager.java +++ b/src/main/java/dev/esophose/playerparticles/manager/GuiManager.java @@ -114,7 +114,7 @@ public class GuiManager extends Manager implements Listener, Runnable { if (!Setting.GUI_PRESETS_ONLY.getBoolean()) { inventoryToOpen = new GuiInventoryDefault(pplayer); } else { - inventoryToOpen = new GuiInventoryLoadPresetGroups(pplayer, true); + inventoryToOpen = new GuiInventoryLoadPresetGroups(pplayer, true, 1); } pplayer.getPlayer().openInventory(inventoryToOpen.getInventory()); diff --git a/src/main/resources/preset_groups.yml b/src/main/resources/preset_groups.yml index db88f43..3f05012 100644 --- a/src/main/resources/preset_groups.yml +++ b/src/main/resources/preset_groups.yml @@ -4,7 +4,6 @@ # * The groups listed within this file will be # # available to all players who have access to the # # effect and style! # -# * The GUI is capable of displaying up to 28 groups. # # * Feel free to create your own, they will be # # available for users to select within the GUI! # # * This file is not automatically updated. If you #