diff --git a/BeatSaberModManager/DataModels/ReleaseInfo.cs b/BeatSaberModManager/DataModels/ReleaseInfo.cs index 1d30e19..5a7244c 100644 --- a/BeatSaberModManager/DataModels/ReleaseInfo.cs +++ b/BeatSaberModManager/DataModels/ReleaseInfo.cs @@ -26,11 +26,15 @@ public class ReleaseInfo public bool install; public bool disabled; + public enum installSpecial { Dependency, Conflict, Required, None }; + public int installType = (int)installSpecial.None; + public bool installPreviousState = false; public ListViewItem itemHandle; public List dependsOn; public List conflictsWith; + public List dependedBy = new List { }; public ReleaseInfo( string _name, string _title, string _version, string _author, string _description, diff --git a/BeatSaberModManager/Forms/FormMain.cs b/BeatSaberModManager/Forms/FormMain.cs index f76a1f3..053f160 100644 --- a/BeatSaberModManager/Forms/FormMain.cs +++ b/BeatSaberModManager/Forms/FormMain.cs @@ -175,12 +175,10 @@ private void CheckDefaultMod(ReleaseInfo release, ListViewItem item) { string name = release.name.ToLower(); string category = release.category.ToLower(); - if (name.Equals("bsipa") || category.Contains("libraries")) + if (name.Equals("bsipa")) { - item.Text = $"[REQUIRED] {release.title}"; - item.BackColor = Color.LightGray; - release.disabled = true; - + release.installType = (int)ReleaseInfo.installSpecial.Required; + release.installPreviousState = true; release.install = true; item.Checked = true; } @@ -188,6 +186,8 @@ private void CheckDefaultMod(ReleaseInfo release, ListViewItem item) if (defaultMods.Contains(name)) { item.Checked = true; + release.installPreviousState = true; + resolveDependencies(release, 1, true); defaultMods.Remove(name); } } @@ -216,6 +216,62 @@ private void buttonFolderBrowser_Click(object sender, EventArgs e) installer.installDirectory = textBoxDirectory.Text; } + private void resolveDependencies(ReleaseInfo release, int action, bool defaults = false) + { + if (release.dependsOn.Count > 0) + { + foreach (ModLink dependency in release.dependsOn) + { + foreach (ListViewItem lvi in listViewMods.Items) + { + ReleaseInfo check = (ReleaseInfo)lvi.Tag; + if (check.name == dependency.name) + { + if (action == 1) + { + if (!check.dependedBy.Contains(release.name)) + { + check.dependedBy.Add(release.name); + } + } + else if (action == 0) + { + if (check.dependedBy.Contains(release.name)) + { + check.dependedBy.Remove(release.name); + } + } + if (check.dependedBy.Count == 1 && action == 1 && !defaults) + { + check.installPreviousState = check.itemHandle.Checked; + } + if (check.dependedBy.Count > 0) + { + check.installType = (int)ReleaseInfo.installSpecial.Dependency; + check.disabled = true; + check.itemHandle.Checked = true; + check.install = true; + } + else + { + check.installType = (int)ReleaseInfo.installSpecial.None; + check.disabled = false; + check.itemHandle.Checked = check.installPreviousState; + } + if (check.itemHandle.Checked) + { + resolveDependencies(check, 1, true); + } + else + { + resolveDependencies(check, 0, true); + } + } + } + } + } + } + private void listViewMods_ItemChecked(object sender, ItemCheckedEventArgs e) { ReleaseInfo release = (ReleaseInfo)e.Item.Tag; @@ -231,20 +287,11 @@ private void listViewMods_ItemChecked(object sender, ItemCheckedEventArgs e) if (e.Item.Checked) { - if (release.dependsOn.Count > 0) - { - foreach (ModLink dependency in release.dependsOn) - { - foreach (ListViewItem lvi in listViewMods.Items) - { - ReleaseInfo check = (ReleaseInfo)lvi.Tag; - if (check.name == dependency.name) - { - check.itemHandle.Checked = true; - } - } - } - } + resolveDependencies(release, 1); + } + else + { + resolveDependencies(release, 0); } if (e.Item.Checked) @@ -292,11 +339,20 @@ private void ReRenderListView () foreach (ListViewItem item in listViewMods.Items) { ReleaseInfo release = (ReleaseInfo)item.Tag; - if (release.disabled) + if (release.installType == (int)ReleaseInfo.installSpecial.Required) + { + item.Checked = true; + release.install = true; + item.BackColor = Color.LightGray; + item.Text = $"[REQUIRED] {release.title}"; + } + else + if (release.installType == (int)ReleaseInfo.installSpecial.Dependency) { - item.Checked = release.install; + item.Checked = true; + release.install = true; item.BackColor = Color.LightGray; - item.Text = $"[{(release.install ? "REQUIRED" : "CONFLICT")}] {release.title}"; + item.Text = $"[DEPENDENCY] {release.title}"; } else { diff --git a/BeatSaberModManager/Properties/AssemblyInfo.cs b/BeatSaberModManager/Properties/AssemblyInfo.cs index afab6ef..a2f166e 100644 --- a/BeatSaberModManager/Properties/AssemblyInfo.cs +++ b/BeatSaberModManager/Properties/AssemblyInfo.cs @@ -33,7 +33,7 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.0.3")] -[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyVersion("0.3.0.4")] +[assembly: AssemblyFileVersion("0.3.0.4")] [assembly: NeutralResourcesLanguage("en")]