package scene2d; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.ui.Button; import com.badlogic.gdx.scenes.scene2d.ui.CheckBox; import com.badlogic.gdx.scenes.scene2d.ui.Dialog; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.List; import com.badlogic.gdx.scenes.scene2d.ui.ScrollPane; import com.badlogic.gdx.scenes.scene2d.ui.SelectBox; import com.badlogic.gdx.scenes.scene2d.ui.Slider; import com.badlogic.gdx.scenes.scene2d.ui.SplitPane; import com.badlogic.gdx.scenes.scene2d.ui.Stack; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.ui.TextField; import com.badlogic.gdx.scenes.scene2d.ui.Touchpad; import com.badlogic.gdx.scenes.scene2d.ui.Tree; import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup; import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup; import com.badlogic.gdx.scenes.scene2d.ui.VerticalGroup; import com.badlogic.gdx.scenes.scene2d.ui.Label.LabelStyle; import com.badlogic.gdx.utils.Json; import com.badlogic.gdx.utils.JsonValue; public class Serializer { public static void registerSerializer(Class<?> clazz, Json.Serializer serializer){ Scene.json.setSerializer(clazz, serializer); } public static void setup(){ registerSerializer(Actor.class, new ActorSerializer()); registerSerializer(Scene.class, new SceneSerializer()); registerSerializer(ImageJson.class, new ImageJson()); registerSerializer(Label.class, new LabelSerializer()); registerSerializer(Button.class, new ButtonSerializer()); registerSerializer(TextButton.class, new TextButtonSerializer()); registerSerializer(Table.class, new TableSerializer()); registerSerializer(CheckBox.class, new CheckBoxSerializer()); registerSerializer(SelectBox.class, new SelectBoxSerializer()); registerSerializer(List.class, new ListSerializer()); registerSerializer(Slider.class, new SliderSerializer()); registerSerializer(TextField.class, new TextFieldSerializer()); registerSerializer(Touchpad.class, new TouchpadSerializer()); registerSerializer(Sprite.class, new SpriteSerializer()); registerSerializer(Dialog.class, new DialogSerializer()); registerSerializer(SplitPane.class, new SplitPaneSerializer()); registerSerializer(ScrollPane.class, new ScrollPaneSerializer()); registerSerializer(Stack.class, new StackSerializer()); registerSerializer(Tree.class, new TreeSerializer()); registerSerializer(Table.class, new TableSerializer()); registerSerializer(ButtonGroup.class, new ButtonGroupSerializer()); registerSerializer(HorizontalGroup.class, new HorizontalGroupSerializer()); registerSerializer(VerticalGroup.class, new VerticalGroupSerializer()); } public static class ActorSerializer implements Json.Serializer<Actor> { @Override public Actor read(Json json, JsonValue jv, Class arg2) { Actor actor = new Actor(); readActor(jv, actor); return actor; } @Override public void write(Json json, Actor actor, Class arg2) { json.writeObjectStart(); writeActor(json, actor); json.writeObjectEnd(); } public static void readActor(JsonValue jv, Actor actor){ actor.setName(jv.getString("name")); actor.setX(jv.getFloat("x")); actor.setY(jv.getFloat("y")); actor.setWidth(jv.getFloat("width")); actor.setHeight(jv.getFloat("height")); actor.setOriginX(jv.getFloat("ox")); actor.setOriginY(jv.getFloat("oy")); actor.setRotation(jv.getFloat("rotation")); actor.setColor(Color.valueOf(jv.getString("color"))); actor.setTouchable(Touchable.valueOf(jv.getString("touchable"))); actor.setVisible(jv.getBoolean("visible")); Scene.getCurrentScene().addActor(actor); actor.setZIndex(jv.getInt("zindex")); } public static void writeActor(Json json, Actor actor){ json.writeValue("class", actor.getClass().getName()); json.writeValue("name", actor.getName()); json.writeValue("x", actor.getX()); json.writeValue("y", actor.getY()); json.writeValue("width", actor.getWidth()); json.writeValue("height", actor.getHeight()); json.writeValue("ox", actor.getOriginX()); json.writeValue("oy", actor.getOriginY()); json.writeValue("rotation", actor.getRotation()); json.writeValue("zindex", actor.getZIndex()); json.writeValue("color", actor.getColor().toString()); json.writeValue("touchable", actor.getTouchable().toString()); json.writeValue("visible", actor.isVisible()); } } public static class SceneSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { Scene scene = Scene.getCurrentScene(); scene.sceneBackground = jv.getString("background"); scene.sceneMusic = jv.getString("music"); scene.sceneTransition = jv.getString("transition"); scene.sceneDuration = jv.getFloat("duration"); scene.sceneInterpolationType = InterpolationType.valueOf(jv.getString("interpolation")); Scene.log(Scene.getCurrentScene().getName()); Scene.getRoot().addActor(scene); return scene; } @Override public void write(Json json, Actor label, Class arg2) { json.writeObjectStart(); Scene scene = (Scene) label; json.writeValue("class", Scene.class.getName()); json.writeValue("background", scene.sceneBackground); json.writeValue("music", scene.sceneMusic); json.writeValue("transition", scene.sceneTransition); json.writeValue("duration", scene.sceneDuration); json.writeValue("interpolation", scene.sceneInterpolationType.toString()); json.writeObjectEnd(); } } public static class LabelSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { LabelStyle ls = new LabelStyle(); ls.font = Asset.font(jv.getString("fontName")); Label label = new Label(jv.getString("text"), ls); readActor(jv, label); return label; } @Override public void write(Json json, Actor label, Class arg2) { json.writeObjectStart(); writeActor(json, label); json.writeValue("text", ((Label)label).getText().toString()); json.writeValue("fontName", Asset.fontMap.getKey(((Label)label).getStyle().font, false)); json.writeObjectEnd(); } } public static class ButtonSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { Button btn = new Button(Asset.skin); readActor(jv, btn); return btn; } @Override public void write(Json json, Actor btn, Class arg2) { json.writeObjectStart(); writeActor(json, btn); json.writeObjectEnd(); } } private static class CheckBoxSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { CheckBox check = new CheckBox(jv.getString("text"), Asset.skin); readActor(jv, check); return check; } @Override public void write(Json json, Actor check, Class arg2) { json.writeObjectStart(); writeActor(json, check); json.writeValue("text", ((CheckBox)check).getText().toString()); json.writeObjectEnd(); } } private static class SliderSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { Slider slider = new Slider(jv.getFloat("min"),jv.getFloat("max"),jv.getFloat("step") , false, Asset.skin); slider.setValue(jv.getFloat("value")); readActor(jv, slider); return slider; } @Override public void write(Json json, Actor slider, Class arg2) { json.writeObjectStart(); writeActor(json, slider); json.writeValue("min", ((Slider)slider).getMinValue()); json.writeValue("max", ((Slider)slider).getMaxValue()); json.writeValue("step", ((Slider)slider).getStepSize()); json.writeValue("value", ((Slider)slider).getValue()); json.writeObjectEnd(); } } private static class SelectBoxSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { SelectBox select = new SelectBox(jv.getString("text").split(","), Asset.skin); readActor(jv, select); return select; } @Override public void write(Json json, Actor select, Class arg2) { json.writeObjectStart(); writeActor(json, select); String items = ""; for(String s: ((SelectBox)select).getItems()) items+=s+","; json.writeValue("text", items); json.writeObjectEnd(); } } private static class ListSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { List list = new List(jv.getString("text").split(","), Asset.skin); readActor(jv, list); return list; } @Override public void write(Json json, Actor list, Class arg2) { json.writeObjectStart(); writeActor(json, list); String items = ""; for(String s: ((List)list).getItems()) items+=s+","; json.writeValue("text", items); json.writeObjectEnd(); } } public static class TouchpadSerializer extends ActorSerializer { public static float deadZoneRadius = 5f; @Override public Actor read(Json json, JsonValue jv, Class arg2) { Touchpad tp = new Touchpad(jv.getFloat("deadzoneRadius"), Asset.skin); deadZoneRadius = jv.getFloat("deadzoneRadius"); readActor(jv, tp); return tp; } @Override public void write(Json json, Actor tp, Class arg2) { json.writeObjectStart(); writeActor(json, tp); json.writeValue("deadzoneRadius", deadZoneRadius); json.writeObjectEnd(); } } private static class TextFieldSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { TextField tf = new TextField(jv.getString("text"), Asset.skin); readActor(jv, tf); return tf; } @Override public void write(Json json, Actor tf, Class arg2) { json.writeObjectStart(); writeActor(json, tf); json.writeValue("text", ((TextField)tf).getText().toString()); json.writeObjectEnd(); } } private static class TextButtonSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { TextButton btn = new TextButton(jv.getString("text"), Asset.skin); ActorSerializer.readActor(jv, btn); return btn; } @Override public void write(Json json, Actor btn, Class arg2) { json.writeObjectStart(); ActorSerializer.writeActor(json, btn); json.writeValue("text", ((TextButton)btn).getText().toString()); json.writeObjectEnd(); } } private static class SpriteSerializer extends ActorSerializer { @Override public Actor read(Json arg0, JsonValue jv, Class arg2) { Sprite sprite; if(jv.getInt("frameCount") != 1){ sprite = new Sprite(jv.getString("textures").split(",")[0], jv.getInt("frameCount"), jv.getFloat("duration")); } else{ sprite = new Sprite(jv.getFloat("duration"), jv.getString("textures").split(",")); } sprite.isAnimationActive = jv.getBoolean("active"); sprite.isAnimationLooping = jv.getBoolean("looping"); ActorSerializer.readActor(jv, sprite); return sprite; } @Override public void write(Json json, Actor sprite, Class arg2) { json.writeObjectStart(); ActorSerializer.writeActor(json, sprite); json.writeValue("textures", sprite.toString()); json.writeValue("duration", ((Sprite)sprite).getDuration()); json.writeValue("active", ((Sprite)sprite).isAnimationActive); json.writeValue("looping", ((Sprite)sprite).isAnimationLooping); json.writeValue("frameCount", ((Sprite)sprite).getFrameCount()); json.writeObjectEnd(); } } public static class GroupSerializer implements Json.Serializer<Group> { @Override public Group read(Json json, JsonValue jv, Class arg2) { Group group = new Group(); readGroup(jv, group); return group; } @Override public void write(Json json, Group group, Class arg2) { json.writeObjectStart(); writeGroup(json, group); json.writeObjectEnd(); } public void writeGroup(Json json, Group group){ ActorSerializer.writeActor(json, group); //Array<String> actorsJson = new Array<String>(); //for(Actor actor: group.getChildren()){ // actorsJson.add(Stage.json.toJson(actor)); //} //json.writeValue("children", actorsJson, Array.class, String.class); //not working } public void readGroup(JsonValue jv, Group group){ ActorSerializer.readActor(jv, group); //Array<String> array = (Array<String>)Stage.json.readValue(Array.class, String.class, // jv.get("children")); //for(String actorJson: array.items){ // Stage.log(actorJson); // //group.addActor(Stage.json.fromJson(actor)); //} } public void iterateActors(){ } } private static class DialogSerializer extends ActorSerializer { @Override public Actor read(Json json, JsonValue jv, Class arg2) { Dialog dialog = new Dialog(jv.getString("title"), Asset.skin); dialog.setModal(jv.getBoolean("modal")); dialog.setMovable(jv.getBoolean("move")); dialog.setResizable(jv.getBoolean("resize")); readActor(jv, dialog); return dialog; } @Override public void write(Json json, Actor dialog, Class arg2) { json.writeObjectStart(); writeActor(json, dialog); json.writeValue("title", ((Dialog)dialog).getTitle()); json.writeValue("modal", ((Dialog)dialog).isModal()); json.writeValue("move", ((Dialog)dialog).isMovable()); json.writeValue("resize", ((Dialog)dialog).isResizable()); json.writeObjectEnd(); } } private static class SplitPaneSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { SplitPane label = new SplitPane(null, null, false, Asset.skin); readGroup(jv, label); return label; } @Override public void write(Json json, Group label, Class arg2) { json.writeObjectStart(); writeGroup(json, label); json.writeObjectEnd(); } } private static class ScrollPaneSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { ScrollPane label = new ScrollPane(null); readGroup(jv, label); return label; } @Override public void write(Json json, Group label, Class arg2) { json.writeObjectStart(); writeGroup(json, label); json.writeObjectEnd(); } } private static class StackSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { Stack label = new Stack(); readGroup(jv, label); return label; } @Override public void write(Json json, Group label, Class arg2) { json.writeObjectStart(); writeGroup(json, label); json.writeObjectEnd(); } } private static class TreeSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { Tree label = new Tree(Asset.skin); readGroup(jv, label); return label; } @Override public void write(Json json, Group label, Class arg2) { json.writeObjectStart(); writeGroup(json, label); json.writeObjectEnd(); } } private static class TableSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { Table table = new Table(Asset.skin); //table.getPadBottom() //table.getCell(null).get readGroup(jv, table); return table; } @Override public void write(Json json, Group table, Class arg2) { json.writeObjectStart(); writeGroup(json, table); json.writeObjectEnd(); } } private static class ButtonGroupSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { Table table = new Table(Asset.skin); readGroup(jv, table); return table; } @Override public void write(Json json, Group table, Class arg2) { json.writeObjectStart(); writeGroup(json, table); json.writeObjectEnd(); } } private static class HorizontalGroupSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { HorizontalGroup hg = new HorizontalGroup(); readGroup(jv, hg); return hg; } @Override public void write(Json json, Group table, Class arg2) { json.writeObjectStart(); writeGroup(json, table); json.writeObjectEnd(); } } private static class VerticalGroupSerializer extends GroupSerializer { @Override public Group read(Json json, JsonValue jv, Class arg2) { VerticalGroup vg = new VerticalGroup(); readGroup(jv, vg); return vg; } @Override public void write(Json json, Group vg, Class arg2) { json.writeObjectStart(); writeGroup(json, vg); json.writeObjectEnd(); } } }