package io.gitlab.jfronny.inceptum.windows; import imgui.ImGui; import imgui.type.ImBoolean; import imgui.type.ImInt; import imgui.type.ImString; import io.gitlab.jfronny.inceptum.Inceptum; import io.gitlab.jfronny.inceptum.install.SetupStepInfo; import io.gitlab.jfronny.inceptum.model.inceptum.LoaderInfo; import io.gitlab.jfronny.inceptum.model.fabric.FabricVersionLoaderInfo; import io.gitlab.jfronny.inceptum.model.mojang.VersionInfo; import io.gitlab.jfronny.inceptum.model.mojang.VersionsList; import io.gitlab.jfronny.inceptum.model.mojang.VersionsListInfo; import io.gitlab.jfronny.inceptum.util.api.FabricMetaApi; import io.gitlab.jfronny.inceptum.util.api.McApi; import io.gitlab.jfronny.inceptum.util.Utils; import java.io.IOException; import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class NewInstanceWindow extends Window { public static final int MAX_NAME_LENGTH = 128; VersionsList manifest = McApi.getVersions(); VersionsListInfo selected; Map> loaderInfoCache = new HashMap<>(); FabricVersionLoaderInfo selectedFabric; ImInt version = new ImInt(0); ImString name = new ImString("", MAX_NAME_LENGTH); ImInt fabricVersion = new ImInt(0); ImBoolean snapshots = new ImBoolean(Inceptum.CONFIG.snapshots); ImBoolean fabric = new ImBoolean(true); public NewInstanceWindow() { super("New Instance"); selected = getVersions(false).get(0); if (Inceptum.CONFIG.snapshots) version.set(manifest.versions.indexOf(selected)); name.set(getDefaultName(selected, fabric.get())); List versions = getFabricLoaderInfo(); for (int i = 0, fabricLoaderInfoSize = versions.size(); i < fabricLoaderInfoSize; i++) { FabricVersionLoaderInfo version = versions.get(i); if (version.loader.stable) { selectedFabric = version; fabricVersion.set(i); break; } } } @Override public void draw() { if (ImGui.checkbox("Show snapshots", snapshots)) { boolean prev = Inceptum.CONFIG.snapshots; Inceptum.CONFIG.snapshots = snapshots.get(); Inceptum.saveConfig(); //fix version index int i = getVersions(Inceptum.CONFIG.snapshots).indexOf(getVersions(prev).get(version.get())); if (i == -1) version.set(0); else version.set(i); } List vil = getVersions(Inceptum.CONFIG.snapshots); if (ImGui.combo("Version", version, vil.stream().map(info -> info.id).toArray(String[]::new))) { VersionsListInfo prev = selected; selected = vil.get(version.get()); if (getDefaultName(prev, fabric.get()).equals(name.get())) name.set(getDefaultName(selected, fabric.get())); //TODO " (1)" etc if exists } if (getFabricLoaderInfo().isEmpty()) { if (fabric.get() && getDefaultName(selected, true).equals(name.get())) name.set(getDefaultName(selected, false)); fabric.set(false); } else { if (ImGui.checkbox("Fabric support", fabric)) { if (getDefaultName(selected, !fabric.get()).equals(name.get())) name.set(getDefaultName(selected, fabric.get())); } if (fabric.get()) { ImGui.sameLine(); List versions = getFabricLoaderInfo(); if (ImGui.combo("Loader", fabricVersion, versions.stream().map(info -> info.loader.version).toArray(String[]::new))) { selectedFabric = versions.get(fabricVersion.get()); } } } //TODO forge ImGui.inputTextWithHint("Name", "Select a name", name); if (!Utils.VALID_FILENAME.matcher(name.get()).matches()) ImGui.text("Invalid name"); else if (Files.exists(Inceptum.INSTANCE_DIR.resolve(name.get()))) ImGui.text("Already exists"); else if (ImGui.button("OK")) { close(); try { VersionInfo vi = McApi.getVersionInfo(selected); if (fabric.get()) FabricMetaApi.addFabric(vi, selectedFabric.loader.version); Inceptum.open(new InstanceCreateProcessWindow(new SetupStepInfo(vi, fabric.get() ? new LoaderInfo(selectedFabric.loader) : LoaderInfo.NONE, name.get()))); } catch (IOException e) { Inceptum.LOGGER.error("Could not initialize instance creation", e); } } } private List getVersions(boolean snapshots) { ArrayList res = new ArrayList<>(manifest.versions); res.removeIf(info -> !snapshots && !info.type.equals("release")); return res; } private List getFabricLoaderInfo() { if (!loaderInfoCache.containsKey(selected)) loaderInfoCache.put(selected, FabricMetaApi.getLoaderVersions(selected)); return loaderInfoCache.get(selected); } private String getDefaultName(VersionsListInfo info, boolean fabric) { return fabric ? "Fabric " + info.id : info.id; } }