GTK: Some of the cleanest code ever to be written (ignoring all other code)
ci/woodpecker/push/docs Pipeline was successful Details
ci/woodpecker/push/woodpecker Pipeline was successful Details

This commit is contained in:
Johannes Frohnmeyer 2023-01-28 20:37:57 +01:00
parent cd3c8a1852
commit 94dbaadaf1
Signed by: Johannes
GPG Key ID: E76429612C2929F4
9 changed files with 117 additions and 38 deletions

View File

@ -0,0 +1,16 @@
package extensions.manifold.rt.api.Array;
import manifold.ext.rt.api.Extension;
import manifold.ext.rt.api.This;
import java.lang.reflect.Array;
@Extension
public class ArrayExt {
public static int indexOf(@This Object array, Object elem) {
for (int i = 0, len = Array.getLength(array); i < len; i++) {
if (Array.get(array, i).equals(elem)) return i;
}
return -1;
}
}

View File

@ -1,13 +1,11 @@
package io.gitlab.jfronny.inceptum.gtk; package io.gitlab.jfronny.inceptum.gtk;
import io.gitlab.jfronny.inceptum.gtk.control.Dropdown;
import io.gitlab.jfronny.inceptum.launcher.LauncherEnv; import io.gitlab.jfronny.inceptum.launcher.LauncherEnv;
import org.gtk.gio.ListStore; import org.gtk.gio.ListStore;
import org.gtk.gobject.GObject; import org.gtk.gobject.GObject;
import org.gtk.gtk.*; import org.gtk.gtk.*;
import java.io.IOException; import java.io.IOException;
import java.util.function.Function;
public class GtkTest extends ApplicationWindow { public class GtkTest extends ApplicationWindow {
private final String searchTextWidget; private final String searchTextWidget;

View File

@ -39,9 +39,9 @@ public class IRow extends Box {
append(btn); append(btn);
} }
public void setDropdown(String[] options, int defaultIndex, IntConsumer changed) { public DropDown setDropdown(String[] options, int defaultIndex, IntConsumer changed) {
firstChild.hexpand = true; firstChild.hexpand = true;
DropDown btn = DropDown.newFromStrings(options); DropDown btn = new DropDown(new StringList(options), null);
btn.valign = Align.CENTER; btn.valign = Align.CENTER;
btn.halign = Align.END; btn.halign = Align.END;
btn.selected = defaultIndex; btn.selected = defaultIndex;
@ -49,9 +49,10 @@ public class IRow extends Box {
changed.accept(btn.selected); changed.accept(btn.selected);
}); });
append(btn); append(btn);
return btn;
} }
public void setCheckbox(@PropertyKey(resourceBundle = I18n.BUNDLE) String text, boolean value, Consumer<Boolean> changed) { public CheckButton setCheckbox(@PropertyKey(resourceBundle = I18n.BUNDLE) String text, boolean value, Consumer<Boolean> changed) {
firstChild.hexpand = true; firstChild.hexpand = true;
CheckButton btn = CheckButton.newWithLabel(I18n.get(text)); CheckButton btn = CheckButton.newWithLabel(I18n.get(text));
btn.valign = Align.CENTER; btn.valign = Align.CENTER;
@ -59,6 +60,7 @@ public class IRow extends Box {
btn.active = value; btn.active = value;
btn.onToggled(() -> changed.accept(btn.active)); btn.onToggled(() -> changed.accept(btn.active));
append(btn); append(btn);
return btn;
} }
public Entry setEntry(String value, Consumer<String> onChanged) { public Entry setEntry(String value, Consumer<String> onChanged) {

View File

@ -3,20 +3,24 @@ package io.gitlab.jfronny.inceptum.gtk.window.edit;
import io.gitlab.jfronny.commons.ArgumentsTokenizer; import io.gitlab.jfronny.commons.ArgumentsTokenizer;
import io.gitlab.jfronny.commons.io.JFiles; import io.gitlab.jfronny.commons.io.JFiles;
import io.gitlab.jfronny.inceptum.common.*; import io.gitlab.jfronny.inceptum.common.*;
import io.gitlab.jfronny.inceptum.gtk.control.*; import io.gitlab.jfronny.inceptum.gtk.control.ILabel;
import io.gitlab.jfronny.inceptum.gtk.util.I18n; import io.gitlab.jfronny.inceptum.gtk.util.I18n;
import io.gitlab.jfronny.inceptum.gtk.window.InstanceSettingsWindow; import io.gitlab.jfronny.inceptum.gtk.window.InstanceSettingsWindow;
import io.gitlab.jfronny.inceptum.launcher.api.FabricMetaApi;
import io.gitlab.jfronny.inceptum.launcher.api.McApi; import io.gitlab.jfronny.inceptum.launcher.api.McApi;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo;
import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta; import io.gitlab.jfronny.inceptum.launcher.model.inceptum.InstanceMeta;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionsList; import io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionsList;
import io.gitlab.jfronny.inceptum.launcher.system.instance.*; import io.gitlab.jfronny.inceptum.launcher.system.instance.*;
import io.gitlab.jfronny.inceptum.launcher.util.GameVersionParser;
import org.gtk.gobject.BindingFlags;
import org.gtk.gtk.*; import org.gtk.gtk.*;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Date; import java.util.*;
import java.util.List; import java.util.stream.Stream;
public class GeneralTab extends SettingsTab { public class GeneralTab extends SettingsTab {
private static final VersionsList VERSIONS = McApi.getVersions(); private static final VersionsList VERSIONS = McApi.getVersions();
@ -43,21 +47,73 @@ public class GeneralTab extends SettingsTab {
row.append(apply); row.append(apply);
}); });
section("instance.settings.general.game", section -> { section("instance.settings.general.game", section -> {
var row = section.row("instance.settings.general.game.version", "instance.settings.general.game.version.subtitle"); {
String[] versions = VERSIONS.versions.stream() var ref = new Object() {
.filter(s -> InceptumConfig.snapshots || s.type.equals("release")) CheckButton fabricEnabled = null;
.map(s -> s.id) Runnable versionChanged = null;
.toArray(String[]::new); DropDown fabricVersion = null;
int def = 0; String defaultFabric = null;
for (int i = 0; i < versions.length; i++) if (versions[i].equals(VERSIONS.latest.release)) def = i; String[] fabricVersions = null;
row.setDropdown( };
versions, var gameRow = section.row("instance.settings.general.game.version", "instance.settings.general.game.version.subtitle");
def, String[] versions = VERSIONS.versions.stream()
i -> { .filter(s -> InceptumConfig.snapshots || s.type.equals("release"))
instance.meta.gameVersion = versions[i]; .map(s -> s.id)
.toArray(String[]::new);
int def = 0;
for (int i = 0; i < versions.length; i++) if (versions[i].equals(instance.gameVersion)) def = i;
gameRow.setDropdown(
versions,
def,
i -> {
instance.meta.gameVersion = instance.isFabric
? GameVersionParser.createVersionWithFabric(versions[i], instance.loaderVersion)
: versions[i];
instance.writeMeta();
ref.versionChanged.run();
});
var fabricRow = section.row("instance.settings.general.game.fabric.enabled", "instance.settings.general.game.fabric.enabled.subtitle");
var loaderRow = section.row("instance.settings.general.game.fabric.version", "instance.settings.general.game.fabric.version.subtitle");
loaderRow.visible = instance.isFabric;
ref.fabricEnabled = fabricRow.setCheckbox("instance.settings.general.game.fabric.enabled", instance.isFabric, bl -> {
if (bl) {
if (ref.fabricVersions != null && ref.fabricVersions.length != 0 && ref.defaultFabric != null) {
instance.meta.gameVersion = GameVersionParser.createVersionWithFabric(instance.gameVersion, ref.defaultFabric);
instance.writeMeta();
} else {
ref.fabricEnabled.active = false;
}
} else {
instance.meta.gameVersion = instance.gameVersion;
instance.writeMeta(); instance.writeMeta();
}); }
//TODO Fabric support (checkbox) + dropdown: Loader version });
ref.fabricEnabled.bindProperty("active", loaderRow, "visible", BindingFlags.DEFAULT);
ref.versionChanged = () -> {
var ver = VERSIONS.versions.stream()
.filter(s -> s.id.equals(instance.gameVersion))
.findFirst()
.map(FabricMetaApi::getLoaderVersions)
.map(s -> s.toArray(FabricVersionLoaderInfo[]::new));
ref.defaultFabric = instance.isFabric ? instance.loaderVersion : ver
.map(Arrays::stream)
.map(a -> a.filter(s -> s.loader.stable))
.flatMap(Stream::findFirst)
.map(s -> s.loader.version)
.orElse(null);
ref.fabricVersions = ver.map(Arrays::stream)
.map(a -> a.map(s -> s.loader.version).toArray(String[]::new))
.orElse(null);
if (ref.fabricVersions == null || ref.fabricVersions.length == 0) {
ref.fabricEnabled.active = false;
} else if (ref.fabricVersion != null) ref.fabricVersion.model = new StringList(ref.fabricVersions);
};
ref.versionChanged.run();
ref.fabricVersion = loaderRow.setDropdown(ref.fabricVersions, ref.fabricVersions.indexOf(ref.defaultFabric), i -> {
instance.meta.gameVersion = i == -1 ? instance.gameVersion : GameVersionParser.createVersionWithFabric(instance.gameVersion, ref.fabricVersions[i]);
instance.writeMeta();
});
}
//TODO Custom Java (checkbox) + String: path //TODO Custom Java (checkbox) + String: path
//TODO minMem/maxMem (slider?) //TODO minMem/maxMem (slider?)
}); });

View File

@ -83,4 +83,8 @@ settings.snapshots=Snapshots
settings.update-channel=Update Channel settings.update-channel=Update Channel
settings.snapshots.subtitle=Whether to show snapshots in the version selector for new instances settings.snapshots.subtitle=Whether to show snapshots in the version selector for new instances
settings.update-channel.subtitle=The update channel. I personnaly recommend the CI channel as it gest the latest features and fixes more quickly, but it might be more unstable settings.update-channel.subtitle=The update channel. I personnaly recommend the CI channel as it gest the latest features and fixes more quickly, but it might be more unstable
settings.author-name.subtitle=The author name to add to packs where the metadata format requires specifying one settings.author-name.subtitle=The author name to add to packs where the metadata format requires specifying one
instance.settings.general.game.fabric.enabled=Fabric
instance.settings.general.game.fabric.enabled.subtitle=Whether the Fabric Loader should be used for this instance
instance.settings.general.game.fabric.version=Fabric Version
instance.settings.general.game.fabric.version.subtitle=Version of the Fabric Loader to use

View File

@ -83,4 +83,8 @@ settings.snapshots=Vorschauversionen
settings.update-channel=Updatekanal settings.update-channel=Updatekanal
settings.snapshots.subtitle=Ob Vorschauversionen im Versions-Auswahlmenü gezeigt werden sollen settings.snapshots.subtitle=Ob Vorschauversionen im Versions-Auswahlmenü gezeigt werden sollen
settings.update-channel.subtitle=Der Update-Kanal. Ich empfehle den etwas instabileren, aber häufiger aktualisierten CI-Kanal settings.update-channel.subtitle=Der Update-Kanal. Ich empfehle den etwas instabileren, aber häufiger aktualisierten CI-Kanal
settings.author-name.subtitle=Der Name, der bei Modpack-Exporten, deren Metadaten einen Autor angeben, aufgelistet werden soll settings.author-name.subtitle=Der Name, der bei Modpack-Exporten, deren Metadaten einen Autor angeben, aufgelistet werden soll
instance.settings.general.game.fabric.enabled=Fabric
instance.settings.general.game.fabric.enabled.subtitle=Ob Fabric-Loader für diese Instanz aktiviert werden soll
instance.settings.general.game.fabric.version=Fabric-Version
instance.settings.general.game.fabric.version.subtitle=Zu verwendende Version des Fabric-Loaders

View File

@ -21,7 +21,6 @@ import java.util.function.Consumer;
public class InstanceManageControls { public class InstanceManageControls {
private static final VersionsList VERSIONS = McApi.getVersions(); private static final VersionsList VERSIONS = McApi.getVersions();
private static final MemoryOperationResultCache<VersionsListInfo, List<FabricVersionLoaderInfo>> LOADER_INFO_CACHE = new MemoryOperationResultCache<>(Utils.CACHE_SIZE);
private static final MemoryOperationResultCache<Tuple<String, String>, VersionInfo> VERSION_INFO_CACHE = new MemoryOperationResultCache<>(Utils.CACHE_SIZE); private static final MemoryOperationResultCache<Tuple<String, String>, VersionInfo> VERSION_INFO_CACHE = new MemoryOperationResultCache<>(Utils.CACHE_SIZE);
private final ImInt version = new ImInt(0); private final ImInt version = new ImInt(0);
@ -44,7 +43,7 @@ public class InstanceManageControls {
version.set(getVersions(snapshots.get()).indexOf(selected)); version.set(getVersions(snapshots.get()).indexOf(selected));
name.set(instance == null ? InstanceNameTool.getDefaultName(selected.id, fabric.get()) : instance.name); name.set(instance == null ? InstanceNameTool.getDefaultName(selected.id, fabric.get()) : instance.name);
fabric.set(instance == null || instance.isFabric); fabric.set(instance == null || instance.isFabric);
List<FabricVersionLoaderInfo> versions = fabricLoaderInfo; List<FabricVersionLoaderInfo> versions = FabricMetaApi.getLoaderVersions(selected);
for (int i = 0, fabricLoaderInfoSize = versions.size(); i < fabricLoaderInfoSize; i++) { for (int i = 0, fabricLoaderInfoSize = versions.size(); i < fabricLoaderInfoSize; i++) {
FabricVersionLoaderInfo version = versions[i]; FabricVersionLoaderInfo version = versions[i];
if (instance != null && instance.isFabric if (instance != null && instance.isFabric
@ -93,7 +92,8 @@ public class InstanceManageControls {
selected = vil[version.get()]; selected = vil[version.get()];
exchangeNameIfDefault(prev.id, fabric.get()); exchangeNameIfDefault(prev.id, fabric.get());
} }
if (fabricLoaderInfo.isEmpty()) { List<FabricVersionLoaderInfo> versions = FabricMetaApi.getLoaderVersions(selected);
if (versions.isEmpty()) {
fabric.set(false); fabric.set(false);
exchangeNameIfDefault(selected.id, true); exchangeNameIfDefault(selected.id, true);
} else { } else {
@ -102,7 +102,6 @@ public class InstanceManageControls {
} }
if (fabric.get()) { if (fabric.get()) {
ImGui.sameLine(); ImGui.sameLine();
List<FabricVersionLoaderInfo> versions = fabricLoaderInfo;
if (ImGui.combo("Loader", fabricVersion, versions.stream().map(info -> info.loader.version).toArray(String[]::new))) { if (ImGui.combo("Loader", fabricVersion, versions.stream().map(info -> info.loader.version).toArray(String[]::new))) {
selectedFabric = versions.get(fabricVersion.get()); selectedFabric = versions.get(fabricVersion.get());
} }
@ -146,8 +145,4 @@ public class InstanceManageControls {
res.removeIf(info -> !snapshots && !info.type.equals("release")); res.removeIf(info -> !snapshots && !info.type.equals("release"));
return res; return res;
} }
private List<FabricVersionLoaderInfo> getFabricLoaderInfo() {
return LOADER_INFO_CACHE.get(selected, () -> FabricMetaApi.getLoaderVersions(selected));
}
} }

View File

@ -1,9 +1,11 @@
package io.gitlab.jfronny.inceptum.launcher.api; package io.gitlab.jfronny.inceptum.launcher.api;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo.GC_FabricVersionLoaderInfo; import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo.GC_FabricVersionLoaderInfo;
import io.gitlab.jfronny.commons.cache.MemoryOperationResultCache;
import io.gitlab.jfronny.gson.compile.util.GList; import io.gitlab.jfronny.gson.compile.util.GList;
import io.gitlab.jfronny.gson.stream.JsonReader; import io.gitlab.jfronny.gson.stream.JsonReader;
import io.gitlab.jfronny.inceptum.common.Net; import io.gitlab.jfronny.inceptum.common.Net;
import io.gitlab.jfronny.inceptum.common.Utils;
import io.gitlab.jfronny.inceptum.common.model.maven.ArtifactMeta; import io.gitlab.jfronny.inceptum.common.model.maven.ArtifactMeta;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.*; import io.gitlab.jfronny.inceptum.launcher.model.fabric.*;
import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library; import io.gitlab.jfronny.inceptum.launcher.model.fabric.FabricVersionLoaderInfo.WithMeta.LauncherMeta.Libraries.Library;
@ -16,13 +18,16 @@ import java.util.*;
public class FabricMetaApi { public class FabricMetaApi {
private static final String META_URL = "https://meta.fabricmc.net/"; private static final String META_URL = "https://meta.fabricmc.net/";
private static final MemoryOperationResultCache<VersionsListInfo, List<FabricVersionLoaderInfo>> LOADER_VERSIONS_CACHE = new MemoryOperationResultCache<>(Utils.CACHE_SIZE);
public static List<FabricVersionLoaderInfo> getLoaderVersions(VersionsListInfo version) { public static List<FabricVersionLoaderInfo> getLoaderVersions(VersionsListInfo version) {
try { try {
return Net.downloadObject(META_URL + "v2/versions/loader/" + version.id, s -> { return LOADER_VERSIONS_CACHE.get(version, () -> {
try (JsonReader r = new JsonReader(new StringReader(s))) { return Net.downloadObject(META_URL + "v2/versions/loader/" + version.id, s -> {
return GList.read(r, GC_FabricVersionLoaderInfo::read); try (JsonReader r = new JsonReader(new StringReader(s))) {
} return GList.read(r, GC_FabricVersionLoaderInfo::read);
}
});
}); });
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException("Could not get fabric loader versions", e); throw new RuntimeException("Could not get fabric loader versions", e);

View File

@ -6,8 +6,7 @@ import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.J
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionInfo.GC_VersionInfo; import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionInfo.GC_VersionInfo;
import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionsList.GC_VersionsList; import gsoncompile.extensions.io.gitlab.jfronny.inceptum.launcher.model.mojang.VersionsList.GC_VersionsList;
import io.gitlab.jfronny.commons.OSUtils; import io.gitlab.jfronny.commons.OSUtils;
import io.gitlab.jfronny.inceptum.common.MetaHolder; import io.gitlab.jfronny.inceptum.common.*;
import io.gitlab.jfronny.inceptum.common.Net;
import io.gitlab.jfronny.inceptum.launcher.model.mojang.*; import io.gitlab.jfronny.inceptum.launcher.model.mojang.*;
import java.io.IOException; import java.io.IOException;