Skip to content

Commit ff8323f

Browse files
committed
improving menu manager
1 parent ea2a2be commit ff8323f

File tree

5 files changed

+117
-22
lines changed

5 files changed

+117
-22
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>me.kodysimpson</groupId>
88
<artifactId>SimpAPI</artifactId>
9-
<version>4.5.6</version>
9+
<version>4.6.0</version>
1010
<packaging>jar</packaging>
1111

1212
<name>SimpAPI</name>
@@ -92,7 +92,7 @@
9292
<dependency>
9393
<groupId>com.fasterxml.jackson.core</groupId>
9494
<artifactId>jackson-databind</artifactId>
95-
<version>2.12.4</version>
95+
<version>2.13.4.2</version>
9696
</dependency>
9797
<dependency>
9898
<groupId>com.fasterxml.jackson.dataformat</groupId>

src/main/java/me/kodysimpson/simpapi/menu/Menu.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,5 +129,14 @@ public ItemStack makeItem(Material material, String displayName, String... lore)
129129
return item;
130130
}
131131

132+
/**
133+
* Called when a player closes this menu
134+
* Override this method to handle menu closing events
135+
*/
136+
public void handleMenuClose() {
137+
// Default empty implementation
138+
// Subclasses can override this if they want to handle menu closing
139+
}
140+
132141
}
133142

src/main/java/me/kodysimpson/simpapi/menu/MenuListener.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
import org.bukkit.event.EventHandler;
77
import org.bukkit.event.Listener;
88
import org.bukkit.event.inventory.InventoryClickEvent;
9+
import org.bukkit.event.inventory.InventoryCloseEvent;
910
import org.bukkit.inventory.InventoryHolder;
1011

