/*******************************************************************************
* 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.panels;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import com.badlogic.gdx.scenes.scene2d.Actor;
import com.badlogic.gdx.scenes.scene2d.ui.Label;
import com.badlogic.gdx.scenes.scene2d.ui.SelectBox;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.ui.Table;
import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener;
import com.bladecoder.engine.actions.Param;
import com.bladecoder.engine.actions.SceneActorRef;
import com.bladecoder.engine.model.BaseActor;
import com.bladecoder.engine.model.CharacterActor;
import com.bladecoder.engine.model.InteractiveActor;
import com.bladecoder.engine.model.Scene;
import com.bladecoder.engine.model.SpriteActor;
import com.bladecoder.engine.model.World;
import com.bladecoder.engineeditor.Ctx;
public class SceneActorInputPanel extends InputPanel {
SelectBox<String> scene;
EditableSelectBox<String> actor;
Table panel;
private final Param.Type type;
SceneActorInputPanel(Skin skin, String title, String desc, boolean mandatory, String defaultValue, Param.Type type) {
this.type = type;
panel = new Table(skin);
scene = new SelectBox<>(skin);
actor = new EditableSelectBox<>(skin);
panel.add(new Label(" Scene ", skin));
panel.add(scene);
panel.add(new Label(" Actor ", skin));
panel.add(actor);
Scene[] scenes = World.getInstance().getScenes().values().toArray(new Scene[0]);
int l = scenes.length + 1;
String values[] = new String[l];
values[0] = "";
for (int i = 0; i < scenes.length; i++) {
values[i + 1] = scenes[i].getId();
}
Arrays.sort(values);
scene.addListener(new ChangeListener() {
@Override
public void changed(ChangeEvent event, Actor actor) {
sceneSelected();
}
});
init(skin, title, desc, panel, mandatory, defaultValue);
scene.setItems(values);
if (values.length > 0) {
if (defaultValue != null)
setText(defaultValue);
else
scene.setSelectedIndex(0);
}
}
private void sceneSelected() {
String s = scene.getSelected();
if(s == null || s.isEmpty()) {
s = Ctx.project.getSelectedScene().getId();
}
Scene scn = World.getInstance().getScene(s);
actor.setItems(getActorValues(scn));
}
public String getText() {
if(actor.getSelected().isEmpty())
return null;
return (new SceneActorRef(scene.getSelected(), actor.getSelected())).toString();
}
public void setText(String s) {
SceneActorRef aa = new SceneActorRef(s);
scene.setSelected(aa.getSceneId() == null?"":aa.getSceneId());
sceneSelected();
actor.setSelected(aa.getActorId());
}
private String[] getActorValues(Scene scn) {
Map<String, BaseActor> actors = scn.getActors();
ArrayList<BaseActor> filteredActors = new ArrayList<BaseActor>();
for(BaseActor a: actors.values()) {
if(type == Param.Type.SCENE_CHARACTER_ACTOR) {
if(a instanceof CharacterActor)
filteredActors.add(a);
} else if(type == Param.Type.SCENE_INTERACTIVE_ACTOR) {
if(a instanceof InteractiveActor)
filteredActors.add(a);
} else if(type == Param.Type.SCENE_SPRITE_ACTOR) {
if(a instanceof SpriteActor)
filteredActors.add(a);
} else {
filteredActors.add(a);
}
}
String[] result = new String[isMandatory()?filteredActors.size() + 1:filteredActors.size() + 2];
// Add player variable to the list
result[0] = Scene.VAR_PLAYER;
if(!isMandatory())
result[filteredActors.size() + 1] = "";
for(int i = 0; i < filteredActors.size(); i++) {
result[i+1] = filteredActors.get(i).getId();
}
Arrays.sort(result);
return result;
}
}