Character equip screen

This commit is contained in:
austin 2022-03-06 15:17:32 -05:00
parent ec0ac741e5
commit 0cc3057d51
20 changed files with 683 additions and 122 deletions

View File

@ -16,8 +16,12 @@ public class Control {
ControlMethod onPress;
ControlMethod onRelease;
ControlMethod onRepeat;
ControlMethod onClick;
MouseCallback onMove;
float pressFrame = 0;
float repeatTimeout = 0;
public boolean isIsKey() {
return type == ControlType.KEY;
}
@ -64,6 +68,10 @@ public class Control {
onMove = method;
}
public void setOnClick(ControlMethod method){
onClick = method;
}
public void onPress(){
if(onPress != null){
onPress.execute();
@ -87,6 +95,28 @@ public class Control {
onMove.execute(event);
}
}
public void onClick(){
if(onClick != null){
onClick.execute();
}
}
public float getPressFrame(){
return this.pressFrame;
}
public void setPressFrame(float frame){
pressFrame = frame;
}
public float getRepeatTimeout(){
return this.repeatTimeout;
}
public void setRepeatTimeout(float timeout){
repeatTimeout = timeout;
}
public interface ControlMethod {

View File

@ -70,6 +70,7 @@ public class ControlHandler {
public static final String INPUT_CODE_INTERACT = "interact";
public static final String INPUT_CODE_DROP = "drop";
public static final String INPUT_CODE_INVENTORY_OPEN = "inventoryOpen";
public static final String INPUT_CODE_CHARACTER_OPEN = "characterOpen";
public static final String DATA_STRING_INPUT_CODE_MENU_INCREMENT = "menuIncrement";
public static final String DATA_STRING_INPUT_CODE_MENU_DECREMENT = "menuDecrement";
@ -188,6 +189,7 @@ public class ControlHandler {
handler.addControl(INPUT_CODE_INTERACT, new Control(ControlType.KEY,GLFW_KEY_E));
handler.addControl(INPUT_CODE_DROP, new Control(ControlType.KEY,GLFW_KEY_Y));
handler.addControl(INPUT_CODE_INVENTORY_OPEN, new Control(ControlType.KEY,GLFW_KEY_I));
handler.addControl(INPUT_CODE_CHARACTER_OPEN, new Control(ControlType.KEY,GLFW_KEY_C));
/*
Map the menu navigation controls
@ -301,6 +303,7 @@ public class ControlHandler {
case INVENTORY:
runHandlers(inventoryControlList);
runHandlers(menuNavigationControlList);
break;
case NO_INPUT:
@ -724,7 +727,7 @@ public class ControlHandler {
Main menu dialog toggle
*/
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU));
controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setOnPress(new ControlMethod(){public void execute(){
controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setOnClick(new ControlMethod(){public void execute(){
// Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, MenuGenerators.createInGameMainMenu());
// Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
@ -733,6 +736,7 @@ public class ControlHandler {
mainMenuWindow.addChild(mainMenuInGame);
Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenuWindow);
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), true);
Globals.elementManager.focusFirstElement();
Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
Globals.controlHandler.showMouse();
// Element mainMenu = MenuGenerators.createInGameMainMenu();
@ -740,20 +744,18 @@ public class ControlHandler {
// MenuGenerators.makeMenuDrawable(mainMenu);
// Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
}});
controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setRepeatTimeout(0.5f);
/*
Open inventory
*/
mainGameControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
controls.get(INPUT_CODE_INVENTORY_OPEN).setOnPress(new ControlMethod(){public void execute(){
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter)){
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
controls.get(INPUT_CODE_INVENTORY_OPEN).setOnClick(new ControlMethod(){public void execute(){
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(InventoryUtils.getNaturalInventory(Globals.playerCharacter).getId())) == null){
//create window
Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
//create window contents
Element inventoryUI = MenuGenerators.createNaturalInventoryMenu(inventory);
//add contents
mainMenuWindow.addChild(inventoryUI);
Window mainMenuWindow = MenuGenerators.createNaturalInventoryMenu(inventory);
//register
Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow);
//make visible
@ -761,8 +763,33 @@ public class ControlHandler {
//controls
Globals.controlHandler.setHandlerState(ControlsState.INVENTORY);
Globals.controlHandler.showMouse();
//
Globals.openInventoriesCount++;
}
}});
controls.get(INPUT_CODE_INVENTORY_OPEN).setRepeatTimeout(0.5f);
/*
Open character
*/
mainGameControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN));
inventoryControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN));
controls.get(INPUT_CODE_CHARACTER_OPEN).setOnClick(new ControlMethod(){public void execute(){
if(InventoryUtils.hasEquipInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER) == null){
//create window
Window mainMenuWindow = MenuGenerators.createCharacterMenu(InventoryUtils.getEquipInventory(Globals.playerCharacter));
//register
Globals.elementManager.registerWindow(WindowStrings.WINDOW_CHARACTER, mainMenuWindow);
//make visible
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER), true);
//controls
Globals.controlHandler.setHandlerState(ControlsState.INVENTORY);
Globals.controlHandler.showMouse();
//
Globals.openInventoriesCount++;
}
}});
controls.get(INPUT_CODE_CHARACTER_OPEN).setRepeatTimeout(0.5f);
}
@ -781,13 +808,13 @@ public class ControlHandler {
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT));
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){
// Globals.currentMenu.incrementMenuOption();
Globals.elementManager.focusNextElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN));
Globals.elementManager.focusNextElement();
}});
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT));
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){
// Globals.currentMenu.decrementMenuOption();
Globals.elementManager.focusPreviousElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN));
Globals.elementManager.focusPreviousElement();
}});
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT));
@ -806,10 +833,12 @@ public class ControlHandler {
// // MenuCallbacks.backout(Globals.currentMenu);
// Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
// }});
controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setOnRelease(new ControlMethod(){public void execute(){
controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setOnClick(new ControlMethod(){public void execute(){
// MenuCallbacks.backout(Globals.currentMenu);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
Globals.elementManager.navigateBackwards();
// Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
}});
controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setRepeatTimeout(0.5f);
}
@ -880,16 +909,16 @@ public class ControlHandler {
/*
Close inventory
*/
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE));
controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){
// MenuCallbacks.backout(Globals.currentMenu);
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
WindowUtils.recursiveSetVisible(inventoryWindow, false);
hideMouse();
Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
}});
// inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE));
// controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){
// // MenuCallbacks.backout(Globals.currentMenu);
// UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
// Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
// WindowUtils.recursiveSetVisible(inventoryWindow, false);
// hideMouse();
// Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
// Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
// }});
/*
Item manipulation
*/
@ -945,15 +974,22 @@ public class ControlHandler {
if(!control.isState()){
//on press
control.onPress();
control.setPressFrame(Main.lastFrame);
} else {
//on repeat
control.onRepeat();
if(Main.lastFrame - control.getPressFrame() > control.getRepeatTimeout()){
control.onRepeat();
}
}
control.setState(true);
} else {
if(control.isState()){
//on release
control.onRelease();
//on click
if(Main.lastFrame - control.getPressFrame() < control.getRepeatTimeout()){
control.onClick();
}
} else {
}
control.setState(false);

View File

@ -106,6 +106,7 @@ public class LoadingThread extends Thread {
case LOAD_TITLE_MENU:
WindowUtils.recursiveSetVisible(loadingWindow,false);
WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_MAIN);
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true);
break;

