From 23e1dbd2440ca9d31f32ea241ad69bc55b5f91f3 Mon Sep 17 00:00:00 2001 From: temacdonald Date: Sun, 14 Jun 2020 16:20:52 +1200 Subject: [PATCH] Transitioned Profiles to using ProfileRepository Moving to using a ProfileRespository will make it easier when moving to a WPF style app, and it will allow some freedom if I want to change the storage to a database or soemthing different. --- HeliosPlus.Shared/Helios.cs | 4 +- HeliosPlus.Shared/HeliosPlus.Shared.csproj | 10 + HeliosPlus.Shared/ProfileItem.cs | 287 ++------- HeliosPlus.Shared/ProfileRepository.cs | 583 ++++++++++++++++++ .../Properties/Resources.Designer.cs | 63 ++ HeliosPlus.Shared/Properties/Resources.resx | 120 ++++ HeliosPlus/HeliosPlus.csproj | 3 +- HeliosPlus/Program.cs | 124 ++-- HeliosPlus/Properties/Resources.Designer.cs | 16 +- HeliosPlus/Resources/HeliosPlus.png | Bin 117868 -> 0 bytes HeliosPlus/ShortcutItem.cs | 2 +- HeliosPlus/ShortcutRepository.cs | 2 +- HeliosPlus/UIForms/DisplayProfileForm.cs | 71 +-- HeliosPlus/UIForms/ProfileAdaptor.cs | 8 +- HeliosPlus/UIForms/ShortcutForm.cs | 8 +- HeliosPlus/Validators.cs | 6 +- 16 files changed, 946 insertions(+), 361 deletions(-) create mode 100644 HeliosPlus.Shared/ProfileRepository.cs create mode 100644 HeliosPlus.Shared/Properties/Resources.Designer.cs create mode 100644 HeliosPlus.Shared/Properties/Resources.resx delete mode 100644 HeliosPlus/Resources/HeliosPlus.png diff --git a/HeliosPlus.Shared/Helios.cs b/HeliosPlus.Shared/Helios.cs index 24f0268..4e0c55a 100644 --- a/HeliosPlus.Shared/Helios.cs +++ b/HeliosPlus.Shared/Helios.cs @@ -60,7 +60,7 @@ namespace HeliosPlus.Shared if (profile != null) { - args.Add($"-p \"{profile.Id}\""); + args.Add($"-p \"{profile.UUID}\""); } if (!string.IsNullOrWhiteSpace(programAddress)) @@ -108,7 +108,7 @@ namespace HeliosPlus.Shared if (profile != null) { - args.Add($"-p \"{profile.Id}\""); + args.Add($"-p \"{profile.UUID}\""); } if (steamAppId > 0) diff --git a/HeliosPlus.Shared/HeliosPlus.Shared.csproj b/HeliosPlus.Shared/HeliosPlus.Shared.csproj index 711ecc8..d0d2acf 100644 --- a/HeliosPlus.Shared/HeliosPlus.Shared.csproj +++ b/HeliosPlus.Shared/HeliosPlus.Shared.csproj @@ -40,6 +40,11 @@ + + True + True + Resources.resx + @@ -54,6 +59,7 @@ + @@ -73,6 +79,10 @@ + + ResXFileCodeGenerator + Resources.Designer.cs + ResXFileCodeGenerator Language.Designer.cs diff --git a/HeliosPlus.Shared/ProfileItem.cs b/HeliosPlus.Shared/ProfileItem.cs index af0c720..14879e1 100644 --- a/HeliosPlus.Shared/ProfileItem.cs +++ b/HeliosPlus.Shared/ProfileItem.cs @@ -15,12 +15,12 @@ using HeliosPlus.Shared.Topology; using System.Drawing; using System.Drawing.Imaging; using WindowsDisplayAPI; +using System.Text.RegularExpressions; namespace HeliosPlus.Shared { public class ProfileItem { - private static ProfileItem _currentProfile; private static List _allSavedProfiles = new List(); private ProfileIcon _profileIcon; private Bitmap _profileBitmap, _profileShortcutBitmap; @@ -29,6 +29,11 @@ namespace HeliosPlus.Shared internal static string AppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "HeliosPlus"); + private string _uuid; + private Version _version; + private bool _isActive = false; + private bool _isPossible = false; + #region JsonConverterBitmap internal class CustomBitmapConverter : JsonConverter @@ -104,14 +109,22 @@ namespace HeliosPlus.Shared public static Version Version = new Version(2, 1); - public string Id { get; set; } = Guid.NewGuid().ToString("B"); + #region Instance Properties - [JsonIgnore] - public bool IsActive + public string UUID { get { - return _currentProfile.Equals(this); + if (String.IsNullOrWhiteSpace(_uuid)) + _uuid = Guid.NewGuid().ToString("B"); + return _uuid; + } + set + { + string uuidV4Regex = @"/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i"; + Match match = Regex.Match(value, uuidV4Regex, RegexOptions.IgnoreCase); + if (match.Success) + _uuid = value; } } @@ -152,34 +165,6 @@ namespace HeliosPlus.Shared public ProfileViewport[] Viewports { get; set; } = new ProfileViewport[0]; - public static string SavedProfilesFilePath - { - get => System.IO.Path.Combine(AppDataPath, $"Profiles\\DisplayProfiles_{Version.ToString(2)}.json"); - } - - public static string SavedProfilesPath - { - get => System.IO.Path.Combine(AppDataPath, $"Profiles"); - } - - public static List AllSavedProfiles - { - get - { - if (_allSavedProfiles.Count == 0) - { - ProfileItem.LoadAllProfiles(); - } - return _allSavedProfiles; - } - } - - public static ProfileItem CurrentProfile - { - get => _currentProfile; - } - - public ProfileIcon ProfileIcon { get @@ -199,8 +184,7 @@ namespace HeliosPlus.Shared } - public string SavedProfileCacheFilename { get; set; } - + public string SavedProfileIconCacheFilename { get; set; } [JsonConverter(typeof(CustomBitmapConverter))] public Bitmap ProfileBitmap @@ -242,82 +226,7 @@ namespace HeliosPlus.Shared } - public static List LoadAllProfiles() - { - - if (File.Exists(SavedProfilesFilePath)) - { - var json = File.ReadAllText(SavedProfilesFilePath, Encoding.Unicode); - - if (!string.IsNullOrWhiteSpace(json)) - { - List profiles = new List(); - try - { - //var profiles = JsonConvert.DeserializeObject(json, new JsonSerializerSettings - profiles = JsonConvert.DeserializeObject>(json, new JsonSerializerSettings - { - MissingMemberHandling = MissingMemberHandling.Ignore, - NullValueHandling = NullValueHandling.Ignore, - DefaultValueHandling = DefaultValueHandling.Include, - TypeNameHandling = TypeNameHandling.Auto - }); - } - catch (Exception ex) - { - // ignored - Console.WriteLine("Unable to deserialize profile: " + ex.Message); - } - - - //Convert array to list - //List profilesList = profiles.ToList(); - - // Find which entry is being used now, and save that info in a class variable - ProfileItem myCurrentProfile = new ProfileItem - { - Name = "Current Display Profile", - Viewports = PathInfo.GetActivePaths().Select(info => new ProfileViewport(info)).ToArray() - }; - - _currentProfile = myCurrentProfile; - - foreach (ProfileItem loadedProfile in profiles) - { - // Save a profile Icon to the profile - loadedProfile.ProfileIcon = new ProfileIcon(loadedProfile); - loadedProfile.ProfileBitmap = loadedProfile.ProfileIcon.ToBitmap(128,128); - - if (loadedProfile.IsActive) { - _currentProfile = loadedProfile; - } - - } - - _allSavedProfiles = profiles; - - return _allSavedProfiles; - } - } - - // If we get here, then we don't have any profiles saved! - // So we gotta start from scratch - // Create a new profile based on our current display settings - _currentProfile = new ProfileItem - { - Name = "Current Display Profile", - Viewports = PathInfo.GetActivePaths().Select(info => new ProfileViewport(info)).ToArray() - }; - - // Save a profile Icon to the profile - _currentProfile.ProfileIcon = new ProfileIcon(_currentProfile); - _currentProfile.ProfileBitmap = _currentProfile.ProfileIcon.ToBitmap(128, 128); - - // Create a new empty list of all our display profiles as we don't have any saved! - _allSavedProfiles = new List(); - - return _allSavedProfiles; - } + #endregion public static bool IsValidName(string testName) { @@ -334,89 +243,33 @@ namespace HeliosPlus.Shared public static bool IsValidId(string testId) { - foreach (ProfileItem loadedProfile in _allSavedProfiles) - { - if (loadedProfile.Id == testId) - { - return false; - } - } - - return true; - } - - - public static void UpdateCurrentProfile() - { - _currentProfile = new ProfileItem - { - Name = "Current Display Profile", - Viewports = PathInfo.GetActivePaths().Select(info => new ProfileViewport(info)).ToArray() - }; - } - - public static bool SaveAllProfiles() - { - if (SaveAllProfiles(_allSavedProfiles)) + string uuidV4Regex = @"/^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i"; + Match match = Regex.Match(testId, uuidV4Regex, RegexOptions.IgnoreCase); + if (match.Success) return true; - return false; + else + return false; } - public static bool SaveAllProfiles(List profilesToSave) + + public bool CopyTo(ProfileItem profile, bool overwriteId = false) { + if (!(profile is ProfileItem)) + return false; - if (!Directory.Exists(SavedProfilesPath)) - { - try - { - Directory.CreateDirectory(SavedProfilesPath); - } - catch (Exception ex) - { - Console.WriteLine("Unable to create Profile folder " + SavedProfilesPath + ": " + ex.Message); - } - } + if (overwriteId) + profile.UUID = UUID; - - // Now we loop over the profiles and save their images for later - foreach (ProfileItem profileToSave in profilesToSave) - { - profileToSave.SaveProfileImageToCache(); - } - - try - { - var json = JsonConvert.SerializeObject(profilesToSave, Formatting.Indented, new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Include, - DefaultValueHandling = DefaultValueHandling.Populate, - TypeNameHandling = TypeNameHandling.Auto - - }); - - - if (!string.IsNullOrWhiteSpace(json)) - { - var dir = System.IO.Path.GetDirectoryName(SavedProfilesPath); - - if (dir != null) - { - Directory.CreateDirectory(dir); - File.WriteAllText(SavedProfilesFilePath, json, Encoding.Unicode); - - return true; - } - } - } - catch (Exception ex) - { - Console.WriteLine("Unable to serialize profile: " + ex.Message); - } - - // Overwrite the list of saved profiles as the new lot we received. - _allSavedProfiles = profilesToSave; - - return false; + // Copy all our profile data over to the other profile + profile.Name = Name; + profile.UUID = UUID; + profile.Name = Name; + profile.Viewports = Viewports; + profile.ProfileIcon = ProfileIcon; + profile.SavedProfileIconCacheFilename = SavedProfileIconCacheFilename; + profile.ProfileBitmap = ProfileBitmap; + profile.ProfileTightestBitmap = ProfileTightestBitmap; + return true; } @@ -481,22 +334,7 @@ namespace HeliosPlus.Shared return uncheckedFilename; } - public bool SaveProfileImageToCache() - { - this.SavedProfileCacheFilename = Path.Combine(SavedProfilesPath, GetValidFilename(String.Concat(this.Name + @".png"))); - try - { - this.ProfileBitmap.Save(this.SavedProfileCacheFilename, ImageFormat.Png); - return true; - } - catch (Exception ex) - { - Console.WriteLine("Unable to create profile image in cache using " + this.SavedProfileCacheFilename + ": " + ex.Message); - return false; - } - } - - private void _applyTopos() + public void ApplyTopos() { Debug.Print("_applyTopos()"); try @@ -533,7 +371,7 @@ namespace HeliosPlus.Shared } } - private void _applyPathInfos() + public void ApplyPathInfos() { Debug.Print("_applyPathInfos()"); if (!IsPossible) @@ -550,8 +388,8 @@ namespace HeliosPlus.Shared { var dict = new Dictionary() { - { "Applying_Topos", _applyTopos }, - { "Applying_Paths", _applyPathInfos } + { "Applying_Topos", ApplyTopos }, + { "Applying_Paths", ApplyPathInfos } }; return dict; } @@ -572,41 +410,6 @@ namespace HeliosPlus.Shared return list; } - public bool Apply() - { - try - { - - Debug.Print("Begin profile change"); - Thread.Sleep(2000); - _applyTopos(); - - Debug.Print("Finished setting topologies"); - Debug.Print("Sleep"); - Thread.Sleep(18000); - Debug.Print("Awake"); - - _applyPathInfos(); - - Debug.Print("Applying pathInfos"); - Debug.Print("Sleep"); - Thread.Sleep(10000); - Debug.Print("Awake"); - - UpdateCurrentProfile(); - - return true; - } - catch (Exception ex) - { - UpdateCurrentProfile(); - Console.WriteLine($"Profile: Problem applying the '{Name}' Display Profile: {ex.Message}"); - MessageBox.Show($"Problem applying the '{Name}' Display Profile! \n(ex.Message)", $"Problem applying '{Name}' Profile", MessageBoxButtons.OK, MessageBoxIcon.Error); - - return false; - } - } - } // Custom comparer for the Profile class diff --git a/HeliosPlus.Shared/ProfileRepository.cs b/HeliosPlus.Shared/ProfileRepository.cs new file mode 100644 index 0000000..8247225 --- /dev/null +++ b/HeliosPlus.Shared/ProfileRepository.cs @@ -0,0 +1,583 @@ +using HeliosPlus.Shared; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.Drawing.IconLib; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using WindowsDisplayAPI.DisplayConfig; +using HeliosPlus.Shared.Resources; +using Newtonsoft.Json; +using NvAPIWrapper.Mosaic; +using NvAPIWrapper.Native.Mosaic; +using HeliosPlus.Shared.Topology; +using System.Drawing; +using System.Drawing.Imaging; +using WindowsDisplayAPI; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; +using System.Text.RegularExpressions; +using System.Resources; + +namespace HeliosPlus.Shared +{ + + public class ProfileRepository + { + #region Class Variables + // Common items to the class + private static List _allProfiles = new List(); + public static Version Version = new Version(1, 0, 0); + // Other constants that are useful + public static string AppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "HeliosPlus"); + public static string AppIconPath = Path.Combine(AppDataPath, $"Icons"); + public static string AppHeliosPlusIconFilename = Path.Combine(AppIconPath, @"HeliosPlus.ico"); + private static string _profileStorageJsonPath = Path.Combine(AppDataPath, $"Profiles"); + private static string _profileStorageJsonFileName = Path.Combine(_profileStorageJsonPath, $"DisplayProfiles_{Version.ToString(2)}.json"); + private static uint _lastProfileId; + private static ProfileItem _currentProfile; + private static List _availableDisplays; + private static List _unavailableDisplays; + + #endregion + + #region Instance Variables + // Individual items per class instance + #endregion + + + #region Class Constructors + public ProfileRepository() + { + // Load the Profiles from storage + LoadProfiles(); + } + + public ProfileRepository(ProfileItem Profile) : this() + { + if (Profile is ProfileItem) + AddProfile(Profile); + } + #endregion + + #region Class Properties + public static List AllProfiles + { + get + { + if (_allProfiles == null) + // Load the Profiles from storage if they need to be + LoadProfiles(); + return _allProfiles; + } + } + + public static ProfileItem CurrentProfile + { + get + { + UpdateActiveProfile(); + return _currentProfile; + } + set + { + if (value is ProfileItem) + { + _currentProfile = value; + // And if we have the _originalBitmap we can also save the Bitmap overlay, but only if the ProfileToUse is set + //if (_originalBitmap is Bitmap) + // _shortcutBitmap = ToBitmapOverlay(_originalBitmap, ProfileToUse.ProfileTightestBitmap, 256, 256); + } + } + } + + public static int ProfileCount + { + get + { + return _allProfiles.Count; + } + } + + #endregion + + #region Class Methods + public static bool AddProfile(ProfileItem Profile) + { + if (!(Profile is ProfileItem)) + return false; + + // Doublecheck if it already exists + // Because then we just update the one that already exists + if (ContainsProfile(Profile)) + { + // We update the existing Profile with the data over + ProfileItem ProfileToUpdate = GetProfile(Profile.UUID); + Profile.CopyTo(ProfileToUpdate); + } + else + { + // Add the Profile to the list of Profiles + _allProfiles.Add(Profile); + } + + //Doublecheck it's been added + if (ContainsProfile(Profile)) + { + // Generate the Profile Icon ready to be used + SaveProfileIconToCache(Profile); + + // Save the Profiles JSON as it's different + SaveProfiles(); + + return true; + } + else + return false; + + } + + public static bool RemoveProfile(ProfileItem Profile) + { + if (!(Profile is ProfileItem)) + return false; + + // Remove the Profile Icons from the Cache + List ProfilesToRemove = _allProfiles.FindAll(item => item.UUID.Equals(Profile.UUID)); + foreach (ProfileItem ProfileToRemove in ProfilesToRemove) + { + try + { + File.Delete(ProfileToRemove.SavedProfileIconCacheFilename); + } + catch + { + // TODO check and report + } + } + + // Remove the Profile from the list. + int numRemoved = _allProfiles.RemoveAll(item => item.UUID.Equals(Profile.UUID)); + + if (numRemoved == 1) + { + SaveProfiles(); + return true; + } + else if (numRemoved == 0) + return false; + else + throw new ProfileRepositoryException(); + } + + + public static bool RemoveProfile(string ProfileName) + { + if (String.IsNullOrWhiteSpace(ProfileName)) + return false; + + // Remove the Profile Icons from the Cache + List ProfilesToRemove = _allProfiles.FindAll(item => item.Name.Equals(ProfileName)); + foreach (ProfileItem ProfileToRemove in ProfilesToRemove) + { + try + { + File.Delete(ProfileToRemove.SavedProfileIconCacheFilename); + } + catch + { + // TODO check and report + } + } + + // Remove the Profile from the list. + int numRemoved = _allProfiles.RemoveAll(item => item.Name.Equals(ProfileName)); + + if (numRemoved == 1) + { + SaveProfiles(); + return true; + } + else if (numRemoved == 0) + return false; + else + throw new ProfileRepositoryException(); + + } + + public static bool RemoveProfile(uint ProfileId) + { + if (ProfileId == 0) + return false; + + // Remove the Profile Icons from the Cache + List ProfilesToRemove = _allProfiles.FindAll(item => item.UUID.Equals(ProfileId)); + foreach (ProfileItem ProfileToRemove in ProfilesToRemove) + { + try + { + File.Delete(ProfileToRemove.SavedProfileIconCacheFilename); + } + catch + { + // TODO check and report + } + } + + // Remove the Profile from the list. + int numRemoved = _allProfiles.RemoveAll(item => item.UUID.Equals(ProfileId)); + + if (numRemoved == 1) + { + SaveProfiles(); + return true; + } + else if (numRemoved == 0) + return false; + else + throw new ProfileRepositoryException(); + } + + + public static bool ContainsProfile(ProfileItem Profile) + { + if (!(Profile is ProfileItem)) + return false; + + foreach (ProfileItem testProfile in _allProfiles) + { + if (testProfile.UUID.Equals(Profile.UUID)) + return true; + } + + return false; + } + + public static bool ContainsProfile(string ProfileNameOrId) + { + if (String.IsNullOrWhiteSpace(ProfileNameOrId)) + return false; + + if (ProfileItem.IsValidId(ProfileNameOrId)) + foreach (ProfileItem testProfile in _allProfiles) + { + if (testProfile.UUID.Equals(ProfileNameOrId)) + return true; + } + else + foreach (ProfileItem testProfile in _allProfiles) + { + if (testProfile.Name.Equals(ProfileNameOrId)) + return true; + } + + return false; + + } + + public static ProfileItem GetProfile(string ProfileNameOrId) + { + if (String.IsNullOrWhiteSpace(ProfileNameOrId)) + return null; + + if (ProfileItem.IsValidId(ProfileNameOrId)) + foreach (ProfileItem testProfile in _allProfiles) + { + if (testProfile.UUID.Equals(ProfileNameOrId)) + return testProfile; + } + else + foreach (ProfileItem testProfile in _allProfiles) + { + if (testProfile.Name.Equals(ProfileNameOrId)) + return testProfile; + } + + return null; + } + + public static bool RenameProfile(ProfileItem profile, string renamedName) + { + if (!(profile is ProfileItem)) + return false; + + if (!IsValidFilename(renamedName)) + return false; + + profile.Name = GetValidFilename(renamedName); + + // If it's been added to the list of AllProfiles + // then we also need to reproduce the Icons + if (ContainsProfile(profile)) + { + + + // rename the old Profile Icon to the new name + string newSavedProfileIconCacheFilename = Path.Combine(_profileStorageJsonPath, String.Concat(@"profile-", GetValidFilename(profile.Name).ToLower(CultureInfo.InvariantCulture), @".ico")); + File.Move(profile.SavedProfileIconCacheFilename, newSavedProfileIconCacheFilename); + + // Then update the profile too + profile.SavedProfileIconCacheFilename = newSavedProfileIconCacheFilename; + + // Save the Profiles JSON as it's different now + SaveProfiles(); + + return true; + } + else + return false; + + } + + + public static void UpdateActiveProfile() + { + _currentProfile = new ProfileItem + { + Name = "Current Display Profile", + Viewports = PathInfo.GetActivePaths().Select(info => new ProfileViewport(info)).ToArray(), + ProfileIcon = new ProfileIcon(_currentProfile), + ProfileBitmap = _currentProfile.ProfileIcon.ToBitmap(256, 256) + }; + + } + + + public static ProfileItem GetActiveProfile() + { + UpdateActiveProfile(); + + if (!(_currentProfile is ProfileItem)) + return null; + return _currentProfile; + } + + public static bool IsActiveProfile(ProfileItem profile) + { + UpdateActiveProfile(); + + if (!(_currentProfile is ProfileItem)) + return false; + + if (!(profile is ProfileItem)) + return false; + + if (profile.Equals(_currentProfile)) + return true; + + return false; + } + + private static bool LoadProfiles() + { + + if (File.Exists(_profileStorageJsonFileName)) + { + var json = File.ReadAllText(_profileStorageJsonFileName, Encoding.Unicode); + + if (!string.IsNullOrWhiteSpace(json)) + { + List profiles = new List(); + try + { + _allProfiles = JsonConvert.DeserializeObject>(json, new JsonSerializerSettings + { + MissingMemberHandling = MissingMemberHandling.Ignore, + NullValueHandling = NullValueHandling.Ignore, + DefaultValueHandling = DefaultValueHandling.Include, + TypeNameHandling = TypeNameHandling.Auto + }); + } + catch (Exception ex) + { + // ignored + Console.WriteLine($"Unable to load Profiles from JSON file {_profileStorageJsonFileName}: " + ex.Message); + } + + ProfileItem myCurrentProfile = new ProfileItem + { + Name = "Current Display Profile", + Viewports = PathInfo.GetActivePaths().Select(info => new ProfileViewport(info)).ToArray() + }; + + _currentProfile = myCurrentProfile; + + // Lookup all the Profile Names in the Saved Profiles + foreach (ProfileItem loadedProfile in profiles) + { + // Save a profile Icon to the profile + loadedProfile.ProfileIcon = new ProfileIcon(loadedProfile); + loadedProfile.ProfileBitmap = loadedProfile.ProfileIcon.ToBitmap(128, 128); + + if (ProfileRepository.IsActiveProfile(loadedProfile)) + _currentProfile = loadedProfile; + + } + } + } else + { + // If we get here, then we don't have any profiles saved! + // So we gotta start from scratch + // Create a new profile based on our current display settings + ProfileItem myCurrentProfile = new ProfileItem + { + Name = "Current Display Profile", + Viewports = PathInfo.GetActivePaths().Select(info => new ProfileViewport(info)).ToArray() + }; + + _currentProfile = myCurrentProfile; + + // Save a profile Icon to the profile + _currentProfile.ProfileIcon = new ProfileIcon(_currentProfile); + _currentProfile.ProfileBitmap = _currentProfile.ProfileIcon.ToBitmap(256, 256); + } + return true; + } + + public static bool SaveProfiles() + { + + if (!Directory.Exists(_profileStorageJsonPath)) + { + try + { + Directory.CreateDirectory(_profileStorageJsonPath); + } + catch (Exception ex) + { + Console.WriteLine($"Unable to create Profile folder {_profileStorageJsonPath}: " + ex.Message); + + } + } + + try + { + var json = JsonConvert.SerializeObject(_allProfiles, Formatting.Indented, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Include, + DefaultValueHandling = DefaultValueHandling.Populate, + TypeNameHandling = TypeNameHandling.Auto + + }); + + + if (!string.IsNullOrWhiteSpace(json)) + { + File.WriteAllText(_profileStorageJsonFileName, json, Encoding.Unicode); + return true; + } + } + catch (Exception ex) + { + Console.WriteLine($"Unable to save Profile JSON file {_profileStorageJsonFileName}: " + ex.Message); + } + + return false; + } + + private static void SaveProfileIconToCache(ProfileItem profile) + { + + // Work out the name of the Profile we'll save. + profile.SavedProfileIconCacheFilename = Path.Combine(_profileStorageJsonPath, String.Concat(@"profile-", GetValidFilename(profile.Name).ToLower(CultureInfo.InvariantCulture), @".ico")); + + MultiIcon ProfileIcon; + try + { + ProfileIcon = profile.ProfileIcon.ToIcon(); + ProfileIcon.Save(profile.SavedProfileIconCacheFilename, MultiIconFormat.ICO); + } + catch (Exception ex) + { + // If we fail to create an icon based on the Profile, then we use the standard HeliosPlus profile one. + // Which is created on program startup. + File.Copy(AppHeliosPlusIconFilename, profile.SavedProfileIconCacheFilename); + + } + } + + public static void UpdateCurrentProfile() + { + _currentProfile = new ProfileItem + { + Name = "Current Display Profile", + Viewports = PathInfo.GetActivePaths().Select(info => new ProfileViewport(info)).ToArray() + }; + } + + public static bool ApplyProfile(ProfileItem profile) + { + try + { + + Debug.Print("Begin profile change"); + Thread.Sleep(2000); + profile.ApplyTopos(); + + Debug.Print("Finished setting topologies"); + Debug.Print("Sleep"); + Thread.Sleep(18000); + Debug.Print("Awake"); + + profile.ApplyPathInfos(); + + Debug.Print("Applying pathInfos"); + Debug.Print("Sleep"); + Thread.Sleep(10000); + Debug.Print("Awake"); + + UpdateCurrentProfile(); + + return true; + } + catch (Exception ex) + { + UpdateCurrentProfile(); + Console.WriteLine($"Profile: Problem applying the '{profile.Name}' Display Profile: {ex.Message}"); + MessageBox.Show($"Problem applying the '{profile.Name}' Display Profile! \n(ex.Message)", $"Problem applying '{profile.Name}' Profile", MessageBoxButtons.OK, MessageBoxIcon.Error); + + return false; + } + } + + public static bool IsValidFilename(string testName) + { + string strTheseAreInvalidFileNameChars = new string(Path.GetInvalidFileNameChars()); + Regex regInvalidFileName = new Regex("[" + Regex.Escape(strTheseAreInvalidFileNameChars) + "]"); + + if (regInvalidFileName.IsMatch(testName)) { return false; }; + + return true; + } + + public static string GetValidFilename(string uncheckedFilename) + { + string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); + foreach (char c in invalid) + { + uncheckedFilename = uncheckedFilename.Replace(c.ToString(), ""); + } + return uncheckedFilename; + } + + #endregion + + } + + + [global::System.Serializable] + public class ProfileRepositoryException : Exception + { + public ProfileRepositoryException() { } + public ProfileRepositoryException(string message) : base(message) { } + public ProfileRepositoryException(string message, Exception inner) : base(message, inner) { } + protected ProfileRepositoryException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } + + +} diff --git a/HeliosPlus.Shared/Properties/Resources.Designer.cs b/HeliosPlus.Shared/Properties/Resources.Designer.cs new file mode 100644 index 0000000..cfee2eb --- /dev/null +++ b/HeliosPlus.Shared/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace HeliosPlus.Shared.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeliosPlus.Shared.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/HeliosPlus.Shared/Properties/Resources.resx b/HeliosPlus.Shared/Properties/Resources.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/HeliosPlus.Shared/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/HeliosPlus/HeliosPlus.csproj b/HeliosPlus/HeliosPlus.csproj index e9a7aaa..9962dab 100644 --- a/HeliosPlus/HeliosPlus.csproj +++ b/HeliosPlus/HeliosPlus.csproj @@ -149,7 +149,7 @@ Designer - ResXFileCodeGenerator + PublicResXFileCodeGenerator Resources.Designer.cs Designer @@ -235,7 +235,6 @@ - diff --git a/HeliosPlus/Program.cs b/HeliosPlus/Program.cs index 53bd113..92d125f 100644 --- a/HeliosPlus/Program.cs +++ b/HeliosPlus/Program.cs @@ -18,6 +18,7 @@ using HeliosPlus.Shared; using HeliosPlus.UIForms; using System.Net.NetworkInformation; using System.Text.RegularExpressions; +using System.Drawing; namespace HeliosPlus { public enum SupportedGameLibrary @@ -31,15 +32,21 @@ namespace HeliosPlus { { internal static string AppDataPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "HeliosPlus"); + public static string AppIconPath = Path.Combine(Program.AppDataPath, $"Icons"); + public static string AppHeliosPlusIconFilename = Path.Combine(AppIconPath, @"HeliosPlus.ico"); + public static string AppOriginIconFilename = Path.Combine(AppIconPath, @"Origin.ico"); + public static string AppSteamIconFilename = Path.Combine(AppIconPath, @"Steam.ico"); + public static string AppUplayIconFilename = Path.Combine(AppIconPath, @"Steam.ico"); + public static string AppEpicIconFilename = Path.Combine(AppIconPath, @"Epic.ico"); //internal static string ShortcutIconCachePath; internal static ProfileItem GetProfile(string profileName) { // Create an array of display profiles we have - var profiles = ProfileItem.LoadAllProfiles().ToArray(); + var profiles = ProfileRepository.AllProfiles.ToArray(); // Check if the user supplied a --profile option using the profiles' ID - var profileIndex = profiles.Length > 0 ? Array.FindIndex(profiles, p => p.Id.Equals(profileName, StringComparison.InvariantCultureIgnoreCase)) : -1; + var profileIndex = profiles.Length > 0 ? Array.FindIndex(profiles, p => p.UUID.Equals(profileName, StringComparison.InvariantCultureIgnoreCase)) : -1; // If the profileID wasn't there, maybe they used the profile name? if (profileIndex == -1) { @@ -52,10 +59,9 @@ namespace HeliosPlus { internal static bool GoProfile(ProfileItem profile) { - if (profile.IsActive) - { + // If we're already on the wanted profile then no need to change! + if (ProfileRepository.IsActiveProfile(profile)) return true; - } var instanceStatus = IPCService.GetInstance().Status; @@ -68,7 +74,7 @@ namespace HeliosPlus { { Task.Factory.StartNew(() => { - if (!profile.Apply()) + if (!(ProfileRepository.ApplyProfile(profile))) { failed = true; } @@ -97,7 +103,7 @@ namespace HeliosPlus { // Get the status of the thing IPCService.GetInstance().Status = InstanceStatus.User; // Load all the profiles from JSON - ProfileItem.LoadAllProfiles().ToArray(); + //ProfileRepository.AllProfiles // Start up the DisplayProfileForm directly new DisplayProfileForm(profile).ShowDialog(); // Then we close down as we're only here to edit one profile @@ -122,33 +128,6 @@ namespace HeliosPlus { Console.WriteLine(@"Copyright © Terry MacDonald 2020-{DateTime.Today.Year}"); Console.WriteLine(@"Based on Helios Display Management - Copyright © Soroush Falahati 2017-2020"); - /*// Figure out where the shortcut's will go - ShortcutIconCachePath = Path.Combine(AppDataPath, @"ShortcutIconCache"); - - // Create the Shortcut Icon Cache if it doesn't exist so that it's avilable for all the program - if (!Directory.Exists(AppDataPath)) - { - try - { - Directory.CreateDirectory(ShortcutIconCachePath); - } - catch - { - } - } - - // Create the Shortcut Icon Cache if it doesn't exist so that it's avilable for all the program - if (!Directory.Exists(ShortcutIconCachePath)) - { - try - { - Directory.CreateDirectory(ShortcutIconCachePath); - } - catch - { - } - }*/ - var app = new CommandLineApplication(); //app.Name = "HeliosDM+"; @@ -253,6 +232,66 @@ namespace HeliosPlus { } + // Create the Shortcut Icon Cache if it doesn't exist so that it's avilable for all the program + if (!Directory.Exists(AppIconPath)) + { + try + { + Directory.CreateDirectory(AppIconPath); + } + catch + { + // TODO + } + } + + try + { + // Save a copy of the HeliosPlus Icon, and all the game library ones in preparation for future use + if (!File.Exists(AppHeliosPlusIconFilename)) + { + Icon heliosIcon = (Icon)Properties.Resources.HeliosPlus; + using (FileStream fs = new FileStream(AppHeliosPlusIconFilename, FileMode.Create)) + heliosIcon.Save(fs); + } + + // Save a copy of the Steam Icon, and all the game library ones in preparation for future use + if (!File.Exists(AppSteamIconFilename)) + { + Icon heliosIcon = (Icon)Properties.Resources.Steam; + using (FileStream fs = new FileStream(AppSteamIconFilename, FileMode.Create)) + heliosIcon.Save(fs); + } + + // Save a copy of the Uplay Icon, and all the game library ones in preparation for future use + if (!File.Exists(AppUplayIconFilename)) + { + Icon heliosIcon = (Icon)Properties.Resources.Uplay; + using (FileStream fs = new FileStream(AppUplayIconFilename, FileMode.Create)) + heliosIcon.Save(fs); + } + + // Save a copy of the Epic Icon, and all the game library ones in preparation for future use + if (!File.Exists(AppEpicIconFilename)) + { + Icon heliosIcon = (Icon)Properties.Resources.Epic; + using (FileStream fs = new FileStream(AppEpicIconFilename, FileMode.Create)) + heliosIcon.Save(fs); + } + + // Save a copy of the Origin Icon, and all the game library ones in preparation for future use + if (!File.Exists(AppOriginIconFilename)) + { + Icon heliosIcon = (Icon)Properties.Resources.Origin; + using (FileStream fs = new FileStream(AppOriginIconFilename, FileMode.Create)) + heliosIcon.Save(fs); + } + } + catch + { + // TODO + } + IPCService.GetInstance().Status = InstanceStatus.User; Application.Run(new UIForms.MainForm()); @@ -270,7 +309,7 @@ namespace HeliosPlus { private static void SwitchToExecutable(ProfileItem profile, string executableToRun, string processToMonitor, uint timeout, string executableArguments) { - var rollbackProfile = ProfileItem.CurrentProfile; + var rollbackProfile = ProfileRepository.CurrentProfile; if (!profile.IsPossible) { @@ -361,7 +400,8 @@ namespace HeliosPlus { IPCService.GetInstance().Status = InstanceStatus.Busy; - if (!rollbackProfile.IsActive) + // Change back to the original profile if it is different + if (!ProfileRepository.IsActiveProfile(rollbackProfile)) { if (!GoProfile(rollbackProfile)) { @@ -383,7 +423,7 @@ namespace HeliosPlus { } // Save the profile we're on now - var rollbackProfile = ProfileItem.CurrentProfile; + var rollbackProfile = ProfileRepository.CurrentProfile; // Check that the profile we've been asked to change to will actually work if (!profile.IsPossible) @@ -502,7 +542,8 @@ namespace HeliosPlus { IPCService.GetInstance().Status = InstanceStatus.Busy; - if (!rollbackProfile.IsActive) + // Change back to the original profile if it is different + if (!ProfileRepository.IsActiveProfile(rollbackProfile)) { if (!GoProfile(rollbackProfile)) { @@ -515,7 +556,7 @@ namespace HeliosPlus { private static void SwitchToUplayGame(ProfileItem profile, string uplayGameIdToRun, uint timeout, string uplayGameArguments) { - var rollbackProfile = ProfileItem.CurrentProfile; + var rollbackProfile = ProfileRepository.CurrentProfile; if (!profile.IsPossible) { @@ -629,7 +670,8 @@ namespace HeliosPlus { IPCService.GetInstance().Status = InstanceStatus.Busy; - if (!rollbackProfile.IsActive) + // Change back to the original profile if it is different + if (!ProfileRepository.IsActiveProfile(rollbackProfile)) { if (!GoProfile(rollbackProfile)) { @@ -643,7 +685,7 @@ namespace HeliosPlus { // ReSharper disable once CyclomaticComplexity private static void SwitchToProfile(ProfileItem profile) { - var rollbackProfile = ProfileItem.CurrentProfile; + var rollbackProfile = ProfileRepository.CurrentProfile; if ( IPCClient.QueryAll() diff --git a/HeliosPlus/Properties/Resources.Designer.cs b/HeliosPlus/Properties/Resources.Designer.cs index f0f0e9f..96ddb49 100644 --- a/HeliosPlus/Properties/Resources.Designer.cs +++ b/HeliosPlus/Properties/Resources.Designer.cs @@ -22,7 +22,7 @@ namespace HeliosPlus.Properties { [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; @@ -36,7 +36,7 @@ namespace HeliosPlus.Properties { /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("HeliosPlus.Properties.Resources", typeof(Resources).Assembly); @@ -51,7 +51,7 @@ namespace HeliosPlus.Properties { /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -63,7 +63,7 @@ namespace HeliosPlus.Properties { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon Epic { + public static System.Drawing.Icon Epic { get { object obj = ResourceManager.GetObject("Epic", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -73,7 +73,7 @@ namespace HeliosPlus.Properties { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon HeliosPlus { + public static System.Drawing.Icon HeliosPlus { get { object obj = ResourceManager.GetObject("HeliosPlus", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -83,7 +83,7 @@ namespace HeliosPlus.Properties { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon Origin { + public static System.Drawing.Icon Origin { get { object obj = ResourceManager.GetObject("Origin", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -93,7 +93,7 @@ namespace HeliosPlus.Properties { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon Steam { + public static System.Drawing.Icon Steam { get { object obj = ResourceManager.GetObject("Steam", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -103,7 +103,7 @@ namespace HeliosPlus.Properties { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon Uplay { + public static System.Drawing.Icon Uplay { get { object obj = ResourceManager.GetObject("Uplay", resourceCulture); return ((System.Drawing.Icon)(obj)); diff --git a/HeliosPlus/Resources/HeliosPlus.png b/HeliosPlus/Resources/HeliosPlus.png deleted file mode 100644 index 5c644218585bac6d6caa9e7d260e0fd1ffc2f0a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117868 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 0) @@ -132,13 +117,10 @@ namespace HeliosPlus.UIForms { // We now only have an unsaved current profile, and no saved ones // So we need to change the mode - ChangeSelectedProfile(ProfileItem.CurrentProfile); + ChangeSelectedProfile(ProfileRepository.CurrentProfile); } - // Then save the profiles so we always have it updated - // Generating the imagelistview images automatically as we save. - ProfileItem.SaveAllProfiles(_savedProfiles); } private void RefreshDisplayProfileUI() @@ -166,7 +148,7 @@ namespace HeliosPlus.UIForms ilv_saved_profiles.Items.Add(newItem, _profileAdaptor); } - if (ProfileItem.CurrentProfile.Equals(loadedProfile)) + if (ProfileRepository.CurrentProfile.Equals(loadedProfile)) { // We have already saved the selected profile! // so we need to show the selected profile @@ -179,7 +161,7 @@ namespace HeliosPlus.UIForms // found a matching profile, then we need to show the current // Profile if (!foundCurrentProfileInLoadedProfiles) - ChangeSelectedProfile(ProfileItem.CurrentProfile); + ChangeSelectedProfile(ProfileRepository.CurrentProfile); // Check if we were loading a profile to edit // If so, select that instead of all that other stuff above! @@ -192,7 +174,7 @@ namespace HeliosPlus.UIForms // If there are no profiles at all then we are starting from scratch! // Show the profile in the DV window // Use the current profile name in the label and the save name - ChangeSelectedProfile(ProfileItem.CurrentProfile); + ChangeSelectedProfile(ProfileRepository.CurrentProfile); } // Restart updating the saved_profiles listview @@ -213,7 +195,7 @@ namespace HeliosPlus.UIForms // and the app will automatically recognise that things have changed. // Reload the profiles in case we swapped to another program to change it - ProfileItem.UpdateCurrentProfile(); + ProfileRepository.UpdateCurrentProfile(); // Refresh the Profile UI RefreshDisplayProfileUI(); } @@ -221,9 +203,9 @@ namespace HeliosPlus.UIForms private void DisplayProfileForm_Load(object sender, EventArgs e) { // Load all the profiles to prepare things - _savedProfiles = (List)ProfileItem.LoadAllProfiles(); + _savedProfiles = ProfileRepository.AllProfiles; // Update the Current Profile - ProfileItem.UpdateCurrentProfile(); + ProfileRepository.UpdateCurrentProfile(); // Refresh the Profile UI RefreshDisplayProfileUI(); } @@ -241,7 +223,7 @@ namespace HeliosPlus.UIForms // And update the save/rename textbox txt_profile_save_name.Text = _selectedProfile.Name; - if (_selectedProfile.Equals(ProfileItem.CurrentProfile)) + if (_selectedProfile.Equals(ProfileRepository.CurrentProfile)) { if (_savedProfiles.Contains(_selectedProfile)) { @@ -305,7 +287,7 @@ namespace HeliosPlus.UIForms } // Check we're not already using the name - foreach (ProfileItem savedProfile in ProfileItem.AllSavedProfiles) + foreach (ProfileItem savedProfile in ProfileRepository.AllProfiles) { //if (String.Equals(txt_profile_save_name.Text, savedProfile.Name, StringComparison.InvariantCultureIgnoreCase)) if (savedProfile.Name.Equals(txt_profile_save_name.Text)) @@ -322,7 +304,7 @@ namespace HeliosPlus.UIForms // We're in 'save' mode! // Check we're not already saving this profile - foreach (ProfileItem savedProfile in ProfileItem.AllSavedProfiles) + foreach (ProfileItem savedProfile in ProfileRepository.AllProfiles) { //if (String.Equals(txt_profile_save_name.Text, savedProfile.Name, StringComparison.InvariantCultureIgnoreCase)) if (savedProfile.Equals(_selectedProfile)) @@ -337,11 +319,10 @@ namespace HeliosPlus.UIForms // Update the name just to make sure we record it if the user changed it _selectedProfile.Name = txt_profile_save_name.Text; - // Add the current profile to the list of profiles so it gets saved later - _savedProfiles.Add(_selectedProfile); + // Add the current profile to the list of profiles so it gets saved + ProfileRepository.AddProfile(_selectedProfile); // Also update the imagelistview so that we can see the new profile we just saved - //_selectedProfile.SaveProfileImageToCache(); // Load the currentProfile image into the imagelistview //ImageListViewItem newItem = new ImageListViewItem(_selectedProfile.SavedProfileCacheFilename, _selectedProfile.Name); @@ -361,7 +342,6 @@ namespace HeliosPlus.UIForms // Lets save the old names for usage next string oldProfileName = _selectedProfile.Name; - string oldProfileCacheFilename = _selectedProfile.SavedProfileCacheFilename; // Lets rename the entry in the imagelistview to the new name foreach (ImageListViewItem myItem in ilv_saved_profiles.Items) @@ -372,30 +352,15 @@ namespace HeliosPlus.UIForms } } // Lets rename the selectedProfile to the new name - _selectedProfile.Name = txt_profile_save_name.Text; + ProfileRepository.RenameProfile(_selectedProfile, txt_profile_save_name.Text); // Lets update the rest of the profile screen too lbl_profile_shown.Text = txt_profile_save_name.Text; - - // Then we'll delete the old PNG that we renamed from so we don't get a buildup of them! - // as a new one will be created when we save later - try - { - File.Delete(oldProfileCacheFilename); - } - catch(Exception ex) - { - // TODO write error to console - // TODO specify the correct the exceptions - } + } ChangeSelectedProfile(_selectedProfile); - // Then save the profiles so we always have it updated - // Generating the imagelistview images automatically as we save. - ProfileItem.SaveAllProfiles(_savedProfiles); - // now update the profiles image listview //ilv_saved_profiles.Refresh(); @@ -416,7 +381,7 @@ namespace HeliosPlus.UIForms private void btn_view_current_Click(object sender, EventArgs e) { // Reload the profiles in case we swapped to another program to change it - ProfileItem.UpdateCurrentProfile(); + ProfileRepository.UpdateCurrentProfile(); // Refresh the Profile UI RefreshDisplayProfileUI(); } diff --git a/HeliosPlus/UIForms/ProfileAdaptor.cs b/HeliosPlus/UIForms/ProfileAdaptor.cs index 5eb930d..38ffb7a 100644 --- a/HeliosPlus/UIForms/ProfileAdaptor.cs +++ b/HeliosPlus/UIForms/ProfileAdaptor.cs @@ -47,7 +47,7 @@ namespace HeliosPlus.UIForms ProfileItem profileToUse = null; - foreach (ProfileItem profileToTest in ProfileItem.AllSavedProfiles) + foreach (ProfileItem profileToTest in ProfileRepository.AllProfiles) { if (profileToTest.Name == profileName) { @@ -58,7 +58,7 @@ namespace HeliosPlus.UIForms if (profileToUse == null) { - profileToUse = ProfileItem.CurrentProfile; + profileToUse = ProfileRepository.CurrentProfile; } Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(() => { return false; }); @@ -141,7 +141,7 @@ namespace HeliosPlus.UIForms string profileName = (string)key; ProfileItem profileToUse = null; - foreach (ProfileItem profileToTest in ProfileItem.AllSavedProfiles) + foreach (ProfileItem profileToTest in ProfileRepository.AllProfiles) { if (profileToTest.Name == profileName) { @@ -152,7 +152,7 @@ namespace HeliosPlus.UIForms if (profileToUse == null) { - profileToUse = ProfileItem.CurrentProfile; + profileToUse = ProfileRepository.CurrentProfile; } // Get file info diff --git a/HeliosPlus/UIForms/ShortcutForm.cs b/HeliosPlus/UIForms/ShortcutForm.cs index 5d95001..928299f 100644 --- a/HeliosPlus/UIForms/ShortcutForm.cs +++ b/HeliosPlus/UIForms/ShortcutForm.cs @@ -603,12 +603,12 @@ namespace HeliosPlus.UIForms { // Load all the profiles to prepare things - _loadedProfiles = (List)ProfileItem.LoadAllProfiles(); + _loadedProfiles = ProfileRepository.AllProfiles; bool foundCurrentProfileInLoadedProfiles = false; foreach (ProfileItem loadedProfile in _loadedProfiles) { - if (ProfileItem.CurrentProfile.Equals(loadedProfile)) + if (ProfileRepository.CurrentProfile.Equals(loadedProfile)) { // We have already saved the selected profile! // so we need to show the selected profile @@ -844,7 +844,7 @@ namespace HeliosPlus.UIForms // We also need to load the saved profile name to show the user lbl_profile_shown.Text = _profileToUse.Name; - if (_profileToUse.Equals(ProfileItem.CurrentProfile)) + if (_profileToUse.Equals(ProfileRepository.CurrentProfile)) { lbl_profile_shown_subtitle.Text = "(Current Display Profile in use)"; } @@ -900,7 +900,7 @@ namespace HeliosPlus.UIForms // found a matching profile, then we need to show the current // Profile if (!foundCurrentProfileInLoadedProfiles) - ChangeSelectedProfile(ProfileItem.CurrentProfile); + ChangeSelectedProfile(ProfileRepository.CurrentProfile); // Check if we were loading a profile to edit // If so, select that instead of all that other stuff above! diff --git a/HeliosPlus/Validators.cs b/HeliosPlus/Validators.cs index 1dc1232..59302ff 100644 --- a/HeliosPlus/Validators.cs +++ b/HeliosPlus/Validators.cs @@ -23,9 +23,9 @@ namespace HeliosPlus var profile = optionProfile.Value(); // Create an array of display profiles we have - var profiles = ProfileItem.LoadAllProfiles().ToArray(); + var profiles = ProfileRepository.AllProfiles.ToArray(); // Check if the user supplied a --profile option using the profiles' ID - var profileIndex = profiles.Length > 0 ? Array.FindIndex(profiles, p => p.Id.Equals(profile, StringComparison.InvariantCultureIgnoreCase)) : -1; + var profileIndex = profiles.Length > 0 ? Array.FindIndex(profiles, p => p.UUID.Equals(profile, StringComparison.InvariantCultureIgnoreCase)) : -1; // If the profileID wasn't there, maybe they used the profile name? if (profileIndex == -1) { @@ -38,7 +38,7 @@ namespace HeliosPlus return new ValidationResult($"Couldn't find Profile Name or ID supplied via command line: '{optionProfile.LongName}'. Please check the Profile Name or ID you supplied on the command line is correct."); } - Console.WriteLine($"Using Profile: '{profiles[profileIndex].Name}' (ID:{profiles[profileIndex].Id})"); + Console.WriteLine($"Using Profile: '{profiles[profileIndex].Name}' (ID:{profiles[profileIndex].UUID})"); return ValidationResult.Success; } }