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.particle.ParticleComponent;
import com.uwsoft.editor.renderer.data.CompositeItemVO;
import com.uwsoft.editor.renderer.data.ParticleEffectVO;
import com.uwsoft.editor.renderer.data.SceneVO;
import com.uwsoft.editor.renderer.utils.ComponentRetriever;
import com.uwsoft.editor.utils.runtime.EntityUtils;
import java.util.ArrayList;
import java.util.function.Consumer;
/**
* Created by Sasun Poghosyan on 5/10/2016.
*/
public class DeleteParticleEffect extends NonRevertibleCommand {
private static final String CLASS_NAME = "com.uwsoft.editor.controller.commands.resource.DeleteParticleEffect";
public static final String DONE = CLASS_NAME + "DONE";
private final ArrayList<Entity> entityList = new ArrayList<>();
private final ArrayList<ParticleEffectVO> tmpParticleEffectList = new ArrayList<>();
@Override
public void doAction() {
String particleName = notification.getBody();
if (projectManager.deleteParticle(particleName)) {
deleteEntitiesWithParticleEffects(sandbox.getRootEntity(), particleName); // delete entities from scene
deleteAllItemsWithParticleName(particleName);
projectManager.loadProjectData(projectManager.getCurrentProjectPath());
sendNotification(DONE, particleName);
SceneVO vo = sandbox.sceneVoFromItems();
projectManager.saveCurrentProject(vo);
} else {
cancel();
}
}
private void deleteAllItemsWithParticleName(String name) {
for (CompositeItemVO compositeItemVO : libraryItems.values()) {
deleteAllParticles(compositeItemVO, name);
}
}
private void deleteAllParticles(CompositeItemVO compositeItemVO, String name) {
Consumer<CompositeItemVO> action = (rootItemVo) -> getParticles(rootItemVo, name);
EntityUtils.applyActionRecursivelyOnLibraryItems(compositeItemVO, action);
}
private void getParticles(CompositeItemVO compositeItemVO, String name) {
if (compositeItemVO.composite != null && compositeItemVO.composite.sParticleEffects.size() != 0) {
ArrayList<ParticleEffectVO> particleEffectList = compositeItemVO.composite.sParticleEffects;
for (ParticleEffectVO particleEffectVO : particleEffectList) {
if (particleEffectVO.particleName.equals(name)) {
tmpParticleEffectList.add(particleEffectVO);
}
}
particleEffectList.removeAll(tmpParticleEffectList);
tmpParticleEffectList.clear();
}
}
private void deleteEntitiesWithParticleEffects(Entity rootEntity, String particleName) {
entityList.clear();
Consumer<Entity> action = (root) -> {
ParticleComponent particleComponent = ComponentRetriever.get(root, ParticleComponent.class);
if (particleComponent != null && particleComponent.particleName.equals(particleName)) {
entityList.add(root);
}
};
EntityUtils.applyActionRecursivelyOnEntities(rootEntity, action);
EntityUtils.removeEntities(entityList);
}
}