All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ru.cwcode.tkach.refreshmenu.inventory.view.PagedView Maven / Gradle / Ivy

package ru.cwcode.tkach.refreshmenu.inventory.view;

import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.event.inventory.InventoryClickEvent;
import ru.cwcode.tkach.refreshmenu.MenuContext;
import ru.cwcode.tkach.refreshmenu.inventory.ingredient.Ingredient;
import ru.cwcode.tkach.refreshmenu.inventory.view.drawer.PagedViewDrawer;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;

public class PagedView extends View {
  protected transient List dynamic = new ArrayList<>();
  protected transient int page = 0;
  protected transient int maxPage = 0;
  protected transient int pageSize = 0;
  protected char dynamicChar = '#';
  protected transient Player player;
  
  {
    behavior.bind('<', ClickType.LEFT, this::prevPage);
    behavior.bind('>', ClickType.LEFT, this::nextPage);
  }
  
  public PagedView() {
  }
  
  @Override
  public PagedViewDrawer getDrawer() {
    return (PagedViewDrawer) drawer;
  }
  
  public List getDynamic() {
    return dynamic;
  }
  
  public void setDynamic(List dynamic) {
    this.dynamic = dynamic;
    this.pageSize = shape.howMany(dynamicChar);
    
    if (this.pageSize == 0) return;
    
    this.maxPage = dynamic.size() / pageSize + (dynamic.size() % pageSize != 0 ? 1 : 0);
    
    placeholders.add("maxPage", maxPage);
    updatePlaceholders();
  }
  
  protected void updatePlaceholders() {
    placeholders.add("page", page + 1);
    placeholders.add("nextPage", Math.min(maxPage, page + 2));
    placeholders.add("prevPage", Math.max(1, page));
  }
  
  protected Optional getDynamic(int slot) {
    int indexAtPage = (int) shape.getJoinedShape().substring(0, slot).chars().filter(ch -> ch == dynamicChar).count();
    int indexAtDynamic = page * pageSize + indexAtPage;
    
    return indexAtDynamic >= dynamic.size() ? Optional.empty() : Optional.ofNullable(dynamic.get(indexAtDynamic));
  }
  
  public char getDynamicChar() {
    return dynamicChar;
  }
  
  protected void setDynamicChar(char dynamicIngredient) {
    this.dynamicChar = dynamicIngredient;
  }
  
  protected void nextPage() {
    if (page + 1 < maxPage) {
      page++;
      updatePlaceholders();
      updateDynamicContent(player);
    }
  }
  
  protected synchronized void updateDynamicContent(Player player) {
    drawer.drawChars(new MenuContext(this, player), Set.of(getDynamicChar(), '<', '>'));
  }
  
  protected void prevPage() {
    if (page > 0) {
      page--;
      updatePlaceholders();
      updateDynamicContent(player);
    }
  }
  
  @Override
  protected void onOpen(Player player) {
    this.player = player;
  }
  
  public int getPage() {
    return page;
  }
  
  @Override
  protected void initializeDrawer() {
    drawer = new PagedViewDrawer();
  }
  
  public Player getPlayer() {
    return player;
  }
  
  public boolean hasViewers() {
    return !getInventory().getViewers().isEmpty();
  }
  
  public void updateRequired(Player player) {
    ((PagedViewDrawer) drawer).updateRequired(new MenuContext(this, player));
  }
  
  @Override
  protected void handleIngredientClickAction(InventoryClickEvent event, char character) {
    int slot = event.getSlot();
    
    if (event.getView().getInventory(event.getRawSlot()) != getInventory()) {
      slot = getInventory().getSize() + (slot < 9 ? (slot + 27) : (slot - 9));
    }
    
    Ingredient clickedIngredient = character == dynamicChar ? getDynamic(slot).orElse(null) : shape.getIngredientMap().get(character);
    
    if (clickedIngredient != null) {
      clickedIngredient.onClick(new MenuContext(this, (Player) event.getWhoClicked()), event.getClick());
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy