using Bloxstrap.Helpers; using Bloxstrap.Helpers.RSMM; namespace Bloxstrap.Dialogs.BootstrapperStyles { // TODO - universal implementation for winforms-based styles? (to reduce duplicate code) public partial class ProgressDialogStyle : Form { private Bootstrapper? Bootstrapper; public ProgressDialogStyle(Bootstrapper? bootstrapper = null) { InitializeComponent(); Bootstrapper = bootstrapper; this.Text = Program.ProjectName; this.Icon = IconManager.GetIconResource(); this.IconBox.BackgroundImage = IconManager.GetBitmapResource(); if (Bootstrapper is null) { this.Message.Text = "Click the Cancel button to return to preferences"; this.CancelButton.Enabled = true; this.CancelButton.Visible = true; } else { Bootstrapper.PromptShutdownEvent += new EventHandler(PromptShutdown); Bootstrapper.ShowSuccessEvent += new ChangeEventHandler(ShowSuccess); Bootstrapper.MessageChanged += new ChangeEventHandler(MessageChanged); Bootstrapper.ProgressBarValueChanged += new ChangeEventHandler(ProgressBarValueChanged); Bootstrapper.ProgressBarStyleChanged += new ChangeEventHandler(ProgressBarStyleChanged); Bootstrapper.CancelEnabledChanged += new ChangeEventHandler(CancelEnabledChanged); Task.Run(() => RunBootstrapper()); } } public async void RunBootstrapper() { try { await Bootstrapper.Run(); } catch (Exception ex) { // string message = String.Format("{0}: {1}", ex.GetType(), ex.Message); string message = ex.ToString(); ShowError(message); Program.Exit(); } } private void ShowError(string message) { MessageBox.Show( $"An error occurred while starting Roblox\n\nDetails: {message}", Program.ProjectName, MessageBoxButtons.OK, MessageBoxIcon.Error ); } private void ShowSuccess(object sender, ChangeEventArgs e) { MessageBox.Show( e.Value, Program.ProjectName, MessageBoxButtons.OK, MessageBoxIcon.Information ); } private void PromptShutdown(object? sender, EventArgs e) { DialogResult result = MessageBox.Show( "Roblox is currently running, but needs to close. Would you like close Roblox now?", Program.ProjectName, MessageBoxButtons.OKCancel, MessageBoxIcon.Information ); if (result != DialogResult.OK) Environment.Exit(0); } private void MessageChanged(object sender, ChangeEventArgs e) { if (this.InvokeRequired) { ChangeEventHandler handler = new(MessageChanged); this.Message.Invoke(handler, sender, e); } else { this.Message.Text = e.Value; } } private void ProgressBarValueChanged(object sender, ChangeEventArgs e) { if (this.ProgressBar.InvokeRequired) { ChangeEventHandler handler = new(ProgressBarValueChanged); this.ProgressBar.Invoke(handler, sender, e); } else { this.ProgressBar.Value = e.Value; } } private void ProgressBarStyleChanged(object sender, ChangeEventArgs e) { if (this.ProgressBar.InvokeRequired) { ChangeEventHandler handler = new(ProgressBarStyleChanged); this.ProgressBar.Invoke(handler, sender, e); } else { this.ProgressBar.Style = e.Value; } } private void CancelEnabledChanged(object sender, ChangeEventArgs e) { if (this.CancelButton.InvokeRequired) { ChangeEventHandler handler = new(CancelEnabledChanged); this.CancelButton.Invoke(handler, sender, e); } else { this.CancelButton.Enabled = e.Value; this.CancelButton.Visible = e.Value; } } private void CancelButton_Click(object sender, EventArgs e) { if (Bootstrapper is null) this.Close(); else Task.Run(() => Bootstrapper.CancelButtonClicked()); } private void CancelButton_MouseEnter(object sender, EventArgs e) { this.CancelButton.Image = Properties.Resources.CancelButtonHover; } private void CancelButton_MouseLeave(object sender, EventArgs e) { this.CancelButton.Image = Properties.Resources.CancelButton; } } }