/******************************************************************************* * 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 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.badlogic.gdx.utils.Array; import com.bladecoder.engine.model.Scene; import com.bladecoder.engine.model.SceneLayer; import com.bladecoder.engineeditor.Ctx; import com.bladecoder.engineeditor.common.Message; import com.bladecoder.engineeditor.ui.panels.CellRenderer; import com.bladecoder.engineeditor.ui.panels.EditModelDialog; import com.bladecoder.engineeditor.ui.panels.ModelList; public class LayerList extends ModelList<Scene, SceneLayer> { private ImageButton upBtn; private ImageButton downBtn; private ImageButton visibilityBtn; public LayerList(Skin skin) { super(skin, false); list.setCellRenderer(listCellRenderer); visibilityBtn = new ImageButton(skin); toolbar.addToolBarButton(visibilityBtn, "ic_eye", "Toggle Visibility", "Toggle Visibility"); visibilityBtn.setDisabled(false); visibilityBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { toggleVisibility(); } }); upBtn = new ImageButton(skin); downBtn = new ImageButton(skin); toolbar.addToolBarButton(upBtn, "ic_up", "Move up", "Move up"); toolbar.addToolBarButton(downBtn, "ic_down", "Move down", "Move down"); toolbar.pack(); list.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { int pos = list.getSelectedIndex(); toolbar.disableEdit(pos == -1); upBtn.setDisabled(pos == -1 || pos == 0); downBtn.setDisabled(pos == -1 || pos == list.getItems().size - 1); } }); upBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { up(); } }); downBtn.addListener(new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { down(); } }); } private void toggleVisibility() { SceneLayer e = list.getSelected(); if (e == null) return; e.setVisible(!e.isVisible()); Ctx.project.setModified(); } private void up() { int pos = list.getSelectedIndex(); if (pos == -1 || pos == 0) return; Array<SceneLayer> items = list.getItems(); SceneLayer e = items.get(pos); SceneLayer e2 = items.get(pos - 1); parent.getLayers().set(pos, e2); parent.getLayers().set(pos - 1, e); items.removeIndex(pos); items.insert(pos - 1, e); list.setSelectedIndex(pos - 1); upBtn.setDisabled(list.getSelectedIndex() == 0); downBtn.setDisabled(list.getSelectedIndex() == list.getItems().size - 1); Ctx.project.setModified(); } private void down() { int pos = list.getSelectedIndex(); Array<SceneLayer> items = list.getItems(); if (pos == -1 || pos == items.size - 1) return; SceneLayer e = items.get(pos); SceneLayer e2 = pos + 1 < items.size ? items.get(pos + 1) : null; parent.getLayers().set(pos, e2); parent.getLayers().set(pos + 1, e); items.removeIndex(pos); items.insert(pos + 1, e); list.setSelectedIndex(pos + 1); upBtn.setDisabled(list.getSelectedIndex() == 0); downBtn.setDisabled(list.getSelectedIndex() == list.getItems().size - 1); Ctx.project.setModified(); } @Override protected EditModelDialog<Scene, SceneLayer> getEditElementDialogInstance(SceneLayer l) { return new EditLayerDialog(skin, parent, l); } @Override protected void delete() { int pos = list.getSelectedIndex(); if (pos == -1) return; if (list.getItems().size < 2) { String msg = "The layer will not be deleted, at least one layer must exist"; Message.showMsg(getStage(), msg, 3); return; } SceneLayer e = list.getSelected(); if (e.getActors().isEmpty()) { SceneLayer l = removeSelected(); parent.getLayers().remove(l); Ctx.project.setModified(); } else { String msg = "The layer is not empty."; Message.showMsg(getStage(), msg, 3); } } @Override protected void copy() { // TODO } @Override protected void paste() { // TODO } // ------------------------------------------------------------------------- // ListCellRenderer // ------------------------------------------------------------------------- private static final CellRenderer<SceneLayer> listCellRenderer = new CellRenderer<SceneLayer>() { @Override protected String getCellTitle(SceneLayer l) { return l.getName(); } @Override protected String getCellSubTitle(SceneLayer l) { StringBuilder sb = new StringBuilder(); sb.append("dynamic: ").append(l.isDynamic()); sb.append(" visible: ").append(l.isVisible()); sb.append(" parallax: ").append(l.getParallaxMultiplier()); return sb.toString(); } @Override public TextureRegion getCellImage(SceneLayer l) { String u = null; if (l.isVisible()) { u = "eye"; } else { u = "eye_disabled"; } return Ctx.assetManager.getIcon(u); } @Override protected boolean hasSubtitle() { return true; } @Override protected boolean hasImage() { return true; } }; }