diff --git a/Binaries/Steam Library Manager.exe b/Binaries/Steam Library Manager.exe index 5bf94d34..41e1249e 100644 Binary files a/Binaries/Steam Library Manager.exe and b/Binaries/Steam Library Manager.exe differ diff --git a/Source/Steam Library Manager/Definitions/Global.cs b/Source/Steam Library Manager/Definitions/Global.cs index d324025f..1f841ec7 100644 --- a/Source/Steam Library Manager/Definitions/Global.cs +++ b/Source/Steam Library Manager/Definitions/Global.cs @@ -10,18 +10,23 @@ public static class Steam public static string RegistryKeyPath = @"HKEY_CURRENT_USER\SOFTWARE\Valve\Steam"; public static string VdfFilePath = System.IO.Path.Combine(Properties.Settings.Default.steamInstallationPath, "config", "config.vdf"); + + public static bool IsStateChanging; } public static class Origin { public static string ConfigFilePath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData), "Origin", "local.xml"); public static List> AppIds = new List>(); + + public static bool IsStateChanging; } public static class Uplay { - // AppData\Local\Ubisoft Game Launcher\settings.yml public static string ConfigFilePath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData), "Ubisoft Game Launcher", "settings.yml"); + + public static bool IsStateChanging; } } } \ No newline at end of file diff --git a/Source/Steam Library Manager/Definitions/Library.cs b/Source/Steam Library Manager/Definitions/Library.cs index 707861d6..804ca5a0 100644 --- a/Source/Steam Library Manager/Definitions/Library.cs +++ b/Source/Steam Library Manager/Definitions/Library.cs @@ -46,7 +46,7 @@ private List GenerateCMenuItems() var cMenu = new List(); try { - foreach (var cMenuItem in List.LibraryCMenuItems.ToList().Where(x => x.IsActive && x.AllowedLibraryTypes.Contains(Type))) + foreach (var cMenuItem in List.LibraryCMenuItems.Where(x => x.IsActive && x.AllowedLibraryTypes.Contains(Type)).ToList()) { if (!cMenuItem.ShowToNormal && IsMain) { diff --git a/Source/Steam Library Manager/Definitions/SteamLibrary.cs b/Source/Steam Library Manager/Definitions/SteamLibrary.cs index 79db697a..db2cd82e 100644 --- a/Source/Steam Library Manager/Definitions/SteamLibrary.cs +++ b/Source/Steam Library Manager/Definitions/SteamLibrary.cs @@ -68,7 +68,7 @@ public override async void UpdateAppListAsync() // If key doesn't contains a child (value in acf file) if (keyValReader.Children.Count == 0) { - if (Definitions.List.IgnoredJunkItems.Contains(acfFile.FullName)) + if (List.IgnoredJunkItems.Contains(acfFile.FullName)) { return; } @@ -371,7 +371,7 @@ public override void UpdateJunks() if (List.JunkItems.Count(x => x.FSInfo.FullName == junk.FSInfo.FullName) == 0) { - if (Definitions.List.IgnoredJunkItems.Contains(dirInfo.FullName)) + if (List.IgnoredJunkItems.Contains(dirInfo.FullName)) { continue; } @@ -400,7 +400,7 @@ public override void UpdateJunks() if (List.JunkItems.Count(x => x.FSInfo.FullName == junk.FSInfo.FullName) == 0) { - if (Definitions.List.IgnoredJunkItems.Contains(fileDetails.FullName)) + if (List.IgnoredJunkItems.Contains(fileDetails.FullName)) { continue; } diff --git a/Source/Steam Library Manager/Forms/Main.xaml.cs b/Source/Steam Library Manager/Forms/Main.xaml.cs index e548dc84..0bf557e0 100644 --- a/Source/Steam Library Manager/Forms/Main.xaml.cs +++ b/Source/Steam Library Manager/Forms/Main.xaml.cs @@ -325,9 +325,16 @@ private void CreateLibraryButton_Click(object sender, RoutedEventArgs e) createLibrary_ResultText.Text = $"Selected directory does not exists: \"{libraryPath}\""; return; } + switch (_libraryType) { case LibraryType.Steam: + if (!Properties.Settings.Default.Steam_IsEnabled) + { + createLibrary_ResultText.Text = "Steam Library support must be enabled for this action."; + return; + } + if (!Functions.Steam.Library.IsLibraryExists(libraryPath)) { if (Directory.GetDirectoryRoot(libraryPath) != libraryPath) @@ -347,6 +354,12 @@ private void CreateLibraryButton_Click(object sender, RoutedEventArgs e) break; case LibraryType.SLM: + if (!Properties.Settings.Default.Steam_IsEnabled) + { + createLibrary_ResultText.Text = "Steam Library support must be enabled for this action."; + return; + } + if (!Functions.SLM.Library.IsLibraryExists(libraryPath)) { if (Directory.GetDirectoryRoot(libraryPath) != libraryPath) @@ -366,6 +379,12 @@ private void CreateLibraryButton_Click(object sender, RoutedEventArgs e) break; case LibraryType.Origin: + if (!Properties.Settings.Default.Origin_IsEnabled) + { + createLibrary_ResultText.Text = "Origin Library support must be enabled for this action."; + return; + } + if (!Functions.Origin.IsLibraryExists(libraryPath)) { if (Directory.GetDirectoryRoot(libraryPath) != libraryPath) @@ -385,7 +404,28 @@ private void CreateLibraryButton_Click(object sender, RoutedEventArgs e) break; case LibraryType.Uplay: - createLibrary_ResultText.Text = "Selected library type is not implemented yet."; + if (!Properties.Settings.Default.Uplay_IsEnabled) + { + createLibrary_ResultText.Text = "Uplay Library support must be enabled for this action."; + return; + } + + if (!Functions.Uplay.IsLibraryExists(libraryPath)) + { + if (Directory.GetDirectoryRoot(libraryPath) != libraryPath) + { + Functions.Uplay.AddNewLibraryAsync(libraryPath); + createLibraryFlyout.IsOpen = false; + } + else + { + createLibrary_ResultText.Text = Functions.SLM.Translate(nameof(Properties.Resources.CreateLibrary_RootErrorMessage)); + } + } + else + { + createLibrary_ResultText.Text = Framework.StringFormat.Format(Functions.SLM.Translate(nameof(Properties.Resources.CreateLibrary_ExistsMessage)), new { LibraryPath = libraryPath }); + } break; } } diff --git a/Source/Steam Library Manager/Forms/SettingsView.xaml b/Source/Steam Library Manager/Forms/SettingsView.xaml index e8d8e1e9..83816cff 100644 --- a/Source/Steam Library Manager/Forms/SettingsView.xaml +++ b/Source/Steam Library Manager/Forms/SettingsView.xaml @@ -10,9 +10,9 @@ xmlns:Enums="clr-namespace:Steam_Library_Manager.Definitions.Enums" xmlns:p="clr-namespace:Steam_Library_Manager.Properties" mc:Ignorable="d"> - - - + + + - + @@ -292,7 +292,8 @@ - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Source/Steam Library Manager/Functions/SLM.cs b/Source/Steam Library Manager/Functions/SLM.cs index 79cfb39a..c7300baa 100644 --- a/Source/Steam Library Manager/Functions/SLM.cs +++ b/Source/Steam Library Manager/Functions/SLM.cs @@ -1,4 +1,5 @@ using Gu.Localization; +using Steam_Library_Manager.Definitions.Enums; using System; using System.IO; using System.Linq; @@ -33,13 +34,13 @@ public static Func GetSortingMethod(Definitions.Library Library return x => x.SizeOnDisk; case "backupType": - return x => (Library.Type == Definitions.Enums.LibraryType.Origin) ? x.AppName : x.IsCompressed; + return x => (Library.Type == LibraryType.Origin) ? x.AppName : x.IsCompressed; case "LastUpdated": return x => x.LastUpdated; case "LastPlayed": - return x => (Library.Type == Definitions.Enums.LibraryType.Origin) ? x.AppName : x.LastPlayed; + return x => (Library.Type == LibraryType.Origin) ? x.AppName : x.LastPlayed; } } @@ -51,7 +52,7 @@ private static void UpdateSlmLibraries() var backupDirs = new System.Collections.Specialized.StringCollection(); // foreach defined library in library list - foreach (var library in Definitions.List.Libraries.Where(x => x.Type == Definitions.Enums.LibraryType.SLM).ToList()) + foreach (var library in Definitions.List.Libraries.Where(x => x.Type == LibraryType.SLM).ToList()) { if (backupDirs.Contains(library.DirectoryInfo.FullName)) continue; @@ -78,7 +79,7 @@ private static void UpdateOriginLibraries() var backupDirs = new System.Collections.Specialized.StringCollection(); // foreach defined library in library list - foreach (var library in Definitions.List.Libraries.Where(x => x.Type == Definitions.Enums.LibraryType.Origin && !x.IsMain).ToList()) + foreach (var library in Definitions.List.Libraries.Where(x => x.Type == LibraryType.Origin && !x.IsMain).ToList()) { if (backupDirs.Contains(library.DirectoryInfo.FullName)) continue; @@ -105,7 +106,7 @@ private static void UpdateUplayLibraries() var backupDirs = new System.Collections.Specialized.StringCollection(); // foreach defined library in library list - foreach (var library in Definitions.List.Libraries.Where(x => x.Type == Definitions.Enums.LibraryType.Uplay && !x.IsMain).ToList()) + foreach (var library in Definitions.List.Libraries.Where(x => x.Type == LibraryType.Uplay && !x.IsMain).ToList()) { if (backupDirs.Contains(library.DirectoryInfo.FullName)) continue; @@ -153,9 +154,21 @@ private static void UpdateJunkItems() public static void SaveSettings() { - UpdateSlmLibraries(); - UpdateOriginLibraries(); - UpdateUplayLibraries(); + if (Properties.Settings.Default.Steam_IsEnabled) + { + UpdateSlmLibraries(); + } + + if (Properties.Settings.Default.Origin_IsEnabled) + { + UpdateOriginLibraries(); + } + + if (Properties.Settings.Default.Uplay_IsEnabled) + { + UpdateUplayLibraries(); + } + UpdateJunkItems(); } } @@ -169,16 +182,21 @@ public static async Task OnLoadAsync() AutoUpdaterDotNET.AutoUpdater.Start(Definitions.Updater.VersionControlURL); } - LoadSteam(); - await LoadOriginAsync(); - LoadUplay(); + if (Properties.Settings.Default.Steam_IsEnabled) + { + LoadSteam(); + GenerateJunkList(); + } - // SLM Libraries - Library.GenerateLibraryList(); - Library.GenerateOriginLibraryList(); - Library.GenerateUplayLibraryList(); + if (Properties.Settings.Default.Origin_IsEnabled) + { + await LoadOriginAsync(); + } - GenerateJunkList(); + if (Properties.Settings.Default.Uplay_IsEnabled) + { + LoadUplay(); + } if (Properties.Settings.Default.ParallelAfterSize >= 20000000) { @@ -191,50 +209,192 @@ public static async Task OnLoadAsync() } } - private static void LoadSteam() + public static bool LoadSteam() { try { + if (Definitions.Global.Steam.IsStateChanging) + return false; + + Definitions.Global.Steam.IsStateChanging = true; + Steam.UpdateSteamInstallationPathAsync(); Steam.PopulateLibraryCMenuItems(); Steam.PopulateAppCMenuItems(); Steam.Library.GenerateLibraryList(); + + Library.GenerateLibraryList(); + + Definitions.Global.Steam.IsStateChanging = false; + return true; } catch (Exception ex) { Logger.Fatal(ex); + Definitions.Global.Steam.IsStateChanging = false; + return false; } } - private static async Task LoadOriginAsync() + public static bool UnloadLibrary(LibraryType targetLibraryType) { try { + switch (targetLibraryType) + { + case LibraryType.Steam: + case LibraryType.SLM: + if (Definitions.Global.Steam.IsStateChanging) + { + return false; + } + else + { + Definitions.Global.Steam.IsStateChanging = true; + } + break; + + case LibraryType.Origin: + if (Definitions.Global.Origin.IsStateChanging) + { + return false; + } + else + { + Definitions.Global.Origin.IsStateChanging = true; + } + break; + + case LibraryType.Uplay: + if (Definitions.Global.Uplay.IsStateChanging) + { + return false; + } + else + { + Definitions.Global.Uplay.IsStateChanging = true; + } + break; + } + + if (TaskManager.TaskList.Count(x => (x.App.Library.Type == targetLibraryType || x.TargetLibrary.Type == targetLibraryType) && !x.Completed) > 0) + { + Logger.Warn($"Can't Unload {targetLibraryType} Libraries while there is an active task."); + + ToggleOffLibrarySwitchState(targetLibraryType); + return false; + } + + // Library Context Menu Items + foreach (var menuItem in Definitions.List.LibraryCMenuItems.Where(x => x.AllowedLibraryTypes.Contains(targetLibraryType)).ToList()) + { + Definitions.List.LibraryCMenuItems.Remove(menuItem); + } + + // App Context Menu Items + foreach (var menuItem in Definitions.List.AppCMenuItems.Where(x => x.AllowedLibraryTypes.Contains(targetLibraryType)).ToList()) + { + Definitions.List.AppCMenuItems.Remove(menuItem); + } + + foreach (var library in Definitions.List.Libraries.Where(x => x.Type == targetLibraryType).ToList()) + { + if (Definitions.SLM.CurrentSelectedLibrary == library) + { + Definitions.SLM.CurrentSelectedLibrary = null; + Main.FormAccessor.AppView.AppPanel.ItemsSource = null; + } + + Definitions.List.Libraries.Remove(library); + } + + ToggleOffLibrarySwitchState(targetLibraryType); + return true; + } + catch (Exception ex) + { + MessageBox.Show(ex.ToString()); + Logger.Fatal(ex); + + ToggleOffLibrarySwitchState(targetLibraryType); + return false; + } + } + + private static void ToggleOffLibrarySwitchState(LibraryType targetLibraryType) + { + switch (targetLibraryType) + { + case LibraryType.Steam: + case LibraryType.SLM: + Definitions.Global.Steam.IsStateChanging = false; + break; + + case LibraryType.Origin: + Definitions.Global.Origin.IsStateChanging = false; + break; + + case LibraryType.Uplay: + Definitions.Global.Uplay.IsStateChanging = false; + break; + } + } + + public static async Task LoadOriginAsync() + { + try + { + if (Definitions.Global.Origin.IsStateChanging) + return false; + + Definitions.Global.Origin.IsStateChanging = true; + Origin.PopulateLibraryCMenuItems(); Origin.PopulateAppCMenuItems(); await Origin.GenerateLibraryListAsync(); + + Library.GenerateOriginLibraryList(); + + Definitions.Global.Origin.IsStateChanging = false; + return true; } catch (Exception ex) { MessageBox.Show(ex.ToString()); Logger.Fatal(ex); + Definitions.Global.Origin.IsStateChanging = false; + return false; } } - private static void LoadUplay() + public static bool LoadUplay() { try { + if (Definitions.Global.Uplay.IsStateChanging) + return false; + + Definitions.Global.Uplay.IsStateChanging = true; + Uplay.PopulateLibraryCMenuItems(); Uplay.GenerateLibraryListAsync(); + + Library.GenerateUplayLibraryList(); + + Definitions.Global.Uplay.IsStateChanging = false; + + return true; } catch (Exception ex) { MessageBox.Show(ex.ToString()); Logger.Fatal(ex); + Definitions.Global.Uplay.IsStateChanging = false; + + return false; } } @@ -248,14 +408,12 @@ public static void GenerateJunkList() { try { - // If we don't have any SLM libraries available if (Properties.Settings.Default.IgnoredJunks == null) return; if (Properties.Settings.Default.IgnoredJunks.Count == 0) return; - // for each backup library we have, do a loop foreach (var ignoredJunk in Properties.Settings.Default.IgnoredJunks) { Definitions.List.IgnoredJunkItems.Add(ignoredJunk); @@ -357,7 +515,7 @@ public static async void AddNewAsync(string libraryPath) var library = new Definitions.SteamLibrary(libraryPath) { - Type = Definitions.Enums.LibraryType.SLM, + Type = LibraryType.SLM, DirectoryInfo = new DirectoryInfo(libraryPath) }; @@ -380,7 +538,7 @@ public static bool IsLibraryExists(string newLibraryPath) { try { - return Definitions.List.Libraries.Count(x => x.Type == Definitions.Enums.LibraryType.SLM) > 0 || Definitions.List.Libraries.Any(x => string.Equals(x.DirectoryInfo.FullName, newLibraryPath, StringComparison.InvariantCultureIgnoreCase)); + return Definitions.List.Libraries.Count(x => x.Type == LibraryType.SLM) > 0 || Definitions.List.Libraries.Any(x => string.Equals(x.DirectoryInfo.FullName, newLibraryPath, StringComparison.InvariantCultureIgnoreCase)); } catch (Exception ex) { diff --git a/Source/Steam Library Manager/Properties/Settings.Designer.cs b/Source/Steam Library Manager/Properties/Settings.Designer.cs index 8ddec4d3..38e01ced 100644 --- a/Source/Steam Library Manager/Properties/Settings.Designer.cs +++ b/Source/Steam Library Manager/Properties/Settings.Designer.cs @@ -460,5 +460,44 @@ public string LastUserVersion { this["UplayLibraries"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + [global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)] + public bool Steam_IsEnabled { + get { + return ((bool)(this["Steam_IsEnabled"])); + } + set { + this["Steam_IsEnabled"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + [global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)] + public bool Origin_IsEnabled { + get { + return ((bool)(this["Origin_IsEnabled"])); + } + set { + this["Origin_IsEnabled"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("True")] + [global::System.Configuration.SettingsManageabilityAttribute(global::System.Configuration.SettingsManageability.Roaming)] + public bool Uplay_IsEnabled { + get { + return ((bool)(this["Uplay_IsEnabled"])); + } + set { + this["Uplay_IsEnabled"] = value; + } + } } } diff --git a/Source/Steam Library Manager/Properties/Settings.settings b/Source/Steam Library Manager/Properties/Settings.settings index 5ee34869..5a9da65b 100644 --- a/Source/Steam Library Manager/Properties/Settings.settings +++ b/Source/Steam Library Manager/Properties/Settings.settings @@ -104,5 +104,14 @@ + + True + + + True + + + True + \ No newline at end of file diff --git a/Source/Steam Library Manager/Settings.cs b/Source/Steam Library Manager/Settings.cs index 76b267fb..72ee2e0c 100644 --- a/Source/Steam Library Manager/Settings.cs +++ b/Source/Steam Library Manager/Settings.cs @@ -1,4 +1,8 @@ using MahApps.Metro; +using MahApps.Metro.Controls.Dialogs; +using Steam_Library_Manager.Definitions.Enums; +using System; +using System.Diagnostics; using System.Windows; namespace Steam_Library_Manager.Properties @@ -11,7 +15,105 @@ namespace Steam_Library_Manager.Properties [System.Configuration.SettingsProvider(typeof(Framework.PortableSettingsProvider))] internal sealed partial class Settings { - public Settings() => PropertyChanged += Settings_PropertyChanged; + private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); + + public Settings() + { + PropertyChanged += Settings_PropertyChanged; + SettingChanging += Settings_SettingChanging; + } + + private async void Settings_SettingChanging(object sender, System.Configuration.SettingChangingEventArgs e) + { + try + { + if (e.SettingName == "Steam_IsEnabled") + { + if (Default.Steam_IsEnabled == (bool)e.NewValue) return; + + if (Definitions.Global.Steam.IsStateChanging) + { + Main.FormAccessor.AppView.AppPanel.Dispatcher?.Invoke(async delegate + { + await Main.FormAccessor.ShowMessageAsync("State is already changing!", + "State is already being changed for Steam libraries; please wait.", + MessageDialogStyle.AffirmativeAndNegative); + }, System.Windows.Threading.DispatcherPriority.Normal); + e.Cancel = true; + } + else + { + if ((bool)e.NewValue) + { + Functions.SLM.LoadSteam(); + } + else + { + Functions.SLM.UnloadLibrary(LibraryType.Steam); + Functions.SLM.UnloadLibrary(LibraryType.SLM); + } + } + } + else if (e.SettingName == "Origin_IsEnabled") + { + if (Default.Origin_IsEnabled == (bool)e.NewValue) return; + + if (Definitions.Global.Origin.IsStateChanging) + { + Main.FormAccessor.AppView.AppPanel.Dispatcher?.Invoke(async delegate + { + await Main.FormAccessor.ShowMessageAsync("State is already changing!", + "State is already being changed for Origin libraries; please wait.", + MessageDialogStyle.AffirmativeAndNegative); + }, System.Windows.Threading.DispatcherPriority.Normal); + e.Cancel = true; + } + else + { + if ((bool)e.NewValue) + { + await Functions.SLM.LoadOriginAsync(); + } + else + { + Functions.SLM.UnloadLibrary(LibraryType.Origin); + } + } + } + else if (e.SettingName == "Uplay_IsEnabled") + { + if (Default.Uplay_IsEnabled == (bool)e.NewValue) return; + + if (Definitions.Global.Uplay.IsStateChanging) + { + Main.FormAccessor.AppView.AppPanel.Dispatcher?.Invoke(async delegate + { + await Main.FormAccessor.ShowMessageAsync("State is already changing!", + "State is already being changed for Uplay libraries; please wait.", + MessageDialogStyle.AffirmativeAndNegative); + }, System.Windows.Threading.DispatcherPriority.Normal); + e.Cancel = true; + } + else + { + if ((bool)e.NewValue) + { + Functions.SLM.LoadUplay(); + } + else + { + Functions.SLM.UnloadLibrary(LibraryType.Uplay); + } + } + } + } + catch (Exception exception) + { + Debug.WriteLine(exception); + Logger.Fatal(exception); + throw; + } + } private void Settings_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { diff --git a/Source/Steam Library Manager/app.config b/Source/Steam Library Manager/app.config index 9326e533..fa351565 100644 --- a/Source/Steam Library Manager/app.config +++ b/Source/Steam Library Manager/app.config @@ -97,6 +97,15 @@ + + True + + + True + + + True +