All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.bigcustard.scene2dplus.image.ImageGroup Maven / Gradle / Ivy

There is a newer version: 1.4.0
Show newest version
package com.bigcustard.scene2dplus.image;

import com.badlogic.gdx.files.FileHandle;
import com.badlogic.gdx.utils.Disposable;
import com.badlogic.gdx.utils.Json;
import com.bigcustard.scene2dplus.XY;
import com.bigcustard.util.Watchable;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

public class ImageGroup implements Disposable {
    private static String IMAGE_DETAIL_FILE = "images.json";

    private Watchable me = new Watchable<>();
    private List images = new ArrayList<>();
    private FileHandle folder;
    private static int count;

    public ImageGroup(FileHandle imageFolder) {
        this.folder = imageFolder;
        readImages();
    }

    public void watch(Consumer watcher) {
        me.watch(watcher);
    }

    public FileHandle folder() {
        return folder;
    }

    public List images() {
        return images;
    }

    public void images(List images) {
        this.images = images;
        me.broadcast(this);
        images.forEach(this::watch);
    }

    private void watch(ImageModel image) {
        image.watch(() -> me.broadcast(this));
    }

    public void save() {
        folder.child(IMAGE_DETAIL_FILE).writeString(new Json().toJson(new ImageListDetails(this)), false);
    }

    public boolean isValid() {
        return Arrays.stream(validate()).allMatch(ValidationResult::isValid);
    }

    public ValidationResult[] validate() {
        return images.stream().map(ImageModel::validate).toArray(ValidationResult[]::new);
    }

    private void readImages() {
        FileHandle imageDetails = folder.child(IMAGE_DETAIL_FILE);
        if (imageDetails.exists()) {
            readImagesFromDetailFile(imageDetails);
        } else {
            FileHandle[] imageFiles = folder.list((dir, name) -> isImage(name));
            for (FileHandle imageFile : imageFiles) {
                try {
                    if (!imageFile.isDirectory()) {
                        XY size = imageSize(imageFile);
                        images.add(new ImageModel(imageFile, imageFile.name(), size.x, size.y));
                    }
                } catch (Exception e) {
                    System.out.println("Ignoring non image file: " + imageFile.name());
                }
            }
        }
    }

    private boolean isImage(String name) {
        return name.endsWith("gif") || name.endsWith("jpg") || name.endsWith("jpeg") || name.endsWith("png") || name.endsWith("bmp");
    }

    protected static XY imageSize(FileHandle imageFile) {
        return ImageUtils.imageSize(imageFile);
    }

    private void readImagesFromDetailFile(FileHandle imageDetails) {
        String manifest = imageDetails.readString();
        ImageListDetails imageListDetails = new Json().fromJson(ImageListDetails.class, manifest);
        for (ImageDetails image : imageListDetails.images) {
            try {
                ImageModel imageModel = image.toImage(folder);
                images.add(imageModel);
                watch(imageModel);
            } catch (Exception e) {
                System.out.println("Failed to watch game image: " + e);
            }
        }
    }

    @Override
    public void dispose() {
        me.dispose();
        images.forEach(ImageModel::dispose);
        count--;
    }

    private static class ImageListDetails {
        private ImageDetails[] images;

        public ImageListDetails() {
            images = new ImageDetails[0];
        }

        public ImageListDetails(ImageGroup model) {
            images = model.images().stream().map(ImageDetails::new).toArray(ImageDetails[]::new);
        }
    }

    private static class ImageDetails {
        private String filename;
        private String name;
        private Integer width;
        private Integer height;

        public ImageDetails() {
        }

        public ImageDetails(ImageModel image) {
            name = image.name().get();
            filename = image.filename();
            width = image.width().get();
            height = image.height().get();
        }

        public ImageModel toImage(FileHandle parentFolder) {
            FileHandle imageFile = parentFolder.child(filename);
            XY size = imageSize(imageFile);
            return new ImageModel(imageFile, name, width, height, size.x, size.y);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy