From ed16e6f4e90d32b265d4070369467dc97fe9588a Mon Sep 17 00:00:00 2001 From: "Jamin W. Collins" Date: Fri, 2 Mar 2018 18:02:59 -0700 Subject: [PATCH] option to fully reset the OnlineLobby Closes core-developers/forge#161 Signed-off-by: Jamin W. Collins --- .../src/main/java/forge/gui/FNetOverlay.java | 6 +++ .../java/forge/screens/home/StopButton.java | 50 +++++++++++++++++++ .../home/online/VSubmenuOnlineLobby.java | 43 +++++++++++++--- .../java/forge/net/server/FServerManager.java | 7 ++- 4 files changed, 97 insertions(+), 9 deletions(-) create mode 100644 forge-gui-desktop/src/main/java/forge/screens/home/StopButton.java diff --git a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java index 041ed3d4e7a..fcc987405be 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java @@ -131,6 +131,12 @@ public enum FNetOverlay implements IOnlineChatInterface { cmdSend.setCommand(new Runnable() { @Override public void run() { onSend.actionPerformed(null); } }); } + public void reset() { + setGameClient(null); + txtLog.setText(""); + hide(); + } + public void hide() { window.setVisible(false); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/StopButton.java b/forge-gui-desktop/src/main/java/forge/screens/home/StopButton.java new file mode 100644 index 00000000000..882b8377429 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/screens/home/StopButton.java @@ -0,0 +1,50 @@ +package forge.screens.home; + +import forge.assets.FSkinProp; +import forge.toolbox.FSkin; +import forge.toolbox.FSkin.SkinnedButton; + +import javax.swing.*; +import javax.swing.border.Border; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.FocusEvent; +import java.awt.event.FocusListener; + +@SuppressWarnings("serial") +public class StopButton extends SkinnedButton { + public StopButton() { + setOpaque(false); + setContentAreaFilled(false); + setBorder((Border)null); + setBorderPainted(false); + setRolloverEnabled(true); + setRolloverIcon(FSkin.getIcon(FSkinProp.ICO_DELETE_OVER)); + setIcon(FSkin.getIcon(FSkinProp.ICO_DELETE)); + setPressedIcon(FSkin.getIcon(FSkinProp.ICO_DELETE_OVER)); + + addFocusListener(new FocusListener() { + @Override + public void focusLost(FocusEvent arg0) { + setIcon(FSkin.getIcon(FSkinProp.ICO_DELETE)); + } + + @Override + public void focusGained(FocusEvent arg0) { + setIcon(FSkin.getIcon(FSkinProp.ICO_DELETE)); + } + }); + + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + setEnabled(false); + + // ensure the click action can resolve before we allow the button to be clicked again + SwingUtilities.invokeLater(new Runnable() { + @Override public void run() { setEnabled(true); } + }); + } + }); + } +} 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 7d95c67e468..759d36b7bd2 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 @@ -5,6 +5,7 @@ import java.awt.event.ActionListener; import javax.swing.JPanel; +import forge.screens.home.*; import net.miginfocom.swing.MigLayout; import forge.deckchooser.DecksComboBoxEvent; import forge.deckchooser.FDeckChooser; @@ -20,10 +21,6 @@ import forge.match.GameLobby; import forge.net.IOnlineLobby; import forge.net.client.FGameClient; import forge.net.server.FServerManager; -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.FSkin; import forge.util.gui.SOptionPane; @@ -36,6 +33,9 @@ public enum VSubmenuOnlineLobby implements IVSubmenu, IOnli private VLobby lobby; private FGameClient client; + private final JPanel pnlTitle = new JPanel(new MigLayout()); + private final StopButton btnStop = new StopButton(); + private VSubmenuOnlineLobby() { } @@ -45,6 +45,13 @@ public enum VSubmenuOnlineLobby implements IVSubmenu, IOnli return this.lobby; } + public void reset() { + onClosing(null); + this.client = null; + this.lobby = null; + populate(); + } + public void setClient(final FGameClient client) { this.client = client; } @@ -77,7 +84,28 @@ public enum VSubmenuOnlineLobby implements IVSubmenu, IOnli 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"); + pnlTitle.removeAll(); + pnlTitle.setOpaque(false); + pnlTitle.add(lobby.getLblTitle(), "w 95%, h 40px!, gap 0 0 15px 15px, span 2"); + pnlTitle.add(btnStop, "gap 10 10 0 0, align right"); + container.add(pnlTitle,"w 80%, gap 0 0 0 0, al right, pushx"); + + // Stop button event handling + btnStop.addActionListener(new ActionListener() { + @Override + public final void actionPerformed(final ActionEvent arg0) { + Runnable stopGame = new Runnable() { + @Override + public void run() { + // do the STOP needful here + reset(); + } + }; + if (stopGame != null) { + stopGame.run(); + } + } + }); for (final FDeckChooser fdc : lobby.getDeckChoosers()) { fdc.populate(); @@ -156,7 +184,8 @@ public enum VSubmenuOnlineLobby implements IVSubmenu, IOnli final FServerManager server = FServerManager.getInstance(); if (server.isHosting()) { if (SOptionPane.showConfirmDialog("Leave lobby? Doing so will shut down all connections and stop hosting.", "Leave")) { - FServerManager.getInstance().stopServer(); + server.stopServer(); + FNetOverlay.SINGLETON_INSTANCE.reset(); return true; } } else { @@ -165,7 +194,7 @@ public enum VSubmenuOnlineLobby implements IVSubmenu, IOnli client.close(); client = null; } - FNetOverlay.SINGLETON_INSTANCE.setGameClient(null); + FNetOverlay.SINGLETON_INSTANCE.reset(); return true; } } diff --git a/forge-gui/src/main/java/forge/net/server/FServerManager.java b/forge-gui/src/main/java/forge/net/server/FServerManager.java index efb0fbcba53..dd5ae1847db 100644 --- a/forge-gui/src/main/java/forge/net/server/FServerManager.java +++ b/forge-gui/src/main/java/forge/net/server/FServerManager.java @@ -57,8 +57,8 @@ public final class FServerManager { private byte[] externalAddress = new byte[]{8,8,8,8}; private boolean isHosting = false; - private final EventLoopGroup bossGroup = new NioEventLoopGroup(1); - private final EventLoopGroup workerGroup = new NioEventLoopGroup(); + private EventLoopGroup bossGroup = new NioEventLoopGroup(1); + private EventLoopGroup workerGroup = new NioEventLoopGroup(); private UpnpService upnpService = null; private final Map clients = Maps.newTreeMap(); private ServerGameLobby localLobby; @@ -149,6 +149,9 @@ public final class FServerManager { Runtime.getRuntime().removeShutdownHook(shutdownHook); } isHosting = false; + // create new EventLoopGroups for potential restart + bossGroup = new NioEventLoopGroup(1); + workerGroup = new NioEventLoopGroup(); } public boolean isHosting() {