Keep working on the GUI API.

* NEW: The manage command now opens the MapList GUI.
* NEW: MapListGui: First actual implementation.
* NEW: MapManager/PlayerMapStore: Added the getMaps() method.
* BUG: GuiUtils: The hideAttributes() method does not crash anymore if
  the ItemFlags API is not available.
* OPT: ExplorerGui: Inventory variables are now computed only on data update.
This commit is contained in:
Adrien Prokopowicz 2015-07-30 08:52:18 +02:00
parent 586644e486
commit 0ad44db92b
6 changed files with 82 additions and 50 deletions

View File

@ -20,10 +20,8 @@ package fr.moribus.imageonmap.commands.maptool;
import fr.moribus.imageonmap.commands.*; import fr.moribus.imageonmap.commands.*;
import fr.moribus.imageonmap.gui.core.*; import fr.moribus.imageonmap.guiproko.list.MapListGui;
import fr.moribus.imageonmap.gui.list.*;
import fr.moribus.imageonmap.guiproko.core.Gui; import fr.moribus.imageonmap.guiproko.core.Gui;
import fr.moribus.imageonmap.guiproko.list.MaterialGui;
@CommandInfo(name = "manage") @CommandInfo(name = "manage")
@ -38,6 +36,6 @@ public class ManageCommand extends Command
protected void run() throws CommandException protected void run() throws CommandException
{ {
//GuiManager.openGui(playerSender(), new MapListGui()); //GuiManager.openGui(playerSender(), new MapListGui());
Gui.open(playerSender(), new MaterialGui()); Gui.open(playerSender(), new MapListGui());
} }
} }

View File

