/******************************************************************************* * 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 com.badlogic.gdx.Gdx; import com.badlogic.gdx.audio.Sound; import com.badlogic.gdx.files.FileHandle; 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.badlogic.gdx.utils.Timer; import com.badlogic.gdx.utils.Timer.Task; import com.bladecoder.engine.model.InteractiveActor; import com.bladecoder.engine.model.SoundFX; 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.ModelList; import com.bladecoder.engineeditor.undo.UndoDeleteSound; public class SoundList extends ModelList<InteractiveActor, SoundFX> { private ImageButton playBtn; private Sound playingSound = null; public SoundList(Skin skin) { super(skin, true); playBtn = new ImageButton(skin); toolbar.addToolBarButton(playBtn, "ic_check", "Play Sound", "Plays the selected sound"); playBtn.setDisabled(true); setCellRenderer(listCellRenderer); Ctx.project.addPropertyChangeListener(Project.NOTIFY_ELEMENT_CREATED, new PropertyChangeListener() { @Override public void propertyChange(PropertyChangeEvent evt) { if (evt.getNewValue() instanceof SoundFX && !(evt.getSource() instanceof EditSoundDialog) && parent instanceof InteractiveActor) { addElements(parent, Arrays.asList(parent.getSounds().values().toArray(new SoundFX[0]))); } } }); list.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { int pos = list.getSelectedIndex(); toolbar.disableEdit(pos == -1); playBtn.setDisabled(pos == -1); } }); playBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { SoundFX selected = list.getSelected(); if (playingSound != null) { playingSound.stop(); playingSound.dispose(); playingSound = null; } playingSound = Gdx.audio.newSound(new FileHandle(Ctx.project.getProjectPath() + "/" + Project.SOUND_PATH + "/" + selected.getFilename())); playingSound.play(selected.getVolume(), 1, selected.getPan()); Timer.schedule(new Task() { @Override public void run() { if (playingSound != null) { playingSound.stop(); playingSound.dispose(); playingSound = null; } } }, 5); } }); } @Override protected EditSoundDialog getEditElementDialogInstance(SoundFX s) { return new EditSoundDialog(skin, parent, s); } @Override protected void delete() { SoundFX s = removeSelected(); parent.getSounds().remove(s.getId()); // UNDO Ctx.project.getUndoStack().add(new UndoDeleteSound(parent, s)); Ctx.project.setModified(); } @Override protected void copy() { SoundFX e = list.getSelected(); if (e == null) return; clipboard = (SoundFX) ElementUtils.cloneElement(e); toolbar.disablePaste(false); } @Override protected void paste() { SoundFX newElement = (SoundFX) ElementUtils.cloneElement(clipboard); int pos = list.getSelectedIndex() + 1; list.getItems().insert(pos, newElement); String id = newElement.getId(); if(parent.getSounds() != null) id = ElementUtils.getCheckedId(newElement.getId(), parent.getSounds().keySet().toArray(new String[parent.getSounds().size()])); newElement.setId(id); parent.addSound(newElement); list.setSelectedIndex(pos); list.invalidateHierarchy(); Ctx.project.setModified(); } // ------------------------------------------------------------------------- // ListCellRenderer // ------------------------------------------------------------------------- private static final CellRenderer<SoundFX> listCellRenderer = new CellRenderer<SoundFX>() { @Override protected String getCellTitle(SoundFX e) { return e.getId(); } StringBuilder sb = new StringBuilder(); @Override protected String getCellSubTitle(SoundFX e) { sb.setLength(0); String filename = e.getFilename(); if (filename != null && !filename.isEmpty()) sb.append("filename: ").append(filename); sb.append(" loop: ").append(e.getLoop()); sb.append(" volume: ").append(e.getVolume()); return sb.toString(); } @Override protected boolean hasSubtitle() { return true; } }; }