Browse Source

Fixed data sources

Krzysztof Krysiński 2 years ago
parent
commit
ae95fafa1a

+ 4 - 3
src/PixiEditor.Extensions/Palettes/FilteringSettings.cs

@@ -7,15 +7,16 @@ public sealed class FilteringSettings
     public ColorsNumberMode ColorsNumberMode { get; set; }
     public int ColorsCount { get; set; }
     public string Name { get; set; }
-
     public bool ShowOnlyFavourites { get; set; }
+    public List<string> Favourites { get; set; }
 
-    public FilteringSettings(ColorsNumberMode colorsNumberMode, int colorsCount, string name, bool showOnlyFavourites)
+    public FilteringSettings(ColorsNumberMode colorsNumberMode, int colorsCount, string name, bool showOnlyFavourites, List<string> favourites)
     {
         ColorsNumberMode = colorsNumberMode;
         ColorsCount = colorsCount;
         Name = name;
         ShowOnlyFavourites = showOnlyFavourites;
+        Favourites = favourites;
     }
 
     public bool Filter(IPalette palette)
@@ -28,7 +29,7 @@ public sealed class FilteringSettings
             return false;
         }
 
-        result = (ShowOnlyFavourites && palette.IsFavourite) || !ShowOnlyFavourites;
+        result = (ShowOnlyFavourites && Favourites.Contains(palette.Name)) || !ShowOnlyFavourites;
 
         if (!result)
         {

+ 3 - 0
src/PixiEditor/Models/UserPreferences/IPreferences.cs

@@ -26,6 +26,9 @@ internal interface IPreferences
     /// <param name="action">The action that will be executed when the setting changes</param>
     public void AddCallback<T>(string name, Action<T> action);
 
+    public void RemoveCallback(string name, Action<object> action);
+    public void RemoveCallback<T>(string name, Action<T> action);
+
     /// <summary>
     /// Initializes the preferences.
     /// </summary>

+ 23 - 0
src/PixiEditor/Models/UserPreferences/PreferencesSettings.cs

@@ -119,6 +119,29 @@ internal class PreferencesSettings : IPreferences
         AddCallback(name, new Action<object>(o => action((T)o)));
     }
 
+    public void RemoveCallback(string name, Action<object> action)
+    {
+        if (action == null)
+        {
+            throw new ArgumentNullException(nameof(action));
+        }
+
+        if (Callbacks.TryGetValue(name, out var callback))
+        {
+            callback.Remove(action);
+        }
+    }
+
+    public void RemoveCallback<T>(string name, Action<T> action)
+    {
+        if (action == null)
+        {
+            throw new ArgumentNullException(nameof(action));
+        }
+
+        RemoveCallback(name, new Action<object>(o => action((T)o)));
+    }
+
 #nullable enable
 
     public T? GetPreference<T>(string name)

+ 37 - 18
src/PixiEditor/Views/Dialogs/PalettesBrowser.xaml.cs

@@ -1,3 +1,4 @@
+using System.ComponentModel;
 using System.Diagnostics;
 using System.IO;
 using System.Windows;
@@ -27,7 +28,7 @@ namespace PixiEditor.Views.Dialogs;
 
 internal partial class PalettesBrowser : Window
 {
-    private const int ItemsPerLoad = 10;
+    private const int ItemsPerLoad = 25;
 
     private readonly LocalizedString[] stopItTexts = new[]
     {
@@ -137,7 +138,8 @@ internal partial class PalettesBrowser : Window
     private FilteringSettings filteringSettings;
 
     public FilteringSettings Filtering => filteringSettings ??=
-        new FilteringSettings(ColorsNumberMode, ColorsNumber, NameFilter, ShowOnlyFavourites);
+        new FilteringSettings(ColorsNumberMode, ColorsNumber, NameFilter, ShowOnlyFavourites,
+            IPreferences.Current.GetLocalPreference<List<string>>(PreferencesConstants.FavouritePalettes));
 
     private char[] separators = new char[] { ' ', ',' };
 
@@ -175,6 +177,14 @@ internal partial class PalettesBrowser : Window
             Instance = null;
             LocalPalettesFetcher.CacheUpdated -= LocalCacheRefreshed;
         };
+
+        IPreferences.Current.AddCallback(PreferencesConstants.FavouritePalettes, OnFavouritePalettesChanged);
+    }
+
+    private void OnFavouritePalettesChanged(object obj)
+    {
+        Filtering.Favourites =
+            IPreferences.Current.GetLocalPreference<List<string>>(PreferencesConstants.FavouritePalettes);
     }
 
     public static PalettesBrowser Open(PaletteProvider provider, ICommand importPaletteCommand, WpfObservableRangeCollection<PaletteColor> currentEditingPalette)
