Allow selecting a version when reinstalling a mod (#12589)

* Mod reinstall select version

* Support for JSON mods with/without releases

* Removed commented-out code
This commit is contained in:
Cardillan
2026-09-05 16:04:23 -04:00
committed by GitHub
parent ca3c0f30b8
commit 8079274531
3 changed files with 88 additions and 67 deletions
+1
View File
@@ -50,6 +50,7 @@ mods.browser.add = Install
mods.browser.reinstall = Reinstall
mods.browser.view-releases = View Releases
mods.browser.noreleases = [scarlet]No Releases Found\n[accent]Couldn't find any releases for this mod. Check if the mod's repository has any releases published.
mods.browser.current = [lightgray]Most recent commit
mods.browser.latest = [lightgray][Latest]
mods.browser.releases = Releases
mods.browser.fetching = Fetching Releases...
@@ -7,14 +7,12 @@ import arc.graphics.*;
import arc.graphics.Texture.*;
import arc.graphics.g2d.*;
import arc.input.*;
import arc.scene.style.*;
import arc.scene.ui.*;
import arc.scene.ui.layout.*;
import arc.struct.*;
import arc.util.*;
import arc.util.Http.*;
import arc.util.serialization.*;
import arc.util.serialization.Jval.*;
import mindustry.*;
import mindustry.core.*;
import mindustry.gen.*;
@@ -350,61 +348,7 @@ public class ModBrowserDialog extends BaseDialog{
Core.app.openURI("https://github.com/" + mod.repo);
});
sel.buttons.button("@mods.browser.view-releases", Icon.zoom, () -> {
BaseDialog load = new BaseDialog("");
load.cont.add("[accent]" + Core.bundle.get("mods.browser.fetching"));
load.show();
Http.get(ghApi + "/repos/" + mod.repo + "/releases", res -> {
var json = Jval.read(res.getResultAsString());
JsonArray releases = json.asArray();
Core.app.post(() -> {
load.hide();
if(releases.size == 0){
ui.showInfo("@mods.browser.noreleases");
}else{
sel.hide();
var downloads = new BaseDialog("@mods.browser.releases");
downloads.cont.pane(p -> {
for(int j = 0; j < releases.size; j++){
var release = releases.get(j);
int index = j;
p.table(((TextureRegionDrawable)Tex.whiteui).tint(Pal.darkestGray), t -> {
t.add("[accent]" + release.getString("name") + (index == 0 ? " " + Core.bundle.get("mods.browser.latest") : "")).top().left().growX().wrap().pad(5f);
t.row();
t.add((release.getString("published_at")).substring(0, 10).replaceAll("-", "/")).top().left().growX().wrap().pad(5f).color(Color.gray);
t.row();
t.table(b -> {
b.defaults().size(150f, 54f).pad(2f);
b.button("@mods.github.open-release", Icon.link, () -> Core.app.openURI(release.getString("html_url")));
b.button("@mods.browser.add", Icon.download, () -> {
String releaseUrl = release.getString("url");
ui.mods.githubImportMod(mod.repo, mod.hasJava, releaseUrl.substring(releaseUrl.lastIndexOf("/") + 1), true);
});
}).right();
}).margin(5f).growX().pad(5f);
if(j < releases.size - 1) p.row();
}
}).width(500f).scrollX(false).fillY();
downloads.buttons.button("@back", Icon.left, () -> {
downloads.clear();
downloads.hide();
sel.show();
}).size(150f, 54f).pad(2f);
downloads.keyDown(KeyCode.escape, downloads::hide);
downloads.keyDown(KeyCode.back, downloads::hide);
downloads.hidden(sel::show);
downloads.show();
}
});
}, t -> Core.app.post(() -> {
ui.mods.showModError(t);
load.hide();
}));
});
sel.buttons.button("@mods.browser.view-releases", Icon.zoom, () -> ui.mods.viewReleases(mod.repo, mod.hasJava, false));
sel.keyDown(KeyCode.escape, sel::hide);
sel.keyDown(KeyCode.back, sel::hide);
sel.show();
+86 -10
View File
@@ -5,6 +5,7 @@ import arc.files.*;
import arc.func.*;
import arc.graphics.*;
import arc.graphics.g2d.*;
import arc.input.*;
import arc.scene.*;
import arc.scene.style.*;
import arc.scene.ui.TextButton.*;
@@ -15,6 +16,7 @@ import arc.util.*;
import arc.util.Http.*;
import arc.util.io.*;
import arc.util.serialization.*;
import arc.util.serialization.Jval.*;
import mindustry.ctype.*;
import mindustry.game.EventType.*;
import mindustry.gen.*;
@@ -33,6 +35,8 @@ public class ModsDialog extends BaseDialog{
protected float modImportProgress;
protected boolean cancelledImport;
protected BaseDialog currentContent;
protected BaseDialog downloads;
protected BaseDialog modDetails;
protected float scroll = 0f;
//only records mods that have a valid repo!
@@ -391,22 +395,22 @@ public class ModsDialog extends BaseDialog{
}
private void showMod(LoadedMod mod){
BaseDialog dialog = new BaseDialog(mod.meta.displayName);
modDetails = new BaseDialog(mod.meta.displayName);
dialog.addCloseButton();
modDetails.addCloseButton();
if(!mobile){
dialog.buttons.button("@mods.openfolder", Icon.link, () -> Core.app.openFolder(mod.file.absolutePath()));
modDetails.buttons.button("@mods.openfolder", Icon.link, () -> Core.app.openFolder(mod.file.absolutePath()));
}
if(mod.getRepo() != null){
boolean showImport = !mod.hasSteamID();
dialog.buttons.button("@mods.github.open", Icon.link, () -> Core.app.openURI("https://github.com/" + mod.getRepo()));
if(mobile && showImport) dialog.buttons.row();
if(showImport) dialog.buttons.button("@mods.browser.reinstall", Icon.download, () -> githubImportMod(mod.getRepo(), mod.isJava(), null, false));
modDetails.buttons.button("@mods.github.open", Icon.link, () -> Core.app.openURI("https://github.com/" + mod.getRepo()));
if(mobile && showImport) modDetails.buttons.row();
if(showImport) modDetails.buttons.button("@mods.browser.reinstall", Icon.download, () -> viewReleases(mod.getRepo(), mod.isJava(), true));
}
dialog.cont.pane(desc -> {
modDetails.cont.pane(desc -> {
desc.center();
desc.defaults().padTop(10).left();
@@ -444,8 +448,8 @@ public class ModsDialog extends BaseDialog{
Seq<UnlockableContent> all = Seq.with(content.getContentMap()).<Content>flatten().select(c -> c.minfo.mod == mod && c instanceof UnlockableContent u && !u.isHidden()).as();
if(all.any()){
dialog.cont.row();
dialog.cont.button("@mods.viewcontent", Icon.book, () -> {
modDetails.cont.row();
modDetails.cont.button("@mods.viewcontent", Icon.book, () -> {
BaseDialog d = new BaseDialog(mod.meta.displayName);
d.cont.pane(cs -> {
int i = 0;
@@ -467,7 +471,7 @@ public class ModsDialog extends BaseDialog{
}).size(300, 50).pad(4);
}
dialog.show();
modDetails.show();
}
protected void handleMod(String repo, HttpResponse result, boolean forceEnable){
@@ -495,6 +499,8 @@ public class ModsDialog extends BaseDialog{
try{
setup();
ui.loadfrag.hide();
if(downloads != null) downloads.hide();
if(modDetails != null) modDetails.hide();
}catch(Throwable e){
ui.showException(e);
}
@@ -523,6 +529,76 @@ public class ModsDialog extends BaseDialog{
}
}
public void viewReleases(String repo, boolean isJava, boolean reinstall) {
BaseDialog load = new BaseDialog("");
load.cont.add("[accent]" + Core.bundle.get("mods.browser.fetching"));
load.show();
Http.get(ghApi + "/repos/" + repo + "/releases", res -> {
var json = Jval.read(res.getResultAsString());
JsonArray releases = json.asArray();
Core.app.post(() -> {
load.hide();
if(releases.size == 0){
if(reinstall && !isJava){
githubImportMod(repo, isJava, null, false);
}else{
ui.showInfo("@mods.browser.noreleases");
}
}else{
downloads = new BaseDialog("@mods.browser.releases");
downloads.cont.pane(p -> {
if(reinstall && !isJava){
p.table(((TextureRegionDrawable)Tex.whiteui).tint(Pal.darkestGray), t -> {
t.add("@mods.browser.current").top().left().growX().wrap().pad(5f).padBottom(15f);
t.row();
t.table(b -> {
b.defaults().size(150f, 54f).pad(2f);
b.button("@mods.github.open", Icon.link, () -> Core.app.openURI("https://github.com/" + repo));
b.button("@mods.browser.add", Icon.download, () -> githubImportMod(repo, isJava, null, false));
}).right();
}).margin(5f).growX().pad(5f);
p.row();
}
for(int j = 0; j < releases.size; j++){
var release = releases.get(j);
int index = j;
p.table(((TextureRegionDrawable)Tex.whiteui).tint(Pal.darkestGray), t -> {
t.add("[accent]" + release.getString("name") + (index == 0 ? " " + Core.bundle.get("mods.browser.latest") : "")).top().left().growX().wrap().pad(5f);
t.row();
t.add((release.getString("published_at")).substring(0, 10).replaceAll("-", "/")).top().left().growX().wrap().pad(5f).color(Color.gray);
t.row();
t.table(b -> {
b.defaults().size(150f, 54f).pad(2f);
b.button("@mods.github.open-release", Icon.link, () -> Core.app.openURI(release.getString("html_url")));
b.button("@mods.browser.add", Icon.download, () -> {
String releaseUrl = release.getString("url");
githubImportMod(repo, isJava, releaseUrl.substring(releaseUrl.lastIndexOf("/") + 1), true);
});
}).right();
}).margin(5f).growX().pad(5f);
if(j < releases.size - 1) p.row();
}
}).width(500f).scrollX(false).fillY();
downloads.buttons.button("@back", Icon.left, () -> {
downloads.clear();
downloads.hide();
}).size(150f, 54f).pad(2f);
downloads.keyDown(KeyCode.escape, downloads::hide);
downloads.keyDown(KeyCode.back, downloads::hide);
downloads.show();
}
});
}, t -> Core.app.post(() -> {
showModError(t);
load.hide();
}));
}
public void githubImportMod(String repo, boolean isJava, boolean forceEnable){
githubImportMod(repo, isJava, null, forceEnable);
}