176 lines
5.4 KiB
Java
176 lines
5.4 KiB
Java
package com.songoda.epicheads.menu;
|
|
|
|
import com.songoda.epicheads.cache.CacheFile;
|
|
import com.songoda.epicheads.cache.CacheHead;
|
|
import com.songoda.epicheads.menu.ui.Bounds;
|
|
import com.songoda.epicheads.menu.ui.InventoryMenu;
|
|
import com.songoda.epicheads.menu.ui.MenuResponse;
|
|
import com.songoda.epicheads.menu.ui.element.Element;
|
|
import com.songoda.epicheads.menu.ui.item.Button;
|
|
import com.songoda.epicheads.menu.ui.item.Item;
|
|
import com.songoda.epicheads.util.Checks;
|
|
import com.songoda.epicheads.util.Stringify;
|
|
import org.bukkit.ChatColor;
|
|
import org.bukkit.Material;
|
|
|
|
import java.util.List;
|
|
import java.util.function.Function;
|
|
|
|
public class CacheHeadsMenu extends Element {
|
|
|
|
public static final Item defaultClose = Item.create(Material.REDSTONE_BLOCK).name("&cClose Menu");
|
|
public static final Item defaultBack = Item.create(Material.REDSTONE_BLOCK).name("&cBack to Categories");
|
|
public static final Item defaultSearch = Item.create(Material.COMPASS).name("&7Search Heads");
|
|
public static final String defaultCategoriesTitle = "Categories";
|
|
public static final String defaultCategoryTitle = "%category%";
|
|
|
|
public static final Template defaultTemplate = new Template(CategoriesMenu.defaultTemplate, HeadsMenu.defaultTemplate, defaultClose, defaultBack, defaultSearch, defaultCategoriesTitle, defaultCategoryTitle);
|
|
|
|
private Template template;
|
|
|
|
private final CacheFile cache;
|
|
private final InventoryMenu inventoryMenu;
|
|
|
|
private final CategoriesMenu categoriesMenu;
|
|
private final HeadsMenu headsMenu;
|
|
|
|
private String selectedCategory = null;
|
|
|
|
public CacheHeadsMenu(CacheFile cache, InventoryMenu inventoryMenu, Bounds bounds, Function<CacheHead, MenuResponse> onSelect) {
|
|
super(bounds);
|
|
|
|
Checks.ensureNonNull(cache, "cache");
|
|
Checks.ensureNonNull(inventoryMenu, "inventoryMenu");
|
|
Checks.ensureNonNull(onSelect, "onSelect");
|
|
Checks.ensureTrue(bounds.height >= 3, "bounds must have a height of at least 3");
|
|
|
|
this.cache = cache;
|
|
this.inventoryMenu = inventoryMenu;
|
|
|
|
this.categoriesMenu = new CategoriesMenu(cache, bounds, this::selectCategory);
|
|
this.headsMenu = new HeadsMenu(bounds, onSelect);
|
|
|
|
setTemplate(defaultTemplate);
|
|
}
|
|
|
|
public boolean onCategoriesScreen() {
|
|
return selectedCategory == null;
|
|
}
|
|
|
|
public MenuResponse close() {
|
|
return MenuResponse.CLOSE;
|
|
}
|
|
|
|
public MenuResponse back() {
|
|
this.selectedCategory = null;
|
|
|
|
inventoryMenu.setTitle(template.getCategoriesTitle());
|
|
|
|
return MenuResponse.UPDATE;
|
|
}
|
|
|
|
public MenuResponse search() {
|
|
inventoryMenu.getPlayer().sendMessage("Search");
|
|
|
|
return MenuResponse.NONE;
|
|
}
|
|
|
|
public MenuResponse selectCategory(String category) {
|
|
Checks.ensureNonNull(category, "category");
|
|
|
|
List<CacheHead> heads = cache.getCategoryHeads(category);
|
|
|
|
if (heads.size() == 0) {
|
|
return back();
|
|
}
|
|
|
|
this.selectedCategory = category;
|
|
this.headsMenu.setItems(heads);
|
|
|
|
inventoryMenu.setTitle(template.getCategoryTitle(category));
|
|
|
|
return MenuResponse.UPDATE;
|
|
}
|
|
|
|
@Override
|
|
public Button[] getItems() {
|
|
if (onCategoriesScreen()) {
|
|
return categoriesMenu.getItems();
|
|
} else {
|
|
return headsMenu.getItems();
|
|
}
|
|
}
|
|
|
|
public void setTemplate(Template template) {
|
|
Checks.ensureNonNull(template, "template");
|
|
|
|
this.template = template;
|
|
this.template.init(this);
|
|
|
|
if (onCategoriesScreen()) {
|
|
inventoryMenu.setTitle(template.getCategoriesTitle());
|
|
} else {
|
|
inventoryMenu.setTitle(template.getCategoryTitle(selectedCategory));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return Stringify.builder().entry("template", template).entry("cache", cache).entry("headsMenu", headsMenu).entry("categoriesMenu", categoriesMenu).toString();
|
|
}
|
|
|
|
public static final class Template {
|
|
|
|
private final CategoriesMenu.Template categoriesTemplate;
|
|
private final HeadsMenu.Template headsTemplate;
|
|
private final Item close;
|
|
private final Item back;
|
|
private final Item search;
|
|
private final String categoriesTitle;
|
|
private final String categoryTitle;
|
|
|
|
public Template(CategoriesMenu.Template categoriesTemplate, HeadsMenu.Template headsTemplate, Item close, Item back, Item search, String categoriesTitle, String categoryTitle) {
|
|
|
|
Checks.ensureNonNull(categoriesTemplate, "categoriesTemplate");
|
|
Checks.ensureNonNull(headsTemplate, "headsTemplate");
|
|
Checks.ensureNonNull(close, "close");
|
|
Checks.ensureNonNull(back, "back");
|
|
Checks.ensureNonNull(search, "search");
|
|
Checks.ensureNonNull(categoriesTemplate, "categoriesTemplate");
|
|
Checks.ensureNonNull(categoryTitle, "categoryTitle");
|
|
|
|
this.categoriesTemplate = categoriesTemplate;
|
|
this.headsTemplate = headsTemplate;
|
|
this.close = close;
|
|
this.back = back;
|
|
this.search = search;
|
|
this.categoriesTitle = ChatColor.translateAlternateColorCodes('&', categoriesTitle);
|
|
this.categoryTitle = ChatColor.translateAlternateColorCodes('&', categoryTitle);
|
|
}
|
|
|
|
public String getCategoriesTitle() {
|
|
return categoriesTitle;
|
|
}
|
|
|
|
public String getCategoryTitle(String category) {
|
|
return categoryTitle.replace("%category%", category);
|
|
}
|
|
|
|
private void init(CacheHeadsMenu menu) {
|
|
Button close = this.close.buildButton(menu::close);
|
|
Button back = this.back.buildButton(menu::back);
|
|
Button search = this.search.buildButton(menu::search);
|
|
|
|
menu.categoriesMenu.setTemplate(categoriesTemplate, close, search);
|
|
menu.headsMenu.setTemplate(headsTemplate, back, search);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
return Stringify.builder().entry("categoriesTemplate", categoriesTemplate).entry("headsTemplate", headsTemplate).toString();
|
|
}
|
|
|
|
}
|
|
|
|
}
|