@@ -281,6 +291,12 @@ internal partial class PalettesBrowser : Window
         await UpdatePaletteList();
     }
 
+    private bool IsPaletteFavourite(string name)
+    {
+        var favouritePalettes = IPreferences.Current.GetLocalPreference(PreferencesConstants.FavouritePalettes, new List<string>());
+        return favouritePalettes.Contains(name);
+    }
+
     private void DeletePalette(Palette palette)
     {
         if (palette == null) return;
@@ -342,18 +358,14 @@ internal partial class PalettesBrowser : Window
         IsFetching = true;
         _lastScrolledOffset = -1;
         PaletteList?.Palettes?.Clear();
-        for (int i = 0; i < PaletteProvider.DataSources.Count; i++)
+        PaletteList src = await FetchPaletteList(Filtering);
+        if (PaletteList == null)
         {
-            PaletteList src = await FetchPaletteList(i, Filtering);
-            if (!src.FetchedCorrectly) continue;
-            if (PaletteList == null)
-            {
-                PaletteList = src;
-            }
-            else
-            {
-                PaletteList.Palettes?.AddRange(src.Palettes);
-            }
+            PaletteList = src;
+        }
+        else
+        {
+            PaletteList.Palettes?.AddRange(src.Palettes);
         }
 
         Sort();
@@ -361,16 +373,16 @@ internal partial class PalettesBrowser : Window
         IsFetching = false;
     }
 
-    private async Task<PaletteList> FetchPaletteList(int index, FilteringSettings filtering)
+    private async Task<PaletteList> FetchPaletteList(FilteringSettings filtering)
     {
         int startIndex = PaletteList != null ? PaletteList.Palettes.Count : 0;
-        var src = await PaletteProvider.FetchPalettes(index, startIndex, filtering);
+        var src = await PaletteProvider.FetchPalettes(startIndex, ItemsPerLoad, filtering);
         WpfObservableRangeCollection<Palette> palettes = new WpfObservableRangeCollection<Palette>();
         if (src != null)
         {
             foreach (var pal in src)
             {
-                palettes.Add(new Palette(pal.Name, pal.Colors, pal.FileName) { IsFavourite = pal.IsFavourite});
+                palettes.Add(new Palette(pal.Name, pal.Colors, pal.FileName) { IsFavourite = IsPaletteFavourite(pal.Name) });
             }
         }
 
@@ -393,7 +405,7 @@ internal partial class PalettesBrowser : Window
         if (viewer.VerticalOffset == viewer.ScrollableHeight && _lastScrolledOffset != viewer.VerticalOffset)
         {
             IsFetching = true;
-            var newPalettes = await FetchPaletteList(0, Filtering);
+            var newPalettes = await FetchPaletteList(Filtering);
             if (newPalettes is not { FetchedCorrectly: true } || newPalettes.Palettes == null)
             {
                 IsFetching = false;
@@ -421,7 +433,7 @@ internal partial class PalettesBrowser : Window
 
     private async void ColorsComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
     {
-        if (e.AddedItems is { Count: > 0 } && e.AddedItems[0] is ComboBoxItem)
+        if (Instance != null && e.AddedItems is { Count: > 0 } && e.AddedItems[0] is ComboBoxItem)
         {
             var comboBox = (ComboBox)sender;
             ColorsNumberMode = (ColorsNumberMode)comboBox.SelectedIndex;
@@ -588,4 +600,11 @@ internal partial class PalettesBrowser : Window
     {
         ProcessHelpers.ShellExecute(e.Uri.ToString());
     }
+
+    protected override void OnClosing(CancelEventArgs e)
+    {
+        base.OnClosing(e);
+
+        IPreferences.Current.RemoveCallback(PreferencesConstants.FavouritePalettes, OnFavouritePalettesChanged);
+    }
 }

+ 7 - 8
src/SampleExtension/TestPaletteDataSource.cs

@@ -4,15 +4,14 @@ namespace SampleExtension;
 
 public class TestPaletteDataSource : PaletteListDataSource
 {
+    private List<ExtensionPalette> palettes = new()
+    {
+        new ExtensionPalette("Test Palette", new List<PaletteColor> { PaletteColor.Black, PaletteColor.White, })
+    };
     public override Task<List<IPalette>> FetchPaletteList(int startIndex, int items, FilteringSettings filtering)
     {
-        return Task.FromResult(new List<IPalette>
-        {
-            new ExtensionPalette("Test Palette", new List<PaletteColor>
-            {
-                PaletteColor.Black,
-                PaletteColor.White,
-            })
-        });
+        if(startIndex >= palettes.Count) return Task.FromResult(new List<IPalette>());
+
+        return Task.FromResult(palettes.Skip(startIndex).Take(items).Where(filtering.Filter).Cast<IPalette>().ToList());
     }
 }