diff --git a/DXMainClient/DXGUI/GameClass.cs b/DXMainClient/DXGUI/GameClass.cs index 98a56753f..6a42e679d 100644 --- a/DXMainClient/DXGUI/GameClass.cs +++ b/DXMainClient/DXGUI/GameClass.cs @@ -230,7 +230,14 @@ private IServiceProvider BuildServiceProvider(WindowManager windowManager) .AddSingletonXnaControl() .AddSingletonXnaControl() .AddSingletonXnaControl() - .AddSingletonXnaControl(); + .AddSingletonXnaControl() + .AddSingletonXnaControl() + .AddSingletonXnaControl() + .AddSingletonXnaControl() + .AddSingletonXnaControl() + .AddSingletonXnaControl() + .AddSingletonXnaControl() + .AddSingletonXnaControl(); // transient xna controls - new instance on each request services diff --git a/DXMainClient/DXGUI/Generic/CampaignSelector.cs b/DXMainClient/DXGUI/Generic/CampaignSelector.cs index 9aae7c6bf..e9aa4cf28 100644 --- a/DXMainClient/DXGUI/Generic/CampaignSelector.cs +++ b/DXMainClient/DXGUI/Generic/CampaignSelector.cs @@ -221,7 +221,7 @@ private void LbCampaignList_SelectedIndexChanged(object sender, EventArgs e) private void BtnCancel_LeftClick(object sender, EventArgs e) { - Enabled = false; + Disable(); } private void BtnLaunch_LeftClick(object sender, EventArgs e) @@ -317,7 +317,7 @@ private void LaunchMission(Mission mission) UserINISettings.Instance.Difficulty.Value = trbDifficultySelector.Value; UserINISettings.Instance.SaveSettings(); - ((MainMenuDarkeningPanel)Parent).Hide(); + Disable(); discordHandler.UpdatePresence(mission.UntranslatedGUIName, difficultyName, mission.IconPath, true); GameProcessLogic.GameProcessExited += GameProcessExited_Callback; diff --git a/DXMainClient/DXGUI/Generic/ExtrasWindow.cs b/DXMainClient/DXGUI/Generic/ExtrasWindow.cs index 6642f0fd0..46984cf11 100644 --- a/DXMainClient/DXGUI/Generic/ExtrasWindow.cs +++ b/DXMainClient/DXGUI/Generic/ExtrasWindow.cs @@ -12,9 +12,11 @@ namespace DTAClient.DXGUI.Generic { public class ExtrasWindow : XNAWindow { - public ExtrasWindow(WindowManager windowManager) : base(windowManager) - { + private StatisticsWindow statisticsWindow; + public ExtrasWindow(WindowManager windowManager, StatisticsWindow statisticsWindow) : base(windowManager) + { + this.statisticsWindow = statisticsWindow; } public override void Initialize() @@ -59,8 +61,8 @@ public override void Initialize() private void BtnExStatistics_LeftClick(object sender, EventArgs e) { - MainMenuDarkeningPanel parent = (MainMenuDarkeningPanel)Parent; - parent.Show(parent.StatisticsWindow); + Disable(); + statisticsWindow.Enable(); } private void BtnExMapEditor_LeftClick(object sender, EventArgs e) @@ -77,7 +79,7 @@ private void BtnExMapEditor_LeftClick(object sender, EventArgs e) mapEditorProcess.Start(); - Enabled = false; + Disable(); } private void BtnExCredits_LeftClick(object sender, EventArgs e) @@ -87,7 +89,7 @@ private void BtnExCredits_LeftClick(object sender, EventArgs e) private void BtnExCancel_LeftClick(object sender, EventArgs e) { - Enabled = false; + Disable(); } } } diff --git a/DXMainClient/DXGUI/Generic/GameLoadingWindow.cs b/DXMainClient/DXGUI/Generic/GameLoadingWindow.cs index c087dd38a..863bccb12 100644 --- a/DXMainClient/DXGUI/Generic/GameLoadingWindow.cs +++ b/DXMainClient/DXGUI/Generic/GameLoadingWindow.cs @@ -98,7 +98,7 @@ private void ListBox_SelectedIndexChanged(object sender, EventArgs e) private void BtnCancel_LeftClick(object sender, EventArgs e) { - Enabled = false; + Disable(); } private void BtnLaunch_LeftClick(object sender, EventArgs e) @@ -136,7 +136,7 @@ private void BtnLaunch_LeftClick(object sender, EventArgs e) discordHandler.UpdatePresence(sg.GUIName, true); - Enabled = false; + Disable(); GameProcessLogic.GameProcessExited += GameProcessExited_Callback; GameProcessLogic.StartGameProcess(WindowManager); diff --git a/DXMainClient/DXGUI/Generic/MainMenu.cs b/DXMainClient/DXGUI/Generic/MainMenu.cs index de441abf9..4e6d77c9b 100644 --- a/DXMainClient/DXGUI/Generic/MainMenu.cs +++ b/DXMainClient/DXGUI/Generic/MainMenu.cs @@ -51,7 +51,14 @@ public MainMenu( PrivateMessagingPanel privateMessagingPanel, PrivateMessagingWindow privateMessagingWindow, GameInProgressWindow gameInProgressWindow, - MapLoader mapLoader + MapLoader mapLoader, + CampaignSelector campaignSelector, + GameLoadingWindow gameLoadingWindow, + StatisticsWindow statisticsWindow, + UpdateQueryWindow updateQueryWindow, + ManualUpdateQueryWindow manualUpdateQueryWindow, + UpdateWindow updateWindow, + ExtrasWindow extrasWindow ) : base(windowManager) { this.lanLobby = lanLobby; @@ -67,12 +74,18 @@ MapLoader mapLoader this.privateMessagingWindow = privateMessagingWindow; this.gameInProgressWindow = gameInProgressWindow; this.mapLoader = mapLoader; + this.campaignSelector = campaignSelector; + this.gameLoadingWindow = gameLoadingWindow; + this.statisticsWindow = statisticsWindow; + this.updateQueryWindow = updateQueryWindow; + this.manualUpdateQueryWindow = manualUpdateQueryWindow; + this.updateWindow = updateWindow; + this.extrasWindow = extrasWindow; + this.cncnetLobby.UpdateCheck += CncnetLobby_UpdateCheck; isMediaPlayerAvailable = IsMediaPlayerAvailable(); } - private MainMenuDarkeningPanel innerPanel; - private XNALabel lblCnCNetPlayerCount; private XNALinkLabel lblUpdateStatus; private XNALinkLabel lblVersion; @@ -96,6 +109,13 @@ MapLoader mapLoader private readonly PrivateMessagingWindow privateMessagingWindow; private readonly GameInProgressWindow gameInProgressWindow; private readonly MapLoader mapLoader; + private readonly CampaignSelector campaignSelector; + private readonly GameLoadingWindow gameLoadingWindow; + private readonly StatisticsWindow statisticsWindow; + private readonly UpdateQueryWindow updateQueryWindow; + private readonly ManualUpdateQueryWindow manualUpdateQueryWindow; + private readonly UpdateWindow updateWindow; + private readonly ExtrasWindow extrasWindow; private XNAMessageBox firstRunMessageBox; @@ -274,31 +294,19 @@ public override void Initialize() base.Initialize(); // Read control attributes from INI - innerPanel = new MainMenuDarkeningPanel(WindowManager, discordHandler, mapLoader); - innerPanel.ClientRectangle = new Rectangle(0, 0, - Width, - Height); - innerPanel.DrawOrder = int.MaxValue; - innerPanel.UpdateOrder = int.MaxValue; - AddChild(innerPanel); - innerPanel.Hide(); - lblVersion.Text = Updater.GameVersion; - innerPanel.UpdateQueryWindow.UpdateDeclined += UpdateQueryWindow_UpdateDeclined; - innerPanel.UpdateQueryWindow.UpdateAccepted += UpdateQueryWindow_UpdateAccepted; - innerPanel.ManualUpdateQueryWindow.Closed += ManualUpdateQueryWindow_Closed; + updateQueryWindow.UpdateDeclined += UpdateQueryWindow_UpdateDeclined; + updateQueryWindow.UpdateAccepted += UpdateQueryWindow_UpdateAccepted; + manualUpdateQueryWindow.Closed += ManualUpdateQueryWindow_Closed; - innerPanel.UpdateWindow.UpdateCompleted += UpdateWindow_UpdateCompleted; - innerPanel.UpdateWindow.UpdateCancelled += UpdateWindow_UpdateCancelled; - innerPanel.UpdateWindow.UpdateFailed += UpdateWindow_UpdateFailed; + updateWindow.UpdateCompleted += UpdateWindow_UpdateCompleted; + updateWindow.UpdateCancelled += UpdateWindow_UpdateCancelled; + updateWindow.UpdateFailed += UpdateWindow_UpdateFailed; ClientRectangle = new Rectangle((WindowManager.RenderResolutionX - Width) / 2, (WindowManager.RenderResolutionY - Height) / 2, Width, Height); - innerPanel.ClientRectangle = new Rectangle(0, 0, - Math.Max(WindowManager.RenderResolutionX, Width), - Math.Max(WindowManager.RenderResolutionY, Height)); CnCNetPlayerCountTask.CnCNetGameCountUpdated += CnCNetInfoController_CnCNetGameCountUpdated; cncnetPlayerCountCancellationSource = new CancellationTokenSource(); @@ -553,11 +561,23 @@ private void Clean() /// public void PostInit() { - DarkeningPanel.AddAndInitializeWithControl(WindowManager, skirmishLobby); - DarkeningPanel.AddAndInitializeWithControl(WindowManager, cnCNetGameLoadingLobby); - DarkeningPanel.AddAndInitializeWithControl(WindowManager, cnCNetGameLobby); - DarkeningPanel.AddAndInitializeWithControl(WindowManager, cncnetLobby); - DarkeningPanel.AddAndInitializeWithControl(WindowManager, lanLobby); + foreach (XNAControl control in new XNAControl[] + { + skirmishLobby, + cnCNetGameLoadingLobby, + cnCNetGameLobby, + cncnetLobby, + lanLobby, + campaignSelector, + gameLoadingWindow, + statisticsWindow, + updateQueryWindow, + manualUpdateQueryWindow, + updateWindow, + extrasWindow, + }) + DarkeningPanel.AddAndInitializeWithControl(WindowManager, control); + optionsWindow.SetTopBar(topBar); DarkeningPanel.AddAndInitializeWithControl(WindowManager, optionsWindow); WindowManager.AddAndInitializeControl(privateMessagingPanel); @@ -566,13 +586,26 @@ public void PostInit() topBar.SetOptionsWindow(optionsWindow); WindowManager.AddAndInitializeControl(gameInProgressWindow); - skirmishLobby.Disable(); - cncnetLobby.Disable(); - cnCNetGameLobby.Disable(); - cnCNetGameLoadingLobby.Disable(); - lanLobby.Disable(); - privateMessagingWindow.Disable(); - optionsWindow.Disable(); + foreach (XNAControl control in new XNAControl[] + { + skirmishLobby, + cnCNetGameLoadingLobby, + cnCNetGameLobby, + cncnetLobby, + lanLobby, + + privateMessagingWindow, + optionsWindow, + + campaignSelector, + gameLoadingWindow, + statisticsWindow, + updateQueryWindow, + manualUpdateQueryWindow, + updateWindow, + extrasWindow, + }) + control.Disable(); WindowManager.AddAndInitializeControl(topBar); topBar.AddPrimarySwitchable(this); @@ -636,28 +669,26 @@ private void SwitchMainMenuMusicFormat() private void UpdateWindow_UpdateFailed(object sender, UpdateFailureEventArgs e) { - innerPanel.Hide(); + updateWindow.Disable(); lblUpdateStatus.Text = "Updating failed! Click to retry.".L10N("Client:Main:UpdateFailedClickToRetry"); lblUpdateStatus.DrawUnderline = true; lblUpdateStatus.Enabled = true; UpdateInProgress = false; - innerPanel.Show(null); // Darkening + // TODO Enable a dummy Window from DarkeningPanel XNAMessageBox msgBox = new XNAMessageBox(WindowManager, "Update failed".L10N("Client:Main:UpdateFailedTitle"), string.Format(("An error occured while updating. Returned error was: {0}\n\nIf you are connected to the Internet and your firewall isn't blocking\n{1}, and the issue is reproducible, contact us at\n{2} for support.").L10N("Client:Main:UpdateFailedText"), e.Reason, Path.GetFileName(ProgramConstants.StartupExecutable), MainClientConstants.SUPPORT_URL_SHORT), XNAMessageBoxButtons.OK); - msgBox.OKClickedAction = MsgBox_OKClicked; + msgBox.OKClickedAction = (XNAMessageBox messageBox) => + { + // TODO Disable the dummy Window from DarkeningPanel + }; msgBox.Show(); } - private void MsgBox_OKClicked(XNAMessageBox messageBox) - { - innerPanel.Hide(); - } - private void UpdateWindow_UpdateCancelled(object sender, EventArgs e) { - innerPanel.Hide(); + updateWindow.Disable(); lblUpdateStatus.Text = "The update was cancelled. Click to retry.".L10N("Client:Main:UpdateCancelledClickToRetry"); lblUpdateStatus.DrawUnderline = true; lblUpdateStatus.Enabled = true; @@ -666,7 +697,7 @@ private void UpdateWindow_UpdateCancelled(object sender, EventArgs e) private void UpdateWindow_UpdateCompleted(object sender, EventArgs e) { - innerPanel.Hide(); + updateWindow.Disable(); lblUpdateStatus.Text = string.Format("{0} was succesfully updated to v.{1}".L10N("Client:Main:UpdateSuccess"), MainClientConstants.GAME_NAME_SHORT, Updater.GameVersion); lblVersion.Text = Updater.GameVersion; @@ -696,9 +727,9 @@ private void LblVersion_LeftClick(object sender, EventArgs e) private void ForceUpdate() { UpdateInProgress = true; - innerPanel.Hide(); - innerPanel.UpdateWindow.ForceUpdate(); - innerPanel.Show(innerPanel.UpdateWindow); + optionsWindow.Disable(); + updateWindow.ForceUpdate(); + updateWindow.Enable(); lblUpdateStatus.Text = "Force updating...".L10N("Client:Main:ForceUpdating"); } @@ -741,16 +772,16 @@ private void HandleFileIdentifierUpdate() lblUpdateStatus.Text = "An update is available. Manual download & installation required.".L10N("Client:Main:UpdateAvailableManualDownloadRequired"); lblUpdateStatus.Enabled = true; lblUpdateStatus.DrawUnderline = false; - innerPanel.ManualUpdateQueryWindow.SetInfo(Updater.ServerGameVersion, Updater.ManualDownloadURL); + manualUpdateQueryWindow.SetInfo(Updater.ServerGameVersion, Updater.ManualDownloadURL); if (!string.IsNullOrEmpty(Updater.ManualDownloadURL)) - innerPanel.Show(innerPanel.ManualUpdateQueryWindow); + manualUpdateQueryWindow.Enable(); } else if (Updater.VersionState == VersionState.OUTDATED) { lblUpdateStatus.Text = "An update is available.".L10N("Client:Main:UpdateAvailable"); - innerPanel.UpdateQueryWindow.SetInfo(Updater.ServerGameVersion, Updater.UpdateSizeInKb); - innerPanel.Show(innerPanel.UpdateQueryWindow); + updateQueryWindow.SetInfo(Updater.ServerGameVersion, Updater.UpdateSizeInKb); + updateQueryWindow.Enable(); } else if (Updater.VersionState == VersionState.UNKNOWN) { @@ -767,7 +798,7 @@ private void HandleFileIdentifierUpdate() /// private void Updater_OnCustomComponentsOutdated() { - if (innerPanel.UpdateQueryWindow.Visible) + if (updateQueryWindow.Visible) return; if (UpdateInProgress) @@ -800,8 +831,7 @@ private void CCMsgBox_YesClicked(XNAMessageBox messageBox) /// private void UpdateQueryWindow_UpdateDeclined(object sender, EventArgs e) { - UpdateQueryWindow uqw = (UpdateQueryWindow)sender; - innerPanel.Hide(); + updateQueryWindow.Disable(); lblUpdateStatus.Text = "An update is available, click to install.".L10N("Client:Main:UpdateAvailableClickToInstall"); lblUpdateStatus.Enabled = true; lblUpdateStatus.DrawUnderline = true; @@ -812,16 +842,16 @@ private void UpdateQueryWindow_UpdateDeclined(object sender, EventArgs e) /// private void UpdateQueryWindow_UpdateAccepted(object sender, EventArgs e) { - innerPanel.Hide(); - innerPanel.UpdateWindow.SetData(Updater.ServerGameVersion); - innerPanel.Show(innerPanel.UpdateWindow); + updateQueryWindow.Disable(); + updateWindow.SetData(Updater.ServerGameVersion); + updateWindow.Enable(); lblUpdateStatus.Text = "Updating...".L10N("Client:Main:Updating"); UpdateInProgress = true; Updater.StartUpdate(); } private void ManualUpdateQueryWindow_Closed(object sender, EventArgs e) - => innerPanel.Hide(); + => updateQueryWindow.Enable(); #endregion @@ -829,10 +859,10 @@ private void BtnOptions_LeftClick(object sender, EventArgs e) => optionsWindow.Open(); private void BtnNewCampaign_LeftClick(object sender, EventArgs e) - => innerPanel.Show(innerPanel.CampaignSelector); + => campaignSelector.Enable(); private void BtnLoadGame_LeftClick(object sender, EventArgs e) - => innerPanel.Show(innerPanel.GameLoadingWindow); + => gameLoadingWindow.Enable(); private void BtnLan_LeftClick(object sender, EventArgs e) { @@ -860,7 +890,7 @@ private void BtnSkirmish_LeftClick(object sender, EventArgs e) private void BtnMapEditor_LeftClick(object sender, EventArgs e) => LaunchMapEditor(); private void BtnStatistics_LeftClick(object sender, EventArgs e) => - innerPanel.Show(innerPanel.StatisticsWindow); + statisticsWindow.Enable(); private void BtnCredits_LeftClick(object sender, EventArgs e) { @@ -868,7 +898,7 @@ private void BtnCredits_LeftClick(object sender, EventArgs e) } private void BtnExtras_LeftClick(object sender, EventArgs e) => - innerPanel.Show(innerPanel.ExtrasWindow); + extrasWindow.Enable(); private void BtnExit_LeftClick(object sender, EventArgs e) { @@ -883,8 +913,9 @@ private void SharedUILogic_GameProcessExited() => private void HandleGameProcessExited() { - innerPanel.GameLoadingWindow.ListSaves(); - innerPanel.Hide(); + gameLoadingWindow.ListSaves(); + gameLoadingWindow.Disable(); + gameInProgressWindow.Disable(); // If music is disabled on menus, check if the main menu is the top-most // window of the top bar and only play music if it is diff --git a/DXMainClient/DXGUI/Generic/MainMenuDarkeningPanel.cs b/DXMainClient/DXGUI/Generic/MainMenuDarkeningPanel.cs deleted file mode 100644 index 6b65f0a3a..000000000 --- a/DXMainClient/DXGUI/Generic/MainMenuDarkeningPanel.cs +++ /dev/null @@ -1,137 +0,0 @@ -using ClientGUI; -using DTAClient.Domain; -using DTAClient.Domain.Multiplayer; -using Microsoft.Xna.Framework; -using Rampastring.XNAUI; -using Rampastring.XNAUI.XNAControls; -using System; - -namespace DTAClient.DXGUI.Generic -{ - /// - /// TODO Replace this class with DarkeningPanels. - /// Handles transitions between the main menu and its sub-menus. - /// - public class MainMenuDarkeningPanel : XNAPanel - { - public MainMenuDarkeningPanel(WindowManager windowManager, DiscordHandler discordHandler, MapLoader mapLoader) - : base(windowManager) - { - this.discordHandler = discordHandler; - this.mapLoader = mapLoader; - DrawBorders = false; - DrawMode = ControlDrawMode.UNIQUE_RENDER_TARGET; - } - - private DiscordHandler discordHandler; - private MapLoader mapLoader; - - public CampaignSelector CampaignSelector; - public GameLoadingWindow GameLoadingWindow; - public StatisticsWindow StatisticsWindow; - public UpdateQueryWindow UpdateQueryWindow; - public ManualUpdateQueryWindow ManualUpdateQueryWindow; - public UpdateWindow UpdateWindow; - public ExtrasWindow ExtrasWindow; - - public override void Initialize() - { - base.Initialize(); - - Name = "DarkeningPanel"; - BorderColor = UISettings.ActiveSettings.PanelBorderColor; - BackgroundTexture = AssetLoader.CreateTexture(new Color(0, 0, 0, 128), 1, 1); - PanelBackgroundDrawMode = PanelBackgroundImageDrawMode.STRETCHED; - Alpha = 1.0f; - - CampaignSelector = new CampaignSelector(WindowManager, discordHandler); - AddChild(CampaignSelector); - - GameLoadingWindow = new GameLoadingWindow(WindowManager, discordHandler); - AddChild(GameLoadingWindow); - - StatisticsWindow = new StatisticsWindow(WindowManager, mapLoader); - AddChild(StatisticsWindow); - - UpdateQueryWindow = new UpdateQueryWindow(WindowManager); - AddChild(UpdateQueryWindow); - - ManualUpdateQueryWindow = new ManualUpdateQueryWindow(WindowManager); - AddChild(ManualUpdateQueryWindow); - - UpdateWindow = new UpdateWindow(WindowManager); - AddChild(UpdateWindow); - - ExtrasWindow = new ExtrasWindow(WindowManager); - AddChild(ExtrasWindow); - - foreach (XNAControl child in Children) - { - child.Visible = false; - child.Enabled = false; - child.EnabledChanged += Child_EnabledChanged; - } - } - - private void Child_EnabledChanged(object sender, EventArgs e) - { - XNAWindow child = (XNAWindow)sender; - if (!child.Enabled) - Hide(); - } - - public void Show(XNAControl control) - { - foreach (XNAControl child in Children) - { - child.Enabled = false; - child.Visible = false; - } - - Enabled = true; - Visible = true; - - AlphaRate = DarkeningPanel.ALPHA_RATE; - - if (control != null) - { - control.Enabled = true; - control.Visible = true; - control.IgnoreInputOnFrame = true; - } - } - - public void Hide() - { - AlphaRate = -DarkeningPanel.ALPHA_RATE; - - foreach (XNAControl child in Children) - { - child.Enabled = false; - child.Visible = false; - } - } - - public override void Update(GameTime gameTime) - { - base.Update(gameTime); - - if (Alpha <= 0f) - { - Enabled = false; - Visible = false; - - foreach (XNAControl child in Children) - { - child.Visible = false; - } - } - } - - public override void Draw(GameTime gameTime) - { - DrawTexture(BackgroundTexture, Point.Zero, Color.White); - base.Draw(gameTime); - } - } -} diff --git a/DXMainClient/DXGUI/Generic/StatisticsWindow.cs b/DXMainClient/DXGUI/Generic/StatisticsWindow.cs index 88abe541d..391b37f17 100644 --- a/DXMainClient/DXGUI/Generic/StatisticsWindow.cs +++ b/DXMainClient/DXGUI/Generic/StatisticsWindow.cs @@ -1009,9 +1009,7 @@ private void ClearAllStatistics() private void BtnReturnToMenu_LeftClick(object sender, EventArgs e) { - // To hide the control, just set Enabled=false - // and MainMenuDarkeningPanel will deal with the rest - Enabled = false; + Disable(); } private void BtnClearStatistics_LeftClick(object sender, EventArgs e)