diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index 9ba678bd97..07fa97b3a0 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -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... diff --git a/core/src/mindustry/ui/dialogs/ModBrowserDialog.java b/core/src/mindustry/ui/dialogs/ModBrowserDialog.java index 523393780f..4fedf5c50a 100644 --- a/core/src/mindustry/ui/dialogs/ModBrowserDialog.java +++ b/core/src/mindustry/ui/dialogs/ModBrowserDialog.java @@ -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(); diff --git a/core/src/mindustry/ui/dialogs/ModsDialog.java b/core/src/mindustry/ui/dialogs/ModsDialog.java index deeb19e3db..75826c9e7d 100644 --- a/core/src/mindustry/ui/dialogs/ModsDialog.java +++ b/core/src/mindustry/ui/dialogs/ModsDialog.java @@ -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 all = Seq.with(content.getContentMap()).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); }