package com.uwsoft.editor.controller.commands.resource;
import com.badlogic.ashley.core.Entity;
import com.uwsoft.editor.controller.commands.NonRevertibleCommand;
import com.uwsoft.editor.renderer.components.spriter.SpriterComponent;
import com.uwsoft.editor.renderer.data.CompositeItemVO;
import com.uwsoft.editor.renderer.data.SceneVO;
import com.uwsoft.editor.renderer.data.SpriterVO;
import com.uwsoft.editor.renderer.utils.ComponentRetriever;
import com.uwsoft.editor.utils.runtime.EntityUtils;
import java.util.ArrayList;
import java.util.function.Consumer;
import java.util.stream.Collectors;
/**
* Created by Sasun Poghosyan on 5/12/2016.
*/
public class DeleteSpriterAnimation extends NonRevertibleCommand {
private static final String CLASS_NAME = "com.uwsoft.editor.controller.commands.resource.DeleteSpriterAnimation";
public static final String DONE = CLASS_NAME + "DONE";
private final ArrayList<Entity> entityList = new ArrayList<>();
private final ArrayList<SpriterVO> tmpSpriterAnimList = new ArrayList<>();
@Override
public void doAction() {
String spriterAnimName = notification.getBody();
if (projectManager.deleteSpriterAnimation(spriterAnimName)) {
deleteEntitiesWithSpriterAnimation(sandbox.getRootEntity(), spriterAnimName);
deleteAllItemsSpriterAnimations(spriterAnimName);
projectManager.loadProjectData(projectManager.getCurrentProjectPath());
facade.sendNotification(DONE, spriterAnimName);
SceneVO vo = sandbox.sceneVoFromItems();
projectManager.saveCurrentProject(vo);
} else {
cancel();
}
}
private void deleteAllItemsSpriterAnimations(String spriterAnimationName) {
for (CompositeItemVO compositeItemVO : libraryItems.values()) {
deleteAllSpriterAnimationsOfItem(compositeItemVO, spriterAnimationName);
}
}
private void deleteAllSpriterAnimationsOfItem(CompositeItemVO rootItemVo, String spriterAnimationName) {
Consumer<CompositeItemVO> action = (currentItemVo) -> deleteCurrentItemSpriterAnimations(currentItemVo, spriterAnimationName);
EntityUtils.applyActionRecursivelyOnLibraryItems(rootItemVo, action);
}
private void deleteCurrentItemSpriterAnimations(CompositeItemVO compositeItemVO, String spriterAnimationName) {
if (compositeItemVO.composite != null && compositeItemVO.composite.sSpriterAnimations.size() != 0) {
ArrayList<SpriterVO> spriterAnimations = compositeItemVO.composite.sSpriterAnimations;
tmpSpriterAnimList.addAll(spriterAnimations
.stream()
.filter(spriterVO -> spriterVO.animationName.equals(spriterAnimationName))
.collect(Collectors.toList()));
spriterAnimations.removeAll(tmpSpriterAnimList);
tmpSpriterAnimList.clear();
}
}
private void deleteEntitiesWithSpriterAnimation(Entity rootEntity, String spriterAnimationName) {
entityList.clear();
Consumer<Entity> action = (root) -> {
SpriterComponent spriterAnimationComponent = ComponentRetriever.get(root, SpriterComponent.class);
if (spriterAnimationComponent != null && spriterAnimationComponent.animationName.equals(spriterAnimationName)) {
entityList.add(root);
}
};
EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action);
EntityUtils.removeEntities(entityList);
}
}