@ -34,8 +34,9 @@ abstract public class ExplorerGui<T> extends ActionGui
private int currentPageX = 0; private int currentPageX = 0;
private int pageCountX = 0; private int pageCountX;
private int pageCountY = 0; private int pageCountY;
private int inventoryViewSize; private int inventoryViewSize;
private Mode mode = Mode.CREATIVE; private Mode mode = Mode.CREATIVE;
@ -81,23 +82,15 @@ abstract public class ExplorerGui<T> extends ActionGui
if(hasActions()) super.populate(inventory); if(hasActions()) super.populate(inventory);
} }
@Override
public void update()
{
//TODO: Make inventory fit to content
setSize(MAX_INVENTORY_SIZE);
super.update();
}
@Override @Override
protected void onClick(InventoryClickEvent event) protected void onClick(InventoryClickEvent event)
{ {
int slot = event.getRawSlot(); int slot = event.getRawSlot();
//Clicked in the action bar //Clicked in the action bar
if(slot > MAX_INVENTORY_SIZE - INVENTORY_ROW_SIZE if(hasActions() &&
&& slot < MAX_INVENTORY_SIZE) slot >= MAX_INVENTORY_SIZE - INVENTORY_ROW_SIZE
&& slot < MAX_INVENTORY_SIZE)
{ {
super.onClick(event); super.onClick(event);
return; return;
@ -127,13 +120,6 @@ abstract public class ExplorerGui<T> extends ActionGui
} }
} }
private int getDataIndex(int slot)
{
int inventorySize = MAX_INVENTORY_SIZE;
if(getPageCount() > 1) inventorySize -= INVENTORY_ROW_SIZE;
return currentPageX * inventorySize + slot;
}
private void onActionPickup(InventoryClickEvent event) private void onActionPickup(InventoryClickEvent event)
{ {
if(mode.equals(Mode.READONLY)) if(mode.equals(Mode.READONLY))
@ -141,13 +127,19 @@ abstract public class ExplorerGui<T> extends ActionGui
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
int dataIndex = getDataIndex(event.getSlot()); int dataIndex = currentPageX * inventoryViewSize + event.getSlot();
if(dataIndex < 0 || dataIndex >= data.length) if(dataIndex < 0 || dataIndex >= data.length)
{ {
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
event.setCurrentItem(getPickedUpItem(data[dataIndex])); ItemStack pickedUpItem = getPickedUpItem(data[dataIndex]);
if(pickedUpItem == null)
{
event.setCancelled(true);
return;
}
event.setCurrentItem(pickedUpItem);
GuiUtils.setItemLater(this, event.getSlot(), getViewItem(data[dataIndex])); GuiUtils.setItemLater(this, event.getSlot(), getViewItem(data[dataIndex]));
} }
@ -170,7 +162,31 @@ abstract public class ExplorerGui<T> extends ActionGui
@Override @Override
protected void onAfterUpdate() protected void onAfterUpdate()
{ {
if(getPageCount() > 1) inventoryViewSize = MAX_INVENTORY_SIZE;
//Calculating page count
if(data.length <= 0)
{
pageCountX = 1;
pageCountY = 1;
}
else if(viewWidth <= 0)
{
if(hasActions() || data.length > MAX_INVENTORY_SIZE)
inventoryViewSize -= INVENTORY_ROW_SIZE;
pageCountX = (int)Math.ceil(data.length / inventoryViewSize);
pageCountY = 1;
}
else
{
//TODO: NYI
}
//TODO: Make inventory fit to content
setSize(MAX_INVENTORY_SIZE);
if(pageCountX > 1)
{ {
action("previous", MAX_INVENTORY_SIZE - INVENTORY_ROW_SIZE); action("previous", MAX_INVENTORY_SIZE - INVENTORY_ROW_SIZE);
action("next", MAX_INVENTORY_SIZE - 1); action("next", MAX_INVENTORY_SIZE - 1);
@ -208,7 +224,7 @@ abstract public class ExplorerGui<T> extends ActionGui
public boolean canGoNext() public boolean canGoNext()
{ {
return currentPageX < getPageCount(); return currentPageX < pageCountX;
} }
public boolean canGoPrevious() public boolean canGoPrevious()
@ -218,22 +234,12 @@ abstract public class ExplorerGui<T> extends ActionGui
public int getPageCount() public int getPageCount()
{ {
if(data.length == 0) return 0; return pageCountX;
if(viewWidth > 0)
{
if(viewWidth > INVENTORY_ROW_SIZE) return 1;
return (int)Math.ceil(viewWidth / (INVENTORY_ROW_SIZE - 1));
}
return (int)Math.ceil(data.length / (MAX_INVENTORY_SIZE - (hasActions() ? INVENTORY_ROW_SIZE : 0)));
} }
public int getVerticalPageCount() public int getVerticalPageCount()
{ {
if(viewWidth <= 0) return 0; return pageCountY;
return (int)Math.ceil(data.length / (MAX_INVENTORY_COLUMN_SIZE - (hasActions() ? 0 : 1)));
} }
protected Mode getMode() {return mode;} protected Mode getMode() {return mode;}

View File

@ -63,6 +63,7 @@ abstract public class GuiUtils
static public void hideItemAttributes(ItemMeta meta) static public void hideItemAttributes(ItemMeta meta)
{ {
if(addItemFlagsMethod == null) return;
try try
{ {
addItemFlagsMethod.invoke(meta, itemFlagValues); addItemFlagsMethod.invoke(meta, itemFlagValues);
@ -113,6 +114,7 @@ abstract public class GuiUtils
meta.setLore(loreLines); meta.setLore(loreLines);
if(itemStack.getType().equals(Material.MAP)) if(itemStack.getType().equals(Material.MAP))
hideItemAttributes(meta); hideItemAttributes(meta);
itemStack.setItemMeta(meta);
return itemStack; return itemStack;
} }

View File

@ -19,33 +19,49 @@
package fr.moribus.imageonmap.guiproko.list; package fr.moribus.imageonmap.guiproko.list;
import fr.moribus.imageonmap.guiproko.core.ExplorerGui; import fr.moribus.imageonmap.guiproko.core.ExplorerGui;
import fr.moribus.imageonmap.guiproko.core.GuiUtils;
import fr.moribus.imageonmap.map.ImageMap; import fr.moribus.imageonmap.map.ImageMap;
import fr.moribus.imageonmap.map.MapManager; import fr.moribus.imageonmap.map.MapManager;
import java.util.List; import fr.moribus.imageonmap.map.PosterMap;
import fr.moribus.imageonmap.map.SingleMap;
import fr.moribus.imageonmap.ui.MapItemManager;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class MapListGui extends ExplorerGui<ImageMap> public class MapListGui extends ExplorerGui<ImageMap>
{ {
private ImageMap[] maps;
@Override @Override
protected ItemStack getViewItem(ImageMap data) protected ItemStack getViewItem(ImageMap data)
{ {
if(data instanceof SingleMap)
{
return GuiUtils.makeItem(Material.EMPTY_MAP, data.getName(), "Single map", "#" + data.getId());
}
PosterMap map = (PosterMap) data;
return GuiUtils.makeItem(Material.MAP, data.getName(),
"Poster map ("+map.getColumnCount()+"x"+map.getRowCount()+")", "#" + data.getId());
}
@Override
protected ItemStack getPickedUpItem(ImageMap map)
{
if(map instanceof SingleMap)
{
return MapItemManager.createMapItem(map.getMapsIDs()[0], map.getName());
}
MapItemManager.give((Player) getPlayer(), map);
return null; return null;
} }
@Override @Override
protected void onUpdate() protected void onUpdate()
{ {
List<ImageMap> listMaps = MapManager.getMapList(getPlayer().getUniqueId()); ImageMap[] maps = MapManager.getMaps(getPlayer().getUniqueId());
maps = new ImageMap[listMaps.size()];
for(int i = listMaps.size(); i --> 0;)
{
maps[i] = listMaps.get(i);
}
setData(maps); setData(maps);
setTitle("Your maps (" + maps.length + " total)");
} }
} }

View File

@ -138,6 +138,11 @@ abstract public class MapManager
{ {
return getPlayerMapStore(playerUUID).getMapList(); return getPlayerMapStore(playerUUID).getMapList();
} }
static public ImageMap[] getMaps(UUID playerUUID)
{
return getPlayerMapStore(playerUUID).getMaps();
}
/** /**
* Returns the number of minecraft maps used by the images rendered by the given player. * Returns the number of minecraft maps used by the images rendered by the given player.

View File

@ -127,6 +127,11 @@ public class PlayerMapStore implements ConfigurationSerializable
return new ArrayList(mapList); return new ArrayList(mapList);
} }
public synchronized ImageMap[] getMaps()
{
return mapList.toArray(new ImageMap[mapList.size()]);
}
public synchronized ImageMap getMap(String mapId) public synchronized ImageMap getMap(String mapId)
{ {
for(ImageMap map : mapList) for(ImageMap map : mapList)