diff --git a/AideDeJeu/AideDeJeu/ViewModels/Library/ItemViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/Library/ItemViewModel.cs new file mode 100644 index 00000000..907ce5e8 --- /dev/null +++ b/AideDeJeu/AideDeJeu/ViewModels/Library/ItemViewModel.cs @@ -0,0 +1,162 @@ +using AideDeJeuLib; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Input; +using Xamarin.Forms; + +namespace AideDeJeu.ViewModels.Library +{ + public class ItemViewModel : BaseViewModel + { + Item _Item = null; + public Item Item + { + get { return _Item; } + set + { + SetProperty(ref _Item, value); + } + } + + CancellationTokenSource cancellationTokenSource; + + public ItemViewModel(Item item = null) + { + Title = item?.Name; + Item = item; + LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommandAsync().ConfigureAwait(false)); + SearchCommand = new Command((text) => + { + if (Filter != null) + { + Filter.SearchText = text; + } + }); + } + public Command SearchCommand { get; private set; } + public ICommand LoadItemsCommand { get; protected set; } + + private FilterViewModel _Filter; + public FilterViewModel Filter + { + get + { + return _Filter; + } + set + { + SetProperty(ref _Filter, value); + if (_Filter != null) + { + _Filter.LoadItemsCommand = LoadItemsCommand; + } + } + } + + public Item _Items = new Item(); + public Item Items + { + get + { + return _Items; + } + set + { + SetProperty(ref _Items, value); + } + } + + public IEnumerable _Children = new List(); + public IEnumerable Children + { + get + { + return _Children; + } + set + { + SetProperty(ref _Children, value); + } + } + + private Item _SelectedItem; + public Item SelectedItem + { + get + { + return _SelectedItem; + } + set + { + SetProperty(ref _SelectedItem, value); + if (_SelectedItem != null) + { + if (_SelectedItem is LinkItem) + { + Main.Navigator.NavigateToLinkAsync("/" + (_SelectedItem as LinkItem).Link).ConfigureAwait(true); + } + else + { + Main.Navigator.GotoItemDetailPageAsync(_SelectedItem).ConfigureAwait(true); + } + } + } + } + + private Item _AllItems; + public Item AllItems + { + get + { + return _AllItems; + } + set + { + _AllItems = value; + if (_AllItems != null) + { + Title = _AllItems.Name; + Filter = _AllItems.GetNewFilterViewModel(); + } + } + } + + async Task LoadItemsAsync(CancellationToken cancellationToken = default) + { + try + { + if (Filter != null) + { + var start = DateTime.Now; + var items = await Task.Run(async () => await Filter.GetFilteredItemsAsync(cancellationToken: cancellationToken)); + var end = DateTime.Now; + Debug.WriteLine((end - start).TotalMilliseconds); + Items = new Item(items.ToList()); + Children = items; + } + else + { + Items = AllItems; + //Children = await AllItems.GetChildrenAsync(); + } + } + catch (OperationCanceledException ex) + { + Debug.WriteLine(ex); + } + } + + public async Task ExecuteLoadItemsCommandAsync() + { + cancellationTokenSource?.Cancel(); + cancellationTokenSource = new CancellationTokenSource(); + await LoadItemsAsync(cancellationTokenSource.Token); + } + + } +} diff --git a/AideDeJeu/AideDeJeu/Views/Library/ItemPage.xaml b/AideDeJeu/AideDeJeu/Views/Library/ItemPage.xaml index b6cfe45d..8760321f 100644 --- a/AideDeJeu/AideDeJeu/Views/Library/ItemPage.xaml +++ b/AideDeJeu/AideDeJeu/Views/Library/ItemPage.xaml @@ -11,6 +11,7 @@ + @@ -18,13 +19,32 @@ - + + + + + + + + + + + + + + (ref T backingStore, T value, [CallerMemberName]string propertyName = "", Action onChanged = null)