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.SpineDataComponent;
import com.uwsoft.editor.renderer.data.CompositeItemVO;
import com.uwsoft.editor.renderer.data.SceneVO;
import com.uwsoft.editor.renderer.data.SpineVO;
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/10/2016.
*/
public class DeleteSpineAnimation extends NonRevertibleCommand {
private static final String CLASS_NAME = "com.uwsoft.editor.controller.commands.resource.DeleteSpineAnimation";
public static final String DONE = CLASS_NAME + "DONE";
private final ArrayList<Entity> entityList = new ArrayList<>();
private final ArrayList<SpineVO> tmpSpineAnimList = new ArrayList<>();
@Override
public void doAction() {
String spineItemName = notification.getBody();
if (projectManager.deleteSpineAnimation(spineItemName)) {
deleteEntitiesWithParticleEffects(sandbox.getRootEntity(), spineItemName);
deleteAllItemsSpineAnimations(spineItemName);
projectManager.loadProjectData(projectManager.getCurrentProjectPath());
sendNotification(DONE, spineItemName);
SceneVO vo = sandbox.sceneVoFromItems();
projectManager.saveCurrentProject(vo);
} else {
cancel();
}
}
private void deleteAllItemsSpineAnimations(String spineAnimationName) {
for (CompositeItemVO compositeItemVO : libraryItems.values()) {
deleteAllSpineAnimationsOfItem(compositeItemVO, spineAnimationName);
}
}
private void deleteAllSpineAnimationsOfItem(CompositeItemVO compositeItemVO, String spineAnimationName) {
Consumer<CompositeItemVO> action = (rootItemVo) -> deleteCurrentItemSpineAnimations(rootItemVo, spineAnimationName);
EntityUtils.applyActionRecursivelyOnLibraryItems(compositeItemVO, action);
}
private void deleteCurrentItemSpineAnimations(CompositeItemVO compositeItemVO, String spineAnimationName) {
if (compositeItemVO.composite != null && compositeItemVO.composite.sSpineAnimations.size() != 0) {
ArrayList<SpineVO> spineAnimations = compositeItemVO.composite.sSpineAnimations;
tmpSpineAnimList.addAll(spineAnimations
.stream()
.filter(spineVO -> spineVO.animationName.equals(spineAnimationName))
.collect(Collectors.toList()));
spineAnimations.removeAll(tmpSpineAnimList);
tmpSpineAnimList.clear();
}
}
private void deleteEntitiesWithParticleEffects(Entity rootEntity, String particleName) {
entityList.clear();
Consumer<Entity> action = (root) -> {
SpineDataComponent spineDataComponent = ComponentRetriever.get(root, SpineDataComponent.class);
if (spineDataComponent != null && spineDataComponent.animationName.equals(particleName)) {
entityList.add(root);
}
};
EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action);
EntityUtils.removeEntities(entityList);
}
}