Skip to content

Commit

Permalink
added PaginatedGui, Patterns
Browse files Browse the repository at this point in the history
  • Loading branch information
zitreF committed Aug 9, 2023
1 parent cf13dc9 commit b20de4f
Show file tree
Hide file tree
Showing 11 changed files with 288 additions and 9 deletions.
10 changes: 10 additions & 0 deletions src/main/java/me/cocos/gui/builder/gui/GuiBuilder.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package me.cocos.gui.builder.gui;

import me.cocos.gui.data.GuiItem;
import me.cocos.gui.gui.impl.PaginatedGui;
import me.cocos.gui.pattern.Pattern;
import me.cocos.gui.structure.Structure;
import me.cocos.gui.gui.Gui;
import me.cocos.gui.gui.impl.NormalGui;
Expand All @@ -18,6 +20,10 @@ public interface GuiBuilder<G extends Gui, B extends GuiBuilder<G, B>> {

B item(int slot, GuiItem item);

B blockPlayerInventory(boolean value);

B pattern(Pattern pattern, GuiItem guiItem);

B addItem(GuiItem item, int times);

B addItems(GuiItem... items);
Expand All @@ -33,4 +39,8 @@ public interface GuiBuilder<G extends Gui, B extends GuiBuilder<G, B>> {
static NormalGui.NormalGuiBuilder normal(String name, int rows) {
return new NormalGui.NormalGuiBuilder(name, rows);
}

static PaginatedGui.PaginatedGuiBuilder paginated(String name, int rows) {
return new PaginatedGui.PaginatedGuiBuilder(name, rows);
}
}
5 changes: 5 additions & 0 deletions src/main/java/me/cocos/gui/gui/Gui.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import me.cocos.gui.CocosGui;
import me.cocos.gui.data.GuiItem;
import me.cocos.gui.pattern.Pattern;
import me.cocos.gui.structure.Structure;
import me.cocos.gui.gui.holder.GuiHolder;
import me.cocos.gui.helper.ChatHelper;
Expand Down Expand Up @@ -40,6 +41,10 @@ public void setItem(int slot, GuiItem guiItem) {
this.inventory.setItem(slot, guiItem.getItemStack());
}

public void applyPattern(Pattern pattern, GuiItem guiItem) {
pattern.getAction().accept(this, guiItem);
}

public void addItems(GuiItem... guiItems) {
for (GuiItem guiItem : guiItems) {
int firstEmpty = this.inventory.firstEmpty();
Expand Down
19 changes: 15 additions & 4 deletions src/main/java/me/cocos/gui/gui/impl/NormalGui.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@

import me.cocos.gui.builder.gui.GuiBuilder;
import me.cocos.gui.data.GuiItem;
import me.cocos.gui.structure.Structure;
import me.cocos.gui.gui.Gui;
import me.cocos.gui.pattern.Pattern;
import me.cocos.gui.structure.Structure;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
Expand Down Expand Up @@ -39,9 +40,7 @@ public NormalGuiBuilder structure(Structure structure) {

@Override
public NormalGuiBuilder ingredient(char character, GuiItem guiItem) {
if (normalGui.getStructure() == null) {
throw new IllegalCallerException("Gui's structure is null! You cannot set ingredient to null Structure!");
}
this.normalGui.getStructure().ingredient(character, guiItem);
return this;
}

Expand All @@ -51,6 +50,18 @@ public NormalGuiBuilder item(int slot, GuiItem item) {
return this;
}

@Override
public NormalGuiBuilder blockPlayerInventory(boolean value) {
this.normalGui.setBlockPlayerInventory(value);
return this;
}

@Override
public NormalGuiBuilder pattern(Pattern pattern, GuiItem guiItem) {
this.normalGui.applyPattern(pattern, guiItem);
return this;
}

@Override
public NormalGuiBuilder addItem(GuiItem item, int times) {
this.normalGui.addItem(item, times);
Expand Down
171 changes: 171 additions & 0 deletions src/main/java/me/cocos/gui/gui/impl/PaginatedGui.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
package me.cocos.gui.gui.impl;

import me.cocos.gui.builder.gui.GuiBuilder;
import me.cocos.gui.data.GuiItem;
import me.cocos.gui.gui.Gui;
import me.cocos.gui.pattern.Pattern;
import me.cocos.gui.structure.Structure;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;

import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;

public final class PaginatedGui extends Gui {

private List<GuiItem> guiItems;

private char key;
private int currentPage;

public PaginatedGui(String name, int rows) {
super(name, rows);
this.guiItems = new ArrayList<>();
this.currentPage = 0;
}

@Override
public void dispose() {
this.actions.clear();
this.inventory.clear();
this.guiItems.clear();
if (structure != null) this.structure.dispose();
}

public void applyStructure() {
if (structure != null) {
String pattern = structure.getPattern();

int itemsPerPage = StringUtils.countMatches(pattern, key);
int startIndex = currentPage * itemsPerPage;
int endIndex = Math.min(startIndex + itemsPerPage, this.guiItems.size());

int index = 0;

for (int i = 0; i < this.inventory.getSize(); i++) {
char character = pattern.charAt(i);

if (character != key) {
continue;
}

if (index < endIndex - startIndex) {
GuiItem guiItem = this.guiItems.get(startIndex + index);
this.setItem(i, guiItem);
index++;
continue;
}
break;
}
}
}

public void nextPage() {
int itemsPerPage = StringUtils.countMatches(structure.getPattern(), key);
int maxPage = (int) Math.ceil((double) this.guiItems.size() / itemsPerPage);
if (this.currentPage >= maxPage - 1) {
return;
}
this.getInventory().clear();
this.currentPage++;
this.applyStructure();
this.structure.apply(this);
}

public void previousPage() {
if (this.currentPage > 0) {
this.getInventory().clear();
this.currentPage--;
this.applyStructure();
this.structure.apply(this);
}
}

public static class PaginatedGuiBuilder implements GuiBuilder<PaginatedGui, PaginatedGuiBuilder> {

private final PaginatedGui paginatedGui;

public PaginatedGuiBuilder(String name, int rows) {
this.paginatedGui = new PaginatedGui(name, rows);
}

@Override
public PaginatedGuiBuilder structure(Structure structure) {
this.paginatedGui.applyStructure(structure);
return this;
}

@Override
public PaginatedGuiBuilder ingredient(char character, GuiItem guiItem) {
this.paginatedGui.getStructure().ingredient(character, guiItem);
return this;
}

@Override
public PaginatedGuiBuilder item(int slot, GuiItem item) {
this.paginatedGui.setItem(slot, item);
return this;
}

public PaginatedGuiBuilder setIngredients(char character, List<GuiItem> guiItems) {
this.paginatedGui.key = character;
this.paginatedGui.guiItems = new ArrayList<>(guiItems);
return this;
}

@Override
public PaginatedGuiBuilder blockPlayerInventory(boolean value) {
this.paginatedGui.setBlockPlayerInventory(value);
return this;
}

@Override
public PaginatedGuiBuilder pattern(Pattern pattern, GuiItem guiItem) {
this.paginatedGui.applyPattern(pattern, guiItem);
return this;
}

@Override
public PaginatedGuiBuilder addItem(GuiItem item, int times) {
this.paginatedGui.addItem(item, times);
return this;
}

@Override
public PaginatedGuiBuilder addItems(GuiItem... items) {
this.paginatedGui.addItems(items);
return this;
}

@Override
public PaginatedGuiBuilder onClick(BiConsumer<InventoryClickEvent, Player> onClick) {
this.paginatedGui.setOnClick(onClick);
return this;
}

@Override
public PaginatedGuiBuilder onClose(BiConsumer<InventoryCloseEvent, Player> onClose) {
this.paginatedGui.setOnClose(onClose);
return this;
}

@Override
public PaginatedGuiBuilder disposable(boolean disposable) {
this.paginatedGui.setDisposable(disposable);
return this;
}

@Override
public PaginatedGui build() {
paginatedGui.applyStructure();
return this.paginatedGui;
}

public static PaginatedGuiBuilder from(String name, int rows) {
return new PaginatedGuiBuilder(name, rows);
}
}
}
6 changes: 3 additions & 3 deletions src/main/java/me/cocos/gui/helper/ChatHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public static String colored(String text) {
return ChatColor.translateAlternateColorCodes('&', text);
}

public static String coloredHex(String text) {
public static String hex(String text) {
Matcher matcher = HEX_PATTERN.matcher(text);

StringBuilder builder = new StringBuilder();
Expand All @@ -36,7 +36,7 @@ public static List<String> colored(List<String> lines) {
return lines.stream().map(ChatHelper::colored).toList();
}

public static List<String> coloredHex(List<String> lines) {
return lines.stream().map(ChatHelper::coloredHex).toList();
public static List<String> hex(List<String> lines) {
return lines.stream().map(ChatHelper::hex).toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import me.cocos.gui.gui.Gui;
import me.cocos.gui.gui.holder.GuiHolder;
import me.cocos.gui.gui.impl.PaginatedGui;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
Expand Down
36 changes: 36 additions & 0 deletions src/main/java/me/cocos/gui/pattern/Pattern.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package me.cocos.gui.pattern;

import me.cocos.gui.data.GuiItem;
import me.cocos.gui.gui.Gui;

import java.util.function.BiConsumer;

public enum Pattern {

FILL((gui, guiItem) -> {
gui.addItem(guiItem, gui.getSize());
}),
BORDER((gui, guiItem) -> {
int inventorySize = gui.getSize();
int rows = inventorySize / 9;

for (int slot = 0; slot < inventorySize; slot++) {
int row = slot / 9;
int col = slot % 9;

if (row == 0 || row == rows - 1 || col == 0 || col == 8) {
gui.setItem(slot, guiItem);
}
}
});

private final BiConsumer<Gui, GuiItem> action;

Pattern(BiConsumer<Gui, GuiItem> action) {
this.action = action;
}

public BiConsumer<Gui, GuiItem> getAction() {
return action;
}
}
8 changes: 8 additions & 0 deletions src/main/java/me/cocos/gui/structure/Structure.java
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,12 @@ public static Structure of(String... pattern) {
public String getPattern() {
return this.pattern;
}

public Map<Character, GuiItem> getIngredients() {
return this.ingredients;
}

public Map<Character, List<GuiItem>> getIngredientList() {
return this.ingredientList;
}
}
2 changes: 2 additions & 0 deletions src/test/java/Main.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import command.TestCommand;
import me.cocos.gui.CocosGui;
import org.bukkit.plugin.java.JavaPlugin;

public final class Main extends JavaPlugin {

@Override
public void onEnable() {
CocosGui.initialize();
this.getCommand("test").setExecutor(new TestCommand());
}
}
3 changes: 1 addition & 2 deletions src/test/java/command/TestCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,8 @@ public class TestCommand implements CommandExecutor {
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
Player player = (Player) sender;
testMenu.openThirdGui(player);
testMenu.openFourthGui(player);
return false;
}


}
Loading

0 comments on commit b20de4f

Please sign in to comment.