All source projects
MrUltimateLibrary Source
Standalone source project / 68 files
MrUltimateLibrary is the backbone of all my plugins; it offers features that facilitate plugin creation, maintenance, and updates.
java
MrUltimateLibrary/src/main/java/eu/mrneznamy/mrultimatelibrary/gui/MrLibPagedGUI.java
JAVA · Read-only source
package eu.mrneznamy.mrultimatelibrary.gui;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
* Paged GUI with navigation
*/
public class MrLibPagedGUI extends MrLibGUI {
private final List<ItemStack> items;
private final List<Consumer<Player>> itemActions;
private int currentPage = 0;
private final int itemsPerPage;
private final int[] itemSlots;
/**
* Create paged GUI
*
* @param title Title
* @param rows Rows (recommended 6 for navigation)
*/
public MrLibPagedGUI(String title, int rows) {
super(title, rows);
this.items = new ArrayList<>();
this.itemActions = new ArrayList<>();
this.itemsPerPage = (rows - 1) * 9;
this.itemSlots = new int[itemsPerPage];
for (int i = 0; i < itemsPerPage; i++) {
itemSlots[i] = i;
}
setupNavigation();
}
/**
* Add item to pages
*
* @param item ItemStack
* @param action Action when clicked
* @return this
*/
public MrLibPagedGUI addPageItem(ItemStack item, Consumer<Player> action) {
items.add(item);
itemActions.add(action);
return this;
}
/**
* Update page display
*/
private void updatePage() {
for (int slot : itemSlots) {
setItem(slot, null);
}
int start = currentPage * itemsPerPage;
int end = Math.min(start + itemsPerPage, items.size());
for (int i = start; i < end; i++) {
int slot = itemSlots[i - start];
int index = i;
setItem(slot, items.get(i), event -> {
if (itemActions.get(index) != null) {
itemActions.get(index).accept((Player) event.getWhoClicked());
}
});
}
updateNavigationButtons();
}
/**
* Setup navigation buttons
*/
private void setupNavigation() {
int lastRow = getSize() - 9;
ItemStack prevButton = createNavigationItem(Material.ARROW, "&cPrevious Page");
setItem(lastRow + 3, prevButton, event -> {
if (currentPage > 0) {
currentPage--;
updatePage();
}
});
ItemStack nextButton = createNavigationItem(Material.ARROW, "&aNext Page");
setItem(lastRow + 5, nextButton, event -> {
if (hasNextPage()) {
currentPage++;
updatePage();
}
});
ItemStack closeButton = createNavigationItem(Material.BARRIER, "&cClose");
setItem(lastRow + 4, closeButton, event -> {
event.getWhoClicked().closeInventory();
});
}
/**
* Update navigation button states
*/
private void updateNavigationButtons() {
int lastRow = getSize() - 9;
Material prevMaterial = currentPage > 0 ? Material.ARROW : Material.GRAY_DYE;
setItem(lastRow + 3, createNavigationItem(prevMaterial, "&cPrevious Page"));
Material nextMaterial = hasNextPage() ? Material.ARROW : Material.GRAY_DYE;
setItem(lastRow + 5, createNavigationItem(nextMaterial, "&aNext Page"));
int totalPages = (int) Math.ceil((double) items.size() / itemsPerPage);
ItemStack pageInfo = createNavigationItem(Material.PAPER,
"&ePage " + (currentPage + 1) + "/" + Math.max(1, totalPages));
setItem(lastRow + 4, pageInfo);
}
/**
* Check if there's next page
*/
private boolean hasNextPage() {
return (currentPage + 1) * itemsPerPage < items.size();
}
/**
* Create navigation item
*/
private ItemStack createNavigationItem(Material material, String name) {
ItemStack item = new ItemStack(material);
ItemMeta meta = item.getItemMeta();
if (meta != null) {
meta.setDisplayName(name.replace("&", "§"));
item.setItemMeta(meta);
}
return item;
}
/**
* Open GUI and show first page
*/
@Override
public void open(Player player) {
currentPage = 0;
updatePage();
super.open(player);
}
}
166 linesGNU GENERAL PUBLIC LICENSE · Version 3, 29 June 2007 · UTF-8 · Read only