package com.uwsoft.editor.controller.commands;
import com.badlogic.ashley.core.Entity;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.utils.Array;
import com.commons.MsgAPI;
import com.uwsoft.editor.Overlap2DFacade;
import com.uwsoft.editor.renderer.components.DimensionsComponent;
import com.uwsoft.editor.renderer.components.TransformComponent;
import com.uwsoft.editor.renderer.utils.ComponentRetriever;
import com.uwsoft.editor.utils.runtime.EntityUtils;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Sasun Poghosyan on 4/29/2016.
*/
public class ItemChildrenTransformCommand extends EntityModifyRevertableCommand {
private HashMap<Integer, Vector2> prevPosMap = new HashMap<>();
private HashMap<Integer, PositionSize> parentPositionAndSizeMap = new HashMap<>();
private Entity entity;
private Vector2 prevLo;
private void doActionOnParent() {
Array<Object[]> objects = getNotification().getBody();
Object[] itemData = objects.get(0);
Entity entity = (Entity) itemData[0];
Vector2 newPos = (Vector2) itemData[1];
Vector2 newSize = (Vector2) itemData[2];
TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class);
DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class);
Vector2 prevLocation = new Vector2(transformComponent.x, transformComponent.y);
Vector2 prevSize = new Vector2(dimensionsComponent.width, dimensionsComponent.height);
PositionSize positionSize = new PositionSize(prevLocation, prevSize);
this.parentPositionAndSizeMap.put(EntityUtils.getEntityId(entity), positionSize);
setState(transformComponent, newPos, dimensionsComponent, newSize);
// transformComponent.x = newPos.x;
// transformComponent.y = newPos.y;
//
// dimensionsComponent.width = newSize.x;
// dimensionsComponent.height = newSize.y;
// if (dimensionsComponent.boundBox != null) {
// dimensionsComponent.boundBox.width = newSize.x;
// dimensionsComponent.boundBox.height = newSize.y;
// }
}
private void undoActionOnParent() {
Map.Entry<Integer, PositionSize> entry = parentPositionAndSizeMap.entrySet().iterator().next();
Integer entityUniqueId = entry.getKey();
PositionSize positionSize = entry.getValue();
Vector2 prevLocation = positionSize.position;
Vector2 prevSize = positionSize.size;
entity = EntityUtils.getByUniqueId(entityUniqueId);
TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class);
DimensionsComponent dimensionsComponent = ComponentRetriever.get(entity, DimensionsComponent.class);
setState(transformComponent, prevLocation, dimensionsComponent, prevSize);
// transformComponent.x = prevLocation.x;
// transformComponent.y = prevLocation.y;
//
//
// dimensionsComponent.width = prevSize.x;
// dimensionsComponent.height = prevSize.y;
// if (dimensionsComponent.boundBox != null) {
// dimensionsComponent.boundBox.width = prevSize.x;
// dimensionsComponent.boundBox.height = prevSize.y;
// }
}
@Override
public void doAction() {
doActionOnParent();
Array<Object[]> payload = notification.getBody();
for (int i = 1; i < payload.size; i++) {
Object[] objectData = payload.get(i);
Entity entity = (Entity) objectData[0];
Vector2 newPos = (Vector2) objectData[1];
TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class);
Vector2 prevPos = new Vector2(transformComponent.x, transformComponent.y);
prevPosMap.put(EntityUtils.getEntityId(entity), prevPos);
// EntityUtils.setPosition(entity, newPos);
transformComponent.x = newPos.x;
transformComponent.y = newPos.y;
}
Overlap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity);
}
@Override
public void undoAction() {
undoActionOnParent();
for (Map.Entry<Integer, Vector2> entry : prevPosMap.entrySet()) {
Integer entityUniqueId = entry.getKey();
Vector2 oldPosition = entry.getValue();
Entity entity = EntityUtils.getByUniqueId(entityUniqueId);
TransformComponent transformComponent = ComponentRetriever.get(entity, TransformComponent.class);
transformComponent.x = oldPosition.x;
transformComponent.y = oldPosition.y;
}
Overlap2DFacade.getInstance().sendNotification(MsgAPI.ITEM_DATA_UPDATED, entity);
}
private void setState(TransformComponent tC, Vector2 position, DimensionsComponent dC, Vector2 size) {
tC.x = position.x;
tC.y = position.y;
dC.width = size.x;
dC.height = size.y;
if (dC.boundBox != null) {
dC.boundBox.width = size.x;
dC.boundBox.height = size.y;
}
}
private class PositionSize {
Vector2 position;
Vector2 size;
public PositionSize(Vector2 position, Vector2 size) {
this.position = position;
this.size = size;
}
}
}