Browse Source

Added taskbar icon image preview

CPKreuz 4 years ago
parent
commit
13ebc77137

+ 19 - 0
PixiEditor/ViewModels/SubViewModels/UserPreferences/Settings/GeneralSettings.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PixiEditor.ViewModels.SubViewModels.UserPreferences.Settings
+{
+    public class GeneralSettings : SettingsGroup
+    {
+        private bool imagePreviewInTaskbar = GetPreference(nameof(ImagePreviewInTaskbar), false);
+
+        public bool ImagePreviewInTaskbar
+        {
+            get => imagePreviewInTaskbar;
+            set => RaiseAndUpdatePreference(ref imagePreviewInTaskbar, value);
+        }
+    }
+}

+ 2 - 0
PixiEditor/ViewModels/SubViewModels/UserPreferences/SettingsViewModel.cs

@@ -7,6 +7,8 @@ namespace PixiEditor.ViewModels.SubViewModels.UserPreferences
 {
     public class SettingsViewModel : SubViewModel<SettingsWindowViewModel>
     {
+        public GeneralSettings General { get; set; } = new GeneralSettings();
+
         public FileSettings File { get; set; } = new FileSettings();
 
         public UpdateSettings Update { get; set; } = new UpdateSettings();

+ 2 - 0
PixiEditor/Views/Dialogs/SettingsWindow.xaml

@@ -57,6 +57,8 @@
             <Grid Visibility="{Binding SelectedCategory, Converter={StaticResource EqualityBoolToVisibilityConverter},
             ConverterParameter='General'}">
                 <StackPanel Orientation="Vertical">
+                    <CheckBox Content="Show Document Preview in Taskbar" Margin="25,30,0,0"
+                                  IsChecked="{Binding SettingsSubViewModel.General.ImagePreviewInTaskbar}"/>
                     <Label Content="File" Style="{StaticResource Header1}"/>
                     <StackPanel Orientation="Vertical" Margin="50 0 50 0">
                         <CheckBox Content="Show Startup Window" 

+ 49 - 1
PixiEditor/Views/MainWindow.xaml.cs

@@ -9,6 +9,9 @@ using PixiEditor.ViewModels.SubViewModels.Main;
 using System.Diagnostics;
 using System.Linq;
 using PixiEditor.Views.Dialogs;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using PixiEditor.Models.DataHolders;
 
 namespace PixiEditor
 {
@@ -17,16 +20,24 @@ namespace PixiEditor
     /// </summary>
     public partial class MainWindow : Window
     {
+        private static WriteableBitmap pixiEditorLogo;
+
+        private PreferencesSettings preferences;
+
         public new ViewModelMain DataContext { get => (ViewModelMain)base.DataContext; set => base.DataContext = value; }
 
         public MainWindow()
         {
             InitializeComponent();
 
+            preferences = new PreferencesSettings();
+
             IServiceCollection services = new ServiceCollection()
-                .AddSingleton<IPreferences>(new PreferencesSettings())
+                .AddSingleton<IPreferences>(preferences)
                 .AddSingleton(new StylusViewModel());
 
+            pixiEditorLogo = BitmapFactory.FromResource(@"/Images/PixiEditorLogo.png");
+
             DataContext = new ViewModelMain(services.BuildServiceProvider());
 
             StateChanged += MainWindowStateChangeRaised;
@@ -35,6 +46,19 @@ namespace PixiEditor
             MaxHeight = SystemParameters.MaximizedPrimaryScreenHeight;
             DataContext.CloseAction = Close;
             Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;
+
+            DataContext.BitmapManager.DocumentChanged += BitmapManager_DocumentChanged;
+            preferences.AddCallback("ImagePreviewInTaskbar", x =>
+            {
+                if ((bool)x)
+                {
+                    UpdateTaskbarIcon(DataContext.BitmapManager.ActiveDocument);
+                }
+                else
+                {
+                    UpdateTaskbarIcon(null);
+                }
+            });
         }
 
         protected override void OnClosing(CancelEventArgs e)
@@ -49,6 +73,30 @@ namespace PixiEditor
             Application.Current.Windows.OfType<HelloTherePopup>().ToList().ForEach(x => { if (!x.IsClosing) x.Close(); });
         }
 
+        private void BitmapManager_DocumentChanged(object sender, Models.Events.DocumentChangedEventArgs e)
+        {
+            if (preferences.GetPreference("ImagePreviewInTaskbar", false))
+            {
+                UpdateTaskbarIcon(e.NewDocument);
+            }
+        }
+
+        private void UpdateTaskbarIcon(Document document)
+        {
+            if (document?.PreviewImage == null)
+            {
+                Icon = pixiEditorLogo;
+                return;
+            }
+
+            var previewCopy = document.PreviewImage.Clone()
+                .Resize(512, 512, WriteableBitmapExtensions.Interpolation.NearestNeighbor);
+
+            previewCopy.Blit(new Rect(256, 256, 256, 256), pixiEditorLogo, new Rect(0, 0, 512, 512));
+
+            Icon = previewCopy;
+        }
+
         private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
         {
             e.CanExecute = true;