package org.terasology.rendering.gui.components; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.Display; import org.terasology.rendering.gui.framework.IClickListener; import org.terasology.rendering.gui.framework.IInputDataElement; import org.terasology.rendering.gui.framework.UIScrollableDisplayContainer; import javax.vecmath.Vector2f; import javax.vecmath.Vector4f; import java.util.ArrayList; import java.util.List; /** * A simple graphical List * * @author Anton Kireev <adeon.k87@gmail.com> * @version 0.1 */ public class UIList extends UIScrollableDisplayContainer implements IInputDataElement { private int _selectedItemIndex = -1; private final ArrayList<IClickListener> _doubleClickListeners = new ArrayList<IClickListener>(); //List items private List<UIListItem> _items = new ArrayList<UIListItem>(); public UIList(Vector2f size) { setSize(size); setCrop(true); setScrollBarsPosition(getPosition(), getSize()); //ToDo Create skin for UIList setStyle("border-image-top", "engine:gui_menu 159/512 18/512 264/512 0 18"); setStyle("border-image-right", "engine:gui_menu 9/512 63/512 423/512 18/512 9"); setStyle("border-image-bottom", "engine:gui_menu 159/512 9/512 264/512 81/512 9"); setStyle("border-image-left", "engine:gui_menu 8/512 64/512 256/512 17/512 8"); setStyle("border-corner-topleft", "engine:gui_menu 256/512 0"); setStyle("border-corner-topright", "engine:gui_menu 423/512 0"); setStyle("border-corner-bottomright", "engine:gui_menu 423/512 81/512"); setStyle("border-corner-bottomleft", "engine:gui_menu 256/512 81/512"); setStyle("background-image", "engine:gui_menu 159/512 63/512 264/512 18/512"); setCropMargin(new Vector4f(-15f, -15f, -15f, 0)); } public void update() { Vector2f mousePos = new Vector2f(Mouse.getX(), Display.getHeight() - Mouse.getY()); if (intersects(mousePos)) { if (_scrollBarVertical.intersects(mousePos) || _scrollBarHorizontal.intersects(mousePos)) { return; } boolean itemClicked = false; for (int i = (_items.size() - 1); i >= 0; i--) { UIListItem item = _items.get(i); if (item.isVisible()) { if (item.intersects(mousePos)) { if (_mouseDown) { if (item.isSelected()) { doubleClick(); break; } if (_selectedItemIndex >= 0) { _items.get(_selectedItemIndex).setSelected(false); } item.setSelected(true); _selectedItemIndex = i; _mouseDown = false; itemClicked = true; } } } } if (!itemClicked) { _mouseUp = false; _mouseDown = false; } } else { _wheelMoved = 0; _mouseUp = false; _mouseDown = false; } super.update(); } public void render() { super.render(); } private void doubleClick() { for (int i = 0; i < _doubleClickListeners.size(); i++) { _doubleClickListeners.get(i).clicked(this); } } /* * Returns count of elements */ public int size() { return _items.size(); } public void addItem(String text, Object value) { UIListItem newItem = new UIListItem(new Vector2f(getSize().x, (32f)), text, value); newItem.setVisible(true); if (_items.size() > 0) { newItem.setPosition(_items.get(0).getPosition()); } newItem.getPosition().y += 32f * _items.size(); newItem.setFixed(false); _items.add(newItem); addDisplayElement(newItem); } /* * Remove selected item */ public void removeSelectedItem() { if (_selectedItemIndex < 0) { return; } removeDisplayElement(_items.get(_selectedItemIndex)); _items.remove(_selectedItemIndex); for (int i = _selectedItemIndex; i < _items.size(); i++) { _items.get(i).getPosition().y -= 32f; } if (_selectedItemIndex > _items.size() - 1) { if (_items.size() - 1 >= 0) { _selectedItemIndex = _items.size() - 1; _items.get(_selectedItemIndex).setSelected(true); } else { _selectedItemIndex = -1; } } if (_selectedItemIndex >= 0) { _items.get(_selectedItemIndex).setSelected(true); } } /* * Return selected item */ public UIListItem getSelectedItem() { if (_selectedItemIndex < 0) { return null; } return _items.get(_selectedItemIndex); } /* * Remove all items */ public void removeAll() { clearData(); for (int i = (_items.size() - 1); i >= 0; i--) { removeDisplayElement(_items.get(i)); _items.remove(i); } } /* * Remove item by index */ public void removeItem(int index) { removeDisplayElement(_items.get(index)); _items.remove(index); } /* * Returns the value of the selected item */ public Object getValue() { return _items.get(_selectedItemIndex).getValue(); } /* * Reset to selected element */ public void clearData() { if (_selectedItemIndex < 0) { return; } _items.get(_selectedItemIndex).setSelected(false); _selectedItemIndex = -1; } public void addDoubleClickListener(IClickListener listener) { _doubleClickListeners.add(listener); } public void removeDoubleClickListener(IClickListener listener) { _doubleClickListeners.remove(listener); } }