11-
1212
public class MenuListener implements Listener {
1313

1414
@EventHandler
@@ -19,13 +19,10 @@ public void onMenuClick(InventoryClickEvent e) {
1919
// is an instance of Menu, then gg. The reason that
2020
// an InventoryHolder can be a Menu is because our Menu
2121
// class implements InventoryHolder!!
22-
if (holder instanceof Menu) {
22+
if (holder instanceof Menu menu) {
2323
if (e.getCurrentItem() == null) { //deal with null exceptions
2424
return;
2525
}
26-
//Since we know our inventoryholder is a menu, get the Menu Object representing
27-
// the menu we clicked on
28-
Menu menu = (Menu) holder;
2926

3027
if (menu.cancelAllClicks()) {
3128
e.setCancelled(true); //prevent them from fucking with the inventory
@@ -43,5 +40,14 @@ public void onMenuClick(InventoryClickEvent e) {
4340

4441
}
4542

43+
@EventHandler
44+
public void onMenuClose(InventoryCloseEvent e) {
45+
InventoryHolder holder = e.getInventory().getHolder();
46+
47+
if (holder instanceof Menu menu) {
48+
menu.handleMenuClose();
49+
}
50+
}
51+
4652
}
4753

src/main/java/me/kodysimpson/simpapi/menu/MenuManager.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public class MenuManager {
2323
private static void registerMenuListener(Server server, Plugin plugin) {
2424
boolean isAlreadyRegistered = false;
2525
for (RegisteredListener rl : InventoryClickEvent.getHandlerList().getRegisteredListeners()) {
26-
System.out.println(rl.getListener().getClass().getSimpleName());
2726
if (rl.getListener() instanceof MenuListener) {
2827
isAlreadyRegistered = true;
2928
break;
@@ -40,7 +39,7 @@ private static void registerMenuListener(Server server, Plugin plugin) {
4039
* @param plugin The instance of the plugin using this API. Can provide in plugin class by passing this keyword
4140
*/
4241
public static void setup(Server server, Plugin plugin) {
43-
System.out.println("MENU MANAGER HAS BEEN SETUP");
42+
plugin.getLogger().info("Menu Manager has been setup");
4443

4544
registerMenuListener(server, plugin);
4645
isSetup = true;

src/main/java/me/kodysimpson/simpapi/menu/PaginatedMenu.java

Lines changed: 94 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ public abstract class PaginatedMenu extends Menu {
1919
//28 empty slots are remaining.
2020
protected int maxItemsPerPage = 28;
2121

22+
// Add cache field
23+
private List<ItemStack> cachedItems;
24+
2225
public PaginatedMenu(PlayerMenuUtility playerMenuUtility) {
2326
super(playerMenuUtility);
2427
}
@@ -39,10 +42,16 @@ public PaginatedMenu(PlayerMenuUtility playerMenuUtility) {
3942
* Set the border and menu buttons for the menu. Override this method to provide a custom menu border or specify custom items in customMenuBorderItems()
4043
*/
4144
protected void addMenuBorder() {
42-
43-
inventory.setItem(48, makeItem(Material.DARK_OAK_BUTTON, ChatColor.GREEN + "Left"));
45+
// First page button
46+
inventory.setItem(47, makeItem(Material.DARK_OAK_BUTTON, ChatColor.GREEN + "First Page"));
47+
// Previous page button
48+
inventory.setItem(48, makeItem(Material.DARK_OAK_BUTTON, ChatColor.GREEN + "Previous"));
49+
// Close button
4450
inventory.setItem(49, makeItem(Material.BARRIER, ChatColor.DARK_RED + "Close"));
45-
inventory.setItem(50, makeItem(Material.DARK_OAK_BUTTON, ChatColor.GREEN + "Right"));
51+
// Next page button
52+
inventory.setItem(50, makeItem(Material.DARK_OAK_BUTTON, ChatColor.GREEN + "Next"));
53+
// Last page button
54+
inventory.setItem(51, makeItem(Material.DARK_OAK_BUTTON, ChatColor.GREEN + "Last Page"));
4655

4756
for (int i = 0; i < 10; i++) {
4857
if (inventory.getItem(i) == null) {
@@ -70,22 +79,43 @@ protected void addMenuBorder() {
7079

7180
}
7281

82+
/**
83+
* Gets the paginated items, using cache if available
84+
* @return List of ItemStacks to display
85+
*/
86+
protected List<ItemStack> getItems() {
87+
if (cachedItems == null) {
88+
cachedItems = dataToItems();
89+
}
90+
return cachedItems;
91+
}
92+
93+
/**
94+
* Clears the item cache, forcing items to be reloaded next time
95+
*/
96+
protected void invalidateCache() {
97+
cachedItems = null;
98+
}
99+
73100
/**
74101
* Place each item in the paginated menu, automatically coded by default but override if you want custom functionality. Calls the loopCode() method you define for each item returned in the getData() method
75102
*/
76103
@Override
77104
public void setMenuItems() {
78-
79105
addMenuBorder();
80-
81-
//add the items to the inventory based on the current page and max items per page
82-
List<ItemStack> items = dataToItems();
106+
107+
List<ItemStack> items = getItems(); // Use cached items
108+
109+
int slot = 10;
83110
for (int i = 0; i < maxItemsPerPage; i++) {
84111
int index = maxItemsPerPage * page + i;
85112
if (index >= items.size()) break;
86-
inventory.addItem(items.get(index));
113+
114+
if (slot % 9 == 8) slot += 2;
115+
116+
inventory.setItem(slot, items.get(index));
117+
slot++;
87118
}
88-
89119
}
90120

91121
/**
@@ -105,17 +135,68 @@ public boolean prevPage() {
105135
* @return true if successful, false if already on the last page
106136
*/
107137
public boolean nextPage() {
108-
if (!((page + 1) * maxItemsPerPage >= dataToItems().size())) {
109-
page = page + 1;
138+
int totalItems = getItems().size(); // Use cached items
139+
int lastPageNumber = (totalItems - 1) / maxItemsPerPage;
140+
141+
if (page < lastPageNumber) {
142+
page++;
110143
reloadItems();
111144
return true;
112-
} else {
113-
return false;
114145
}
146+
return false;
115147
}
116148

117149
public int getMaxItemsPerPage() {
118150
return maxItemsPerPage;
119151
}
152+
153+
public int getCurrentPage() {
154+
return page + 1; // Convert to 1-based page numbers for display
155+
}
156+
157+
public int getTotalPages() {
158+
return ((getItems().size() - 1) / maxItemsPerPage) + 1; // Use cached items
159+
}
160+
161+
@Override
162+
public void open() {
163+
invalidateCache(); // Force items to be reloaded when menu opens
164+
super.open();
165+
}
166+
167+
/**
168+
* Refreshes the menu data and reloads items while keeping the menu open
169+
*/
170+
public void refreshData() {
171+
invalidateCache();
172+
reloadItems();
173+
}
174+
175+
/**
176+
* Sets the current page to the first page (0)
177+
* @return true if the page was changed, false if already on first page
178+
*/
179+
public boolean firstPage() {
180+
if (page == 0) {
181+
return false;
182+
}
183+
page = 0;
184+
reloadItems();
185+
return true;
186+
}
187+
188+
/**
189+
* Sets the current page to the last page
190+
* @return true if the page was changed, false if already on last page
191+
*/
192+
public boolean lastPage() {
193+
int lastPageNum = (getItems().size() - 1) / maxItemsPerPage;
194+
if (page == lastPageNum) {
195+
return false;
196+
}
197+
page = lastPageNum;
198+
reloadItems();
199+
return true;
200+
}
120201
}
121202

0 commit comments

Comments
 (0)