Better mod browser horizontal layout
This commit is contained in:
@@ -19,6 +19,7 @@ public class MultiEffect extends Effect{
|
|||||||
public void init(){
|
public void init(){
|
||||||
for(Effect f : effects){
|
for(Effect f : effects){
|
||||||
clip = Math.max(clip, f.clip);
|
clip = Math.max(clip, f.clip);
|
||||||
|
lifetime = Math.max(lifetime, f.lifetime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -882,7 +882,7 @@ public class Mods implements Loadable{
|
|||||||
public boolean java;
|
public boolean java;
|
||||||
|
|
||||||
public String displayName(){
|
public String displayName(){
|
||||||
return displayName == null ? Strings.stripColors(name) : displayName;
|
return displayName == null ? name : displayName;
|
||||||
}
|
}
|
||||||
|
|
||||||
//removes all colors
|
//removes all colors
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import arc.input.*;
|
|||||||
import arc.scene.style.*;
|
import arc.scene.style.*;
|
||||||
import arc.scene.ui.TextButton.*;
|
import arc.scene.ui.TextButton.*;
|
||||||
import arc.scene.ui.*;
|
import arc.scene.ui.*;
|
||||||
|
import arc.scene.ui.layout.*;
|
||||||
import arc.struct.*;
|
import arc.struct.*;
|
||||||
import arc.util.*;
|
import arc.util.*;
|
||||||
import arc.util.io.*;
|
import arc.util.io.*;
|
||||||
@@ -36,10 +37,39 @@ public class ModsDialog extends BaseDialog{
|
|||||||
private boolean orderDate = true;
|
private boolean orderDate = true;
|
||||||
private BaseDialog currentContent;
|
private BaseDialog currentContent;
|
||||||
|
|
||||||
|
private BaseDialog browser;
|
||||||
|
private Table browserTable;
|
||||||
|
|
||||||
public ModsDialog(){
|
public ModsDialog(){
|
||||||
super("@mods");
|
super("@mods");
|
||||||
addCloseButton();
|
addCloseButton();
|
||||||
|
|
||||||
|
browser = new BaseDialog("@mods.browser");
|
||||||
|
|
||||||
|
browser.cont.table(table -> {
|
||||||
|
table.left();
|
||||||
|
table.image(Icon.zoom);
|
||||||
|
table.field(searchtxt, res -> {
|
||||||
|
searchtxt = res;
|
||||||
|
rebuildBrowser();
|
||||||
|
}).growX().get();
|
||||||
|
table.button(Icon.list, Styles.clearPartiali, 32f, () -> {
|
||||||
|
orderDate = !orderDate;
|
||||||
|
rebuildBrowser();
|
||||||
|
}).update(b -> b.getStyle().imageUp = (orderDate ? Icon.list : Icon.star)).size(40f).get()
|
||||||
|
.addListener(new Tooltip(tip -> tip.label(() -> orderDate ? "@mods.browser.sortdate" : "@mods.browser.sortstars").left()));
|
||||||
|
}).fillX().padBottom(4);
|
||||||
|
|
||||||
|
browser.cont.row();
|
||||||
|
browser.cont.pane(tablebrow -> {
|
||||||
|
tablebrow.margin(10f).top();
|
||||||
|
browserTable = tablebrow;
|
||||||
|
rebuildBrowser();
|
||||||
|
}).get().setScrollingDisabled(true, false);
|
||||||
|
browser.addCloseButton();
|
||||||
|
|
||||||
|
browser.onResize(this::rebuildBrowser);
|
||||||
|
|
||||||
buttons.button("@mods.guide", Icon.link, () -> Core.app.openURI(modGuideURL)).size(210, 64f);
|
buttons.button("@mods.guide", Icon.link, () -> Core.app.openURI(modGuideURL)).size(210, 64f);
|
||||||
|
|
||||||
if(!mobile){
|
if(!mobile){
|
||||||
@@ -226,7 +256,7 @@ public class ModsDialog extends BaseDialog{
|
|||||||
title.table(text -> {
|
title.table(text -> {
|
||||||
boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors();
|
boolean hideDisabled = !mod.isSupported() || mod.hasUnmetDependencies() || mod.hasContentErrors();
|
||||||
|
|
||||||
text.add("" + mod.meta.displayName() + "\n[lightgray]v" + mod.meta.version + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + ""))
|
text.add("" + Strings.stripColors(mod.meta.displayName()) + "\n[lightgray]v" + Strings.stripColors(trimText(mod.meta.version)) + (mod.enabled() || hideDisabled ? "" : "\n" + Core.bundle.get("mod.disabled") + ""))
|
||||||
.wrap().top().width(300f).growX().left();
|
.wrap().top().width(300f).growX().left();
|
||||||
|
|
||||||
text.row();
|
text.row();
|
||||||
@@ -357,32 +387,21 @@ public class ModsDialog extends BaseDialog{
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void showModBrowser(){
|
private void showModBrowser(){
|
||||||
Runnable[] rebuildBrowser = {null};
|
rebuildBrowser();
|
||||||
BaseDialog browser = new BaseDialog("@mods.browser");
|
browser.show();
|
||||||
browser.cont.table(table -> {
|
}
|
||||||
table.left();
|
|
||||||
table.image(Icon.zoom);
|
|
||||||
table.field(searchtxt, res -> {
|
|
||||||
searchtxt = res;
|
|
||||||
rebuildBrowser[0].run();
|
|
||||||
}).growX().get();
|
|
||||||
table.button(Icon.list, Styles.clearPartiali, 32f, () -> {
|
|
||||||
orderDate = !orderDate;
|
|
||||||
rebuildBrowser[0].run();
|
|
||||||
}).update(b -> b.getStyle().imageUp = (orderDate ? Icon.list : Icon.star)).size(40f).get()
|
|
||||||
.addListener(new Tooltip(tip -> tip.label(() -> orderDate ? "@mods.browser.sortdate" : "@mods.browser.sortstars").left()));
|
|
||||||
}).fillX().padBottom(4);
|
|
||||||
|
|
||||||
browser.cont.row();
|
private void rebuildBrowser(){
|
||||||
|
ObjectSet<String> installed = mods.list().map(m -> m.getRepo()).asSet();
|
||||||
|
|
||||||
browser.cont.pane(tablebrow -> {
|
browserTable.clear();
|
||||||
tablebrow.margin(10f).top();
|
browserTable.add("@loading");
|
||||||
rebuildBrowser[0] = () -> {
|
|
||||||
tablebrow.clear();
|
int cols = Math.max(Core.graphics.getWidth() / 475, 1);
|
||||||
tablebrow.add("@loading");
|
|
||||||
|
|
||||||
getModList(rlistings -> {
|
getModList(rlistings -> {
|
||||||
tablebrow.clear();
|
browserTable.clear();
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
Seq<ModListing> listings = rlistings;
|
Seq<ModListing> listings = rlistings;
|
||||||
if(!orderDate){
|
if(!orderDate){
|
||||||
@@ -393,12 +412,16 @@ public class ModsDialog extends BaseDialog{
|
|||||||
for(ModListing mod : listings){
|
for(ModListing mod : listings){
|
||||||
if((mod.hasJava && Vars.ios) || !searchtxt.isEmpty() && !mod.repo.toLowerCase().contains(searchtxt.toLowerCase()) || (Vars.ios && mod.hasScripts)) continue;
|
if((mod.hasJava && Vars.ios) || !searchtxt.isEmpty() && !mod.repo.toLowerCase().contains(searchtxt.toLowerCase()) || (Vars.ios && mod.hasScripts)) continue;
|
||||||
|
|
||||||
tablebrow.button(btn -> {
|
browserTable.button(btn -> {
|
||||||
btn.top().left();
|
btn.top().left();
|
||||||
btn.margin(12f);
|
btn.margin(12f);
|
||||||
btn.table(con -> {
|
btn.table(con -> {
|
||||||
con.left();
|
con.left();
|
||||||
con.add("[accent]" + mod.name + "[white]\n[lightgray]Author:[] " + trimText(mod.author) + "\n[lightgray]\uE809 " + mod.stars +
|
con.add(
|
||||||
|
"[accent]" + mod.name.replace("\n", "") +
|
||||||
|
(installed.contains(mod.repo) ? " [scarlet][[Installed]" : "") +
|
||||||
|
"[white]\n[lightgray]Author:[] " + trimText(mod.author) +
|
||||||
|
"\n[lightgray]\uE809 " + mod.stars +
|
||||||
(Version.isAtLeast(mod.minGameVersion) ? "" : "\n" + Core.bundle.format("mod.requiresversion", mod.minGameVersion)))
|
(Version.isAtLeast(mod.minGameVersion) ? "" : "\n" + Core.bundle.format("mod.requiresversion", mod.minGameVersion)))
|
||||||
.width(388f).wrap().growX().pad(0f, 6f, 0f, 6f).left().labelAlign(Align.left);
|
.width(388f).wrap().growX().pad(0f, 6f, 0f, 6f).left().labelAlign(Align.left);
|
||||||
con.add().growX().pad(0f, 6f, 0f, 6f);
|
con.add().growX().pad(0f, 6f, 0f, 6f);
|
||||||
@@ -425,14 +448,9 @@ public class ModsDialog extends BaseDialog{
|
|||||||
sel.keyDown(KeyCode.back, sel::hide);
|
sel.keyDown(KeyCode.back, sel::hide);
|
||||||
sel.show();
|
sel.show();
|
||||||
}).width(460f).growX().left().fillY();
|
}).width(460f).growX().left().fillY();
|
||||||
tablebrow.row();
|
if(++i % cols == 0) browserTable.row();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
|
||||||
rebuildBrowser[0].run();
|
|
||||||
}).get().setScrollingDisabled(true, false);
|
|
||||||
browser.addCloseButton();
|
|
||||||
browser.show();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String trimText(String text){
|
private String trimText(String text){
|
||||||
|
|||||||
Reference in New Issue
Block a user