diff --git a/src/modules/Projects/ProjectsEditor/Models/Project.cs b/src/modules/Projects/ProjectsEditor/Models/Project.cs index 6d443161d8..81f167988d 100644 --- a/src/modules/Projects/ProjectsEditor/Models/Project.cs +++ b/src/modules/Projects/ProjectsEditor/Models/Project.cs @@ -317,5 +317,27 @@ namespace ProjectsEditor.Models return new Rectangle((int)minX, (int)minY, (int)(maxX - minX), (int)(maxY - minY)); } + + internal string GetShortcutChars() + { + if (string.IsNullOrEmpty(Name)) + { + return "PR"; + } + + string[] words = Name.Trim().ToUpperInvariant().Split(' '); + if (words.Length > 2) + { + return $"{words[0][0]}{words[1][0]}{words[2][0]}"; + } + else if (words.Length == 2) + { + return $"{words[0][0]}{words[1][0]}"; + } + else + { + return words[0].Substring(0, Math.Min(3, words[0].Length)); + } + } } } diff --git a/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml b/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml index f90ad23131..149b944856 100644 --- a/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml +++ b/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml @@ -259,11 +259,6 @@ Content="{x:Static props:Resources.CreateShortcut}" IsChecked="{Binding IsShortcutNeeded, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontSize="14"/> - iconBrushes = new List + { + ////Brushes.Gold, + ////Brushes.SteelBlue, + ////Brushes.SkyBlue, + ////Brushes.DarkGoldenrod, + ////Brushes.ForestGreen, + ////Brushes.Peru, + ////Brushes.Chartreuse, + ////Brushes.LightPink, + ////Brushes.CadetBlue, + ////Brushes.DarkSalmon, + ////Brushes.Orange, + ////Brushes.DarkSeaGreen, + ////Brushes.Yellow, + ////Brushes.Green, + ////Brushes.Orange, + ////Brushes.White, + new SolidBrush(Color.FromArgb(255, 40, 101, 120)), + new SolidBrush(Color.FromArgb(255, 58, 91, 153)), + new SolidBrush(Color.FromArgb(255, 87, 88, 163)), + new SolidBrush(Color.FromArgb(255, 116, 87, 160)), + new SolidBrush(Color.FromArgb(255, 139, 82, 145)), + }; + + private static int iconBrushIndex; + public static BitmapImage DrawPreview(Project project, Rectangle bounds) { double scale = 0.1; @@ -134,7 +163,6 @@ namespace ProjectsEditor.Utils if (app.RepeatIndex > 0) { string indexString = app.RepeatIndex.ToString(CultureInfo.InvariantCulture); - System.Drawing.Font font = new System.Drawing.Font("Tahoma", 8); int indexSize = (int)(iconBounds.Width * 0.5); Rectangle indexBounds = new Rectangle(iconBounds.Right - indexSize, iconBounds.Bottom - indexSize, indexSize, indexSize); @@ -196,7 +224,6 @@ namespace ProjectsEditor.Utils if (app.RepeatIndex > 0) { string indexString = app.RepeatIndex.ToString(CultureInfo.InvariantCulture); - System.Drawing.Font font = new System.Drawing.Font("Tahoma", 8); int indexSize = (int)(iconBounds.Width * 0.5); Rectangle indexBounds = new Rectangle(iconBounds.Right - indexSize, iconBounds.Bottom - indexSize, indexSize, indexSize); @@ -252,42 +279,67 @@ namespace ProjectsEditor.Utils internal static string CreateShortcutIcon(Project project, out Bitmap bitmap) { - int iconSize = 128; object shDesktop = (object)"Desktop"; IWshRuntimeLibrary.WshShell shell = new IWshRuntimeLibrary.WshShell(); string shortcutIconFilename = (string)shell.SpecialFolders.Item(ref shDesktop) + $"\\{project.Name}.ico"; - bitmap = new Bitmap(iconSize, iconSize); + bitmap = new Bitmap(IconSize, IconSize); using (Graphics graphics = Graphics.FromImage(bitmap)) { graphics.SmoothingMode = SmoothingMode.AntiAlias; graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + // if (project != null) + // { + // List selectedApps = project.Applications.Where(x => x.IsSelected).ToList(); + // if (selectedApps.Count > 0) + // { + // graphics.DrawIcon(selectedApps[0].Icon, new Rectangle(0, 0, IconSize / 2, IconSize / 2)); + // } + // if (selectedApps.Count > 1) + // { + // graphics.DrawIcon(selectedApps[1].Icon, new Rectangle(IconSize / 2, 0, IconSize / 2, IconSize / 2)); + // } + // if (selectedApps.Count > 2) + // { + // graphics.DrawIcon(selectedApps[2].Icon, new Rectangle(0, IconSize / 2, IconSize / 2, IconSize / 2)); + // } + // if (selectedApps.Count > 3) + // { + // graphics.DrawIcon(selectedApps[3].Icon, new Rectangle(IconSize / 2, IconSize / 2, IconSize / 2, IconSize / 2)); + // } + // } + // graphics.FillRectangle(new System.Drawing.SolidBrush(Color.FromArgb(128, 32, 32, 32)), 0, 0, IconSize, IconSize); + graphics.FillEllipse(iconBrushes[iconBrushIndex], 0, 0, IconSize, IconSize); + + string shortcutChars = "PR"; + if (project != null) { - List selectedApps = project.Applications.Where(x => x.IsSelected).ToList(); - if (selectedApps.Count > 0) - { - graphics.DrawIcon(selectedApps[0].Icon, new Rectangle(0, 0, iconSize / 2, iconSize / 2)); - } - - if (selectedApps.Count > 1) - { - graphics.DrawIcon(selectedApps[1].Icon, new Rectangle(iconSize / 2, 0, iconSize / 2, iconSize / 2)); - } - - if (selectedApps.Count > 2) - { - graphics.DrawIcon(selectedApps[2].Icon, new Rectangle(0, iconSize / 2, iconSize / 2, iconSize / 2)); - } - - if (selectedApps.Count > 3) - { - graphics.DrawIcon(selectedApps[3].Icon, new Rectangle(iconSize / 2, iconSize / 2, iconSize / 2, iconSize / 2)); - } + shortcutChars = project.GetShortcutChars(); } - graphics.DrawIcon(new Icon(@"images\Projects.ico"), new Rectangle(iconSize / 4, iconSize / 4, iconSize / 2, iconSize / 2)); + Rectangle indexBounds; + if (shortcutChars.Length > 1) + { + indexBounds = new Rectangle(0, 0, IconSize, IconSize); + } + else + { + indexBounds = new Rectangle(IconSize / 4, 0, IconSize / 2, IconSize); + } + + var textSize = graphics.MeasureString(shortcutChars, font); + var state = graphics.Save(); + graphics.TranslateTransform(indexBounds.Left, indexBounds.Top); + graphics.ScaleTransform(indexBounds.Width / textSize.Width, indexBounds.Height / textSize.Height); + graphics.DrawString(shortcutChars, font, Brushes.White, PointF.Empty); + graphics.Restore(state); + iconBrushIndex++; + if (iconBrushIndex >= iconBrushes.Count) + { + iconBrushIndex = 0; + } } FileStream fileStream = new FileStream(shortcutIconFilename, FileMode.OpenOrCreate); @@ -311,10 +363,10 @@ namespace ProjectsEditor.Utils // image entry 1 // 0 image width - iconWriter.Write((byte)iconSize); + iconWriter.Write((byte)IconSize); // 1 image height - iconWriter.Write((byte)iconSize); + iconWriter.Write((byte)IconSize); // 2 number of colors iconWriter.Write((byte)0); @@ -346,5 +398,47 @@ namespace ProjectsEditor.Utils fileStream.Close(); return shortcutIconFilename; } + + private static void CreateExamples(Project project) + { + Bitmap bitmap = new Bitmap(IconSize + 1000, IconSize * iconBrushes.Count); + using (Graphics graphics = Graphics.FromImage(bitmap)) + { + for (int brushIndex = 0; brushIndex < iconBrushes.Count; brushIndex++) + { + graphics.SmoothingMode = SmoothingMode.AntiAlias; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + + graphics.FillEllipse(iconBrushes[brushIndex], 0, IconSize * brushIndex, IconSize, IconSize); + + string shortcutChars = "PR"; + + Rectangle indexBounds; + indexBounds = new Rectangle(0, IconSize * brushIndex, IconSize, IconSize); + + var textSize = graphics.MeasureString(shortcutChars, font); + var state = graphics.Save(); + graphics.TranslateTransform(indexBounds.Left, indexBounds.Top); + graphics.ScaleTransform(indexBounds.Width / textSize.Width, indexBounds.Height / textSize.Height); + graphics.DrawString(shortcutChars, font, Brushes.Black, 0, 0); + graphics.Restore(state); + + var b = (SolidBrush)iconBrushes[brushIndex]; + var colorname = (from p in typeof(System.Drawing.Color).GetProperties() + where p.PropertyType.Equals(typeof(System.Drawing.Color)) + let value = (System.Drawing.Color)p.GetValue(null, null) + where value.R == b.Color.R && + value.G == b.Color.G && + value.B == b.Color.B && + value.A == b.Color.A + select p.Name).DefaultIfEmpty("unknown").First(); + + graphics.DrawString(colorname, font, Brushes.White, IconSize, IconSize * brushIndex); + } + } + + bitmap.Save(@"C:\temp\shorcutIcons.png"); + } } } diff --git a/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs b/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs index af678f3728..17713257b3 100644 --- a/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs +++ b/src/modules/Projects/ProjectsEditor/ViewModels/MainViewModel.cs @@ -142,7 +142,7 @@ namespace ProjectsEditor.ViewModels IWshRuntimeLibrary.IWshShortcut shortcut = (IWshRuntimeLibrary.IWshShortcut)shell.CreateShortcut(shortcutAddress); shortcut.Description = $"Project Launcher {project.Id}"; string basePath = AppDomain.CurrentDomain.BaseDirectory; - shortcut.TargetPath = Path.Combine(basePath, "ProjectsEditor.exe"); + shortcut.TargetPath = Path.Combine(basePath, "ProjectsLauncher.exe"); shortcut.Arguments = '"' + project.Id + '"'; shortcut.WorkingDirectory = basePath; string iconFilename = DrawHelper.CreateShortcutIcon(project, out Bitmap bitmap); @@ -189,23 +189,7 @@ namespace ProjectsEditor.ViewModels projectEdited.Initialize(); } - DrawHelper.CreateShortcutIcon(selectedProject, out Bitmap bitmap); - BitmapImage bitmapImage; - using (var memory = new MemoryStream()) - { - bitmap.Save(memory, ImageFormat.Png); - memory.Position = 0; - - bitmapImage = new BitmapImage(); - bitmapImage.BeginInit(); - bitmapImage.StreamSource = memory; - bitmapImage.CacheOption = BitmapCacheOption.OnLoad; - bitmapImage.EndInit(); - bitmapImage.Freeze(); - } - editPage.DataContext = projectEdited; - editPage.IconPreview.Source = bitmapImage; _mainWindow.ShowPage(editPage); lastUpdatedTimer.Stop(); }