diff --git a/src/modules/Projects/ProjectsEditor/Models/Application.cs b/src/modules/Projects/ProjectsEditor/Models/Application.cs index fec8e20b94..fadb7795fd 100644 --- a/src/modules/Projects/ProjectsEditor/Models/Application.cs +++ b/src/modules/Projects/ProjectsEditor/Models/Application.cs @@ -51,6 +51,26 @@ namespace ProjectsEditor.Models public bool Maximized { get; set; } + private bool _isNotFound; + + [JsonIgnore] + public bool IsNotFound + { + get + { + return _isNotFound; + } + + set + { + if (_isNotFound != value) + { + _isNotFound = value; + OnPropertyChanged(new PropertyChangedEventArgs(nameof(IsNotFound))); + } + } + } + [JsonIgnore] public bool IsSelected { get; set; } @@ -85,9 +105,17 @@ namespace ProjectsEditor.Models { Task task = Task.Run(async () => await GetAppByPackageFamilyNameAsync()); AppListEntry packApp = task.Result; - string filename = Path.GetFileName(AppPath); - string newExeLocation = Path.Combine(packApp.AppInfo.Package.InstalledPath, filename); - _icon = Icon.ExtractAssociatedIcon(newExeLocation); + if (packApp == null) + { + IsNotFound = true; + _icon = new Icon(@"images\DefaultIcon.ico"); + } + else + { + string filename = Path.GetFileName(AppPath); + string newExeLocation = Path.Combine(packApp.AppInfo.Package.InstalledPath, filename); + _icon = Icon.ExtractAssociatedIcon(newExeLocation); + } } else { @@ -97,6 +125,7 @@ namespace ProjectsEditor.Models catch (Exception e) { Logger.LogError($"Exception while extracting icon from app path: {AppPath}. Exception message: {e.Message}"); + IsNotFound = true; _icon = new Icon(@"images\DefaultIcon.ico"); } } diff --git a/src/modules/Projects/ProjectsEditor/Models/Project.cs b/src/modules/Projects/ProjectsEditor/Models/Project.cs index 81f167988d..7cc0b3e1bc 100644 --- a/src/modules/Projects/ProjectsEditor/Models/Project.cs +++ b/src/modules/Projects/ProjectsEditor/Models/Project.cs @@ -213,6 +213,7 @@ namespace ProjectsEditor.Models Maximized = item.Maximized, IsSelected = item.IsSelected, MonitorNumber = item.MonitorNumber, + IsNotFound = item.IsNotFound, Position = new Application.WindowPosition() { X = item.Position.X, Y = item.Position.Y, Height = item.Position.Height, Width = item.Position.Width }, Parent = this, }); @@ -246,7 +247,7 @@ namespace ProjectsEditor.Models public async void Initialize() { - PreviewImage = await Task.Run(() => DrawPreviewIcons()); + PreviewImage = await Task.Run(() => DrawHelper.DrawPreviewIcons(this)); foreach (MonitorSetup monitor in Monitors) { System.Windows.Rect rect = monitor.MonitorDpiAwareBounds; @@ -254,53 +255,6 @@ namespace ProjectsEditor.Models } } - private BitmapImage DrawPreviewIcons() - { - var selectedApps = Applications.Where(x => x.IsSelected); - int appsCount = selectedApps.Count(); - if (appsCount == 0) - { - return null; - } - - Bitmap previewBitmap = new Bitmap(32 * appsCount, 24); - using (Graphics graphics = Graphics.FromImage(previewBitmap)) - { - graphics.SmoothingMode = SmoothingMode.AntiAlias; - graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; - graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; - int appIndex = 0; - foreach (var app in selectedApps) - { - try - { - graphics.DrawIcon(app.Icon, new Rectangle(32 * appIndex, 0, 24, 24)); - } - catch (Exception e) - { - Logger.LogError($"Exception while drawing the icon for app {Name}. Exception message: {e.Message}"); - } - - appIndex++; - } - } - - using (var memory = new MemoryStream()) - { - previewBitmap.Save(memory, ImageFormat.Png); - memory.Position = 0; - - var bitmapImage = new BitmapImage(); - bitmapImage.BeginInit(); - bitmapImage.StreamSource = memory; - bitmapImage.CacheOption = BitmapCacheOption.OnLoad; - bitmapImage.EndInit(); - bitmapImage.Freeze(); - - return bitmapImage; - } - } - private Rectangle GetCommonBounds() { double minX = Monitors.First().MonitorDpiUnawareBounds.Left; diff --git a/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml b/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml index e1a5146b9b..30aac4a870 100644 --- a/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml +++ b/src/modules/Projects/ProjectsEditor/ProjectEditorPage.xaml @@ -10,6 +10,8 @@ Title="Project Editor" Background="{DynamicResource PrimaryBackgroundBrush}"> + + + + + /// Looks up a localized string similar to The application cannot be found. + /// + public static string NotFoundTooltip { + get { + return ResourceManager.GetString("NotFoundTooltip", resourceCulture); + } + } + /// /// Looks up a localized string similar to an hour ago. /// diff --git a/src/modules/Projects/ProjectsEditor/Properties/Resources.resx b/src/modules/Projects/ProjectsEditor/Properties/Resources.resx index 1b25f1a884..f659fb83d0 100644 --- a/src/modules/Projects/ProjectsEditor/Properties/Resources.resx +++ b/src/modules/Projects/ProjectsEditor/Properties/Resources.resx @@ -189,6 +189,9 @@ New project + + The application cannot be found + There are no saved projects. diff --git a/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs b/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs index 3af0696e5f..f6300b4a3b 100644 --- a/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs +++ b/src/modules/Projects/ProjectsEditor/Utils/DrawHelper.cs @@ -12,6 +12,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Windows.Media.Imaging; +using ManagedCommon; using ProjectsEditor.Models; namespace ProjectsEditor.Utils @@ -140,11 +141,11 @@ namespace ProjectsEditor.Utils { if (app.IsHighlighted) { - graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.White : Color.DarkGray, graphics.VisibleClipBounds.Height / 25), path); + graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.White : Color.DarkGray, graphics.VisibleClipBounds.Height / 50), path); } else { - graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.FromArgb(128, 82, 82, 82) : Color.FromArgb(128, 160, 160, 160), graphics.VisibleClipBounds.Height / 100), path); + graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.FromArgb(128, 82, 82, 82) : Color.FromArgb(128, 160, 160, 160), graphics.VisibleClipBounds.Height / 200), path); } graphics.FillPath(brush, path); @@ -198,11 +199,11 @@ namespace ProjectsEditor.Utils { if (apps.Where(x => x.IsHighlighted).Any()) { - graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.White : Color.DarkGray, graphics.VisibleClipBounds.Height / 25), path); + graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.White : Color.DarkGray, graphics.VisibleClipBounds.Height / 50), path); } else { - graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.FromArgb(128, 82, 82, 82) : Color.FromArgb(128, 160, 160, 160), graphics.VisibleClipBounds.Height / 100), path); + graphics.DrawPath(new Pen(Common.ThemeManager.GetCurrentTheme() == Common.Theme.Dark ? Color.FromArgb(128, 82, 82, 82) : Color.FromArgb(128, 160, 160, 160), graphics.VisibleClipBounds.Height / 200), path); } graphics.FillPath(brush, path); @@ -395,6 +396,53 @@ namespace ProjectsEditor.Utils return shortcutIconFilename; } + internal static BitmapImage DrawPreviewIcons(Project project) + { + var selectedApps = project.Applications.Where(x => x.IsSelected); + int appsCount = selectedApps.Count(); + if (appsCount == 0) + { + return null; + } + + Bitmap previewBitmap = new Bitmap(32 * appsCount, 24); + using (Graphics graphics = Graphics.FromImage(previewBitmap)) + { + graphics.SmoothingMode = SmoothingMode.AntiAlias; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; + int appIndex = 0; + foreach (var app in selectedApps) + { + try + { + graphics.DrawIcon(app.Icon, new Rectangle(32 * appIndex, 0, 24, 24)); + } + catch (Exception e) + { + Logger.LogError($"Exception while drawing the icon for app {app.AppName}. Exception message: {e.Message}"); + } + + appIndex++; + } + } + + using (var memory = new MemoryStream()) + { + previewBitmap.Save(memory, ImageFormat.Png); + memory.Position = 0; + + var bitmapImage = new BitmapImage(); + bitmapImage.BeginInit(); + bitmapImage.StreamSource = memory; + bitmapImage.CacheOption = BitmapCacheOption.OnLoad; + bitmapImage.EndInit(); + bitmapImage.Freeze(); + + return bitmapImage; + } + } + private static void CreateExamples(Project project) { Bitmap bitmap = new Bitmap(IconSize + 1000, IconSize * iconBrushes.Count); diff --git a/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs b/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs index b90c7ccdb8..4b90a31e0c 100644 --- a/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs +++ b/src/modules/Projects/ProjectsEditor/Utils/ProjectsEditorIO.cs @@ -118,6 +118,7 @@ namespace ProjectsEditor.Utils Maximized = app.Maximized, Minimized = app.Minimized, IsSelected = true, + IsNotFound = false, Position = new Models.Application.WindowPosition() { Height = app.Position.Height,