diff --git a/core/assets/bundles/bundle.properties b/core/assets/bundles/bundle.properties index de9a945104..77f6c736bc 100644 --- a/core/assets/bundles/bundle.properties +++ b/core/assets/bundles/bundle.properties @@ -172,6 +172,11 @@ hosts.discovering.any = Discovering games server.refreshing = Refreshing server hosts.none = [lightgray]No local games found! host.invalid = [scarlet]Can't connect to host. + +servers.local = Local Servers +servers.remote = Remote Servers +servers.global = Global Servers + trace = Trace Player trace.playername = Player name: [accent]{0} trace.ip = IP: [accent]{0} diff --git a/core/src/mindustry/ui/dialogs/JoinDialog.java b/core/src/mindustry/ui/dialogs/JoinDialog.java index 4b5b31fe08..1e3452a24b 100644 --- a/core/src/mindustry/ui/dialogs/JoinDialog.java +++ b/core/src/mindustry/ui/dialogs/JoinDialog.java @@ -13,6 +13,7 @@ import arc.util.serialization.*; import mindustry.*; import mindustry.core.*; import mindustry.gen.*; +import mindustry.graphics.*; import mindustry.net.*; import mindustry.net.Packets.*; import mindustry.ui.*; @@ -25,6 +26,7 @@ public class JoinDialog extends FloatingDialog{ Server renaming; Table local = new Table(); Table remote = new Table(); + Table global = new Table(); Table hosts = new Table(); int totalHosts; @@ -80,15 +82,11 @@ public class JoinDialog extends FloatingDialog{ } }); - keyDown(KeyCode.F5, () -> { - refreshLocal(); - refreshRemote(); - }); + keyDown(KeyCode.F5, this::refreshAll); shown(() -> { setup(); - refreshLocal(); - refreshRemote(); + refreshAll(); if(!steam){ Core.app.post(() -> Core.settings.getBoolOnce("joininfo", () -> ui.showInfo("$join.info"))); @@ -97,11 +95,16 @@ public class JoinDialog extends FloatingDialog{ onResize(() -> { setup(); - refreshLocal(); - refreshRemote(); + refreshAll(); }); } + void refreshAll(){ + refreshLocal(); + refreshRemote(); + refreshGlobal(); + } + void setupRemote(){ remote.clear(); @@ -128,21 +131,12 @@ public class JoinDialog extends FloatingDialog{ inner.add(button.getLabel()).growX(); inner.addImageButton(Icon.upOpen, Styles.emptyi, () -> { - int index = servers.indexOf(server); - if(index > 0){ - servers.remove(index); - servers.insert(0, server); + moveRemote(server, -1); - saveServers(); - setupRemote(); - for(Server other : servers){ - if(other.lastHost != null){ - setupServer(other, other.lastHost); - }else{ - refreshServer(other); - } - } - } + }).margin(3f).padTop(6f).top().right(); + + inner.addImageButton(Icon.downOpen, Styles.emptyi, () -> { + moveRemote(server, +1); }).margin(3f).padTop(6f).top().right(); @@ -172,6 +166,26 @@ public class JoinDialog extends FloatingDialog{ } } + void moveRemote(Server server, int sign){ + int index = servers.indexOf(server); + + if(index + sign < 0) return; + if(index + sign > servers.size - 1) return; + + servers.remove(index); + servers.insert(index + sign, server); + + saveServers(); + setupRemote(); + for(Server other : servers){ + if(other.lastHost != null){ + setupServer(other, other.lastHost); + }else{ + refreshServer(other); + } + } + } + void refreshRemote(){ for(Server server : servers){ refreshServer(server); @@ -232,9 +246,9 @@ public class JoinDialog extends FloatingDialog{ hosts.clear(); - hosts.add(remote).growX(); - hosts.row(); - hosts.add(local).width(w); + section("$servers.local", local); + section("$servers.remote", remote); + section("$servers.global", global); ScrollPane pane = new ScrollPane(hosts); pane.setFadeScrollBars(false); @@ -289,6 +303,24 @@ public class JoinDialog extends FloatingDialog{ }); } + void section(String label, Table servers){ + Collapser coll = new Collapser(servers, Core.settings.getBool("collapsed-" + label, false)); + coll.setDuration(0.1f); + + hosts.table(name -> { + name.add(label).pad(10).growX().left().color(Pal.accent); + name.addImageButton(Icon.downOpen, Styles.emptyi, () -> { + coll.toggle(false); + Core.settings.putSave("collapsed-" + label, coll.isCollapsed()); + }).update(i -> i.getStyle().imageUp = (!coll.isCollapsed() ? Icon.upOpen : Icon.downOpen)).size(40f).right().padRight(10f); + }).growX(); + hosts.row(); + hosts.addImage().growX().pad(5).padLeft(10).padRight(10).height(3).color(Pal.accent); + hosts.row(); + hosts.add(coll).width(targetWidth()); + hosts.row(); + } + void refreshLocal(){ totalHosts = 0; @@ -296,12 +328,17 @@ public class JoinDialog extends FloatingDialog{ local.background(null); local.table(Tex.button, t -> t.label(() -> "[accent]" + Core.bundle.get("hosts.discovering.any") + Strings.animated(Time.time(), 4, 10f, ".")).pad(10f)).growX(); net.discoverServers(this::addLocalHost, this::finishLocalHosts); + } + + void refreshGlobal(){ + global.clear(); + global.background(null); for(String host : defaultServers){ String resaddress = host.contains(":") ? host.split(":")[0] : host; int resport = host.contains(":") ? Strings.parseInt(host.split(":")[1]) : port; net.pingHost(resaddress, resport, res -> { res.port = resport; - addLocalHost(res); + addGlobalHost(res); }, e -> {}); } } @@ -334,6 +371,18 @@ public class JoinDialog extends FloatingDialog{ buildServer(host, button); } + void addGlobalHost(Host host){ + global.background(null); + float w = targetWidth(); + + global.row(); + + TextButton button = global.addButton("", Styles.cleart, () -> safeConnect(host.address, host.port, host.version)) + .width(w).pad(5f).get(); + button.clearChildren(); + buildServer(host, button); + } + public void connect(String ip, int port){ if(player.name.trim().isEmpty()){ ui.showInfo("$noname"); @@ -428,4 +477,4 @@ public class JoinDialog extends FloatingDialog{ public Server(){ } } -} +} \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index e54e317005..1b93d7b829 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,3 +1,3 @@ org.gradle.daemon=true org.gradle.jvmargs=-Xms256m -Xmx1024m -archash=1817bb22ac7680700fe780816940f4217a1f7e07 +archash=6467748c6d78d6a2204b37913f00375116138924