diff --git a/AideDeJeu/AideDeJeu.Android/Properties/AndroidManifest.xml b/AideDeJeu/AideDeJeu.Android/Properties/AndroidManifest.xml index 626b9b6c..03dab11a 100644 --- a/AideDeJeu/AideDeJeu.Android/Properties/AndroidManifest.xml +++ b/AideDeJeu/AideDeJeu.Android/Properties/AndroidManifest.xml @@ -1,5 +1,5 @@  - + diff --git a/AideDeJeu/AideDeJeu/Tools/Behaviors.cs b/AideDeJeu/AideDeJeu/Tools/Behaviors.cs new file mode 100644 index 00000000..b0be6c95 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Tools/Behaviors.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Xamarin.Forms; + +namespace AideDeJeu.Tools +{ + public class TextChangedBehavior : Behavior + { + protected override void OnAttachedTo(SearchBar bindable) + { + base.OnAttachedTo(bindable); + bindable.TextChanged += Bindable_TextChanged; + } + + protected override void OnDetachingFrom(SearchBar bindable) + { + base.OnDetachingFrom(bindable); + bindable.TextChanged -= Bindable_TextChanged; + } + + private void Bindable_TextChanged(object sender, TextChangedEventArgs e) + { + ((SearchBar)sender).SearchCommand?.Execute(e.NewTextValue); + } + } +} diff --git a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs index ea7e6b19..4e08d4d9 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs @@ -8,13 +8,45 @@ namespace AideDeJeu.ViewModels { public abstract class ItemsViewModel : BaseViewModel { - public ItemsViewModel(ObservableCollection items) + public ItemsViewModel(INavigator navigator, ObservableCollection items) { + Navigator = navigator; Items = items; LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommandAsync()); } + protected ObservableCollection AllItems { get; set; } = new ObservableCollection(); public ObservableCollection Items { get; protected set; } public ICommand LoadItemsCommand { get; protected set; } public abstract Task ExecuteLoadItemsCommandAsync(); + public abstract Task ExecuteGotoItemCommandAsync(Item item); + protected INavigator Navigator { get; set; } + + private string _SearchText = ""; + public string SearchText + { + get + { + return _SearchText; + } + set + { + SetProperty(ref _SearchText, value); + FilterItems(); + } + } + + public void FilterItems() + { + Items.Clear(); + foreach (var item in AllItems) + { + if (item.Name.ToLower().Contains(SearchText.ToLower())) + { + Items.Add(item); + } + } + } + + } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs index f8ce5eb7..77db7669 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs @@ -23,7 +23,9 @@ namespace AideDeJeu.ViewModels } set { + CurrentViewModel.SearchText = ""; SetProperty(ref _ItemsType, value); + CurrentViewModel.SearchText = ""; OnPropertyChanged(nameof(CurrentViewModel)); LoadItemsCommand.Execute(null); } @@ -47,19 +49,23 @@ namespace AideDeJeu.ViewModels public ObservableCollection Items { get; private set; } = new ObservableCollection(); public Command LoadItemsCommand { get; private set; } + public Command GotoItemCommand { get; private set; } public Command SwitchToSpells { get; private set; } public Command SwitchToMonsters { get; private set; } public Command AboutCommand { get; private set; } + public Command SearchCommand { get; private set; } public MainViewModel(INavigator navigator) { - Spells = new SpellsViewModel(Items); - Monsters = new MonstersViewModel(Items); + Spells = new SpellsViewModel(navigator, Items); + Monsters = new MonstersViewModel(navigator, Items); LoadItemsCommand = new Command(async () => await CurrentViewModel.ExecuteLoadItemsCommandAsync()); + GotoItemCommand = new Command(async (item) => await CurrentViewModel.ExecuteGotoItemCommandAsync(item)); SwitchToSpells = new Command(() => ItemsType = ItemType.Spell); SwitchToMonsters = new Command(() => ItemsType = ItemType.Monster); AboutCommand = new Command(async() => await navigator.GotoAboutPageAsync()); + SearchCommand = new Command((text) => CurrentViewModel.SearchText = text); } } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs index 2af7a522..d0e6e85e 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs @@ -181,8 +181,8 @@ namespace AideDeJeu.ViewModels } - public MonstersViewModel(ObservableCollection items) - : base(items) + public MonstersViewModel(INavigator navigator, ObservableCollection items) + : base(navigator, items) { } @@ -195,12 +195,13 @@ namespace AideDeJeu.ViewModels try { - Items.Clear(); + AllItems.Clear(); var monsters = await new MonstersScrappers().GetMonsters(category: Categories[Category].Key, type: Types[Type].Key, minPower: Powers[MinPower].Key, maxPower: Powers[MaxPower].Key, size: Sizes[Size].Key, legendary:Legendaries[Legendary].Key, source: Sources[Source].Key); foreach (var monster in monsters) { - Items.Add(monster); + AllItems.Add(monster); } + FilterItems(); } catch (Exception ex) { @@ -211,5 +212,11 @@ namespace AideDeJeu.ViewModels IsBusy = false; } } + + public override async Task ExecuteGotoItemCommandAsync(Item item) + { + await Navigator.GotoMonsterDetailPageAsync(item as Monster); + } + } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs index 963065a6..4d4e8f55 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs @@ -152,8 +152,8 @@ namespace AideDeJeu.ViewModels } - public SpellsViewModel(ObservableCollection items) - : base(items) + public SpellsViewModel(INavigator navigator, ObservableCollection items) + : base(navigator, items) { } @@ -166,12 +166,13 @@ namespace AideDeJeu.ViewModels try { - Items.Clear(); + AllItems.Clear(); var items = await SpellsScrappers.GetSpells(classe: Classes[Classe].Key, niveauMin: NiveauMin, niveauMax: NiveauMax, ecole: Ecoles[Ecole].Key, rituel: Rituels[Rituel].Key, source: Sources[Source].Key); foreach (var item in items) { - Items.Add(item); + AllItems.Add(item); } + FilterItems(); } catch (Exception ex) { @@ -182,5 +183,11 @@ namespace AideDeJeu.ViewModels IsBusy = false; } } + + public override async Task ExecuteGotoItemCommandAsync(Item item) + { + await Navigator.GotoSpellDetailPageAsync(item as Spell); + } + } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/AboutPage.xaml b/AideDeJeu/AideDeJeu/Views/AboutPage.xaml index 8ed667ce..aec80500 100644 --- a/AideDeJeu/AideDeJeu/Views/AboutPage.xaml +++ b/AideDeJeu/AideDeJeu/Views/AboutPage.xaml @@ -27,30 +27,15 @@ - - - - - - - +