From f59490a1fff816e51046d0535fc1d8a840291aad Mon Sep 17 00:00:00 2001 From: Terry MacDonald Date: Mon, 1 Jun 2020 22:25:52 +1200 Subject: [PATCH] [WIP] Improved Shortcut handling Created ShortcutRepository which handles the loading/saving and lifecycle management of shortcuts. There can only be one shortcut repository at a time, hence it's mainly static methods. Also started down the path of troubleshooting the profileIcon overlays. The ToBitmapOverlay still isn't working properly, so I need to figure out how it was working originally, and how I broke it :). Then I need to unbreak it. --- HeliosPlus.Shared/ProfileIcon.cs | 43 +- HeliosPlus/HeliosPlus.csproj | 1 + HeliosPlus/Shortcut.cs | 278 ++--------- HeliosPlus/ShortcutRepository.cs | 462 ++++++++++++++++++ HeliosPlus/UIForms/ShortcutAdaptor.cs | 48 +- HeliosPlus/UIForms/ShortcutForm.cs | 28 +- .../UIForms/ShortcutLibraryForm.Designer.cs | 1 + HeliosPlus/UIForms/ShortcutLibraryForm.cs | 33 +- HeliosPlus/Validators.cs | 2 +- 9 files changed, 591 insertions(+), 305 deletions(-) create mode 100644 HeliosPlus/ShortcutRepository.cs diff --git a/HeliosPlus.Shared/ProfileIcon.cs b/HeliosPlus.Shared/ProfileIcon.cs index 5890352..a90ca57 100644 --- a/HeliosPlus.Shared/ProfileIcon.cs +++ b/HeliosPlus.Shared/ProfileIcon.cs @@ -127,7 +127,7 @@ namespace HeliosPlus.Shared return path; } - public Bitmap ToBitmap(int width, int height, PixelFormat format = PixelFormat.Format32bppArgb) + public Bitmap ToBitmap(int width = 128, int height = 128, PixelFormat format = PixelFormat.Format32bppArgb) { var bitmap = new Bitmap(width, height, format); bitmap.MakeTransparent(); @@ -141,17 +141,40 @@ namespace HeliosPlus.Shared return bitmap; } - public Bitmap ToBitmapOverly(Bitmap bitmap) + public Bitmap ToBitmapOverlay(Bitmap bitmap, int width = 0, int height = 0, PixelFormat format = PixelFormat.Format32bppArgb) { - var viewSize = CalculateViewSize(_profile.Viewports, true, PaddingX, PaddingY); - var width = bitmap.Width * 0.7f; - var height = width / viewSize.Width * viewSize.Height; - using (var g = Graphics.FromImage(bitmap)) + if (width == 0) + width = bitmap.Width; + + if (height == 0) + height = bitmap.Height; + + var viewSize = CalculateViewSize(_profile.Viewports, true, PaddingX, PaddingY); + int viewSizeRatio = (int) Math.Round(viewSize.Width * viewSize.Height); + int overlayWidth = (int) Math.Round(width * 0.7f,0); + int overlayHeight = overlayWidth / viewSizeRatio; + int overlayX = width - overlayWidth; + int overlayY = height - overlayHeight; + Point overlayPosition = new Point(overlayX, overlayY); + Size overlaySize = new Size(overlayWidth, overlayHeight); + Rectangle overlayRect = new Rectangle(overlayPosition, overlaySize); + //var width = bitmap.Width * 0.7f; + //var height = width / viewSize.Width * viewSize.Height; + + var combinedBitmap = new Bitmap(width, height, format); + combinedBitmap.MakeTransparent(); + + using (var g = Graphics.FromImage(combinedBitmap)) { g.SmoothingMode = SmoothingMode.HighQuality; - g.TranslateTransform(bitmap.Width - width, bitmap.Height - height * 1.1f); - DrawView(g, width, height); + //g.DrawImage(bitmap, 0, 0, width, height); + g.TranslateTransform(overlayX, overlayY); + //Rectangle compressionRectangle = new Rectangle(300, 10, + //myBitmap.Width / 2, myBitmap.Height / 2); + g.DrawRectangle(new Pen(Color.FromArgb(125, 50, 50, 50), 2f), overlayRect); + + DrawView(g, overlayWidth, overlayHeight); } return bitmap; @@ -186,7 +209,7 @@ namespace HeliosPlus.Shared return multiIcon; } - public MultiIcon ToIconOverly(string iconAddress) + public MultiIcon ToIconOverlay(string iconAddress) { var multiIcon = new MultiIcon(); var icon = multiIcon.Add("Icon1"); @@ -226,7 +249,7 @@ namespace HeliosPlus.Shared bitmap = clone; } - icon.Add(singleIcon.Size.Height * singleIcon.Size.Width < 24 * 24 ? bitmap : ToBitmapOverly(bitmap)); + icon.Add(singleIcon.Size.Height * singleIcon.Size.Width < 24 * 24 ? bitmap : ToBitmapOverlay(bitmap)); if (singleIcon.Size.Width >= 256 && singleIcon.Size.Height >= 256) { diff --git a/HeliosPlus/HeliosPlus.csproj b/HeliosPlus/HeliosPlus.csproj index f00b2bc..5a7b318 100644 --- a/HeliosPlus/HeliosPlus.csproj +++ b/HeliosPlus/HeliosPlus.csproj @@ -78,6 +78,7 @@ + diff --git a/HeliosPlus/Shortcut.cs b/HeliosPlus/Shortcut.cs index 8b073e1..0181389 100644 --- a/HeliosPlus/Shortcut.cs +++ b/HeliosPlus/Shortcut.cs @@ -33,11 +33,12 @@ namespace HeliosPlus public class Shortcut { - + private static List _allSavedShortcuts = new List(); private MultiIcon _shortcutIcon, _originalIcon = null; private Bitmap _shortcutBitmap, _originalBitmap = null; private Profile _profileToUse = null; + private uint _id = 0; private string _profileName = ""; private bool _isPossible = false; @@ -52,7 +53,19 @@ namespace HeliosPlus public static Version Version = new Version(1, 0); - public uint Id { get; set; } = 0; + public uint Id + { + get + { + if (_id == 0) + _id = ShortcutRepository.GetNextAvailableShortcutId(); + return _id; + } + set + { + _id = value; + } + } public string Name { get; set; } = ""; @@ -146,7 +159,7 @@ namespace HeliosPlus if (OriginalBitmap == null) return null; - _shortcutBitmap = new ProfileIcon(ProfileToUse).ToBitmapOverly(OriginalBitmap); + _shortcutBitmap = new ProfileIcon(ProfileToUse).ToBitmapOverlay(OriginalBitmap,128 ,128); return _shortcutBitmap; } } @@ -157,33 +170,8 @@ namespace HeliosPlus } } - [JsonIgnore] - public static string SavedShortcutsFilePath - { - get => Path.Combine(Program.AppDataPath, $"Shortcuts\\Shortcuts_{Version.ToString(2)}.json"); - } - - [JsonIgnore] - public static string SavedShortcutsPath - { - get => Path.Combine(Program.AppDataPath, $"Shortcuts"); - } - public string SavedShortcutIconCacheFilename { get; set; } - - [JsonIgnore] - public static List AllSavedShortcuts - { - get - { - if (_allSavedShortcuts.Count == 0) - { - Shortcut.LoadAllShortcuts(); - } - return _allSavedShortcuts; - } - } [JsonIgnore] public bool IsPossible @@ -195,9 +183,46 @@ namespace HeliosPlus set { _isPossible = value; - } + } } + + public bool CopyTo (Shortcut shortcut, bool overwriteId = false) + { + if (!(shortcut is Shortcut)) + return false; + + if (overwriteId) + shortcut.Id = Id; + + // Copy all the shortcut data over to the other Shortcut + shortcut.Name = Name; + shortcut.ProfileToUse = ProfileToUse; + shortcut.ProfileName = ProfileName; + shortcut.Permanence = Permanence; + shortcut.Category = Category; + shortcut.DifferentExecutableToMonitor = DifferentExecutableToMonitor; + shortcut.ExecutableNameAndPath = ExecutableNameAndPath; + shortcut.ExecutableTimeout = ExecutableTimeout; + shortcut.ExecutableArguments = ExecutableArguments; + shortcut.ExecutableArgumentsRequired = ExecutableArgumentsRequired; + shortcut.ProcessNameToMonitorUsesExecutable = ProcessNameToMonitorUsesExecutable; + shortcut.GameAppId = GameAppId; + shortcut.GameName = GameName; + shortcut.GameLibrary = GameLibrary; + shortcut.GameTimeout = GameTimeout; + shortcut.GameArguments = GameArguments; + shortcut.GameArgumentsRequired = GameArgumentsRequired; + shortcut.OriginalIconPath = OriginalIconPath; + shortcut.OriginalBitmap = OriginalBitmap; + shortcut.ShortcutBitmap = ShortcutBitmap; + shortcut.SavedShortcutIconCacheFilename = SavedShortcutIconCacheFilename; + shortcut.IsPossible = IsPossible; + + return true; + } + + public static Bitmap ExtractVistaIcon(Icon icoIcon) { Bitmap bmpPngExtracted = null; @@ -231,193 +256,6 @@ namespace HeliosPlus return bmpPngExtracted; } - public void SaveShortcutIconToCache() - { - if (_shortcutIcon == null) - { - - if (!Directory.Exists(SavedShortcutsPath)) - { - try - { - Directory.CreateDirectory(SavedShortcutsPath); - } - catch (Exception ex) - { - Console.WriteLine("Unable to create Shortcut folder " + SavedShortcutsPath + ": " + ex.Message); - } - } - - // Only add the rest of the options if the permanence is temporary - if (Permanence == ShortcutPermanence.Temporary) - { - // Only add this set of options if the shortcut is to an standalone application - if (Category == ShortcutCategory.Application) - { - // Work out the name of the shortcut we'll save. - SavedShortcutIconCacheFilename = Path.Combine(SavedShortcutsPath, String.Concat(@"executable-", Program.GetValidFilename(Name).ToLower(CultureInfo.InvariantCulture), "-", Path.GetFileNameWithoutExtension(ExecutableNameAndPath), @".ico")); - - } - // Only add the rest of the options if the temporary switch radio button is set - // and if the game launching radio button is set - else if (Permanence == ShortcutPermanence.Temporary) - { - // TODO need to make this work so at least one game library is installed - // i.e. if (!SteamGame.SteamInstalled && !UplayGame.UplayInstalled ) - if (GameLibrary == SupportedGameLibrary.Steam) - { - // Work out the name of the shortcut we'll save. - SavedShortcutIconCacheFilename = Path.Combine(SavedShortcutsPath, String.Concat(@"steam-", Program.GetValidFilename(Name).ToLower(CultureInfo.InvariantCulture), "-", GameAppId.ToString(), @".ico")); - - } - else if (GameLibrary == SupportedGameLibrary.Uplay) - { - // Work out the name of the shortcut we'll save. - SavedShortcutIconCacheFilename = Path.Combine(SavedShortcutsPath, String.Concat(@"uplay-", Program.GetValidFilename(Name).ToLower(CultureInfo.InvariantCulture), "-", GameAppId.ToString(), @".ico")); - } - - } - - } - // Only add the rest of the options if the shortcut is permanent - else - { - // Work out the name of the shortcut we'll save. - SavedShortcutIconCacheFilename = Path.Combine(SavedShortcutsPath, String.Concat(@"permanent-", Program.GetValidFilename(Name).ToLower(CultureInfo.InvariantCulture), @".ico")); - } - - try - { - _shortcutIcon = new ProfileIcon(ProfileToUse).ToIconOverly(OriginalIconPath); - _shortcutIcon.Save(SavedShortcutIconCacheFilename, MultiIconFormat.ICO); - } - catch (Exception ex) - { - // If we fail to create an icon based on the original executable or game - // Then we use the standard HeliosPlus profile one. - _shortcutIcon = new ProfileIcon(ProfileToUse).ToIcon(); - _shortcutIcon.Save(SavedShortcutIconCacheFilename, MultiIconFormat.ICO); - } - } - } - - public static List LoadAllShortcuts() - { - - if (File.Exists(SavedShortcutsFilePath)) - { - var json = File.ReadAllText(SavedShortcutsFilePath, Encoding.Unicode); - - if (!string.IsNullOrWhiteSpace(json)) - { - List shortcuts = new List(); - try - { - shortcuts = 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 shortcut: " + ex.Message); - } - - // Lookup all the Profile Names in the Saved Profiles - foreach (Shortcut updatedShortcut in shortcuts) - { - foreach (Profile profile in Profile.AllSavedProfiles) - { - - if (profile.Name.Equals(updatedShortcut.ProfileName)) - { - // And assign the matching Profile if we find it. - updatedShortcut.ProfileToUse = profile; - updatedShortcut.IsPossible = true; - break; - } - } - } - - _allSavedShortcuts = shortcuts; - - return _allSavedShortcuts; - } - } - - // If we get here, then we don't have any shortcuts saved! - // So we gotta start from scratch - // Create a new empty list of all our display profiles as we don't have any saved! - _allSavedShortcuts = new List(); - - return _allSavedShortcuts; - } - - public static bool SaveAllShortcuts() - { - if (SaveAllShortcuts(_allSavedShortcuts)) - return true; - return false; - } - - public static bool SaveAllShortcuts(List shortcutsToSave) - { - - if (!Directory.Exists(SavedShortcutsPath)) - { - try - { - Directory.CreateDirectory(SavedShortcutsPath); - } - catch (Exception ex) - { - Console.WriteLine("Unable to create Shortcut folder " + SavedShortcutsPath + ": " + ex.Message); - } - } - - - // Now we loop over the profiles and save their images for later - foreach (Shortcut shortcutToSave in shortcutsToSave) - shortcutToSave.SaveShortcutIconToCache(); - - try - { - var json = JsonConvert.SerializeObject(shortcutsToSave, Formatting.Indented, new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Include, - DefaultValueHandling = DefaultValueHandling.Populate, - TypeNameHandling = TypeNameHandling.Auto - - }); - - - if (!string.IsNullOrWhiteSpace(json)) - { - var dir = Path.GetDirectoryName(SavedShortcutsPath); - - if (dir != null) - { - Directory.CreateDirectory(dir); - File.WriteAllText(SavedShortcutsFilePath, 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. - _allSavedShortcuts = shortcutsToSave; - - return false; - } // ReSharper disable once FunctionComplexityOverflow // ReSharper disable once CyclomaticComplexity @@ -519,14 +357,6 @@ namespace HeliosPlus return shortcutFileName != null && File.Exists(shortcutFileName); } - public static bool NameAlreadyExists(string shortcutName) - { - if (AllSavedShortcuts.Exists(item => item.Name.Equals(shortcutName))) - return true; - else - return false; - } - } #region JsonConverterBitmap diff --git a/HeliosPlus/ShortcutRepository.cs b/HeliosPlus/ShortcutRepository.cs new file mode 100644 index 0000000..33edc84 --- /dev/null +++ b/HeliosPlus/ShortcutRepository.cs @@ -0,0 +1,462 @@ +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.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace HeliosPlus +{ + + class ShortcutRepository + { + #region Class Variables + // Common items to the class + private static List _allShortcuts = new List(); + public static Version Version = new Version(1, 0, 0); + // Other constants that are useful + private static string _shortcutStorageJsonPath = Path.Combine(Program.AppDataPath, $"Shortcuts"); + private static string _shortcutStorageJsonFileName = Path.Combine(_shortcutStorageJsonPath, $"Shortcuts_{Version.ToString(2)}.json"); + private static uint _lastShortcutId; + #endregion + + #region Instance Variables + // Individual items per class instance + #endregion + + + #region Class Constructors + public ShortcutRepository() + { + // Load the Shortcuts from storage + if (LoadShortcuts() && ShortcutCount > 0) + { + // Work out the starting NextShortcutId value + long max = _allShortcuts.Max(item => item.Id); + _lastShortcutId = Convert.ToUInt32(max); + } else + _lastShortcutId = 0; + } + + public ShortcutRepository(Shortcut shortcut) : this() + { + if (shortcut is Shortcut) + AddShortcut(shortcut); + } + #endregion + + #region Class Properties + public static List AllShortcuts + { + get + { + if (_allShortcuts == null) + // Load the Shortcuts from storage + if (LoadShortcuts() && ShortcutCount > 0) + { + // Work out the starting NextShortcutId value + long max = _allShortcuts.Max(item => item.Id); + _lastShortcutId = Convert.ToUInt32(max); + } + else + _lastShortcutId = 0; + + return _allShortcuts; + } + } + + + public static int ShortcutCount + { + get + { + return _allShortcuts.Count; + } + } + + #endregion + + #region Class Methods + public static bool AddShortcut(Shortcut shortcut) + { + if (!(shortcut is Shortcut)) + return false; + + // Doublecheck if it already exists + // Because then we just update the one that already exists + if (ContainsShortcut(shortcut)) + { + // We update the existing Shortcut with the data over + Shortcut shortcutToUpdate = GetShortcut(shortcut.Id); + shortcut.CopyTo(shortcutToUpdate); + } + else + { + // Add the shortcut to the list of shortcuts + _allShortcuts.Add(shortcut); + } + + //Doublecheck it's been added + if (ContainsShortcut(shortcut)) + { + // Generate the Shortcut Icon ready to be used + SaveShortcutIconToCache(shortcut); + + // Save the shortcuts JSON as it's different + SaveShortcuts(); + + return true; + } + else + return false; + + } + + public static bool RemoveShortcut(Shortcut shortcut) + { + if (!(shortcut is Shortcut)) + return false; + + // Remove the Shortcut Icons from the Cache + List shortcutsToRemove = _allShortcuts.FindAll(item => item.Id.Equals(shortcut.Id)); + foreach (Shortcut shortcutToRemove in shortcutsToRemove) + { + try + { + File.Delete(shortcutToRemove.SavedShortcutIconCacheFilename); + } + catch + { + // TODO check and report + } + } + + // Remove the shortcut from the list. + int numRemoved = _allShortcuts.RemoveAll(item => item.Id.Equals(shortcut.Id)); + + if (numRemoved == 1) + { + SaveShortcuts(); + return true; + } + else if (numRemoved == 0) + return false; + else + throw new ShortcutRepositoryException(); + } + + + public static bool RemoveShortcut(string shortcutName) + { + if (String.IsNullOrWhiteSpace(shortcutName)) + return false; + + // Remove the Shortcut Icons from the Cache + List shortcutsToRemove = _allShortcuts.FindAll(item => item.Name.Equals(shortcutName)); + foreach (Shortcut shortcutToRemove in shortcutsToRemove) + { + try + { + File.Delete(shortcutToRemove.SavedShortcutIconCacheFilename); + } + catch + { + // TODO check and report + } + } + + // Remove the shortcut from the list. + int numRemoved = _allShortcuts.RemoveAll(item => item.Name.Equals(shortcutName)); + + if (numRemoved == 1) + { + SaveShortcuts(); + return true; + } + else if (numRemoved == 0) + return false; + else + throw new ShortcutRepositoryException(); + + } + + public static bool RemoveShortcut(uint shortcutId) + { + if (shortcutId == 0) + return false; + + // Remove the Shortcut Icons from the Cache + List shortcutsToRemove = _allShortcuts.FindAll(item => item.Id.Equals(shortcutId)); + foreach (Shortcut shortcutToRemove in shortcutsToRemove) + { + try + { + File.Delete(shortcutToRemove.SavedShortcutIconCacheFilename); + } + catch + { + // TODO check and report + } + } + + // Remove the shortcut from the list. + int numRemoved = _allShortcuts.RemoveAll(item => item.Id.Equals(shortcutId)); + + if (numRemoved == 1) + { + SaveShortcuts(); + return true; + } + else if (numRemoved == 0) + return false; + else + throw new ShortcutRepositoryException(); + } + + + public static bool ContainsShortcut(Shortcut shortcut) + { + if (!(shortcut is Shortcut)) + return false; + + foreach (Shortcut testShortcut in _allShortcuts) + { + if (testShortcut.Id.Equals(shortcut.Id)) + return true; + } + + return false; + } + + public static bool ContainsShortcut(string shortcutName) + { + if (String.IsNullOrWhiteSpace(shortcutName)) + return false; + + foreach (Shortcut testShortcut in _allShortcuts) + { + if (testShortcut.Name.Equals(shortcutName)) + return true; + } + + return false; + + } + + public static bool ContainsShortcut(uint shortcutId) + { + if (shortcutId == 0) + return true; + + foreach (Shortcut testShortcut in _allShortcuts) + { + if (testShortcut.Id.Equals(shortcutId)) + return true; + } + + return false; + + } + + + public static Shortcut GetShortcut(string shortcutName) + { + if (String.IsNullOrWhiteSpace(shortcutName)) + return null; + + foreach (Shortcut testShortcut in _allShortcuts) + { + if (testShortcut.Name.Equals(shortcutName)) + return testShortcut; + } + + return null; + } + + public static Shortcut GetShortcut(uint shortcutId) + { + if (shortcutId == 0) + return null; + + foreach (Shortcut testShortcut in _allShortcuts) + { + if (testShortcut.Id.Equals(shortcutId)) + return testShortcut; + } + + return null; + } + + public static uint GetNextAvailableShortcutId() + { + return ++_lastShortcutId; + } + + + + private static bool LoadShortcuts() + { + + if (File.Exists(_shortcutStorageJsonFileName)) + { + var json = File.ReadAllText(_shortcutStorageJsonFileName, Encoding.Unicode); + + if (!string.IsNullOrWhiteSpace(json)) + { + List shortcuts = new List(); + try + { + _allShortcuts = 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 Shortcuts from JSON file {_shortcutStorageJsonFileName}: " + ex.Message); + } + + // Lookup all the Profile Names in the Saved Profiles + foreach (Shortcut updatedShortcut in _allShortcuts) + { + foreach (Profile profile in Profile.AllSavedProfiles) + { + + if (profile.Name.Equals(updatedShortcut.ProfileName)) + { + // And assign the matching Profile if we find it. + updatedShortcut.ProfileToUse = profile; + updatedShortcut.IsPossible = true; + break; + } + } + } + } + } + return true; + } + + private static bool SaveShortcuts() + { + + if (!Directory.Exists(_shortcutStorageJsonPath)) + { + try + { + Directory.CreateDirectory(_shortcutStorageJsonPath); + } + catch (Exception ex) + { + Console.WriteLine($"Unable to create Shortcut folder {_shortcutStorageJsonPath}: " + ex.Message); + + } + } + + try + { + var json = JsonConvert.SerializeObject(_allShortcuts, Formatting.Indented, new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Include, + DefaultValueHandling = DefaultValueHandling.Populate, + TypeNameHandling = TypeNameHandling.Auto + + }); + + + if (!string.IsNullOrWhiteSpace(json)) + { + File.WriteAllText(_shortcutStorageJsonFileName, json, Encoding.Unicode); + return true; + } + } + catch (Exception ex) + { + Console.WriteLine($"Unable to save Shortcut JSON file {_shortcutStorageJsonFileName}: " + ex.Message); + } + + return false; + } + + private static void SaveShortcutIconToCache(Shortcut shortcut) + { + + // Only add the rest of the options if the permanence is temporary + if (shortcut.Permanence == ShortcutPermanence.Temporary) + { + // Only add this set of options if the shortcut is to an standalone application + if (shortcut.Category == ShortcutCategory.Application) + { + // Work out the name of the shortcut we'll save. + shortcut.SavedShortcutIconCacheFilename = Path.Combine(_shortcutStorageJsonPath, String.Concat(@"executable-", Program.GetValidFilename(shortcut.Name).ToLower(CultureInfo.InvariantCulture), "-", Path.GetFileNameWithoutExtension(shortcut.ExecutableNameAndPath), @".ico")); + + } + // Only add the rest of the options if the temporary switch radio button is set + // and if the game launching radio button is set + else if (shortcut.Permanence == ShortcutPermanence.Temporary) + { + // TODO need to make this work so at least one game library is installed + // i.e. if (!SteamGame.SteamInstalled && !UplayGame.UplayInstalled ) + if (shortcut.GameLibrary == SupportedGameLibrary.Steam) + { + // Work out the name of the shortcut we'll save. + shortcut.SavedShortcutIconCacheFilename = Path.Combine(_shortcutStorageJsonPath, String.Concat(@"steam-", Program.GetValidFilename(shortcut.Name).ToLower(CultureInfo.InvariantCulture), "-", shortcut.GameAppId.ToString(), @".ico")); + + } + else if (shortcut.GameLibrary == SupportedGameLibrary.Uplay) + { + // Work out the name of the shortcut we'll save. + shortcut.SavedShortcutIconCacheFilename = Path.Combine(_shortcutStorageJsonPath, String.Concat(@"uplay-", Program.GetValidFilename(shortcut.Name).ToLower(CultureInfo.InvariantCulture), "-", shortcut.GameAppId.ToString(), @".ico")); + } + + } + + } + // Only add the rest of the options if the shortcut is permanent + else + { + // Work out the name of the shortcut we'll save. + shortcut.SavedShortcutIconCacheFilename = Path.Combine(_shortcutStorageJsonPath, String.Concat(@"permanent-", Program.GetValidFilename(shortcut.Name).ToLower(CultureInfo.InvariantCulture), @".ico")); + } + + MultiIcon shortcutIcon; + try + { + shortcutIcon = new ProfileIcon(shortcut.ProfileToUse).ToIconOverlay(shortcut.OriginalIconPath); + shortcutIcon.Save(shortcut.SavedShortcutIconCacheFilename, MultiIconFormat.ICO); + } + catch (Exception ex) + { + // If we fail to create an icon based on the original executable or game + // Then we use the standard HeliosPlus profile one. + shortcutIcon = new ProfileIcon(shortcut.ProfileToUse).ToIcon(); + shortcutIcon.Save(shortcut.SavedShortcutIconCacheFilename, MultiIconFormat.ICO); + } + } + + #endregion + + } + + [global::System.Serializable] + public class ShortcutRepositoryException : Exception + { + public ShortcutRepositoryException() { } + public ShortcutRepositoryException(string message) : base(message) { } + public ShortcutRepositoryException(string message, Exception inner) : base(message, inner) { } + protected ShortcutRepositoryException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + } + + +} diff --git a/HeliosPlus/UIForms/ShortcutAdaptor.cs b/HeliosPlus/UIForms/ShortcutAdaptor.cs index ad2eece..9cb45c2 100644 --- a/HeliosPlus/UIForms/ShortcutAdaptor.cs +++ b/HeliosPlus/UIForms/ShortcutAdaptor.cs @@ -42,26 +42,16 @@ namespace HeliosPlus.UIForms try { - string shortcutName = key.ToString(); + Shortcut shortcut = (Shortcut) key; - Shortcut shortcutToUse = null; - - foreach (Shortcut profileToTest in Shortcut.AllSavedShortcuts) - { - if (profileToTest.Name == shortcutName) - { - shortcutToUse = profileToTest; - } - - } - - if (shortcutToUse == null) + if (shortcut == null) { return null; } - Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(() => { return false; }); - return shortcutToUse.ShortcutBitmap.GetThumbnailImage(size.Width, size.Height, myCallback, IntPtr.Zero); + //Image.GetThumbnailImageAbort myCallback = new Image.GetThumbnailImageAbort(() => { return false; }); + //return shortcut.ShortcutBitmap.GetThumbnailImage(size.Width, size.Height, myCallback, IntPtr.Zero); + return shortcut.ShortcutBitmap; } catch { // If we have a problem with converting the submitted key to a profile @@ -89,12 +79,12 @@ namespace HeliosPlus.UIForms try { - string shortcutName = (string)key; - return shortcutName; + Shortcut shortcutName = (Shortcut) key; + return shortcutName.Name; } catch { - // If we have a problem with converting the submitted key to a profile + // If we have a problem with converting the submitted key to a Shortcut // Then we return null return null; } @@ -145,31 +135,21 @@ namespace HeliosPlus.UIForms try { - Shortcut shortcut = (Shortcut)key; - Shortcut shortcutToUse = null; - - foreach (Shortcut shortcutToTest in Shortcut.AllSavedShortcuts) - { - if (shortcutToTest.Name == shortcut.Name) - { - shortcutToUse = shortcutToTest; - } - - } + Shortcut shortcut = (Shortcut) key; // Get file info - if (shortcutToUse.ShortcutBitmap is Bitmap) + if (shortcut.ShortcutBitmap is Bitmap) { DateTime now = DateTime.Now; details.Add(new Utility.Tuple(ColumnType.DateCreated, string.Empty, now)); details.Add(new Utility.Tuple(ColumnType.DateAccessed, string.Empty, now)); details.Add(new Utility.Tuple(ColumnType.DateModified, string.Empty, now)); details.Add(new Utility.Tuple(ColumnType.FileSize, string.Empty, (long)0)); - details.Add(new Utility.Tuple(ColumnType.FilePath, string.Empty, shortcutToUse.SavedShortcutIconCacheFilename)); + details.Add(new Utility.Tuple(ColumnType.FilePath, string.Empty, shortcut.SavedShortcutIconCacheFilename)); details.Add(new Utility.Tuple(ColumnType.FolderName, string.Empty, "")); - details.Add(new Utility.Tuple(ColumnType.Dimensions, string.Empty, new Size(shortcutToUse.ShortcutBitmap.Width, shortcutToUse.ShortcutBitmap.Height))); - details.Add(new Utility.Tuple(ColumnType.Resolution, string.Empty, new SizeF((float)shortcutToUse.ShortcutBitmap.Width, (float)shortcutToUse.ShortcutBitmap.Height))); - details.Add(new Utility.Tuple(ColumnType.ImageDescription, string.Empty, shortcutToUse.Name)); + details.Add(new Utility.Tuple(ColumnType.Dimensions, string.Empty, new Size(shortcut.ShortcutBitmap.Width, shortcut.ShortcutBitmap.Height))); + details.Add(new Utility.Tuple(ColumnType.Resolution, string.Empty, new SizeF((float)shortcut.ShortcutBitmap.Width, (float)shortcut.ShortcutBitmap.Height))); + details.Add(new Utility.Tuple(ColumnType.ImageDescription, string.Empty, shortcut.Name)); details.Add(new Utility.Tuple(ColumnType.EquipmentModel, string.Empty, "")); details.Add(new Utility.Tuple(ColumnType.DateTaken, string.Empty, now)); details.Add(new Utility.Tuple(ColumnType.Artist, string.Empty, "")); diff --git a/HeliosPlus/UIForms/ShortcutForm.cs b/HeliosPlus/UIForms/ShortcutForm.cs index 3dc3a18..dfa4bd9 100644 --- a/HeliosPlus/UIForms/ShortcutForm.cs +++ b/HeliosPlus/UIForms/ShortcutForm.cs @@ -258,7 +258,7 @@ namespace HeliosPlus.UIForms } // Please use a plain name that can be - if (_isNewShortcut && Shortcut.NameAlreadyExists(txt_shortcut_save_name.Text)) + if (_isNewShortcut && ShortcutRepository.ContainsShortcut(txt_shortcut_save_name.Text)) { MessageBox.Show( @"A shortcut has already been created with this name. Please enter a different name for this shortcut.", @@ -444,16 +444,9 @@ namespace HeliosPlus.UIForms else if (rb_standalone.Checked) _shortcutToEdit.Category = ShortcutCategory.Application; - // Save the shortcut icon - _shortcutToEdit.SaveShortcutIconToCache(); - // Add the Shortcut to the list of saved Shortcuts so it gets saved for later // but only if it's new... if it is an edit then it will already be in the list. - if (_isNewShortcut) - Shortcut.AllSavedShortcuts.Add(_shortcutToEdit); - - // Save all shortcuts just to be sure - Shortcut.SaveAllShortcuts(); + ShortcutRepository.AddShortcut(_shortcutToEdit); // We've saved, so mark it as so _isUnsaved = false; @@ -604,7 +597,6 @@ namespace HeliosPlus.UIForms matchingImageListViewItems.First().Selected = true; matchingImageListViewItems.First().Focused = true; } - } private async void ShortcutForm_Load(object sender, EventArgs e) @@ -686,21 +678,7 @@ namespace HeliosPlus.UIForms // Now start populating the other fields - if (_shortcutToEdit.Id == 0) - { - // This is a new Shortcut so we need to figure out what the next - // ID will need to be set to. - try - { - _id = (from shortcut in Shortcut.AllSavedShortcuts select shortcut.Id).Max() + 1; - } - catch - { - _id = 1; - } - } - else - _id = _shortcutToEdit.Id; + _id = _shortcutToEdit.Id; // Set if we launch App/Game/NoGame switch (_shortcutToEdit.Category) { diff --git a/HeliosPlus/UIForms/ShortcutLibraryForm.Designer.cs b/HeliosPlus/UIForms/ShortcutLibraryForm.Designer.cs index be3e771..8903fd2 100644 --- a/HeliosPlus/UIForms/ShortcutLibraryForm.Designer.cs +++ b/HeliosPlus/UIForms/ShortcutLibraryForm.Designer.cs @@ -75,6 +75,7 @@ this.btn_delete.TabIndex = 26; this.btn_delete.Text = "&Delete"; this.btn_delete.UseVisualStyleBackColor = true; + this.btn_delete.Click += new System.EventHandler(this.btn_delete_Click); // // btn_back // diff --git a/HeliosPlus/UIForms/ShortcutLibraryForm.cs b/HeliosPlus/UIForms/ShortcutLibraryForm.cs index ba43677..a146eb1 100644 --- a/HeliosPlus/UIForms/ShortcutLibraryForm.cs +++ b/HeliosPlus/UIForms/ShortcutLibraryForm.cs @@ -23,6 +23,7 @@ namespace HeliosPlus.UIForms private ShortcutAdaptor _shortcutAdaptor; private ImageListViewItem _selectedShortcutILVItem = null; private Shortcut _selectedShortcut = null; + private ShortcutRepository _shortcutRepository = new ShortcutRepository(); public ShortcutLibraryForm() { @@ -49,7 +50,7 @@ namespace HeliosPlus.UIForms private void ShortcutLibraryForm_Load(object sender, EventArgs e) { // Load all the shortcuts we have saved earlier - List _savedShortcuts = Shortcut.LoadAllShortcuts(); + List _savedShortcuts = ShortcutRepository.AllShortcuts; // Refresh the Shortcut Library UI RefreshShortcutLibraryUI(); } @@ -57,21 +58,17 @@ namespace HeliosPlus.UIForms private void RefreshShortcutLibraryUI() { - if (Shortcut.AllSavedShortcuts.Count > 0) + if (ShortcutRepository.ShortcutCount > 0) { // Temporarily stop updating the saved_profiles listview ilv_saved_shortcuts.SuspendLayout(); ImageListViewItem newItem = null; - foreach (Shortcut loadedShortcut in Shortcut.AllSavedShortcuts) + ilv_saved_shortcuts.Items.Clear(); + foreach (Shortcut loadedShortcut in ShortcutRepository.AllShortcuts) { - bool thisLoadedProfileIsAlreadyHere = (from item in ilv_saved_shortcuts.Items where item.Text == loadedShortcut.Name select item.Text).Any(); - if (!thisLoadedProfileIsAlreadyHere) - { - newItem = new ImageListViewItem(loadedShortcut, loadedShortcut.Name); - //ilv_saved_profiles.Items.Add(newItem); - ilv_saved_shortcuts.Items.Add(newItem, _shortcutAdaptor); - } + newItem = new ImageListViewItem(loadedShortcut, loadedShortcut.Name); + ilv_saved_shortcuts.Items.Add(newItem, _shortcutAdaptor); if (_selectedShortcut != null && _selectedShortcut is Shortcut) RefreshImageListView(_selectedShortcut); @@ -103,7 +100,7 @@ namespace HeliosPlus.UIForms private Shortcut GetShortcutFromName(string shortcutName) { - return (from item in Shortcut.AllSavedShortcuts where item.Name == shortcutName select item).First(); + return (from item in ShortcutRepository.AllShortcuts where item.Name == shortcutName select item).First(); } private void btn_save_Click(object sender, EventArgs e) @@ -203,5 +200,19 @@ namespace HeliosPlus.UIForms } } + + private void btn_delete_Click(object sender, EventArgs e) + { + if (_selectedShortcut == null) + return; + + if (MessageBox.Show($"Are you sure you want to delete the '{_selectedShortcut.Name}' Shortcut?", $"Delete '{_selectedShortcut.Name}' Shortcut?", MessageBoxButtons.YesNo, MessageBoxIcon.Error) == DialogResult.No) + return; + + ShortcutRepository.RemoveShortcut(_selectedShortcut); + _selectedShortcut = null; + + RefreshShortcutLibraryUI(); + } } } diff --git a/HeliosPlus/Validators.cs b/HeliosPlus/Validators.cs index 4abdf95..89f4795 100644 --- a/HeliosPlus/Validators.cs +++ b/HeliosPlus/Validators.cs @@ -66,7 +66,7 @@ namespace HeliosPlus } // Create an array of shortcuts we have - var shortcuts = Shortcut.LoadAllShortcuts().ToArray(); + var shortcuts = ShortcutRepository.AllShortcuts.ToArray(); // Check if the user supplied a valid shortcut name int profileIndex = shortcuts.Length > 0 ? Array.FindIndex(shortcuts, p => p.Name.Contains(shortcutName)) : -1;