diff --git a/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java b/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java index 2123d98..26a2262 100644 --- a/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java +++ b/bukkit/src/main/java/broccolai/tags/bukkit/BukkitTagsPlatform.java @@ -33,6 +33,7 @@ import org.bukkit.plugin.java.JavaPlugin; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.NonNull; +import org.incendo.interfaces.paper.PaperInterfaceListeners; public final class BukkitTagsPlatform extends JavaPlugin implements TagsPlatform { @@ -77,6 +78,8 @@ public void onEnable() { } this.plugin.commands(commandManager, BUKKIT_COMMANDS); + + PaperInterfaceListeners.install(this); } @Override diff --git a/bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java b/bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java index b9087e1..33d108f 100644 --- a/bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java +++ b/bukkit/src/main/java/broccolai/tags/bukkit/menu/TagsMenuFactory.java @@ -29,12 +29,22 @@ public final class TagsMenuFactory { private static final ItemStackElement BOTTOM_BAR_ELEMENT = new ItemStackElement<>( - PaperItemBuilder.ofType(Material.WHITE_STAINED_GLASS_PANE) - .name(Component.empty()) - .build(), - ClickHandler.cancel() + PaperItemBuilder.ofType(Material.WHITE_STAINED_GLASS_PANE) + .name(Component.empty()) + .build(), + ClickHandler.cancel() ); + private static final ItemStack BACK_ITEM = PaperItemBuilder + .ofType(Material.RED_STAINED_GLASS_PANE) + .name(Component.text("Previous Page")) + .build(); + + private static final ItemStack FORWARD_ITEM = PaperItemBuilder + .ofType(Material.GREEN_STAINED_GLASS_PANE) + .name(Component.text("Next Page")) + .build(); + private final Logger logger; private final TagsService tagsService; private final ActionService actionService; @@ -42,10 +52,10 @@ public final class TagsMenuFactory { @Inject public TagsMenuFactory( - final @NonNull Logger logger, - final @NonNull TagsService tagsService, - final @NonNull ActionService actionService, - final @NonNull LocaleConfiguration locale + final @NonNull Logger logger, + final @NonNull TagsService tagsService, + final @NonNull ActionService actionService, + final @NonNull LocaleConfiguration locale ) { this.logger = logger; this.tagsService = tagsService; @@ -55,11 +65,11 @@ public TagsMenuFactory( public ChestInterface create(final @NonNull TagsUser user) { return ChestInterface.builder() - .title(this.locale.title.asComponent()) - .rows(4) - .addTransform(this::createFillTransform) - .addReactiveTransform(this.createTagTransform(user)) - .build(); + .title(this.locale.title.asComponent()) + .rows(4) + .addTransform(this::createFillTransform) + .addReactiveTransform(this.createTagTransform(user)) + .build(); } private ChestPane createFillTransform(ChestPane pane, InterfaceView view) { @@ -73,28 +83,43 @@ private ChestPane createFillTransform(ChestPane pane, InterfaceView, ChestPane, PlayerViewer> createTagTransform(final @NonNull TagsUser user) { - return new PaginatedTransform<>( - Vector2.at(0, 0), - Vector2.at(8, 2), - () -> this.createTagElements(user) + PaginatedTransform, ChestPane, PlayerViewer> transform = new PaginatedTransform<>( + Vector2.at(0, 0), + Vector2.at(8, 2), + () -> this.createTagElements(user) ); + + transform.backwardElement(Vector2.at(0, 3), unused -> { + return ItemStackElement.of(BACK_ITEM, ctx -> { + transform.previousPage(); + }); + }); + + transform.forwardElement(Vector2.at(8, 3), unused -> { + return ItemStackElement.of(FORWARD_ITEM, ctx -> { + transform.nextPage(); + }); + }); + + return transform; } private List> createTagElements(final @NonNull TagsUser user) { return this.tagsService.allTags(user) - .stream() - .map(tag -> this.createTagElement(user, tag)) - .toList(); + .stream() + .map(tag -> this.createTagElement(user, tag)) + .toList(); } private ItemStackElement createTagElement(final @NonNull TagsUser user, final @NonNull ConstructedTag tag) { Material material = this.matchMaterialOrDefault(tag.displayInformation().material()); ItemStack item = PaperItemBuilder.ofType(material) - .name(tag.component()) - .lore(this.createTagLore(tag)) - .build(); + .name(tag.component()) + .lore(this.createTagLore(tag)) + .build(); return ItemStackElement.of(item, ctx -> { + ctx.cancel(true); this.actionService.select(user, tag); }); } @@ -112,9 +137,9 @@ private List createTagLore(final @NonNull ConstructedTag tag) { private List formatTagReason(final @NonNull String reason) { return FormatingUtilites.splitString(reason, 30) - .stream() - .map(text -> Component.text(text, NamedTextColor.WHITE)) - .collect(Collectors.toList()); + .stream() + .map(text -> Component.text(text, NamedTextColor.WHITE)) + .collect(Collectors.toList()); } private Material matchMaterialOrDefault(final @NonNull String input) {