diff --git a/AideDeJeu/AideDeJeu.Android/Resources/Resource.designer.cs b/AideDeJeu/AideDeJeu.Android/Resources/Resource.designer.cs
index 28cd2faa..ce4544ed 100644
--- a/AideDeJeu/AideDeJeu.Android/Resources/Resource.designer.cs
+++ b/AideDeJeu/AideDeJeu.Android/Resources/Resource.designer.cs
@@ -1,11 +1,11 @@
#pragma warning disable 1591
//------------------------------------------------------------------------------
//
-// Ce code a été généré par un outil.
-// Version du runtime :4.0.30319.42000
+// This code was generated by a tool.
+// Runtime Version:4.0.30319.42000
//
-// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si
-// le code est régénéré.
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
//
//------------------------------------------------------------------------------
diff --git a/AideDeJeu/AideDeJeu/AideDeJeu.csproj b/AideDeJeu/AideDeJeu/AideDeJeu.csproj
index 5e719179..eee9ccba 100644
--- a/AideDeJeu/AideDeJeu/AideDeJeu.csproj
+++ b/AideDeJeu/AideDeJeu/AideDeJeu.csproj
@@ -7,8 +7,12 @@
pdbonly
true
+ Latest
+
+ Latest
+
diff --git a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs
index a99145e6..dfe73926 100644
--- a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs
+++ b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs
@@ -8,13 +8,15 @@ using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Input;
+using System.Threading;
+using System.Threading.Tasks;
namespace AideDeJeu.ViewModels
{
public abstract class FilterViewModel : BaseViewModel
{
public ICommand LoadItemsCommand { get; protected set; }
- public abstract IEnumerable- FilterItems(IEnumerable
- items);
+ public abstract Task> FilterItems(IEnumerable
- items, CancellationToken token = default);
public abstract IEnumerable Filters { get; }
private string _SearchText = "";
public string SearchText
@@ -77,7 +79,7 @@ namespace AideDeJeu.ViewModels
{
get
{
- if(Index >= 0 && Index < KeyValues.Count)
+ if (Index >= 0 && Index < KeyValues.Count)
{
return KeyValues[Index].Key;
}
@@ -94,7 +96,7 @@ namespace AideDeJeu.ViewModels
{
get
{
- if(_Filters == null)
+ if (_Filters == null)
{
_Filters = new List()
{
@@ -111,29 +113,31 @@ namespace AideDeJeu.ViewModels
}
- public override IEnumerable
- FilterItems(IEnumerable
- items)
+ public override async Task> FilterItems(IEnumerable
- items, CancellationToken token = default)
{
- var classe = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Class).SelectedKey ?? "";
- var niveauMin = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MinLevel).SelectedKey ?? "0";
- var niveauMax = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MaxLevel).SelectedKey ?? "9";
- var ecole = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.School).SelectedKey ?? "";
- var rituel = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Ritual).SelectedKey ?? "";
- var source = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Source).SelectedKey ?? "";
+ return await Task.Run(() =>
+ {
+ var classe = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Class).SelectedKey ?? "";
+ var niveauMin = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MinLevel).SelectedKey ?? "0";
+ var niveauMax = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MaxLevel).SelectedKey ?? "9";
+ var ecole = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.School).SelectedKey ?? "";
+ var rituel = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Ritual).SelectedKey ?? "";
+ var source = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Source).SelectedKey ?? "";
+ token.ThrowIfCancellationRequested();
+ return items.Where(item =>
+ {
+ var spell = item as Spell;
+ return (int.Parse(spell.Level) >= int.Parse(niveauMin)) &&
+ (int.Parse(spell.Level) <= int.Parse(niveauMax)) &&
+ spell.Type.ToLower().Contains(ecole.ToLower()) &&
+ spell.Source.Contains(source) &&
+ spell.Source.Contains(classe) &&
+ spell.Type.Contains(rituel) &&
+ spell.NamePHB.ToLower().Contains(SearchText.ToLower());
+ }).OrderBy(spell => spell.NamePHB)
+ .AsEnumerable();
+ }, token);
- return items
- .Where(item =>
- {
- var spell = item as Spell;
- return (int.Parse(spell.Level) >= int.Parse(niveauMin)) &&
- (int.Parse(spell.Level) <= int.Parse(niveauMax)) &&
- spell.Type.ToLower().Contains(ecole.ToLower()) &&
- spell.Source.Contains(source) &&
- spell.Source.Contains(classe) &&
- spell.Type.Contains(rituel) &&
- spell.NamePHB.ToLower().Contains(SearchText.ToLower());
- })
- .OrderBy(spell => spell.NamePHB)
- .ToList();
}
public abstract List> Classes { get; }
@@ -343,19 +347,30 @@ namespace AideDeJeu.ViewModels
}
}
- public override IEnumerable
- FilterItems(IEnumerable
- items)
+ public override async Task> FilterItems(IEnumerable
- items, CancellationToken token = default)
{
- var powerComparer = new PowerComparer();
+ return await Task.Run(() =>
+ {
+ var powerComparer = new PowerComparer();
- //var category = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Category).SelectedKey ?? "";
- var type = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Type).SelectedKey ?? "";
- var minPower = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MinPower).SelectedKey ?? "0 (0 PX)";
- var maxPower = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MaxPower).SelectedKey ?? "30 (155000 PX)";
- var size = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Size).SelectedKey ?? "";
- //var legendary = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Legendary).SelectedKey ?? "";
- var source = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Source).SelectedKey ?? "";
+ //var category = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Category).SelectedKey ?? "";
+ var type = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Type).SelectedKey ?? "";
+ token.ThrowIfCancellationRequested();
- return items.Where(item =>
+ var minPower = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MinPower).SelectedKey ?? "0 (0 PX)";
+ token.ThrowIfCancellationRequested();
+
+ var maxPower = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.MaxPower).SelectedKey ?? "30 (155000 PX)";
+ token.ThrowIfCancellationRequested();
+
+ var size = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Size).SelectedKey ?? "";
+ token.ThrowIfCancellationRequested();
+ //var legendary = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Legendary).SelectedKey ?? "";
+
+ var source = Filters.SingleOrDefault(filter => filter.Key == FilterKeys.Source).SelectedKey ?? "";
+ token.ThrowIfCancellationRequested();
+
+ return items.Where(item =>
{
var monster = item as Monster;
return monster.Type.Contains(type) &&
@@ -365,8 +380,10 @@ namespace AideDeJeu.ViewModels
powerComparer.Compare(monster.Challenge, maxPower) <= 0 &&
monster.NamePHB.ToLower().Contains(SearchText.ToLower());
})
- .OrderBy(monster => monster.NamePHB)
- .ToList();
+ .OrderBy(monster => monster.NamePHB)
+ .AsEnumerable();
+ }, token);
+
}
public abstract List> Categories { get; }
diff --git a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs
index f34619f9..c4e3b9da 100644
--- a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs
+++ b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs
@@ -8,15 +8,18 @@ using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;
+using System.Threading;
namespace AideDeJeu.ViewModels
{
public abstract class ItemsViewModel : BaseViewModel
{
+ CancellationTokenSource cancellationTokenSource;
+
public ItemsViewModel(ItemSourceType itemSourceType)
{
this.ItemSourceType = itemSourceType;
- LoadItemsCommand = new Command(() => ExecuteLoadItemsCommand());
+ LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommandAsync());
}
public ICommand LoadItemsCommand { get; protected set; }
//public abstract void ExecuteLoadItemsCommand();
@@ -66,26 +69,28 @@ namespace AideDeJeu.ViewModels
}
}
- public void ExecuteLoadItemsCommand()
+ async Task LoadItemsAsync(CancellationToken token = default)
{
- if (IsBusy)
- return;
-
IsBusy = true;
-
+ Main.IsLoading = true;
try
{
- Main.Items.Clear();
-
var filterViewModel = Main.GetFilterViewModel(ItemSourceType);
- var items = filterViewModel.FilterItems(AllItems);
-
- foreach (var item in items)
+ var items = await filterViewModel.FilterItems(AllItems, token);
+ await Task.Run(() =>
{
- Main.Items.Add(item);
- }
+ Main.Items.Clear();
+ foreach (var item in items)
+ {
+ token.ThrowIfCancellationRequested();
+ Main.Items.Add(item);
+ }
+ });
+
+ //On arrete le loading ici car on annule toujours avant de lancer une nouvelle opération
+ Main.IsLoading = false;
}
- catch (Exception ex)
+ catch (OperationCanceledException ex)
{
Debug.WriteLine(ex);
}
@@ -95,6 +100,14 @@ namespace AideDeJeu.ViewModels
}
}
-
+ public async Task ExecuteLoadItemsCommandAsync()
+ {
+ if (cancellationTokenSource != null)
+ {
+ cancellationTokenSource.Cancel();
+ }
+ cancellationTokenSource = new CancellationTokenSource();
+ await LoadItemsAsync(cancellationTokenSource.Token);
+ }
}
}
diff --git a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs
index 220786a4..c3463121 100644
--- a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs
+++ b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs
@@ -52,6 +52,13 @@ namespace AideDeJeu.ViewModels
}
}
+ private bool _isLoading;
+ public bool IsLoading
+ {
+ get => _isLoading;
+ set => SetProperty(ref _isLoading, value);
+ }
+
public Dictionary> AllItemsViewModel = new Dictionary>()
{
{ ItemSourceType.SpellVF, new Lazy(() => new SpellsViewModel(ItemSourceType.SpellVF)) },
@@ -116,21 +123,21 @@ namespace AideDeJeu.ViewModels
public MainViewModel()
{
- LoadItemsCommand = new Command(() =>
+ LoadItemsCommand = new Command(async () =>
{
- GetItemsViewModel(ItemSourceType).ExecuteLoadItemsCommand();
+ await GetItemsViewModel(ItemSourceType).ExecuteLoadItemsCommandAsync();
});
GotoItemCommand = new Command
- (async (item) => await GetItemsViewModel(ItemSourceType).ExecuteGotoItemCommandAsync(item));
- SwitchToSpells = new Command(() => ItemSourceType = (ItemSourceType & ~ ItemSourceType.Monster) | ItemSourceType.Spell);
+ SwitchToSpells = new Command(() => ItemSourceType = (ItemSourceType & ~ItemSourceType.Monster) | ItemSourceType.Spell);
SwitchToMonsters = new Command(() => ItemSourceType = (ItemSourceType & ~ItemSourceType.Spell) | ItemSourceType.Monster);
SwitchToVF = new Command(() => ItemSourceType = (ItemSourceType & ~ItemSourceType.VO & ~ItemSourceType.HD) | ItemSourceType.VF);
SwitchToVO = new Command(() => ItemSourceType = (ItemSourceType & ~ItemSourceType.VF & ~ItemSourceType.HD) | ItemSourceType.VO);
SwitchToHD = new Command(() => ItemSourceType = (ItemSourceType & ~ItemSourceType.VF & ~ItemSourceType.VO) | ItemSourceType.HD);
- AboutCommand = new Command(async() => await Main.Navigator.GotoAboutPageAsync());
- SearchCommand = new Command((text) =>
+ AboutCommand = new Command(async () => await Main.Navigator.GotoAboutPageAsync());
+ SearchCommand = new Command(async (text) =>
{
GetFilterViewModel(ItemSourceType).SearchText = text;
- GetItemsViewModel(ItemSourceType).ExecuteLoadItemsCommand();
+ await GetItemsViewModel(ItemSourceType).ExecuteLoadItemsCommandAsync();
});
}
}
diff --git a/AideDeJeu/AideDeJeu/Views/MainPage.xaml b/AideDeJeu/AideDeJeu/Views/MainPage.xaml
index 78cdb795..42ff789a 100644
--- a/AideDeJeu/AideDeJeu/Views/MainPage.xaml
+++ b/AideDeJeu/AideDeJeu/Views/MainPage.xaml
@@ -1,45 +1,30 @@
-
-
+
+
-
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -54,40 +39,29 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
\ No newline at end of file