stu.tnt.gdx.widget.StyleAtlas.java Source code

Java tutorial

Introduction

Here is the source code for stu.tnt.gdx.widget.StyleAtlas.java

Source

package stu.tnt.gdx.widget;

/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 * 
 * 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.
 ******************************************************************************/
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.TextureAtlas;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.badlogic.gdx.scenes.scene2d.utils.Drawable;
import com.badlogic.gdx.utils.Json;
import com.badlogic.gdx.utils.Json.ReadOnlySerializer;
import com.badlogic.gdx.utils.JsonValue;
import com.badlogic.gdx.utils.SerializationException;
import com.badlogic.gdx.utils.reflect.ClassReflection;
import com.badlogic.gdx.utils.reflect.ReflectionException;

/**
 * @author Nathan Sweet
 */
public class StyleAtlas extends Skin {
    public StyleAtlas() {
    }

    public StyleAtlas(FileHandle skinFile) {
        super(skinFile);
    }

    public StyleAtlas(FileHandle skinFile, TextureAtlas texture) {
        super(skinFile, texture);
    }

    protected Json getJsonLoader(final FileHandle skinFile) {
        final Skin skin = this;

        final Json json = new Json() {
            public <T> T readValue(Class<T> type, Class elementType, JsonValue jsonData) {
                // If the JSON is a string but the type is not, look up the
                // actual value by name.
                if (jsonData.isString() && !ClassReflection.isAssignableFrom(CharSequence.class, type))
                    return get(jsonData.asString(), type);
                return super.readValue(type, elementType, jsonData);
            }
        };
        json.setTypeName(null);
        json.setUsePrototypes(false);

        /* ------------------------------------------------ */

        json.setSerializer(Skin.class, new ReadOnlySerializer<Skin>() {
            public Skin read(Json json, JsonValue typeToValueMap, Class ignored) {
                for (JsonValue valueMap = typeToValueMap.child(); valueMap != null; valueMap = valueMap.next()) {
                    try {
                        readNamedObjects(json, ClassReflection.forName(valueMap.name()), valueMap);
                    } catch (ReflectionException ex) {
                        throw new SerializationException(ex);
                    }
                }
                return skin;
            }

            private void readNamedObjects(Json json, Class type, JsonValue valueMap) {
                Class addType = type == TintedDrawable.class ? Drawable.class : type;
                for (JsonValue valueEntry = valueMap.child(); valueEntry != null; valueEntry = valueEntry.next()) {
                    Object object = json.readValue(type, valueEntry);
                    if (object == null)
                        continue;
                    try {
                        add(valueEntry.name(), object, addType);
                    } catch (Exception ex) {
                        throw new SerializationException(
                                "Error reading " + ClassReflection.getSimpleName(type) + ": " + valueEntry.name(),
                                ex);
                    }
                }
            }
        });

        json.setSerializer(BitmapFont.class, new ReadOnlySerializer<BitmapFont>() {
            public BitmapFont read(Json json, JsonValue jsonData, Class type) {
                String path = json.readValue("file", String.class, jsonData);

                FileHandle fontFile = skinFile.parent().child(path);
                if (!fontFile.exists())
                    fontFile = Gdx.files.internal(path);
                if (!fontFile.exists())
                    throw new SerializationException("Font file not found: " + fontFile);

                // Use a region with the same name as the font, else use
                // a PNG file in the same directory as the FNT file.
                String regionName = fontFile.nameWithoutExtension();
                try {
                    TextureRegion region = skin.optional(regionName, TextureRegion.class);
                    if (region != null)
                        return new BitmapFont(fontFile, region, false);
                    else {
                        FileHandle imageFile = fontFile.parent().child(regionName + ".png");
                        if (imageFile.exists())
                            return new BitmapFont(fontFile, imageFile, false);
                        else
                            return new BitmapFont(fontFile, false);
                    }
                } catch (RuntimeException ex) {
                    throw new SerializationException("Error loading bitmap font: " + fontFile, ex);
                }
            }
        });

        json.setSerializer(Color.class, new ReadOnlySerializer<Color>() {
            public Color read(Json json, JsonValue jsonData, Class type) {
                if (jsonData.isString())
                    return get(jsonData.asString(), Color.class);
                String hex = json.readValue("hex", String.class, (String) null, jsonData);
                if (hex != null)
                    return Color.valueOf(hex);
                float r = json.readValue("r", float.class, 0f, jsonData);
                float g = json.readValue("g", float.class, 0f, jsonData);
                float b = json.readValue("b", float.class, 0f, jsonData);
                float a = json.readValue("a", float.class, 1f, jsonData);
                return new Color(r, g, b, a);
            }
        });

        json.setSerializer(TintedDrawable.class, new ReadOnlySerializer() {
            public Object read(Json json, JsonValue jsonData, Class type) {
                String name = json.readValue("name", String.class, jsonData);
                Color color = json.readValue("color", Color.class, jsonData);
                return newDrawable(name, color);
            }
        });

        /* ------------------------------------------------ */

        json.setSerializer(Attributes.class, new ReadOnlySerializer<Attributes>() {
            @Override
            public Attributes read(Json json, JsonValue jsonData, Class type) {
                float startX = json.readValue("startX", float.class, (float) 0, jsonData);
                float startY = json.readValue("startY", float.class, (float) 0, jsonData);
                float dstX = json.readValue("x", float.class, jsonData);
                float dstY = json.readValue("y", float.class, jsonData);
                float width = json.readValue("width", float.class, jsonData);
                float height = json.readValue("height", float.class, jsonData);
                Attributes attr = new Attributes();
                attr.startX = startX;
                attr.startY = startY;
                attr.x = dstX;
                attr.y = dstY;
                attr.width = width;
                attr.height = height;
                return attr;
            }
        });

        /* ------------------------------------------------ */

        json.setSerializer(ScalingSet.class, new ReadOnlySerializer<ScalingSet>() {
            @Override
            public ScalingSet read(Json json, JsonValue jsonData, Class type) {
                float layoutx = json.readValue("layoutx", float.class, jsonData);
                float layouty = json.readValue("layouty", float.class, jsonData);
                float layoutwidth = json.readValue("layoutwidth", float.class, jsonData);
                float layoutheight = json.readValue("layoutheight", float.class, jsonData);
                float whratio = json.readValue("whratio", float.class, jsonData);
                float hwratio = json.readValue("hwratio", float.class, jsonData);
                return new ScalingSet().set(layoutx, layouty, layoutwidth, layoutheight, whratio, hwratio);
            }
        });

        /* ------------------------------------------------ */

        json.setSerializer(Vector2.class, new ReadOnlySerializer<Vector2>() {
            @Override
            public Vector2 read(Json json, JsonValue jsonData, Class type) {
                return new Vector2(json.readValue("x", float.class, jsonData),
                        json.readValue("y", float.class, jsonData));
            }
        });
        return json;
    }
}