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