diff --git a/forge-gui-desktop/src/main/java/forge/gui/SOverlayUtils.java b/forge-gui-desktop/src/main/java/forge/gui/SOverlayUtils.java index c6247bbc520..caf0994501e 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/SOverlayUtils.java +++ b/forge-gui-desktop/src/main/java/forge/gui/SOverlayUtils.java @@ -35,6 +35,9 @@ public final class SOverlayUtils { * A standardized overlay for a game start condition. */ public static void startGameOverlay() { + startGameOverlay("Loading new game..."); + } + public static void startGameOverlay(String message) { final JPanel overlay = SOverlayUtils.genericOverlay(); final int w = overlay.getWidth(); final int h = overlay.getHeight(); @@ -53,7 +56,7 @@ public final class SOverlayUtils { pnl.add(new FLabel.Builder().icon(FSkin.getIcon(FSkinProp.ICO_LOGO)) .iconScaleFactor(1d).iconInBackground().build(), "w " + logoSize + "px!, h " + logoSize + "px!, align center"); - pnl.add(new FLabel.Builder().text("Loading new game...") + pnl.add(new FLabel.Builder().text(message) .fontSize(22).build(), "h " + labelHeight + "px!, align center"); overlay.add(pnl); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java index 02d1f70cad1..14ba6f64d8c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java @@ -4,12 +4,15 @@ import java.util.ArrayList; import java.util.List; import javax.swing.JMenu; +import javax.swing.SwingUtilities; import org.apache.commons.lang3.StringUtils; +import forge.FThreads; import forge.GuiBase; import forge.assets.FSkinProp; import forge.gui.FNetOverlay; +import forge.gui.SOverlayUtils; import forge.gui.framework.ICDoc; import forge.interfaces.IGuiGame; import forge.interfaces.ILobbyListener; @@ -30,6 +33,7 @@ import forge.net.server.FServerManager; import forge.net.server.ServerGameLobby; import forge.player.GamePlayerUtil; import forge.properties.ForgePreferences.FPref; +import forge.properties.ForgeProfileProperties; import forge.screens.home.CLobby; import forge.screens.home.VLobby; import forge.screens.home.sanctioned.ConstructedGameMenu; @@ -45,17 +49,45 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { initialize(); } - final void host(final int portNumber) { - promptNameIfNeeded(); + void connectToServer() { + final String url = SOptionPane.showInputDialog("Enter URL of server to join. Leave blank to host your own server.", "Connect to Server"); + if (url == null) { return; } + //prompt user for player one name if needed + if (StringUtils.isBlank(FModel.getPreferences().getPref(FPref.PLAYER_NAME))) { + GamePlayerUtil.setPlayerName(); + } + + FThreads.invokeInBackgroundThread(new Runnable() { + @Override + public void run() { + if (url.length() > 0) { + join(url); + } + else { + host(); + } + } + }); + } + + private void host() { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + SOverlayUtils.startGameOverlay("Starting server..."); + SOverlayUtils.showOverlay(); + } + }); + + final int port = ForgeProfileProperties.getServerPort(); final FServerManager server = FServerManager.getInstance(); final ServerGameLobby lobby = new ServerGameLobby(); final VLobby view = VSubmenuOnlineLobby.SINGLETON_INSTANCE.setLobby(lobby); - server.startServer(portNumber); + server.startServer(port); server.setLobby(lobby); - FNetOverlay.SINGLETON_INSTANCE.showUp("Hosting game"); lobby.setListener(new IUpdateable() { @Override public final void update(final boolean fullUpdate) { @@ -103,11 +135,24 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { view.update(true); - FNetOverlay.SINGLETON_INSTANCE.showUp(String.format("Hosting on port %d", portNumber)); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + SOverlayUtils.hideOverlay(); + FNetOverlay.SINGLETON_INSTANCE.showUp(String.format("Hosting on port %d", port)); + VSubmenuOnlineLobby.SINGLETON_INSTANCE.populate(); + } + }); } - final void join(final String hostname, final int port) { - promptNameIfNeeded(); + private void join(final String url) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + SOverlayUtils.startGameOverlay("Connecting to server..."); + SOverlayUtils.showOverlay(); + } + }); final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); final FGameClient client = new FGameClient(FModel.getPreferences().getPref(FPref.PLAYER_NAME), "0", gui); @@ -138,16 +183,35 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { client.send(event); } }); + + final String hostname; + int port0 = ForgeProfileProperties.getServerPort(); + + //see if port specified in URL + int index = url.indexOf(':'); + if (index >= 0) { + hostname = url.substring(0, index); + String portStr = url.substring(index + 1); + try { + port0 = Integer.parseInt(portStr); + } + catch (Exception ex) {} + } + else { + hostname = url; + } + final int port = port0; + client.connect(hostname, port); - FNetOverlay.SINGLETON_INSTANCE.showUp(String.format("Connected to %s:%d", hostname, port)); - } - - private static void promptNameIfNeeded() { - //prompt user for player one name if needed - if (StringUtils.isBlank(FModel.getPreferences().getPref(FPref.PLAYER_NAME))) { - GamePlayerUtil.setPlayerName(); - } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + SOverlayUtils.hideOverlay(); + FNetOverlay.SINGLETON_INSTANCE.showUp(String.format("Connected to %s:%d", hostname, port)); + VSubmenuOnlineLobby.SINGLETON_INSTANCE.populate(); + } + }); } @Override @@ -155,7 +219,7 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { } /* (non-Javadoc) - * @see forge.gui.home.ICSubmenu#initialize() + * @see forge.gui.home.ICSubmenu#update() */ @Override public void update() { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java index 45ce28866e5..bd868ed4427 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java @@ -18,15 +18,12 @@ import forge.gui.framework.IVTopLevelUI; import forge.match.GameLobby; import forge.net.client.FGameClient; import forge.net.server.FServerManager; -import forge.properties.ForgeConstants; import forge.screens.home.EMenuGroup; import forge.screens.home.IVSubmenu; import forge.screens.home.VHomeUI; import forge.screens.home.VLobby; import forge.toolbox.FButton; -import forge.toolbox.FLabel; -import forge.toolbox.FPanel; -import forge.toolbox.FTextField; +import forge.toolbox.FSkin; import forge.util.gui.SOptionPane; public enum VSubmenuOnlineLobby implements IVSubmenu, IVTopLevelUI { @@ -55,85 +52,46 @@ public enum VSubmenuOnlineLobby implements IVSubmenu, IVTop final JPanel container = VHomeUI.SINGLETON_INSTANCE.getPnlDisplay(); container.removeAll(); - container.setLayout(new MigLayout("insets 0, gap 0, wrap 1, ax right")); if (lobby == null) { - final FPanel pnlHost = new FPanel(new MigLayout("insets 5px 10% 5px 10%, wrap 2", "[grow,l]10[grow,r]", "[grow,c][grow,c]")); - container.add(pnlHost, "west, w 50%!, h 100%!"); - - final FLabel lblServerPort = new FLabel.Builder().text("Server port").build(); - pnlHost.add(lblServerPort, "w 100!, h 50!"); - - final FTextField txtServerPort = new FTextField.Builder().text(String.valueOf(ForgeConstants.SERVER_PORT_NUMBER)).build(); - txtServerPort.setEditable(false); - pnlHost.add(txtServerPort, "wrap"); - - final FButton btnHost = new FButton("Host"); - btnHost.addActionListener(new ActionListener() { + final FButton btnConnect = new FButton("Connect to Server"); + btnConnect.setFont(FSkin.getFont(20)); + btnConnect.addActionListener(new ActionListener() { @Override public final void actionPerformed(final ActionEvent e) { - getLayoutControl().host(Integer.parseInt(txtServerPort.getText())); - populate(); + getLayoutControl().connectToServer(); } }); - pnlHost.add(btnHost, "span 2, wrap, w 200!, h 50!"); - - final FPanel pnlJoin = new FPanel(new MigLayout("insets 5px 10% 5px 10%, wrap 2", "[grow,l]10[grow,r]", "[grow,c][grow,c][grow,c]")); - container.add(pnlJoin, "east, w 50%!, h 100%!"); - - final FLabel lblJoinHost = new FLabel.Builder().text("Hostname").build(); - pnlJoin.add(lblJoinHost, "w 100!, h 50!"); - - final FTextField txtJoinHost = new FTextField.Builder().text("localhost").build(); - pnlJoin.add(txtJoinHost, "wrap, w 250!"); - - final FLabel lblJoinPort = new FLabel.Builder().text("Host port").build(); - pnlJoin.add(lblJoinPort, "w 100!, h 50!"); - - final FTextField txtJoinPort = new FTextField.Builder().text(String.valueOf(ForgeConstants.SERVER_PORT_NUMBER)).build(); - txtJoinPort.setEditable(false); - pnlJoin.add(txtJoinPort, "wrap"); - - final FButton btnJoin = new FButton("Join"); - btnJoin.addActionListener(new ActionListener() { - @Override - public final void actionPerformed(final ActionEvent e) { - getLayoutControl().join(txtJoinHost.getText(), Integer.parseInt(txtJoinPort.getText())); - populate(); - } - }); - pnlJoin.add(btnJoin, "span 2, w 200!, h 50!"); - - if (container.isShowing()) { - container.validate(); - container.repaint(); - } + container.setLayout(new MigLayout("insets 0, gap 0, ax center, ay center")); + container.add(btnConnect, "w 300!, h 75!"); + return; } - else { - lobby.getLblTitle().setText("Online Multiplayer: Lobby"); - container.add(lobby.getLblTitle(), "w 80%, h 40px!, gap 0 0 15px 15px, span 2, al right, pushx"); - - for (final FDeckChooser fdc : lobby.getDeckChoosers()) { - fdc.populate(); - fdc.getDecksComboBox().addListener(new IDecksComboBoxListener() { - @Override - public final void deckTypeSelected(final DecksComboBoxEvent ev) { - lobby.focusOnAvatar(); - } - }); - } - - container.add(lobby.getConstructedFrame(), "gap 20px 20px 20px 0px, push, grow"); - container.add(lobby.getPanelStart(), "gap 0 0 3.5%! 3.5%!, ax center"); - - if (container.isShowing()) { - container.validate(); - container.repaint(); - } - - if (!lobby.getPlayerPanels().isEmpty()) { - lobby.changePlayerFocus(0); - } + + container.setLayout(new MigLayout("insets 0, gap 0, wrap 1, ax right")); + + lobby.getLblTitle().setText("Online Multiplayer: Lobby"); + container.add(lobby.getLblTitle(), "w 80%, h 40px!, gap 0 0 15px 15px, span 2, al right, pushx"); + + for (final FDeckChooser fdc : lobby.getDeckChoosers()) { + fdc.populate(); + fdc.getDecksComboBox().addListener(new IDecksComboBoxListener() { + @Override + public final void deckTypeSelected(final DecksComboBoxEvent ev) { + lobby.focusOnAvatar(); + } + }); + } + + container.add(lobby.getConstructedFrame(), "gap 20px 20px 20px 0px, push, grow"); + container.add(lobby.getPanelStart(), "gap 0 0 3.5%! 3.5%!, ax center"); + + if (container.isShowing()) { + container.validate(); + container.repaint(); + } + + if (!lobby.getPlayerPanels().isEmpty()) { + lobby.changePlayerFocus(0); } }