/******************************************************************************* * Copyright 2014 Rafael Garcia Moreno. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package com.bladecoder.engineeditor.ui; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Arrays; import java.util.HashMap; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.ui.ImageButton; import com.badlogic.gdx.scenes.scene2d.ui.Skin; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.bladecoder.engine.anim.AnimationDesc; import com.bladecoder.engine.anim.Tween.Type; import com.bladecoder.engine.model.AnimationRenderer; import com.bladecoder.engine.model.Dialog; import com.bladecoder.engine.model.SpriteActor; import com.bladecoder.engineeditor.Ctx; import com.bladecoder.engineeditor.common.ElementUtils; import com.bladecoder.engineeditor.model.Project; import com.bladecoder.engineeditor.ui.panels.CellRenderer; import com.bladecoder.engineeditor.ui.panels.EditModelDialog; import com.bladecoder.engineeditor.ui.panels.ModelList; import com.bladecoder.engineeditor.undo.UndoDeleteAnimation; public class SpriteList extends ModelList<SpriteActor, AnimationDesc> { private ImageButton initBtn; private ImageButton flipInitBtn; public SpriteList(Skin skin) { super(skin, true); initBtn = new ImageButton(skin); toolbar.addToolBarButton(initBtn, "ic_check", "Set init animation", "Set init animation"); initBtn.setDisabled(true); flipInitBtn = new ImageButton(skin); toolbar.addToolBarButton(flipInitBtn, "ic_flip", "Set init animation flipped", "Set init animation flipped"); flipInitBtn.setDisabled(true); setCellRenderer(listCellRenderer); list.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { int pos = list.getSelectedIndex(); String id = null; if (pos != -1) id = list.getItems().get(pos).id; Ctx.project.setSelectedFA(id); toolbar.disableEdit(pos == -1); initBtn.setDisabled(pos == -1); flipInitBtn.setDisabled(pos == -1); } }); initBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { setDefault(); } }); flipInitBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { flipInit(); } }); Ctx.project.addPropertyChangeListener(Project.NOTIFY_ELEMENT_CREATED, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getNewValue() instanceof Dialog && !(evt.getSource() instanceof EditDialogDialog) && parent instanceof SpriteActor) { HashMap<String, AnimationDesc> animations = ((AnimationRenderer)parent.getRenderer()).getAnimations(); addElements(parent, Arrays.asList(animations.values().toArray(new AnimationDesc[0]))); } } }); } private void setDefault() { int pos = list.getSelectedIndex(); if (pos == -1) return; AnimationRenderer renderer = (AnimationRenderer)((SpriteActor) Ctx.project.getSelectedActor()).getRenderer(); String id = list.getItems().get(pos).id; String oldId = renderer.getInitAnimation(); renderer.setInitAnimation(id); Ctx.project.setModified(this, "init_animation", oldId, id); } private void flipInit() { int pos = list.getSelectedIndex(); if (pos == -1) return; AnimationRenderer renderer = (AnimationRenderer)((SpriteActor) Ctx.project.getSelectedActor()).getRenderer(); String id = list.getItems().get(pos).id; String newValue = AnimationDesc.getFlipId(id); renderer.setInitAnimation(newValue); Ctx.project.setModified(this, "init_animation", id, newValue); } @Override protected void delete() { AnimationDesc d = removeSelected(); AnimationRenderer renderer = (AnimationRenderer)parent.getRenderer(); renderer.getAnimations().remove(d.id); // UNDO Ctx.project.getUndoStack().add(new UndoDeleteAnimation(parent, d)); // delete init_animation attr if the animation to delete is the chapter // init_animation if (renderer.getInitAnimation().equals(d.id)) { HashMap<String, AnimationDesc> animations = renderer.getAnimations(); String newValue = null; if(animations.size() > 0) newValue = animations.keySet().iterator().next(); renderer.setInitAnimation(newValue); Ctx.project.setModified(this, "init_animation", d.id, newValue); } Ctx.project.setModified(); } @Override protected void copy() { AnimationDesc e = list.getSelected(); if (e == null) return; clipboard = (AnimationDesc)ElementUtils.cloneElement(e); toolbar.disablePaste(false); } @Override protected void paste() { AnimationDesc newElement = (AnimationDesc)ElementUtils.cloneElement(clipboard); int pos = list.getSelectedIndex() + 1; list.getItems().insert(pos, newElement); ((AnimationRenderer)parent.getRenderer()).addAnimation(newElement); list.setSelectedIndex(pos); list.invalidateHierarchy(); Ctx.project.setModified(); } @Override protected EditModelDialog<SpriteActor, AnimationDesc> getEditElementDialogInstance(AnimationDesc e) { return new EditAnimationDialog(skin, parent, e); } // ------------------------------------------------------------------------- // ListCellRenderer // ------------------------------------------------------------------------- private final CellRenderer<AnimationDesc> listCellRenderer = new CellRenderer<AnimationDesc>() { @Override protected String getCellTitle(AnimationDesc e) { String name = e.id; SpriteActor actor = (SpriteActor) Ctx.project.getSelectedActor(); AnimationRenderer renderer = (AnimationRenderer)actor.getRenderer(); String init = renderer.getInitAnimation(); if (init == null || init.isEmpty()) { if (renderer.getAnimations().values().size() > 0) init = renderer.getAnimations().values().iterator().next().id; else init = ""; } if (init.equals(name) || AnimationDesc.getFlipId(init).equals(name)) name += " <init>"; return name; } @Override protected String getCellSubTitle(AnimationDesc e) { StringBuilder sb = new StringBuilder(); if (e.source != null && !e.source.isEmpty()) sb.append("source: ").append(e.source); sb.append(" speed: ").append(e.duration); sb.append(" count: ").append(e.count); return sb.toString(); } @Override public TextureRegion getCellImage(AnimationDesc a) { String u = null; if (a.animationType == Type.REPEAT) { u = "ic_repeat"; } else if (a.animationType == Type.YOYO) { u = "ic_yoyo"; } else { u = "ic_sprite_actor"; } return Ctx.assetManager.getIcon(u); } @Override protected boolean hasSubtitle() { return true; } @Override protected boolean hasImage() { return true; } }; }