From 04f86865f7fb2bb2520c07fbf492391697c9e31c Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 18 Feb 2017 15:58:46 +0200 Subject: [PATCH] Changed GUIMessageBox.MessageBoxes from a queue to a list to make it easier to remove messageboxes that aren't currently visible, fixed clients creating multiple "permissions changed" messageboxes if there's another messagebox on the screen --- Launcher2/LauncherMain.cs | 22 +++++---------- Subsurface/Source/GUI/GUI.cs | 27 +++++++------------ Subsurface/Source/GUI/GUIMessageBox.cs | 8 +++--- .../GameSession/GameModes/SinglePlayerMode.cs | 6 ++--- Subsurface/Source/GameSession/GameSession.cs | 4 +-- Subsurface/Source/Networking/GameClient.cs | 9 +------ Subsurface/Source/Screens/NetLobbyScreen.cs | 2 +- 7 files changed, 27 insertions(+), 51 deletions(-) diff --git a/Launcher2/LauncherMain.cs b/Launcher2/LauncherMain.cs index ea862f64d..d7be4e78c 100644 --- a/Launcher2/LauncherMain.cs +++ b/Launcher2/LauncherMain.cs @@ -191,16 +191,12 @@ namespace Launcher2 PlayerInput.Update(deltaTime); - if (GUIMessageBox.MessageBoxes.Count > 0) + if (GUIMessageBox.VisibleBox != null) { - var messageBox = GUIMessageBox.MessageBoxes.Peek(); - if (messageBox != null) - { - GUIComponent.ForceMouseOn(messageBox); - messageBox.Update(deltaTime); - return; - } - } + GUIComponent.ForceMouseOn(GUIMessageBox.VisibleBox); + GUIMessageBox.VisibleBox.Update(deltaTime); + return; + } GUIComponent.ClearUpdateList(); guiRoot.AddToGUIUpdateList(); @@ -223,12 +219,8 @@ namespace Launcher2 spriteBatch.Draw(titleTexture, new Vector2(40.0f, 20.0f), null, Color.White, 0.0f, Vector2.Zero, new Vector2(0.2f, 0.2f), SpriteEffects.None, 0.0f); guiRoot.Draw(spriteBatch); - - if (GUIMessageBox.MessageBoxes.Count > 0) - { - var messageBox = GUIMessageBox.MessageBoxes.Peek(); - if (messageBox != null) messageBox.Draw(spriteBatch); - } + + if (GUIMessageBox.VisibleBox != null) GUIMessageBox.VisibleBox.Draw(spriteBatch); spriteBatch.End(); } diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 18723768d..5ecf2827c 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -480,11 +480,10 @@ namespace Barotrauma DrawMessages(spriteBatch, (float)deltaTime); - if (GUIMessageBox.MessageBoxes.Count>0) + if (GUIMessageBox.VisibleBox != null) { - var messageBox = GUIMessageBox.MessageBoxes.Peek(); - if (messageBox != null) messageBox.Draw(spriteBatch); - } + GUIMessageBox.VisibleBox.Draw(spriteBatch); + } if (pauseMenuOpen) { @@ -516,14 +515,10 @@ namespace Barotrauma GameMain.Config.SettingsFrame.AddToGUIUpdateList(); } - if (GUIMessageBox.MessageBoxes.Count > 0) + if (GUIMessageBox.VisibleBox != null) { - var messageBox = GUIMessageBox.MessageBoxes.Peek(); - if (messageBox != null) - { - messageBox.AddToGUIUpdateList(); - } - } + GUIMessageBox.VisibleBox.AddToGUIUpdateList(); + } } public static void Update(float deltaTime) @@ -538,14 +533,10 @@ namespace Barotrauma GameMain.Config.SettingsFrame.Update(deltaTime); } - if (GUIMessageBox.MessageBoxes.Count > 0) + if (GUIMessageBox.VisibleBox != null) { - var messageBox = GUIMessageBox.MessageBoxes.Peek(); - if (messageBox != null) - { - messageBox.Update(deltaTime); - } - } + GUIMessageBox.VisibleBox.Update(deltaTime); + } } public static void AddMessage(string message, Color color, float lifeTime = 3.0f, bool playSound = true) diff --git a/Subsurface/Source/GUI/GUIMessageBox.cs b/Subsurface/Source/GUI/GUIMessageBox.cs index 3546b5766..64eae3a3a 100644 --- a/Subsurface/Source/GUI/GUIMessageBox.cs +++ b/Subsurface/Source/GUI/GUIMessageBox.cs @@ -5,7 +5,7 @@ namespace Barotrauma { public class GUIMessageBox : GUIFrame { - public static Queue MessageBoxes = new Queue(); + public static List MessageBoxes = new List(); const int DefaultWidth=400, DefaultHeight=250; @@ -17,7 +17,7 @@ namespace Barotrauma public static GUIComponent VisibleBox { - get { return MessageBoxes.Count==0 ? null : MessageBoxes.Peek(); } + get { return MessageBoxes.Count == 0 ? null : MessageBoxes[0]; } } public string Text @@ -60,7 +60,7 @@ namespace Barotrauma x += this.Buttons[i].Rect.Width + 20; } - MessageBoxes.Enqueue(this); + MessageBoxes.Add(this); } @@ -68,7 +68,7 @@ namespace Barotrauma public bool Close(GUIButton button, object obj) { if (parent != null) parent.RemoveChild(this); - if (MessageBoxes.Contains(this)) MessageBoxes.Dequeue(); + if (MessageBoxes.Contains(this)) MessageBoxes.Remove(this); return true; } diff --git a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index b543446d8..245bcc0d7 100644 --- a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -294,7 +294,7 @@ namespace Barotrauma if (!success) { - var summaryScreen = GUIMessageBox.MessageBoxes.Peek(); + var summaryScreen = GUIMessageBox.VisibleBox; if (summaryScreen != null) { @@ -303,11 +303,11 @@ namespace Barotrauma var okButton = new GUIButton(new Rectangle(-120, 0, 100, 30), "Load game", Alignment.BottomRight, GUI.Style, summaryScreen); okButton.OnClicked += GameMain.GameSession.LoadPrevious; - okButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Dequeue(); return true; }; + okButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Remove(GUIMessageBox.VisibleBox); return true; }; var quitButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Quit", Alignment.BottomRight, GUI.Style, summaryScreen); quitButton.OnClicked += GameMain.LobbyScreen.QuitToMainMenu; - quitButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Dequeue(); return true; }; + quitButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Remove(GUIMessageBox.VisibleBox); return true; }; } } diff --git a/Subsurface/Source/GameSession/GameSession.cs b/Subsurface/Source/GameSession/GameSession.cs index 47a1bc900..cf5772361 100644 --- a/Subsurface/Source/GameSession/GameSession.cs +++ b/Subsurface/Source/GameSession/GameSession.cs @@ -246,9 +246,9 @@ namespace Barotrauma if (shiftSummary != null) { GUIFrame summaryFrame = shiftSummary.CreateSummaryFrame(endMessage); - GUIMessageBox.MessageBoxes.Enqueue(summaryFrame); + GUIMessageBox.MessageBoxes.Add(summaryFrame); var okButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Ok", Alignment.BottomRight, GUI.Style, summaryFrame.children[0]); - okButton.OnClicked = (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Dequeue(); return true; }; + okButton.OnClicked = (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Remove(summaryFrame); return true; }; } TaskManager.EndShift(); diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index f69744e7b..5f7e790be 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -587,14 +587,7 @@ namespace Barotrauma.Networking private void SetPermissions(ClientPermissions newPermissions) { - if (GUIMessageBox.MessageBoxes.Count > 0) - { - var existingMsgBox = GUIMessageBox.MessageBoxes.Peek(); - if (existingMsgBox.UserData as string == "permissions") - { - GUIMessageBox.MessageBoxes.Dequeue(); - } - } + GUIMessageBox.MessageBoxes.RemoveAll(mb => mb.UserData as string == "permissions"); string msg = ""; if (newPermissions == ClientPermissions.None) diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 67887f04b..197a253e3 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -1226,7 +1226,7 @@ namespace Barotrauma if (GUIMessageBox.MessageBoxes.Count>0) { - var currentMessageBox = GUIMessageBox.MessageBoxes.Peek(); + var currentMessageBox = GUIMessageBox.VisibleBox; if (currentMessageBox != null && currentMessageBox.UserData as string == subName) { return false;