|
@@ -72,26 +72,41 @@ namespace PixiEditor.Views.Dialogs
|
|
|
// Using a DependencyProperty as the backing store for PaletteListDataSources. This enables animation, styling, binding, etc...
|
|
|
public static readonly DependencyProperty PaletteListDataSourcesProperty =
|
|
|
DependencyProperty.Register("PaletteListDataSources", typeof(WpfObservableRangeCollection<PaletteListDataSource>), typeof(PalettesBrowser), new PropertyMetadata(new WpfObservableRangeCollection<PaletteListDataSource>()));
|
|
|
-
|
|
|
- public WpfObservableRangeCollection<Palette> FilteredPalettes
|
|
|
+ public bool SortAscending
|
|
|
{
|
|
|
- get { return (WpfObservableRangeCollection<Palette>)GetValue(FilteredPalettesProperty); }
|
|
|
- set { SetValue(FilteredPalettesProperty, value); }
|
|
|
+ get { return (bool)GetValue(SortAscendingProperty); }
|
|
|
+ set { SetValue(SortAscendingProperty, value); }
|
|
|
}
|
|
|
|
|
|
- // Using a DependencyProperty as the backing store for FilteredPalettes. This enables animation, styling, binding, etc...
|
|
|
- public static readonly DependencyProperty FilteredPalettesProperty =
|
|
|
- DependencyProperty.Register("FilteredPalettes", typeof(WpfObservableRangeCollection<Palette>), typeof(PalettesBrowser));
|
|
|
-
|
|
|
+ // Using a DependencyProperty as the backing store for SortDescending. This enables animation, styling, binding, etc...
|
|
|
+ public static readonly DependencyProperty SortAscendingProperty =
|
|
|
+ DependencyProperty.Register("SortAscending", typeof(bool), typeof(PalettesBrowser), new PropertyMetadata(true, OnSortAscendingChanged));
|
|
|
|
|
|
|
|
|
+ public static readonly DependencyProperty SortedResultsProperty = DependencyProperty.Register(
|
|
|
+ "SortedResults", typeof(WpfObservableRangeCollection<Palette>), typeof(PalettesBrowser), new PropertyMetadata(default(WpfObservableRangeCollection<Palette>)));
|
|
|
|
|
|
+ public WpfObservableRangeCollection<Palette> SortedResults
|
|
|
+ {
|
|
|
+ get { return (WpfObservableRangeCollection<Palette>)GetValue(SortedResultsProperty); }
|
|
|
+ set { SetValue(SortedResultsProperty, value); }
|
|
|
+ }
|
|
|
public string SortingType { get; set; } = "Default";
|
|
|
public ColorsNumberMode ColorsNumberMode { get; set; } = ColorsNumberMode.Any;
|
|
|
public string[] Tags { get; set; } = Array.Empty<string>();
|
|
|
|
|
|
+ private FilteringSettings _filteringSettings;
|
|
|
+
|
|
|
+ public FilteringSettings Filtering
|
|
|
+ {
|
|
|
+ get => _filteringSettings ??= new FilteringSettings(ColorsNumberMode, ColorsNumber, Tags);
|
|
|
+ set => _filteringSettings = value;
|
|
|
+ }
|
|
|
+
|
|
|
private char[] _separators = new char[] { ' ', ',' };
|
|
|
|
|
|
+ private SortingType _sortingType => (SortingType)Enum.Parse(typeof(SortingType), SortingType.Replace(" ", ""));
|
|
|
+
|
|
|
public PalettesBrowser()
|
|
|
{
|
|
|
InitializeComponent();
|
|
@@ -107,121 +122,102 @@ namespace PixiEditor.Views.Dialogs
|
|
|
SystemCommands.CloseWindow(this);
|
|
|
}
|
|
|
|
|
|
- private static void ColorsNumberChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
|
+ private static async void ColorsNumberChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
|
+ {
|
|
|
+ PalettesBrowser browser = (PalettesBrowser)d;
|
|
|
+ browser.Filtering.ColorsCount = (int)e.NewValue;
|
|
|
+ await browser.UpdatePaletteList();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void OnSortAscendingChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
|
|
|
{
|
|
|
PalettesBrowser browser = (PalettesBrowser)d;
|
|
|
- browser.FilterPalettes();
|
|
|
+ browser.Sort();
|
|
|
}
|
|
|
|
|
|
|
|
|
- public async Task UpdatePaletteList(bool refetch = false)
|
|
|
+ public async Task UpdatePaletteList()
|
|
|
{
|
|
|
IsFetching = true;
|
|
|
- if (PaletteList == null || refetch)
|
|
|
+ if(PaletteList?.Palettes != null)
|
|
|
+ {
|
|
|
+ PaletteList.Palettes.Clear();
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0; i < PaletteListDataSources.Count; i++)
|
|
|
{
|
|
|
- for (int i = 0; i < PaletteListDataSources.Count; i++)
|
|
|
+ PaletteList src = await FetchPaletteList(i, Filtering);
|
|
|
+ if (!src.FetchedCorrectly) continue;
|
|
|
+ if (PaletteList == null)
|
|
|
{
|
|
|
- PaletteList src = await FetchPaletteList(i);
|
|
|
- if (!src.FetchedCorrectly) continue;
|
|
|
- if (PaletteList == null)
|
|
|
- {
|
|
|
- PaletteList = src;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- PaletteList.Palettes.AddRange(src.Palettes);
|
|
|
- }
|
|
|
+ PaletteList = src;
|
|
|
}
|
|
|
-
|
|
|
- if (FilteredPalettes == null)
|
|
|
+ else
|
|
|
{
|
|
|
- FilteredPalettes = new WpfObservableRangeCollection<Palette>(PaletteList.Palettes);
|
|
|
+ PaletteList.Palettes?.AddRange(src.Palettes);
|
|
|
}
|
|
|
-
|
|
|
- FilterPalettes();
|
|
|
- OnListFetched.Invoke(PaletteList);
|
|
|
}
|
|
|
|
|
|
+ Sort();
|
|
|
+ OnListFetched?.Invoke(PaletteList);
|
|
|
+
|
|
|
IsFetching = false;
|
|
|
}
|
|
|
|
|
|
- private async Task<PaletteList> FetchPaletteList(int index)
|
|
|
+ private async Task<PaletteList> FetchPaletteList(int index, FilteringSettings filtering)
|
|
|
{
|
|
|
int startIndex = PaletteList != null ? PaletteList.Palettes.Count : 0;
|
|
|
- var src = await PaletteListDataSources[index].FetchPaletteList(startIndex, ItemsPerLoad);
|
|
|
+ var src = await PaletteListDataSources[index].FetchPaletteList(startIndex, ItemsPerLoad, filtering);
|
|
|
return src;
|
|
|
}
|
|
|
|
|
|
private async void ScrollViewer_ScrollChanged(object sender, ScrollChangedEventArgs e)
|
|
|
{
|
|
|
- if (PaletteList == null || PaletteList.Palettes == null) return;
|
|
|
+ if (PaletteList?.Palettes == null) return;
|
|
|
var scrollViewer = (ScrollViewer)sender;
|
|
|
if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
|
|
|
{
|
|
|
IsFetching = true;
|
|
|
- var newPalettes = await FetchPaletteList(0);
|
|
|
- if (newPalettes == null || !newPalettes.FetchedCorrectly || newPalettes.Palettes == null)
|
|
|
+ var newPalettes = await FetchPaletteList(0, Filtering);
|
|
|
+ if (newPalettes is not { FetchedCorrectly: true } || newPalettes.Palettes == null)
|
|
|
{
|
|
|
IsFetching = false;
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
PaletteList.Palettes.AddRange(newPalettes.Palettes);
|
|
|
- FilterPalettes();
|
|
|
- OnListFetched.Invoke(PaletteList);
|
|
|
+ Sort();
|
|
|
+ OnListFetched?.Invoke(PaletteList);
|
|
|
IsFetching = false;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
private void SortingComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
|
{
|
|
|
- if (e.AddedItems != null && e.AddedItems.Count > 0 && e.AddedItems[0] is ComboBoxItem item && item.Content is string value)
|
|
|
+ if (e.AddedItems is { Count: > 0 } && e.AddedItems[0] is ComboBoxItem { Content: string value })
|
|
|
{
|
|
|
SortingType = value;
|
|
|
- FilterPalettes();
|
|
|
+ Sort();
|
|
|
scrollViewer.ScrollToHome();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private void FilterPalettes()
|
|
|
- {
|
|
|
- FilteredPalettes.Clear();
|
|
|
- switch (ColorsNumberMode)
|
|
|
- {
|
|
|
- case ColorsNumberMode.Any:
|
|
|
- FilteredPalettes.AddRange(PaletteList.Palettes);
|
|
|
- break;
|
|
|
- case ColorsNumberMode.Max:
|
|
|
- FilteredPalettes.AddRange(PaletteList.Palettes.Where(x => x.Colors.Count <= ColorsNumber));
|
|
|
- break;
|
|
|
- case ColorsNumberMode.Min:
|
|
|
- FilteredPalettes.AddRange(PaletteList.Palettes.Where(x => x.Colors.Count >= ColorsNumber));
|
|
|
- break;
|
|
|
- case ColorsNumberMode.Exact:
|
|
|
- FilteredPalettes.AddRange(PaletteList.Palettes.Where(x => x.Colors.Count == ColorsNumber));
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- FilteredPalettes.OrderBy()
|
|
|
- }
|
|
|
-
|
|
|
- private void TagsInput_OnSubmit(object sender, InputBoxEventArgs e)
|
|
|
+ private async void TagsInput_OnSubmit(object sender, InputBoxEventArgs e)
|
|
|
{
|
|
|
Tags = e.Input.Split(_separators, options: StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
|
|
- FilterPalettes();
|
|
|
+ Filtering.Tags = Tags;
|
|
|
+ await UpdatePaletteList();
|
|
|
scrollViewer.ScrollToHome();
|
|
|
}
|
|
|
|
|
|
|
|
|
- private void ColorsComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
|
+ private async void ColorsComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
|
|
|
{
|
|
|
- if (e.AddedItems != null && e.AddedItems.Count > 0 && e.AddedItems[0] is ComboBoxItem item && item.Content is string value)
|
|
|
+ if (e.AddedItems is { Count: > 0 } && e.AddedItems[0] is ComboBoxItem item && item.Content is string value)
|
|
|
{
|
|
|
ColorsNumberMode = Enum.Parse<ColorsNumberMode>(value);
|
|
|
- FilterPalettes();
|
|
|
+ Filtering.ColorsNumberMode = ColorsNumberMode;
|
|
|
+ await UpdatePaletteList();
|
|
|
scrollViewer.ScrollToHome();
|
|
|
}
|
|
|
}
|
|
@@ -230,5 +226,52 @@ namespace PixiEditor.Views.Dialogs
|
|
|
{
|
|
|
((Grid)sender).Focus();
|
|
|
}
|
|
|
+
|
|
|
+ private void Sort()
|
|
|
+ {
|
|
|
+ Sort(!SortAscending);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void Sort(bool descending)
|
|
|
+ {
|
|
|
+ if(PaletteList?.Palettes == null) return;
|
|
|
+
|
|
|
+ IOrderedEnumerable<Palette> sorted = null;
|
|
|
+ if (!descending)
|
|
|
+ {
|
|
|
+ switch (_sortingType)
|
|
|
+ {
|
|
|
+ case Models.DataHolders.Palettes.SortingType.Default:
|
|
|
+ sorted = PaletteList.Palettes.OrderBy(x => PaletteList.Palettes.IndexOf(x));
|
|
|
+ break;
|
|
|
+ case Models.DataHolders.Palettes.SortingType.Alphabetical:
|
|
|
+ sorted = PaletteList.Palettes.OrderBy(x => x.Title);
|
|
|
+ break;
|
|
|
+ case Models.DataHolders.Palettes.SortingType.ColorCount:
|
|
|
+ sorted = PaletteList.Palettes.OrderBy(x => x.Colors.Count);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ switch (_sortingType)
|
|
|
+ {
|
|
|
+ case Models.DataHolders.Palettes.SortingType.Default:
|
|
|
+ sorted = PaletteList.Palettes.OrderByDescending(x => PaletteList.Palettes.IndexOf(x));
|
|
|
+ break;
|
|
|
+ case Models.DataHolders.Palettes.SortingType.Alphabetical:
|
|
|
+ sorted = PaletteList.Palettes.OrderByDescending(x => x.Title);
|
|
|
+ break;
|
|
|
+ case Models.DataHolders.Palettes.SortingType.ColorCount:
|
|
|
+ sorted = PaletteList.Palettes.OrderByDescending(x => x.Colors.Count);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(sorted != null)
|
|
|
+ {
|
|
|
+ SortedResults = new WpfObservableRangeCollection<Palette>(sorted);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|