View File

@ -146,7 +146,9 @@ public class EntityDataStrings {
public static final String ITEM_IS_WEAPON = "itemIsWeapon";
public static final String ITEM_IS_ARMOR = "itemIsArmor";
public static final String ITEM_EQUIP_WHITELIST = "itemEquipWhitelist";
public static final String ITEM_EQUIP_CLASS = "itemEquipClass";
public static final String ITEM_ICON = "itemIcon";
public static final String ITEM_IN_WORLD_REPRESENTATION = "itemInWorldRepresentation";
/*

View File

@ -181,7 +181,6 @@ public class EntityManager {
}
if(drawableList.contains(e)){
drawableList.remove(e);
EntityUtils.cleanUpDrawableEntity(e);
}
if(entityList.contains(e)){
entityList.remove(e);

View File

@ -48,7 +48,7 @@ public class EquipState {
boolean targetIsItem = ItemUtils.isItem(toEquip);
boolean targetIsAttached = AttachUtils.isAttached(toEquip);
boolean targetHasWhitelist = ItemUtils.hasEquipList(toEquip);
String equipItemClass = "";//somehow resolve from toEquip
String equipItemClass = ItemUtils.getEquipClass(toEquip);//somehow resolve from toEquip
List<String> pointEquipClassList = point.getEquipClassWhitelist();
boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass);
if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){
@ -153,7 +153,47 @@ public class EquipState {
// }
public void unequipPoint(String pointId){
equipMap.remove(pointId);
Entity equipped = equipMap.remove(pointId);
if(equipped != null){
boolean targetHasWhitelist = ItemUtils.hasEquipList(equipped);
if(targetHasWhitelist){
//have to do fancy mesh removal nonsense
//basically the reverse of below
// List<EquipWhitelist> whitelist = ItemUtils.getEquipWhitelist(equipped);
// for(EquipWhitelist whitelistItem : whitelist){
// if(whitelistItem.getCreatureId().equals(parentCreatureId)){
// //put in map
// equipMap.put(point.getEquipPointId(),toEquip);
// String modelName = whitelistItem.getModel();
// Globals.assetManager.addModelPathToQueue(modelName);
// Actor parentActor = EntityUtils.getActor(parent);
// //queue meshes from display model to parent actor
// ActorMeshMask meshMask = parentActor.getMeshMask();
// for(String toBlock : whitelistItem.getMeshMaskList()){
// meshMask.blockMesh(modelName, toBlock);
// }
// for(String toDraw : whitelistItem.getMeshList()){
// meshMask.queueMesh(modelName, toDraw);
// }
// //attach to parent bone
// AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone());
// //make uncollidable
// if(toEquip.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLIDABLE)){
// CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
// Globals.collisionEngine.deregisterPhysicsObject(rigidBody);
// }
// //hide toEquip actor
// EntityUtils.setDraw(toEquip, false);
// //make untargetable
// Globals.entityManager.setTargetable(toEquip, false);
// break;
// }
// }
} else {
AttachUtils.detatchEntityFromEntityAtBone(parent, equipped);
EntityUtils.cleanUpDrawableEntity(equipped);
}
}
}

View File

@ -6,9 +6,11 @@ import org.joml.Vector3f;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.equip.EquipState;
import electrosphere.entity.state.gravity.GravityUtils;
import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.main.Globals;
public class InventoryUtils {
@ -21,6 +23,14 @@ public class InventoryUtils {
return (UnrelationalInventoryState)target.getData(EntityDataStrings.NATURAL_INVENTORY);
}
public static boolean hasEquipInventory(Entity target){
return target.getDataKeys().contains(EntityDataStrings.EQUIP_INVENTORY);
}
public static RelationalInventoryState getEquipInventory(Entity target){
return (RelationalInventoryState)target.getData(EntityDataStrings.EQUIP_INVENTORY);
}
public static void attemptStoreItem(Entity creature, Entity item){
boolean creatureIsCreature = CreatureUtils.isCreature(creature);
boolean itemIsItem = ItemUtils.isItem(item);
@ -45,12 +55,28 @@ public class InventoryUtils {
//verify creature is creature, item is item, inventory exists, and item is in inventory
boolean creatureIsCreature = CreatureUtils.isCreature(creature);
boolean itemIsItem = ItemUtils.isItem(item);
boolean hasInventory = hasNaturalInventory(creature);
if(creatureIsCreature && itemIsItem && hasInventory){
//get inventory
UnrelationalInventoryState inventory = getNaturalInventory(creature);
//remove item from inventory
inventory.removeItem(item);
boolean hasNaturalInventory = hasNaturalInventory(creature);
boolean hasEquipInventory = hasEquipInventory(creature);
if(creatureIsCreature && itemIsItem){
if(hasNaturalInventory){
//get inventory
UnrelationalInventoryState inventory = getNaturalInventory(creature);
//remove item from inventory
inventory.removeItem(item);
}
if(hasEquipInventory){
//get inventory
RelationalInventoryState inventory = getEquipInventory(creature);
//get real world item
Entity realWorldItem = ItemUtils.getRealWorldEntity(item);
if(realWorldItem != null){
//drop item
EquipState equipState = (EquipState)creature.getData(EntityDataStrings.EQUIP_STATE);
equipState.unequipPoint(inventory.getItemSlot(item));
}
//remove item from inventory
inventory.tryRemoveItem(item);
}
//compose item into in-world entity
Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item));
//delete in container item
@ -64,4 +90,36 @@ public class InventoryUtils {
}
}
//need creature so we can figure out where to drop the item
public static void attemptDestroyItem(Entity creature, Entity item){
//verify creature is creature, item is item, inventory exists, and item is in inventory
boolean creatureIsCreature = CreatureUtils.isCreature(creature);
boolean itemIsItem = ItemUtils.isItem(item);
boolean hasNaturalInventory = hasNaturalInventory(creature);
boolean hasEquipInventory = hasEquipInventory(creature);
if(creatureIsCreature && itemIsItem){
if(hasNaturalInventory){
//get inventory
UnrelationalInventoryState inventory = getNaturalInventory(creature);
//remove item from inventory
inventory.removeItem(item);
}
if(hasEquipInventory){
//get inventory
RelationalInventoryState inventory = getEquipInventory(creature);
//get real world item
Entity realWorldItem = ItemUtils.getRealWorldEntity(item);
if(realWorldItem != null){
//drop item
EquipState equipState = (EquipState)creature.getData(EntityDataStrings.EQUIP_STATE);
equipState.unequipPoint(inventory.getItemSlot(item));
}
//remove item from inventory
inventory.tryRemoveItem(item);
}
//delete in container item
ItemUtils.destroyInInventoryItem(item);
}
}
}

View File

@ -6,24 +6,29 @@ import java.util.List;
import java.util.Map;
import electrosphere.entity.Entity;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.data.creature.type.equip.EquipPoint;
public class RelationalInventoryState {
Map<String,Entity> items = new HashMap<String,Entity>();
Map<String,List<String>> slotWhitelists = new HashMap<String,List<String>>();
Map<String,EquipPoint> equipPoints = new HashMap<String,EquipPoint>();
public static RelationalInventoryState buildRelationalInventoryStateFromStringList(List<String> slots){
RelationalInventoryState rVal = new RelationalInventoryState();
for(String slot : slots){
rVal.items.put(slot,null);
}
return rVal;
}
// public static RelationalInventoryState buildRelationalInventoryStateFromStringList(List<String> slots){
// RelationalInventoryState rVal = new RelationalInventoryState();
// for(String slot : slots){
// rVal.items.put(slot,null);
// }
// return rVal;
// }
public static RelationalInventoryState buildRelationalInventoryStateFromEquipList(List<EquipPoint> points){
RelationalInventoryState rVal = new RelationalInventoryState();
for(EquipPoint point : points){
rVal.items.put(point.getEquipPointId(),null);
rVal.slotWhitelists.put(point.getEquipPointId(),point.getEquipClassWhitelist());
rVal.equipPoints.put(point.getEquipPointId(),point);
}
return rVal;
}
@ -42,6 +47,17 @@ public class RelationalInventoryState {
return items.get(slot);
}
public String getItemSlot(Entity item){
if(items.containsValue(item)){
for(String slot : items.keySet()){
if(items.get(slot) == item){
return slot;
}
}
}
return null;
}
public boolean hasItemInSlot(String slot){
//if the slot is a key return if the value at the key isn't null, otherwise return false
return items.containsKey(slot) ? items.get(slot) != null : false;
@ -51,4 +67,29 @@ public class RelationalInventoryState {
return new LinkedList<String>(items.keySet());
}
public Entity tryRemoveItem(Entity item){
if(items.containsValue(item)){
for(String slot : items.keySet()){
if(items.get(slot) == item){
items.remove(slot);
items.put(slot,null);
return item;
}
}
}
return null;
}
public boolean canEquipItemToSlot(Entity item, String slot){
String itemClass = ItemUtils.getEquipClass(item);
if(slotWhitelists.get(slot).contains(itemClass)){
return true;
}
return false;
}
public EquipPoint getEquipPointFromSlot(String slot){
return equipPoints.get(slot);
}
}

View File

@ -29,7 +29,7 @@ public class AttachUtils {
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
getChildrenList(parent).add(toAttach);
} else {
LinkedList<Entity> childrenEntities = new LinkedList();
LinkedList<Entity> childrenEntities = new LinkedList<Entity> ();
childrenEntities.add(toAttach);
parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities);
}

View File

@ -115,6 +115,9 @@ public class ItemUtils {
} else {
rVal.putData(EntityDataStrings.ITEM_ICON,genericItemIconPath);
}
if(item.getEquipClass() != null){
rVal.putData(EntityDataStrings.ITEM_EQUIP_CLASS,item.getEquipClass());
}
rVal.putData(EntityDataStrings.DRAW_CAST_SHADOW, true);
rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true);
rVal.putData(EntityDataStrings.ITEM_TYPE, name);
@ -210,6 +213,7 @@ public class ItemUtils {
rVal.putData(EntityDataStrings.ITEM_EQUIP_WHITELIST, getEquipWhitelist(item));
}
rVal.putData(EntityDataStrings.ITEM_ICON,ItemUtils.getItemIcon(item));
rVal.putData(EntityDataStrings.ITEM_EQUIP_CLASS, item.getData(EntityDataStrings.ITEM_EQUIP_CLASS));
rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true);
rVal.putData(EntityDataStrings.ITEM_TYPE, item.getData(EntityDataStrings.ITEM_TYPE));
Globals.entityManager.registerEntity(rVal);
@ -248,4 +252,16 @@ public class ItemUtils {
return (String)item.getData(EntityDataStrings.ITEM_ICON);
}
public static String getEquipClass(Entity item){
return (String)item.getData(EntityDataStrings.ITEM_EQUIP_CLASS);
}
public static void setRealWorldEntity(Entity inInventory, Entity inWorld){
inInventory.putData(EntityDataStrings.ITEM_IN_WORLD_REPRESENTATION, inWorld);
}
public static Entity getRealWorldEntity(Entity inInventory){
return (Entity) inInventory.getData(EntityDataStrings.ITEM_IN_WORLD_REPRESENTATION);
}
}

View File

@ -14,6 +14,7 @@ public class Item {
List<EquipWhitelist> equipWhitelist;
String idleAnim;
String iconPath;
String equipClass;
public String getItemId() {
return itemId;
@ -46,5 +47,9 @@ public class Item {
public String getIconPath(){
return iconPath;
}
public String getEquipClass(){
return equipClass;
}
}

View File

@ -277,6 +277,7 @@ public class Globals {
//manager for all widgets currently being drawn to screen
public static ElementManager elementManager;
public static int openInventoriesCount = 0;
//collision world data
public static CommonWorldData commonWorldData;
@ -300,7 +301,7 @@ public class Globals {
//drag item state
public static Entity draggedItem = null;
public static UnrelationalInventoryState dragSourceInventory = null;
public static Object dragSourceInventory = null;

View File

@ -1,12 +1,17 @@
package electrosphere.menu;
import electrosphere.controls.ControlHandler.ControlsState;
import electrosphere.engine.LoadingThread;
import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.state.equip.EquipState;
import electrosphere.entity.state.inventory.InventoryUtils;
import electrosphere.entity.state.inventory.RelationalInventoryState;
import electrosphere.entity.state.inventory.UnrelationalInventoryState;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.server.saves.SaveUtils;
import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.NetUtils;
import electrosphere.renderer.ui.ClickableElement;
import electrosphere.renderer.ui.DrawableElement;
@ -14,7 +19,10 @@ import electrosphere.renderer.ui.Element;
import electrosphere.renderer.ui.FocusableElement;
import electrosphere.renderer.ui.WidgetUtils;
import electrosphere.renderer.ui.Window;
import electrosphere.renderer.ui.ClickableElement.ClickEventCallback;
import electrosphere.renderer.ui.DraggableElement.DragEventCallback;
import electrosphere.renderer.ui.FocusableElement.FocusEventCallback;
import electrosphere.renderer.ui.NavigableElement.NavigationEventCallback;
import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.Div;
import electrosphere.renderer.ui.elements.ImagePanel;
@ -22,10 +30,14 @@ import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.TextInput;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
import electrosphere.renderer.ui.form.FormElement;
import java.util.List;
import javax.management.relation.Relation;
/**
*
* @author amaterasu
@ -379,28 +391,43 @@ public class MenuGenerators {
}
public static Element worldItemDropCaptureWindow(){
Div rVal = new Div();
rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Div div = new Div();
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
if(Globals.draggedItem != null){
//remove item from inventory
Globals.dragSourceInventory.removeItem(Globals.draggedItem);
//drop item
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
//clear ui
WindowUtils.cleanItemWindow();
String sourceWindowId = WindowUtils.getInventoryWindowID(Globals.dragSourceInventory.getId());
WindowUtils.replaceWindowContents(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(Globals.dragSourceInventory));
//null globals
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
return false;
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory;
//drop item
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
//clear ui
WindowUtils.cleanItemDraggingWindow();
String sourceWindowId = WindowUtils.getInventoryWindowID(inventory.getId());
WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(inventory));
//null globals
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
return false;
} else if(Globals.dragSourceInventory instanceof RelationalInventoryState){
RelationalInventoryState inventory = (RelationalInventoryState) Globals.dragSourceInventory;
//drop item
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
//clear ui
WindowUtils.cleanItemDraggingWindow();
String sourceWindowId = WindowStrings.WINDOW_CHARACTER;
WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createCharacterMenu(inventory));
//null globals
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
return false;
}
}
return true;
}});
rVal.setPositionX(0);
rVal.setPositionY(0);
rVal.setWidth(Globals.WINDOW_WIDTH);
rVal.setHeight(Globals.WINDOW_HEIGHT);
div.setPositionX(0);
div.setPositionY(0);
div.setWidth(Globals.WINDOW_WIDTH);
div.setHeight(Globals.WINDOW_HEIGHT);
rVal.addChild(div);
return rVal;
}
@ -409,7 +436,14 @@ public class MenuGenerators {
int width = 500;
int height = 500;
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
FormElement rVal = new FormElement();
Div rVal = new Div();
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
return false;
}});
//black texture background
ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
@ -419,65 +453,101 @@ public class MenuGenerators {
rVal.addChild(imagePanel);
//label 1 (back)
Button backButton = new Button();
Label backLabel = new Label(100,50,1.0f);
backLabel.setText("Back");
rVal.addChild(backLabel);
backButton.addChild(backLabel);
rVal.addChild(backButton);
backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
return false;
}});
//label 2 (quit)
Button quitButton = new Button();
Label quitLabel = new Label(100,150,1.0f);
quitLabel.setText("Quit");
rVal.addChild(quitLabel);
quitLabel.setText("QUIT");
quitButton.addChild(quitLabel);
rVal.addChild(quitButton);
quitButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
Main.running = false;
return false;
}});
return rVal;
}
public static Element createNaturalInventoryMenu(UnrelationalInventoryState inventory){
// int screenTop = Globals.WINDOW_HEIGHT - 150;
public static Window createNaturalInventoryMenu(UnrelationalInventoryState inventory){
int width = 500;
int height = 500;
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
Div rVal = new Div();
rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Div div = new Div();
rVal.addChild(div);
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())), false);
Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
//
Globals.openInventoriesCount--;
if(Globals.openInventoriesCount == 0){
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
}
return false;
}});
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
if(Globals.draggedItem != null){
if(Globals.dragSourceInventory != inventory){
UnrelationalInventoryState sourceInventory = Globals.dragSourceInventory;
//transfer item
Globals.dragSourceInventory.removeItem(Globals.draggedItem);
inventory.addItem(Globals.draggedItem);
//null out global state
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
//re-render inventory
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory;
//transfer item
sourceInventory.removeItem(Globals.draggedItem);
inventory.addItem(Globals.draggedItem);
//null out global state
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemDraggingWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
}
} else {
//clear ui
WindowUtils.cleanItemWindow();
WindowUtils.cleanItemDraggingWindow();
//re-render inventory
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
}
return false;
}
return true;
}});
div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){
WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_INVENTORY);
return false;
}});
//black texture background
ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
// imagePanel.setWidth(width);
// imagePanel.setHeight(height);
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
rVal.addChild(imagePanel);
div.addChild(imagePanel);
//label 1 (inventory)
Label inventoryLabel = new Label(10,10,1.0f);
inventoryLabel.setText("INVENTORY");
rVal.addChild(inventoryLabel);
div.addChild(inventoryLabel);
int columns = 8;
int columnWidth = 60;
@ -506,7 +576,7 @@ public class MenuGenerators {
// System.out.println("Drag start");
Globals.dragSourceInventory = inventory;
Globals.draggedItem = inventory.getItems().get(itemId);
rVal.removeChild(panel);
div.removeChild(panel);
WindowUtils.pushItemIconToItemWindow(panel);
return false;
}});
@ -516,28 +586,225 @@ public class MenuGenerators {
panel.setPositionY(event.getCurrentY() - panelHeight / 2);
return false;
}});
// panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
// // panel.setPositionX(posX);
// // panel.setPositionY(posY);
// //now the fun begins :)
// //if transfer item
// // remove item from current inventory
// // place item in new inventory
// // trigger recreation of the menu
// //if drop item
// // remove item from current inventory
// // create item in world in front of character
// // trigger recreation of the menu
// //if neither of above
// // replace item icon position to origin
// // System.out.println("Release drag");
// return false;
// }});
} else {
panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
if(Globals.dragSourceInventory instanceof RelationalInventoryState){
RelationalInventoryState sourceInventory = (RelationalInventoryState) Globals.dragSourceInventory;
Entity item = Globals.draggedItem;
//destroy real world item
if(ItemUtils.getRealWorldEntity(item) != null){
System.out.println("Destroy real world item");
ItemUtils.destroyInWorldItem(ItemUtils.getRealWorldEntity(item));
}
//eject from equip state
InventoryUtils.attemptDestroyItem(Globals.playerCharacter,item);
//add to unrelational
sourceInventory.tryRemoveItem(item);
inventory.addItem(item);
//update ui
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemDraggingWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(sourceInventory));
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
}
//now the fun begins :)
//if transfer item
// remove item from current inventory
// place item in new inventory
// trigger recreation of the menu
//if drop item
// remove item from current inventory
// create item in world in front of character
// trigger recreation of the menu
//if neither of above
// replace item icon position to origin
// System.out.println("Release drag");
return false;
}});
}
// imagePanel.setWidth(width);
// imagePanel.setHeight(height);
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
rVal.addChild(panel);
div.addChild(panel);
}
return rVal;
}
public static Window createCharacterMenu(RelationalInventoryState inventory){
// int screenTop = Globals.WINDOW_HEIGHT - 150;
int width = 500;
int height = 500;
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Div div = new Div();
div.setPositionX(1000);
rVal.addChild(div);
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_CHARACTER);
//
Globals.openInventoriesCount--;
if(Globals.openInventoriesCount == 0){
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
}
return false;
}});
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
if(Globals.draggedItem != null){
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory;
//null out global state
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemDraggingWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(inventory));
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
}
return false;
}
return true;
}});
div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){
WindowUtils.focusWindow(WindowStrings.WINDOW_CHARACTER);
return false;
}});
//black texture background
ImagePanel imagePanel = new ImagePanel(1000,0,width,height,Globals.blackTexture);
// imagePanel.setWidth(width);
// imagePanel.setHeight(height);
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
div.addChild(imagePanel);
//label 1 (inventory)
Label inventoryLabel = new Label(1010,10,1.0f);
inventoryLabel.setText("CHARACTER");
div.addChild(inventoryLabel);
// int columns = 8;
// int columnWidth = 60;
// int rowHeight = 60;
int slotSpacing = 30;
List<String> slots = inventory.getSlots();
int numSlots = slots.size();
int numRows = (numSlots / 2) + (numSlots % 2 == 1 ? 1 : 0);
int incrementer = 0;
for(int i = 0; i < numSlots; i++){
String texturePath = "Textures/icons/itemIconEmpty.png";
boolean hasItem = false;
if(inventory.getItemSlot(slots.get(i)) != null){
Entity currentItem = inventory.getItemSlot(slots.get(i));
//get texture path from item
texturePath = ItemUtils.getItemIcon(currentItem);
//flag that this isn't an empty slot
hasItem = true;
}
if(!Globals.assetManager.hasLoadedTexture(texturePath)){
Globals.assetManager.addTexturePathtoQueue(texturePath);
}
int panelWidth = 50;
int panelHeight = 50;
int posX = 1000 + 20;
if((incrementer % 2) == 1){
posX = posX + 400;
}
int posY = 60 + (i / 2 * (panelHeight + slotSpacing));
ImagePanel panel = new ImagePanel(posX,posY,panelWidth,panelHeight,texturePath);
if(hasItem == true){
int itemId = i;
panel.setOnDragStart(new DragEventCallback() {public boolean execute(DragEvent event){
// System.out.println("Drag start");
Globals.dragSourceInventory = inventory;
Globals.draggedItem = inventory.getItemSlot(slots.get(itemId));
div.removeChild(panel);
WindowUtils.pushItemIconToItemWindow(panel);
return false;
}});
panel.setOnDrag(new DragEventCallback() {public boolean execute(DragEvent event){
// System.out.println("Drag");
panel.setPositionX(event.getCurrentX() - panelWidth / 2);
panel.setPositionY(event.getCurrentY() - panelHeight / 2);
return false;
}});
} else {
int itemId = i;
panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
// panel.setPositionX(posX);
// panel.setPositionY(posY);
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState) Globals.dragSourceInventory;
Entity item = Globals.draggedItem;
if(inventory.canEquipItemToSlot(item, slots.get(itemId))){
//transfer item
sourceInventory.removeItem(item);
inventory.addItem(slots.get(itemId), item);
//hydrate inventory item
Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item));
//bind in world with in inventory
ItemUtils.setRealWorldEntity(item, inWorldItem);
//fire equip event to equip state
EquipState equipState = (EquipState)Globals.playerCharacter.getData(EntityDataStrings.EQUIP_STATE);
equipState.attemptEquip(inWorldItem,inventory.getEquipPointFromSlot(slots.get(itemId)));
}
//update ui
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemDraggingWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(inventory));
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
}
//now the fun begins :)
//if transfer item
// remove item from current inventory
// place item in new inventory
// trigger recreation of the menu
//if drop item
// remove item from current inventory
// create item in world in front of character
// trigger recreation of the menu
//if neither of above
// replace item icon position to origin
// System.out.println("Release drag");
//rebuild inventory windows
return false;
}});
}
div.addChild(panel);
//create the slot text
posX = 1000 + 80;
if((incrementer % 2) == 1){
posX = posX + 190;
}
posY = posY + 15;
Label slotText = new Label(posX, posY, 0.4f);
slotText.setText(slots.get(i));
div.addChild(slotText);
incrementer++;
}
return rVal;

View File

@ -9,5 +9,6 @@ public class WindowStrings {
public static final String WINDOW_LOADING = "windowLoading";
public static final String WINDDOW_ITEM_DROP = "itemDrop";
public static final String WINDOW_ITEM_DRAG_CONTAINER = "itemDragContainer";
public static final String WINDOW_CHARACTER = "windowCharacter";
}

View File

@ -16,7 +16,7 @@ public class WindowUtils {
//todo: destroy elements as well
mainMenu.getChildren().clear();
mainMenu.addChild(newMenu);
Globals.elementManager.focusFirstElement(mainMenu);
Globals.elementManager.focusFirstElement();
}
}
@ -42,7 +42,7 @@ public class WindowUtils {
//todo: destroy elements as well
mainMenu.getChildren().clear();
mainMenu.addChild(content);
Globals.elementManager.focusFirstElement(mainMenu);
Globals.elementManager.focusFirstElement();
}
}
@ -53,12 +53,18 @@ public class WindowUtils {
Globals.elementManager.pushWindowToFront(targetWindow);
}
public static void cleanItemWindow(){
public static void cleanItemDraggingWindow(){
Window targetWindow = (Window) Globals.elementManager.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER);
targetWindow.getChildren().clear();
recursiveSetVisible(targetWindow, false);
}
public static void replaceWindow(String window, Window windowEl){
Globals.elementManager.unregisterWindow(window);
Globals.elementManager.registerWindow(window, windowEl);
recursiveSetVisible(windowEl, true);
Globals.elementManager.focusFirstElement();
}
@ -89,9 +95,7 @@ public class WindowUtils {
}
static void initItemDropWindow(){
Window itemDropWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, itemDropWindow);
WindowUtils.replaceWindowContents(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow());
Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow());
}
static void initItemDragContainerWindow(){
@ -99,4 +103,10 @@ public class WindowUtils {
Globals.elementManager.registerWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER, itemDragContainerWindow);
}
public static void focusWindow(String window){
Element windowEl = Globals.elementManager.getWindow(window);
Globals.elementManager.unregisterWindow(window);
Globals.elementManager.registerWindow(window, windowEl);
}
}

View File

@ -14,7 +14,9 @@ import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.MouseEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
import electrosphere.renderer.ui.events.DragEvent.DragEventType;
import electrosphere.renderer.ui.events.NavigationEvent.NavigationEventType;
/**
*
@ -34,7 +36,7 @@ public class ElementManager {
elementList.add(w);
}
if(elementList.size() == 1){
focusFirstElement(w);
focusFirstElement();
}
}
@ -51,6 +53,9 @@ public class ElementManager {
if(elementList.contains(w)){
elementList.remove(w);
}
if(elementList.size() > 0){
focusFirstElement();
}
}
public void pushWindowToFront(Window window){
@ -75,8 +80,8 @@ public class ElementManager {
return currentFocusedElement;
}
public void focusFirstElement(Element topLevel){
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>());
public void focusFirstElement(){
List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
if(focusables.size() > 0){
if(currentFocusedElement != null){
currentFocusedElement.handleEvent(new FocusEvent(false));
@ -86,8 +91,8 @@ public class ElementManager {
}
}
public void focusNextElement(Element topLevel){
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>());
public void focusNextElement(){
List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
if(focusables.contains(currentFocusedElement)){
int index = focusables.indexOf(currentFocusedElement);
if(index + 1 >= focusables.size()){
@ -103,8 +108,8 @@ public class ElementManager {
}
}
public void focusPreviousElement(Element topLevel){
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>());
public void focusPreviousElement(){
List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
if(focusables.contains(currentFocusedElement)){
int index = focusables.indexOf(currentFocusedElement);
if(index - 1 < 0){
@ -207,5 +212,10 @@ public class ElementManager {
}
fireEvent(event,event.getCurrentX(),event.getCurrentY());
}
public void navigateBackwards(){
NavigationEvent event = new NavigationEvent(NavigationEventType.BACKWARD);
fireEvent(event,currentFocusedElement.getPositionX(),currentFocusedElement.getPositionY());
}
}

View File

@ -8,7 +8,7 @@ public interface NavigableElement extends Element {
public interface NavigationEventCallback {
public void execute(NavigationEvent event);
public boolean execute(NavigationEvent event);
}

View File

@ -6,6 +6,7 @@ import electrosphere.renderer.Model;
import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.NavigationEvent;
import java.util.LinkedList;
import java.util.List;
@ -17,7 +18,7 @@ import static org.lwjgl.opengl.GL30.*;
*
* @author amaterasu
*/
public class Window implements DrawableElement, ContainerElement {
public class Window implements DrawableElement, ContainerElement, NavigableElement {
List<Element> childList = new LinkedList<Element>();
Framebuffer widgetBuffer;
Material customMat = new Material();
@ -26,6 +27,8 @@ public class Window implements DrawableElement, ContainerElement {
Vector3f boxDimensions = new Vector3f();
Vector3f texPosition = new Vector3f(0,0,0);
Vector3f texScale = new Vector3f(1,1,0);
NavigationEventCallback navCallback;
public Window(int positionX, int positionY, int width, int height){
//TODO: figure out why this has to be 1920x1080
@ -197,7 +200,18 @@ public class Window implements DrawableElement, ContainerElement {
}
public boolean handleEvent(Event event){
return true;
boolean propagate = true;
if(event instanceof NavigationEvent && navCallback != null){
if(!navCallback.execute((NavigationEvent)event)){
propagate = false;
}
}
return propagate;
}
@Override
public void setOnNavigationCallback(NavigationEventCallback callback) {
navCallback = callback;
}
}

View File

@ -9,13 +9,15 @@ import electrosphere.renderer.ui.DraggableElement;
import electrosphere.renderer.ui.DrawableElement;
import electrosphere.renderer.ui.Element;
import electrosphere.renderer.ui.FocusableElement;
import electrosphere.renderer.ui.NavigableElement;
import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
import electrosphere.renderer.ui.events.DragEvent.DragEventType;
public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement {
public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement,NavigableElement {
ClickEventCallback onClick;
FocusEventCallback onFocus;
@ -23,6 +25,7 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
DragEventCallback onDragStart;
DragEventCallback onDrag;
DragEventCallback onDragRelease;
NavigationEventCallback onNavigate;
boolean focused = false;
List<Element> childList = new LinkedList<Element>();
@ -293,6 +296,13 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
}
}
}
if(event instanceof NavigationEvent){
if(onNavigate != null){
if(onNavigate.execute((NavigationEvent)event)){
propagate = false;
}
}
}
return propagate;
}
@ -319,6 +329,12 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
}
}
@Override
public void setOnNavigationCallback(NavigationEventCallback callback) {
// TODO Auto-generated method stub
onNavigate = callback;
}

View File

@ -1,5 +1,19 @@
package electrosphere.renderer.ui.events;
public class NavigationEvent implements Event {
public static enum NavigationEventType {
FORWARD,
BACKWARD,
}
NavigationEventType type;
public NavigationEvent(NavigationEventType type){
this.type = type;
}
public NavigationEventType getType(){
return type;
}
}