Sorting mods when (un)installing Added Apply to all checkbox to a custom message box that replaces the one that shows up when the mod files already exist without the mod manager knowing about it Removing IPA.zip after unzipping Fix deleting files when their folder doesn't existtags/v1.4.0
@@ -0,0 +1,128 @@ | |||
namespace GCMM | |||
{ | |||
partial class CustomMessageBox | |||
{ | |||
/// <summary> | |||
/// Required designer variable. | |||
/// </summary> | |||
private System.ComponentModel.IContainer components = null; | |||
/// <summary> | |||
/// Clean up any resources being used. | |||
/// </summary> | |||
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> | |||
protected override void Dispose(bool disposing) | |||
{ | |||
if (disposing && (components != null)) | |||
{ | |||
components.Dispose(); | |||
} | |||
base.Dispose(disposing); | |||
} | |||
#region Windows Form Designer generated code | |||
/// <summary> | |||
/// Required method for Designer support - do not modify | |||
/// the contents of this method with the code editor. | |||
/// </summary> | |||
private void InitializeComponent() | |||
{ | |||
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CustomMessageBox)); | |||
this.content = new System.Windows.Forms.Label(); | |||
this.yesbtn = new System.Windows.Forms.Button(); | |||
this.nobtn = new System.Windows.Forms.Button(); | |||
this.applyToAll = new System.Windows.Forms.CheckBox(); | |||
this.panel1 = new System.Windows.Forms.Panel(); | |||
this.panel1.SuspendLayout(); | |||
this.SuspendLayout(); | |||
// | |||
// content | |||
// | |||
this.content.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | |||
| System.Windows.Forms.AnchorStyles.Left) | |||
| System.Windows.Forms.AnchorStyles.Right))); | |||
this.content.Location = new System.Drawing.Point(12, 13); | |||
this.content.Name = "content"; | |||
this.content.Size = new System.Drawing.Size(367, 55); | |||
this.content.TabIndex = 0; | |||
this.content.Text = "Text"; | |||
// | |||
// yesbtn | |||
// | |||
this.yesbtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); | |||
this.yesbtn.Location = new System.Drawing.Point(216, 106); | |||
this.yesbtn.Name = "yesbtn"; | |||
this.yesbtn.Size = new System.Drawing.Size(75, 23); | |||
this.yesbtn.TabIndex = 1; | |||
this.yesbtn.Text = "Yes"; | |||
this.yesbtn.UseVisualStyleBackColor = true; | |||
// | |||
// nobtn | |||
// | |||
this.nobtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); | |||
this.nobtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; | |||
this.nobtn.Location = new System.Drawing.Point(297, 106); | |||
this.nobtn.Name = "nobtn"; | |||
this.nobtn.Size = new System.Drawing.Size(75, 23); | |||
this.nobtn.TabIndex = 2; | |||
this.nobtn.Text = "No"; | |||
this.nobtn.UseVisualStyleBackColor = true; | |||
// | |||
// applyToAll | |||
// | |||
this.applyToAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); | |||
this.applyToAll.AutoSize = true; | |||
this.applyToAll.Location = new System.Drawing.Point(12, 83); | |||
this.applyToAll.Name = "applyToAll"; | |||
this.applyToAll.Size = new System.Drawing.Size(77, 17); | |||
this.applyToAll.TabIndex = 4; | |||
this.applyToAll.Text = "Apply to all"; | |||
this.applyToAll.UseVisualStyleBackColor = true; | |||
// | |||
// panel1 | |||
// | |||
this.panel1.BackColor = System.Drawing.SystemColors.ControlLightLight; | |||
this.panel1.Controls.Add(this.content); | |||
this.panel1.Location = new System.Drawing.Point(1, 0); | |||
this.panel1.Name = "panel1"; | |||
this.panel1.Size = new System.Drawing.Size(382, 80); | |||
this.panel1.TabIndex = 5; | |||
// | |||
// CustomMessageBox | |||
// | |||
this.AcceptButton = this.yesbtn; | |||
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); | |||
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; | |||
this.BackColor = System.Drawing.SystemColors.ControlLight; | |||
this.ClientSize = new System.Drawing.Size(384, 141); | |||
this.ControlBox = false; | |||
this.Controls.Add(this.panel1); | |||
this.Controls.Add(this.applyToAll); | |||
this.Controls.Add(this.nobtn); | |||
this.Controls.Add(this.yesbtn); | |||
this.ForeColor = System.Drawing.SystemColors.ControlText; | |||
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; | |||
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); | |||
this.MaximizeBox = false; | |||
this.MinimizeBox = false; | |||
this.Name = "CustomMessageBox"; | |||
this.ShowIcon = false; | |||
this.ShowInTaskbar = false; | |||
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; | |||
this.panel1.ResumeLayout(false); | |||
this.ResumeLayout(false); | |||
this.PerformLayout(); | |||
} | |||
#endregion | |||
private System.Windows.Forms.Label content; | |||
private System.Windows.Forms.Button yesbtn; | |||
private System.Windows.Forms.Button nobtn; | |||
private System.Windows.Forms.CheckBox applyToAll; | |||
private System.Windows.Forms.Panel panel1; | |||
} | |||
} | |||
@@ -0,0 +1,47 @@ | |||
using GCMM.Properties; | |||
using System; | |||
using System.Collections.Generic; | |||
using System.ComponentModel; | |||
using System.Data; | |||
using System.Drawing; | |||
using System.IO; | |||
using System.Linq; | |||
using System.Text; | |||
using System.Text.RegularExpressions; | |||
using System.Threading.Tasks; | |||
using System.Windows.Forms; | |||
namespace GCMM | |||
{ | |||
public partial class CustomMessageBox : Form | |||
{ | |||
public bool ApplyToAll { get; private set; } | |||
public CustomMessageBox() | |||
{ | |||
InitializeComponent(); | |||
yesbtn.Click += (sender, e) => | |||
{ | |||
DialogResult = DialogResult.Yes; | |||
ApplyToAll = applyToAll.Checked; | |||
Close(); | |||
}; | |||
nobtn.Click += (sender, e) => | |||
{ | |||
DialogResult = DialogResult.No; | |||
ApplyToAll = applyToAll.Checked; | |||
Close(); | |||
}; | |||
/*cancelbtn.Click += (sender, e) => | |||
{ | |||
DialogResult = DialogResult.Cancel; | |||
Close(); | |||
};*/ | |||
} | |||
public CustomMessageBox(string message, string caption) : this() | |||
{ | |||
content.Text = message; | |||
Text = caption; | |||
} | |||
} | |||
} |
@@ -84,6 +84,7 @@ | |||
this.modlist.Location = new System.Drawing.Point(12, 47); | |||
this.modlist.Name = "modlist"; | |||
this.modlist.Size = new System.Drawing.Size(491, 433); | |||
this.modlist.Sorting = System.Windows.Forms.SortOrder.Ascending; | |||
this.modlist.TabIndex = 0; | |||
this.modlist.UseCompatibleStateImageBehavior = false; | |||
this.modlist.View = System.Windows.Forms.View.Details; | |||
@@ -75,6 +75,7 @@ namespace GCMM | |||
LoadFileList(mod); | |||
DirectoryInfo di = Directory.CreateDirectory(destinationDirectoryName); | |||
string destinationDirectoryFullPath = di.FullName; | |||
bool? skipExisting = null; | |||
foreach (ZipArchiveEntry file in archive.Entries) | |||
{ | |||
@@ -96,7 +97,16 @@ namespace GCMM | |||
&& !mod.ModFiles.Contains(completeFileName) // OR it's known to be part of the mod already | |||
&& file.FullName != "Plugins/" + mod.Name + ".dll") // OR it's the plugin's DLL (dll->zip release) | |||
{ | |||
if (MessageBox.Show("The mod zip contains a file that exists as part of the game. Do you want to skip this file?\n" + file.FullName + "\nOnly choose No if it's part of a previous installation of the mod.", "File is part of the game", MessageBoxButtons.YesNo) == DialogResult.Yes) | |||
if (!skipExisting.HasValue) | |||
{ | |||
var mbox = new CustomMessageBox("The mod zip contains a file that exists as part of the game. Do you want to skip this file?\n" + file.FullName + "\nOnly choose No if it's part of a previous installation of the mod.", "File is part of the game"); | |||
var result = mbox.ShowDialog(this); | |||
if (mbox.ApplyToAll) | |||
skipExisting = result == DialogResult.Yes; | |||
if (result == DialogResult.Yes) | |||
continue; | |||
} | |||
else if (skipExisting.Value) | |||
continue; | |||
} | |||
@@ -131,6 +141,7 @@ namespace GCMM | |||
{ | |||
foreach (string file in mod.ModFiles) | |||
{ | |||
if (!File.Exists(file)) continue; //If the folders don't exist then it errors | |||
File.Delete(file); | |||
var parent = Directory.GetParent(file); | |||
if (!parent.EnumerateFileSystemInfos().Any()) | |||
@@ -94,7 +94,7 @@ namespace GCMM | |||
await FetchModInfo(gcipa, preview, false); | |||
await FetchModInfo(gcmm, preview, false); | |||
if (gcmm.Updatable) | |||
if (MessageBox.Show("There is a GCMM update available! Do you want to download it now? If yes, extract it over this installation.", "Mod Manager update", MessageBoxButtons.YesNo) | |||
if (MessageBox.Show("There is a GCMM update available! Do you want to download it now? If yes, extract it over this installation.\n\n" + gcmm.UpdateDetails, "Mod Manager update", MessageBoxButtons.YesNo) | |||
== DialogResult.Yes) | |||
Process.Start(gcmm.DownloadURL); | |||
} | |||
@@ -180,6 +180,7 @@ namespace GCMM | |||
items[2].Text = (omod.Version ?? omod.LatestVersion)?.ToString(); | |||
items[3].Text = omod.LastUpdated.ToString(); | |||
item.Group = omod.Installed ? modlist.Groups["installed"] : modlist.Groups["available"]; | |||
modlist.Sort(); | |||
mod = omod; | |||
} | |||
else | |||
@@ -98,6 +98,7 @@ namespace GCMM | |||
using (var fs = new FileStream("IPA.zip", FileMode.Open)) | |||
using (var za = new ZipArchive(fs)) | |||
za.ExtractToDirectory(Settings.Default.GamePath, true); //Overwrite files that were left from a previous install of the patcher | |||
File.Delete("IPA.zip"); | |||
} | |||
} | |||
GetInstalledMods(); //Update patcher state, should be fine for this rare event | |||