package org.terasology.rendering.gui.components;
import com.google.common.collect.Lists;
import org.terasology.components.InventoryComponent;
import org.terasology.entitySystem.EntityRef;
import org.terasology.rendering.gui.framework.UIDisplayContainer;
import javax.vecmath.Vector2f;
import java.util.List;
/**
* @author Immortius <immortius@gmail.com>
*/
public class UIInventoryNew extends UIDisplayContainer implements UIInventoryCellNew.CellSubscriber {
EntityRef entity = EntityRef.NULL;
Vector2f cellBorder = new Vector2f(2, 2);
Vector2f cellSize = new Vector2f(48, 48);
List<UIInventoryCellNew> cells = Lists.newArrayList();
List<InventorySubscriber> subscribers = Lists.newArrayList();
private int targetWidth;
public interface InventorySubscriber {
public void itemClicked(UIInventoryNew inventoryNew, int slot);
}
public UIInventoryNew(int width) {
targetWidth = width;
}
public EntityRef getEntity() {
return entity;
}
public void setEntity(EntityRef entity) {
this.entity = entity;
InventoryComponent inventory = entity.getComponent(InventoryComponent.class);
for (UIInventoryCellNew cell : cells) {
removeDisplayElement(cell);
}
cells.clear();
if (inventory == null) {
setVisible(false);
} else {
setVisible(true);
float height = Math.max(inventory.itemSlots.size() / targetWidth, 1);
setSize(new Vector2f(targetWidth * (cellSize.x + cellBorder.x), height * (cellSize.y + cellBorder.y)));
for (int i = 0; i < inventory.itemSlots.size(); ++i) {
UIInventoryCellNew cell = new UIInventoryCellNew(entity, i, cellSize);
cells.add(cell);
cell.setSize(cellSize);
cell.setPosition(new Vector2f(i % targetWidth * (cellSize.x + cellBorder.x), i / targetWidth * (cellSize.y + cellBorder.y)));
cell.setVisible(true);
cell.subscribe(this);
addDisplayElement(cell);
}
}
}
public void onCellActivated(UIInventoryCellNew cell) {
for (InventorySubscriber subscriber : subscribers) {
subscriber.itemClicked(this, cell.getSlot());
}
}
public void subscribe(InventorySubscriber subscriber) {
subscribers.add(subscriber);
}
public void unsubscribe(InventorySubscriber subscriber) {
subscribers.remove(subscriber);
}
}