diff --git a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Events.cs b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Events.cs index af95fb4..0b6fb79 100644 --- a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Events.cs +++ b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Events.cs @@ -14,6 +14,8 @@ using System.Threading.Tasks; namespace AM2RLauncher { + //TODO: comment a bunch of this stuf for readability + /// /// Methods for UI Events that get triggered go in here /// @@ -54,7 +56,7 @@ namespace AM2RLauncher log.Error("Druid PatchData corruption occurred!"); await Application.Instance.InvokeAsync(() => { - MessageBox.Show(Text.CorruptPatchData, Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, Text.CorruptPatchData, Text.ErrorWindowTitle, MessageBoxType.Error); }); HelperMethods.DeleteDirectory(CrossPlatformOperations.CURRENTPATH + "/PatchData"); return; @@ -63,7 +65,7 @@ namespace AM2RLauncher catch (UserCancelledException ex) { log.Info(ex.Message); - MessageBox.Show(Text.CorruptPatchData, Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, Text.CorruptPatchData, Text.ErrorWindowTitle, MessageBoxType.Error); HelperMethods.DeleteDirectory(CrossPlatformOperations.CURRENTPATH + "/PatchData"); } catch (LibGit2SharpException ex) // This is for any exceptions from libgit @@ -75,19 +77,19 @@ namespace AM2RLauncher if (!(bool)autoUpdateAM2RCheck.Checked) { log.Error("Internet connection failed while attempting to pull repository" + currentMirror + "!"); - MessageBox.Show(Text.InternetConnectionDrop, Text.WarningWindowTitle, MessageBoxType.Warning); + MessageBox.Show(this, Text.InternetConnectionDrop, Text.WarningWindowTitle, MessageBoxType.Warning); } } else { log.Error(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace); - MessageBox.Show(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); } } catch (Exception ex) // This is if somehow any other exception might get thrown as well. { log.Error(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace); - MessageBox.Show(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); } finally { @@ -171,12 +173,12 @@ namespace AM2RLauncher ex.Message.ToLower().Contains("failed to resolve address")) { log.Error("Internet connection dropped while attempting to clone repository" + currentMirror + "!"); - MessageBox.Show(Text.InternetConnectionDrop, Text.WarningWindowTitle, MessageBoxType.Warning); + MessageBox.Show(this, Text.InternetConnectionDrop, Text.WarningWindowTitle, MessageBoxType.Warning); } else { log.Error("LibGit2SharpException: " + ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace); - MessageBox.Show(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); if (Directory.Exists(CrossPlatformOperations.CURRENTPATH + "/PatchData")) HelperMethods.DeleteDirectory(CrossPlatformOperations.CURRENTPATH + "/PatchData"); } @@ -185,7 +187,7 @@ namespace AM2RLauncher catch (Exception ex) // This is if somehow any other exception might get thrown as well. { log.Error(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace); - MessageBox.Show(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); if (Directory.Exists(CrossPlatformOperations.CURRENTPATH + " / PatchData")) HelperMethods.DeleteDirectory(CrossPlatformOperations.CURRENTPATH + "/PatchData"); @@ -217,14 +219,13 @@ namespace AM2RLauncher #region Downloading case UpdateState.Downloading: - var result = MessageBox.Show(Text.CloseOnCloningText, Text.WarningWindowTitle, MessageBoxButtons.YesNo, MessageBoxType.Warning, MessageBoxDefaultButton.No); - if (result == DialogResult.No) + var result = MessageBox.Show(this, Text.CloseOnCloningText, Text.WarningWindowTitle, MessageBoxButtons.YesNo, MessageBoxType.Warning, MessageBoxDefaultButton.No); + if (result != DialogResult.Yes) return; - else - { - log.Info("User cancelled download!"); - isGitProcessGettingCancelled = true; - } + + log.Info("User cancelled download!"); + isGitProcessGettingCancelled = true; + // We don't need to delete any folders here, the cancelled gitClone will do that automatically for us :) // But we should probably wait a bit before proceeding, since cleanup can take a while Thread.Sleep(1000); @@ -238,14 +239,7 @@ namespace AM2RLauncher log.Info("Requesting user input for AM2R_11.zip..."); - OpenFileDialog fileFinder = new OpenFileDialog - { - Directory = new Uri(CrossPlatformOperations.CURRENTPATH), - MultiSelect = false, - Title = Text.Select11FileDialog - }; - - fileFinder.Filters.Add(new FileFilter(Text.ZipArchiveText, ".zip")); + OpenFileDialog fileFinder = GetSingleZipDialog(Text.Select11FileDialog); if (fileFinder.ShowDialog(this) != DialogResult.Ok) { @@ -253,41 +247,34 @@ namespace AM2RLauncher return; } - if (!String.IsNullOrWhiteSpace(fileFinder.FileName)) // This is default + // Default filename is whitespace + if (String.IsNullOrWhiteSpace(fileFinder.FileName)) { - if (Directory.Exists(fileFinder.FileName)) - { - // This can happen on linux, and maybe windows as well - log.Error("User selected a Directory. Cancelling import."); - return; - } - - IsZipAM2R11ReturnCodes errorCode = Profile.CheckIfZipIsAM2R11(fileFinder.FileName); - if (errorCode != IsZipAM2R11ReturnCodes.Successful) - { - log.Error("User tried to input invalid AM2R_11.zip file (" + errorCode + "). Cancelling import."); - MessageBox.Show(Text.ZipIsNotAM2R11 + "\n\nError Code: " + errorCode, Text.ErrorWindowTitle, MessageBoxType.Error); - return; - } - - // If either a directory was selected or the file somehow went missing, cancel - if (!File.Exists(fileFinder.FileName)) - { - log.Error("Selected AM2R_11.zip file not found! Cancelling import."); - break; - } - - // We check if it exists first, because someone coughDRUIDcough might've copied it into here while on the showDialog - if (!File.Exists(CrossPlatformOperations.CURRENTPATH + "/AM2R_11.zip")) - File.Copy(fileFinder.FileName, CrossPlatformOperations.CURRENTPATH + "/AM2R_11.zip"); + log.Error("User did not supply valid input. Cancelling import."); + return; + } - log.Info("AM2R_11.zip successfully imported."); + // If either a directory was selected or the file somehow went missing, cancel + if (!File.Exists(fileFinder.FileName)) + { + log.Error("Selected AM2R_11.zip file not found! Cancelling import."); + break; } - else + + IsZipAM2R11ReturnCodes errorCode = Profile.CheckIfZipIsAM2R11(fileFinder.FileName); + if (errorCode != IsZipAM2R11ReturnCodes.Successful) { - log.Error("User did not supply valid input. Cancelling import."); + log.Error("User tried to input invalid AM2R_11.zip file (" + errorCode + "). Cancelling import."); + MessageBox.Show(this, Text.ZipIsNotAM2R11 + "\n\nError Code: " + errorCode, Text.ErrorWindowTitle, MessageBoxType.Error); + return; } + // We check if it exists first, because someone coughDRUIDcough might've copied it into here while on the showDialog + if (fileFinder.FileName != CrossPlatformOperations.CURRENTPATH + "/AM2R_11.zip") + File.Copy(fileFinder.FileName, CrossPlatformOperations.CURRENTPATH + "/AM2R_11.zip"); + + log.Info("AM2R_11.zip successfully imported."); + UpdateStateMachine(); break; #endregion @@ -305,36 +292,34 @@ namespace AM2RLauncher // If the file cannot be launched due to anti-virus shenanigans or any other reason, we try catch here try { - // Check if xdelta is installed on linux´and exit if not - if ((OS.IsUnix) && !CrossPlatformOperations.CheckIfXdeltaIsInstalled()) + // Check if xdelta is installed on unix and exit if not + if (OS.IsUnix && !CrossPlatformOperations.CheckIfXdeltaIsInstalled()) { - MessageBox.Show(Text.XdeltaNotFound, Text.WarningWindowTitle, MessageBoxButtons.OK); + MessageBox.Show(this, Text.XdeltaNotFound, Text.WarningWindowTitle, MessageBoxButtons.OK); SetPlayButtonState(UpdateState.Install); UpdateStateMachine(); log.Error("Xdelta not found. Aborting installing a profile..."); - break; + return; } var progressIndicator = new Progress(UpdateProgressBar); bool useHqMusic = hqMusicPCCheck.Checked.Value; await Task.Run(() => Profile.InstallProfile(profileList[profileIndex.Value], useHqMusic, progressIndicator)); // This is just for visuals because the average windows end user will ask why it doesn't go to the end otherwise. if (OS.IsWindows) - Thread.Sleep(1000); + Thread.Sleep(500); } catch (Exception ex) { log.Error(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace); - MessageBox.Show(ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, ex.Message + "\n*****Stack Trace*****\n\n" + ex.StackTrace, Text.ErrorWindowTitle, MessageBoxType.Error); } progressBar.Visible = false; progressBar.Value = 0; // Just need to switch this to anything that isn't an "active" state so SetUpdateState() actually does something SetPlayButtonState(UpdateState.Play); - UpdateStateMachine(); - break; #endregion @@ -345,9 +330,7 @@ namespace AM2RLauncher return; ProfileXML profile = profileList[profileIndex.Value]; - Visible = false; - SetPlayButtonState(UpdateState.Playing); // Make sure the main interface state machines properly @@ -357,8 +340,6 @@ namespace AM2RLauncher this.ShowInTaskbar = false; trayIndicator.Visible = true; WindowState windowStateBeforeLaunching = this.WindowState; - if (windowStateBeforeLaunching == WindowState.Maximized) - this.WindowState = WindowState.Normal; Minimize(); string envVarText = customEnvVarTextBox?.Text; @@ -370,66 +351,41 @@ namespace AM2RLauncher trayIndicator.Visible = false; Show(); BringToFront(); - if (windowStateBeforeLaunching == WindowState.Maximized) - Maximize(); + Visible = true; + WindowState = windowStateBeforeLaunching; SetPlayButtonState(UpdateState.Play); - UpdateStateMachine(); - - Visible = true; - break; #endregion - default: break; + default: throw new NotImplementedException("Encountered invalid update state: " + updateState + "!"); } } - /// - /// This is just a helper method for the git commands in order to have a progress bar display for them. - /// - private bool TransferProgressHandlerMethod(TransferProgress transferProgress) - { - // Thank you random issue on the gitlib2sharp repo!!!! - // Also tldr; rtfm - if (isGitProcessGettingCancelled) return false; - - // This needs to be in an Invoke, in order to access the variables from the main thread - // Otherwise this will throw a runtime exception - Application.Instance.Invoke(() => - { - progressBar.MinValue = 0; - progressBar.MaxValue = transferProgress.TotalObjects; - if (currentGitObject >= transferProgress.ReceivedObjects) - return; - progressLabel.Text = Text.ProgressbarProgress + " " + transferProgress.ReceivedObjects + " (" + ((int)transferProgress.ReceivedBytes / 1000000) + "MB) / " + transferProgress.TotalObjects + " objects"; - currentGitObject = transferProgress.ReceivedObjects; - progressBar.Value = transferProgress.ReceivedObjects; - }); - - return true; - } - /// /// Does stuff, depending on the current state of . /// private async void ApkButtonClickEvent(object sender, EventArgs e) { + // If we're currently creating something, exit + if (apkButtonState == ApkButtonState.Creating) return; + // Check for java, exit safely with a warning if not found! if (!CrossPlatformOperations.IsJavaInstalled()) { - MessageBox.Show(Text.JavaNotFound, Text.WarningWindowTitle, MessageBoxButtons.OK); + MessageBox.Show(this, Text.JavaNotFound, Text.WarningWindowTitle, MessageBoxButtons.OK); SetApkButtonState(ApkButtonState.Create); UpdateStateMachine(); log.Error("Java not found! Aborting Android APK creation."); return; } - // Check if xdelta is installed on linux + + // Check if xdelta is installed on unix, exit with a warning if not. if (OS.IsUnix && !CrossPlatformOperations.CheckIfXdeltaIsInstalled()) { - MessageBox.Show(Text.XdeltaNotFound, Text.WarningWindowTitle, MessageBoxButtons.OK); + MessageBox.Show(this, Text.XdeltaNotFound, Text.WarningWindowTitle, MessageBoxButtons.OK); SetApkButtonState(ApkButtonState.Create); UpdateStateMachine(); log.Error("Xdelta not found. Aborting Android APK creation..."); @@ -441,7 +397,6 @@ namespace AM2RLauncher if (apkButtonState == ApkButtonState.Create) { SetApkButtonState(ApkButtonState.Creating); - UpdateStateMachine(); progressBar.Visible = true; @@ -451,49 +406,30 @@ namespace AM2RLauncher await Task.Run(() => Profile.CreateAPK(profileList[profileIndex.Value], useHqMusic, progressIndicator)); SetApkButtonState(ApkButtonState.Create); - progressBar.Visible = false; + UpdateStateMachine(); } - - UpdateStateMachine(); } /// - /// Runs on 's DocumentLoaded event. Manages the warning for no internet connection. + /// If no internet access is available, this changes the content of to an empty page only displaying . /// - private void NewsWebViewDocumentLoaded(object sender, WebViewLoadedEventArgs e) + /// The to change the contents of. + /// The that should be displayed. + private void ChangeToEmptyPageOnNoInternet(TabPage tabPage, Label errorLabel) { - if (!isInternetThere) - { - newsPage.Content = new TableLayout - { - Rows = - { - null, - newsNoConnectionLabel, - null - } - }; - } - } + if (isInternetThere) + return; - /// - /// Runs on 's DocumentLoaded event. Manages the warning for no internet connection. - /// - private void ChangelogWebViewDocumentLoaded(object sender, WebViewLoadedEventArgs e) - { - if (!isInternetThere) + tabPage.Content = new TableLayout { - changelogPage.Content = new TableLayout + Rows = { - Rows = - { - null, - changelogNoConnectionLabel, - null - } - }; - } + null, + errorLabel, + null + } + }; } /// @@ -503,14 +439,7 @@ namespace AM2RLauncher { log.Info("User requested to add mod. Requesting user input for new mod .zip..."); - OpenFileDialog fileFinder = new OpenFileDialog - { - Directory = new Uri(CrossPlatformOperations.CURRENTPATH), - MultiSelect = false, - Title = Text.SelectModFileDialog - }; - - fileFinder.Filters.Add(new FileFilter(Text.ZipArchiveText, ".zip")); + OpenFileDialog fileFinder = GetSingleZipDialog(Text.SelectModFileDialog); if (fileFinder.ShowDialog(this) != DialogResult.Ok) { @@ -547,7 +476,7 @@ namespace AM2RLauncher ProfileXML profile2 = Serializer.Deserialize(File.ReadAllText(modsDir + "/" + extractedName + "/profile.xml")); log.Error("Mod is already imported as " + extractedName + "! Cancelling mod import."); - MessageBox.Show(HelperMethods.GetText(Text.ModIsAlreadyInstalledMessage, profile2.Name), Text.WarningWindowTitle, MessageBoxType.Warning); + MessageBox.Show(this, HelperMethods.GetText(Text.ModIsAlreadyInstalledMessage, profile2.Name), Text.WarningWindowTitle, MessageBoxType.Warning); return; } // Directory doesn't exist -> extract! @@ -559,7 +488,7 @@ namespace AM2RLauncher { log.Error(fileFinder.FileName + " does not contain profile.xml! Cancelling mod import."); - MessageBox.Show(HelperMethods.GetText(Text.ModIsInvalidMessage, extractedName), Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, HelperMethods.GetText(Text.ModIsInvalidMessage, extractedName), Text.ErrorWindowTitle, MessageBoxType.Error); Directory.Delete(modsDir + "/" + extractedName, true); File.Delete(CrossPlatformOperations.CURRENTPATH + "/Mods/" + modFile.Name); return; @@ -572,7 +501,7 @@ namespace AM2RLauncher { log.Error("Mod is for " + profile.OperatingSystem + " while current OS is " + OS.Name + ". Cancelling mod import."); - MessageBox.Show(HelperMethods.GetText(Text.ModIsForWrongOS, profile.Name).Replace("$OS", profile.OperatingSystem).Replace("$CURRENTOS", OS.Name), + MessageBox.Show(this, HelperMethods.GetText(Text.ModIsForWrongOS, profile.Name).Replace("$OS", profile.OperatingSystem).Replace("$CURRENTOS", OS.Name), Text.ErrorWindowTitle, MessageBoxType.Error); HelperMethods.DeleteDirectory(modsDir + "/" + extractedName); return; @@ -582,13 +511,13 @@ namespace AM2RLauncher if (profileList.FirstOrDefault(p => p.Name == profile.Name) != null || Directory.Exists(CrossPlatformOperations.CURRENTPATH + "/Profiles/" + profile.Name)) { log.Error(profile.Name + " is already installed."); - MessageBox.Show(HelperMethods.GetText(Text.ModIsAlreadyInstalledMessage, profile.Name), Text.WarningWindowTitle, MessageBoxType.Warning); + MessageBox.Show(this, HelperMethods.GetText(Text.ModIsAlreadyInstalledMessage, profile.Name), Text.WarningWindowTitle, MessageBoxType.Warning); HelperMethods.DeleteDirectory(modsDir + "/" + extractedName); return; } log.Info(profile.Name + " successfully installed."); - MessageBox.Show(HelperMethods.GetText(Text.ModSuccessfullyInstalledMessage, profile.Name), Text.SuccessWindowTitle); + MessageBox.Show(this, HelperMethods.GetText(Text.ModSuccessfullyInstalledMessage, profile.Name), Text.SuccessWindowTitle); LoadProfilesAndAdjustLists(); // Adjust profileIndex to point to newly added mod. if its not found for whatever reason, we default to first community updates @@ -779,7 +708,7 @@ namespace AM2RLauncher // Create warning dialog when enabling if (enabled) { - MessageBox.Show(Text.WarningWindowText, Text.WarningWindowTitle, MessageBoxType.Warning); + MessageBox.Show(this, Text.WarningWindowText, Text.WarningWindowTitle, MessageBoxType.Warning); currentMirror = customMirrorTextBox.Text; } else @@ -835,7 +764,7 @@ namespace AM2RLauncher if (!gitURLRegex.IsMatch(mirrorText)) { log.Info("User used " + mirrorText + " as a custom Mirror, didn't pass git validation test."); - MessageBox.Show(HelperMethods.GetText(Text.InvalidGitURL, mirrorText), Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, HelperMethods.GetText(Text.InvalidGitURL, mirrorText), Text.ErrorWindowTitle, MessageBoxType.Error); return; } @@ -883,7 +812,7 @@ namespace AM2RLauncher ProfileXML profile = profileList[modSettingsProfileDropDown.SelectedIndex]; log.Info("User is attempting to delete profile " + profile.Name + "."); - DialogResult result = MessageBox.Show(HelperMethods.GetText(Text.DeleteModWarning, profile.Name), Text.WarningWindowTitle, + DialogResult result = MessageBox.Show(this, HelperMethods.GetText(Text.DeleteModWarning, profile.Name), Text.WarningWindowTitle, MessageBoxButtons.OKCancel, MessageBoxType.Warning, MessageBoxDefaultButton.Cancel); if (result == DialogResult.Ok) @@ -891,7 +820,7 @@ namespace AM2RLauncher log.Info("User did not cancel. Proceeding to delete " + profile); DeleteProfileAndAdjustLists(profile); log.Info(profile + " has been deleted"); - MessageBox.Show(HelperMethods.GetText(Text.DeleteModButtonSuccess, profile.Name), Text.SuccessWindowTitle); + MessageBox.Show(this, HelperMethods.GetText(Text.DeleteModButtonSuccess, profile.Name), Text.SuccessWindowTitle); } else { @@ -911,14 +840,7 @@ namespace AM2RLauncher ProfileXML currentProfile = profileList[modSettingsProfileDropDown.SelectedIndex]; - OpenFileDialog fileFinder = new OpenFileDialog - { - Directory = new Uri(CrossPlatformOperations.CURRENTPATH), - MultiSelect = false, - Title = Text.SelectModFileDialog - }; - - fileFinder.Filters.Add(new FileFilter(Text.ZipArchiveText, ".zip")); + OpenFileDialog fileFinder = GetSingleZipDialog(Text.SelectModFileDialog); if (fileFinder.ShowDialog(this) != DialogResult.Ok) { @@ -962,7 +884,7 @@ namespace AM2RLauncher if (!File.Exists(extractedFolder + "/profile.xml")) { log.Error(fileFinder.FileName + " does not contain profile.xml! Cancelling mod update."); - MessageBox.Show(HelperMethods.GetText(Text.ModIsInvalidMessage, extractedName), Text.ErrorWindowTitle, MessageBoxType.Error); + MessageBox.Show(this, HelperMethods.GetText(Text.ModIsInvalidMessage, extractedName), Text.ErrorWindowTitle, MessageBoxType.Error); Directory.Delete(extractedFolder, true); File.Delete(CrossPlatformOperations.CURRENTPATH + "/Mods/" + modFile.Name); return; @@ -974,7 +896,7 @@ namespace AM2RLauncher if (profileList.FirstOrDefault(p => p.Name == profile.Name) != null || Directory.Exists(CrossPlatformOperations.CURRENTPATH + "/Profiles/" + profile.Name)) { // Mod is already installed, so we can update! - DialogResult updateResult = MessageBox.Show(HelperMethods.GetText(Text.UpdateModWarning, currentProfile.Name), Text.WarningWindowTitle, + DialogResult updateResult = MessageBox.Show(this, HelperMethods.GetText(Text.UpdateModWarning, currentProfile.Name), Text.WarningWindowTitle, MessageBoxButtons.OKCancel, MessageBoxType.Warning, MessageBoxDefaultButton.Cancel); if (updateResult == DialogResult.Ok) @@ -982,7 +904,7 @@ namespace AM2RLauncher // If the profile isn't installed, don't ask about archiving it if (Profile.IsProfileInstalled(currentProfile)) { - DialogResult archiveResult = MessageBox.Show(HelperMethods.GetText(Text.ArchiveMod, currentProfile.Name + " " + Text.VersionLabel + currentProfile.Version), Text.WarningWindowTitle, MessageBoxButtons.YesNo, MessageBoxType.Warning, MessageBoxDefaultButton.No); + DialogResult archiveResult = MessageBox.Show(this, HelperMethods.GetText(Text.ArchiveMod, currentProfile.Name + " " + Text.VersionLabel + currentProfile.Version), Text.WarningWindowTitle, MessageBoxButtons.YesNo, MessageBoxType.Warning, MessageBoxDefaultButton.No); // User wants to archive profile if (archiveResult == DialogResult.Yes) @@ -1006,7 +928,7 @@ namespace AM2RLauncher // Cancel the operation! // Show message to tell user that mod could not be found, install this separately log.Error("Mod is not installed! Cancelling mod update."); - MessageBox.Show(HelperMethods.GetText(Text.UpdateModButtonWrongMod, currentProfile.Name).Replace("$SELECT", profile.Name), + MessageBox.Show(this, HelperMethods.GetText(Text.UpdateModButtonWrongMod, currentProfile.Name).Replace("$SELECT", profile.Name), Text.WarningWindowTitle, MessageBoxButtons.OK); abort = true; } @@ -1020,7 +942,7 @@ namespace AM2RLauncher } log.Info("Successfully updated mod profile " + profile.Name + "."); - MessageBox.Show(HelperMethods.GetText(Text.ModSuccessfullyInstalledMessage, currentProfile.Name), Text.SuccessWindowTitle); + MessageBox.Show(this, HelperMethods.GetText(Text.ModSuccessfullyInstalledMessage, currentProfile.Name), Text.SuccessWindowTitle); UpdateStateMachine(); LoadProfilesAndAdjustLists(); @@ -1048,7 +970,7 @@ namespace AM2RLauncher { case UpdateState.Downloading: { - var result = MessageBox.Show(Text.CloseOnCloningText, Text.WarningWindowTitle, MessageBoxButtons.YesNo, + var result = MessageBox.Show(this, Text.CloseOnCloningText, Text.WarningWindowTitle, MessageBoxButtons.YesNo, MessageBoxType.Warning, MessageBoxDefaultButton.No); if (result == DialogResult.No) { @@ -1060,7 +982,7 @@ namespace AM2RLauncher break; } case UpdateState.Installing: - MessageBox.Show(Text.CloseOnInstallingText, Text.WarningWindowTitle, MessageBoxButtons.OK, MessageBoxType.Warning); + MessageBox.Show(this, Text.CloseOnInstallingText, Text.WarningWindowTitle, MessageBoxButtons.OK, MessageBoxType.Warning); e.Cancel = true; break; } diff --git a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs index ea4c80d..87b6d63 100644 --- a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs +++ b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.Methods.cs @@ -1,4 +1,7 @@ -using Eto.Forms; +using AM2RLauncher.Core; +using AM2RLauncher.Language; +using Eto.Forms; +using LibGit2Sharp; using System; namespace AM2RLauncher @@ -40,5 +43,47 @@ namespace AM2RLauncher { return profileIndex != null; } + + /// + /// This is just a helper method for the git commands in order to have a progress bar display for them. + /// + private bool TransferProgressHandlerMethod(TransferProgress transferProgress) + { + // Thank you random issue on the gitlib2sharp repo!!!! + // Also tldr; rtfm + if (isGitProcessGettingCancelled) return false; + + // This needs to be in an Invoke, in order to access the variables from the main thread + // Otherwise this will throw a runtime exception + Application.Instance.Invoke(() => + { + progressBar.MinValue = 0; + progressBar.MaxValue = transferProgress.TotalObjects; + if (currentGitObject >= transferProgress.ReceivedObjects) + return; + progressLabel.Text = Text.ProgressbarProgress + " " + transferProgress.ReceivedObjects + " (" + ((int)transferProgress.ReceivedBytes / 1000000) + "MB) / " + transferProgress.TotalObjects + " objects"; + currentGitObject = transferProgress.ReceivedObjects; + progressBar.Value = transferProgress.ReceivedObjects; + }); + + return true; + } + + /// + /// Creates a single-file, zip-filtered file dialog. + /// + /// The title of the file dialog. + /// The created file dialog. + private OpenFileDialog GetSingleZipDialog(string title = "") + { + OpenFileDialog fileDialog = new OpenFileDialog + { + Directory = new Uri(CrossPlatformOperations.CURRENTPATH), + MultiSelect = false, + Title = title + }; + fileDialog.Filters.Add(new FileFilter(Text.ZipArchiveText, ".zip")); + return fileDialog; + } } } \ No newline at end of file diff --git a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs index bd7e93d..59de18c 100644 --- a/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs +++ b/AM2RLauncher/AM2RLauncher/MainForm/MainForm.UI.cs @@ -818,8 +818,8 @@ namespace AM2RLauncher customEnvVarTextBox.LostFocus += CustomEnvVarTextBoxLostFocus; //TODO: Retest if these now work on mac - newsWebView.DocumentLoaded += NewsWebViewDocumentLoaded; - changelogWebView.DocumentLoaded += ChangelogWebViewDocumentLoaded; + newsWebView.DocumentLoaded += (sender, e) => ChangeToEmptyPageOnNoInternet(newsPage, newsNoConnectionLabel); + changelogWebView.DocumentLoaded += (sender, e) => ChangeToEmptyPageOnNoInternet(changelogPage, changelogNoConnectionLabel); log.Info("Events linked successfully."); diff --git a/AM2RLauncher/AM2RLauncherCore/CrossPlatformOperations.cs b/AM2RLauncher/AM2RLauncherCore/CrossPlatformOperations.cs index 5939915..2482028 100644 --- a/AM2RLauncher/AM2RLauncherCore/CrossPlatformOperations.cs +++ b/AM2RLauncher/AM2RLauncherCore/CrossPlatformOperations.cs @@ -353,7 +353,6 @@ public static class CrossPlatformOperations try { xdelta.Start(); - xdelta.WaitForExit(); } catch (System.ComponentModel.Win32Exception)