From c1f0c66283724a5e10243a2d06abbfd765180c04 Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Sat, 25 Aug 2018 23:06:46 +0200 Subject: [PATCH] Deeeeeeep search ;) --- AideDeJeu/AideDeJeu/AideDeJeu.csproj | 3 ++ AideDeJeu/AideDeJeu/Models/Items.cs | 5 ++ .../ViewModels/DeepSearchViewModel.cs | 43 +++++++++++++++ .../AideDeJeu/ViewModels/MainViewModel.cs | 40 ++++++++++++++ AideDeJeu/AideDeJeu/ViewModels/Navigator.cs | 7 +-- AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml | 52 +++++++++++++++++++ .../AideDeJeu/Views/DeepSearchPage.xaml.cs | 37 +++++++++++++ 7 files changed, 181 insertions(+), 6 deletions(-) create mode 100644 AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs create mode 100644 AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml create mode 100644 AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml.cs diff --git a/AideDeJeu/AideDeJeu/AideDeJeu.csproj b/AideDeJeu/AideDeJeu/AideDeJeu.csproj index 2674d123..f0ce4357 100644 --- a/AideDeJeu/AideDeJeu/AideDeJeu.csproj +++ b/AideDeJeu/AideDeJeu/AideDeJeu.csproj @@ -332,6 +332,9 @@ + + MSBuild:UpdateDesignTimeXaml + MSBuild:UpdateDesignTimeXaml diff --git a/AideDeJeu/AideDeJeu/Models/Items.cs b/AideDeJeu/AideDeJeu/Models/Items.cs index e52d01f3..0d8983f1 100644 --- a/AideDeJeu/AideDeJeu/Models/Items.cs +++ b/AideDeJeu/AideDeJeu/Models/Items.cs @@ -15,6 +15,11 @@ namespace AideDeJeuLib _Items = items; } + public Items(IEnumerable items) + { + _Items = items.ToList(); + } + public Items() { _Items = new List(); diff --git a/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs new file mode 100644 index 00000000..f66ede94 --- /dev/null +++ b/AideDeJeu/AideDeJeu/ViewModels/DeepSearchViewModel.cs @@ -0,0 +1,43 @@ +using AideDeJeuLib; +using System; +using System.Collections.Generic; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Input; +using Xamarin.Forms; + +namespace AideDeJeu.ViewModels +{ + public class DeepSearchViewModel : BaseViewModel + { + private Command _SearchCommand = null; + public ICommand SearchCommand + { + get + { + return _SearchCommand ?? (_SearchCommand = new Command(async (searchText) => await ExecuteSearchCommandAsync(searchText))); + } + } + + public async Task ExecuteSearchCommandAsync(string searchText) + { + Main.IsLoading = true; + await Task.Run(async () => await Main.PreloadAllItemsAsync()); + Items = await Task.Run(async () => await Main.DeepSearchAllItemsAsync(searchText)); + Main.IsLoading = false; + } + + public IEnumerable _Items = null; + public IEnumerable Items + { + get + { + return _Items; + } + set + { + SetProperty(ref _Items, value); + } + } + } +} diff --git a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs index 7a926b4f..ee72b5b7 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs @@ -85,6 +85,46 @@ namespace AideDeJeu.ViewModels } } + public class SearchedItem + { + public string Preview { get; set; } + public Item Item { get; set; } + } + + public async Task> DeepSearchAllItemsAsync(string searchText) + { + List primaryItems = new List(); + List secondaryItems = new List(); + var cleanSearchText = Tools.Helpers.RemoveDiacritics(searchText).ToLower(); + foreach (var allItem in _AllItems) + { + foreach(var item in allItem.Value.Anchors) + { + var name = item.Value.Name; + var cleanName = Tools.Helpers.RemoveDiacritics(name).ToLower(); + if (cleanName.Contains(cleanSearchText)) + { + primaryItems.Add(new SearchedItem() { Item = item.Value, Preview = name }); + } + else + { + var markdown = item.Value.Markdown; + var cleanMarkdown = Tools.Helpers.RemoveDiacritics(markdown).ToLower(); + if (cleanMarkdown.Contains(cleanSearchText)) + { + int position = cleanMarkdown.IndexOf(cleanSearchText); + int startPosition = Math.Max(0, position - 30); + int endPosition = Math.Min(markdown.Length, position + searchText.Length + 30); + var preview = markdown.Substring(startPosition, endPosition - startPosition - 1); + secondaryItems.Add(new SearchedItem() { Item = item.Value, Preview = preview }); + } + } + } + } + primaryItems.AddRange(secondaryItems); + return primaryItems; + } + public async Task GetItemFromDataAsync(string source, string anchor) { //await Task.Delay(3000); diff --git a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs index 2c5e9abb..ec7c960a 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs @@ -48,12 +48,7 @@ namespace AideDeJeu.ViewModels public async Task GotoDeepSearchPageAsync() { - Main.IsLoading = true; - // à remplacer par gros chargement - await Task.Run(async () => await Main.PreloadAllItemsAsync()); - //await Task.Run(async () => await Task.Delay(5000)); - Main.IsLoading = false; - //await Navigation.PushAsync(new Views.DeepSearchPage()); + await Navigation.PushAsync(new Views.DeepSearchPage()); } public async Task GotoItemDetailPageAsync(Item item) diff --git a/AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml b/AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml new file mode 100644 index 00000000..ac57802d --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml.cs new file mode 100644 index 00000000..c3e362e0 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/DeepSearchPage.xaml.cs @@ -0,0 +1,37 @@ +using AideDeJeu.ViewModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +using Xamarin.Forms; +using Xamarin.Forms.Xaml; + +namespace AideDeJeu.Views +{ + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class DeepSearchPage : ContentPage + { + MainViewModel Main + { + get + { + return DependencyService.Get(); + } + } + + public DeepSearchPage () + { + InitializeComponent (); + + BindingContext = new DeepSearchViewModel(); + } + + private async void ItemsListView_ItemTapped(object sender, ItemTappedEventArgs e) + { + var searchedItem = e.Item as MainViewModel.SearchedItem; + await Main.Navigator.GotoItemDetailPageAsync(searchedItem.Item); + } + } +} \ No newline at end of file