DeflatedPickle/Quiver

View on GitHub
core/src/main/kotlin/com/deflatedpickle/quiver/backend/util/ActionUtil.kt

Summary

Maintainability
F
4 days
Test Coverage
/* Copyright (c) 2020-2021 DeflatedPickle under the MIT license */

@file:Suppress("WHEN_ENUM_CAN_BE_NULL_IN_JAVA")

package com.deflatedpickle.quiver.backend.util

import com.deflatedpickle.haruhi.util.PluginUtil
import com.deflatedpickle.marvin.Version
import com.deflatedpickle.quiver.Quiver
import com.deflatedpickle.quiver.backend.event.EventNewDocument
import com.deflatedpickle.quiver.backend.event.EventOpenPack
import com.deflatedpickle.quiver.backend.util.PackUtil.findResolution
import com.deflatedpickle.quiver.frontend.dialog.NewDialog
import org.oxbow.swingbits.dialog.task.TaskDialog
import org.oxbow.swingbits.dialog.task.TaskDialogs
import java.io.File
import javax.swing.JFileChooser

object ActionUtil {
    fun newPack() {
        val dialog = NewDialog()
        dialog.isVisible = true

        if (dialog.result == TaskDialog.StandardCommand.OK) {
            val path = "${
                if (dialog.locationEntry.field.text == "")
                    System.getProperty("user.dir")
                else
                    dialog.locationEntry.field.text
            }/${dialog.nameEntry.text}"

            Quiver.packDirectory = File(path).apply {
                mkdirs()
                createNewFile()
            }

            when (dialog.packTypeGroup.selectedValue!!) {
                PackType.EMPTY_PACK -> {
                    fun isSelected(path: String) = dialog.folderStructure.checkBoxTreeSelectionModel.selectionPaths.filter {
                            dialog.folderStructure.checkBoxTreeSelectionModel.isPathSelected(it,
                                true)
                        }.map {
                            it.path.joinToString("/").replace("root/", "")
                        }.contains(path)

                    PackUtil.createEmptyPack(
                        path, true,
                        PackUtil.PackStructure(
                            packMcMeta = /*isSelected("pack.mcmeta")*/ true,
                            assets = if (isSelected("assets")) PackUtil.PackStructure.Assets(
                                icons = isSelected("assets/icons"),
                                minecraft = if (isSelected("assets/minecraft")) PackUtil.PackStructure.Minecraft(
                                    soundsJson = isSelected("assets/minecraft/sounds.json"),
                                    blockstates = isSelected("assets/minecraft/blockstates"),
                                    gpuWarnlistJson = isSelected("assets/minecraft/gpu_warnlist.json"),
                                    font = isSelected("assets/minecraft/font"),
                                    icons = isSelected("assets/minecraft/icons"),
                                    lang = isSelected("assets/minecraft/lang"),
                                    models = if (isSelected("assets/minecraft/models")) PackUtil.PackStructure.Minecraft.Models(
                                        block = isSelected("assets/minecraft/models/block"),
                                        item = isSelected("assets/minecraft/models/item")
                                    ) else null,
                                    particles = isSelected("assets/minecraft/particles"),
                                    sounds = isSelected("assets/minecraft/sounds"),
                                    shaders = if (isSelected("assets/minecraft/shaders")) PackUtil.PackStructure.Minecraft.Shaders(
                                        post = isSelected("assets/minecraft/shaders/post"),
                                        program = isSelected("assets/minecraft/shaders/program")
                                    ) else null,
                                    texts = isSelected("assets/minecraft/text"),
                                    textures = if (isSelected("assets/minecraft/textures")) PackUtil.PackStructure.Minecraft.Textures(
                                        block = isSelected("assets/minecraft/textures/block"),
                                        colourmap = isSelected("assets/minecraft/textures/colourmap"),
                                        effect = isSelected("assets/minecraft/textures/effect"),
                                        entity = isSelected("assets/minecraft/textures/entity"),
                                        environment = isSelected("assets/minecraft/textures/environment"),
                                        font = isSelected("assets/minecraft/textures/font"),
                                        gui = if (isSelected("assets/minecraft/textures/gui")) PackUtil.PackStructure.Minecraft.Textures.GUI(
                                            advancements = if (isSelected("assets/minecraft/textures/gui/advancements")) PackUtil.PackStructure.Minecraft.Textures.GUI.Advancements(
                                                backgrounds = isSelected("assets/minecraft/textures/gui/advancements/backgrounds")
                                            ) else null,
                                            container = if (isSelected("assets/minecraft/textures/gui/container")) PackUtil.PackStructure.Minecraft.Textures.GUI.Container(
                                                creativeInventory = isSelected("assets/minecraft/textures/gui/container/creative_inventory")
                                            ) else null,
                                            presets = isSelected("assets/minecraft/textures/gui/container/presets"),
                                            title = if (isSelected("assets/minecraft/textures/gui/title")) PackUtil.PackStructure.Minecraft.Textures.GUI.Title(
                                                background = isSelected("assets/minecraft/textures/gui/title/background")
                                            ) else null
                                        ) else null,
                                        item = isSelected("assets/minecraft/textures/item"),
                                        map = isSelected("assets/minecraft/textures/map"),
                                        misc = isSelected("assets/minecraft/textures/misc"),
                                        mobEffect = isSelected("assets/minecraft/textures/mob_effect"),
                                        models = if (isSelected("assets/minecraft/textures/models")) PackUtil.PackStructure.Minecraft.Textures.Models(
                                            armor = isSelected("assets/minecraft/textures/models/armor")
                                        ) else null,
                                        painting = isSelected("assets/minecraft/textures/painting"),
                                        particle = isSelected("assets/minecraft/textures/particle")
                                    ) else null
                                ) else null
                            ) else null
                        )
                    )

                    if (Quiver.packDirectory!!.resolve("pack.mcmeta").exists()) {
                        PackUtil.writeMcMeta(
                            dialog.packVersionComboBox.selectedItem as Int,
                            dialog.descriptionEntry.text
                        )
                    }
                }
                PackType.DEFAULT_PACK -> {
                    val file = dialog.defaultVersionComboBox.selectedItem as File

                    PackUtil.extractPack(
                        file.resolve("${file.name}.jar"),
                        path
                    )

                    val extraResourceTypes = mutableListOf<ExtraResourceType>()

                    val selectionModel = dialog.extraResourceTree.checkBoxListSelectionModel
                    for (row in 0..dialog.extraResourceTree.model.size) {
                        if (selectionModel.isSelectedIndex(row)) {
                            extraResourceTypes.add(ExtraResourceType.values()[row])
                        }
                    }

                    PackUtil.extractExtraData(
                        file.resolve("${file.name}.json"),
                        path,
                        *extraResourceTypes.toTypedArray()
                    )

                    PackUtil.writeMcMeta(
                        PackUtil.gameVersionToPackVersion(Version.fromString((dialog.defaultVersionComboBox.selectedItem as File).name)),
                        dialog.descriptionEntry.text
                    )
                }
            }

            for (f in dialog.postTaskQueue) {
                f()
            }

            when (dialog.packTypeGroup.selectedValue) {
                PackType.EMPTY_PACK -> Quiver.resolution = dialog.resolutionEntry.text.toInt()
                PackType.DEFAULT_PACK -> Quiver.resolution = findResolution()
            }

            EventNewDocument.trigger(Quiver.packDirectory!!)
            EventOpenPack.trigger(Quiver.packDirectory!!)
        }
    }

    fun openPack() {
        val directoryChooser = JFileChooser(
            DotMinecraft.dotMinecraft.resolve("resourcepacks").absolutePath
        ).apply {
            fileSelectionMode = JFileChooser.DIRECTORIES_ONLY
            isAcceptAllFileFilterUsed = false
        }
        val openResult = directoryChooser.showOpenDialog(PluginUtil.window)

        if (openResult == JFileChooser.APPROVE_OPTION) {
            val selected = directoryChooser.selectedFile

            if (selected.isDirectory &&
                selected.resolve("pack.mcmeta").isFile
            ) {
                Quiver.packDirectory = directoryChooser.selectedFile
                Quiver.resolution = findResolution()
                Quiver.format = Quiver.json
                    .load(selected.resolve("pack.mcmeta"))
                    .getObject("pack")!!
                    .get(Int::class.java, "pack_format") as PackFormat

                EventNewDocument.trigger(Quiver.packDirectory!!)
                EventOpenPack.trigger(Quiver.packDirectory!!)
            } else {
                TaskDialogs.error(
                    PluginUtil.window,
                    "Invalid Pack",
                    "This directory is not a pack, as it does not contain a pack.mcmeta file"
                )
            }
        }
    }
}