diff --git a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs index e5e762c5..1d6a144b 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs @@ -1,4 +1,5 @@ -using AideDeJeuLib; +using AideDeJeu.Tools; +using AideDeJeuLib; using System; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -18,20 +19,58 @@ namespace AideDeJeu.ViewModels set => SetProperty(ref _isLoading, value); } - private Dictionary _AllItems = new Dictionary(); - public async Task GetItemFromDataAsync(string source) + void AddAnchor(Dictionary anchors, Item item) + { + if (item != null) + { + var basename = Helpers.IdFromName(item.Name); + var name = basename; + int index = 0; + while (true) + { + if (!anchors.ContainsKey(name)) + { + anchors.Add(name, item); + return; + } + index++; + name = $"{basename}{index}"; + } + } + } + void MakeAnchors(Dictionary anchors, Item baseItem) + { + AddAnchor(anchors, baseItem); + if(baseItem is Items) + { + foreach(var item in (baseItem as Items)) + { + MakeAnchors(anchors, item); + } + } + } + + public class ItemWithAnchors + { + public Item Item { get; set; } + public Dictionary Anchors { get; set; } = new Dictionary(); + } + + private Dictionary _AllItems = new Dictionary(); + public async Task GetItemFromDataAsync(string source, string anchor) { if (!_AllItems.ContainsKey(source)) { //var md = await Tools.Helpers.GetStringFromUrl($"https://raw.githubusercontent.com/Nioux/AideDeJeu/master/Data/{source}.md"); var md = await Tools.Helpers.GetResourceStringAsync($"AideDeJeu.Data.{source}.md"); - //return Tools.MarkdownExtensions.ToItem(md); if (md != null) { var item = Tools.MarkdownExtensions.ToItem(md); if (item != null) { - _AllItems[source] = item; + var anchors = new Dictionary(); + MakeAnchors(anchors, item); + _AllItems[source] = new ItemWithAnchors() { Item = item, Anchors = anchors }; } else { @@ -43,7 +82,15 @@ namespace AideDeJeu.ViewModels return null; } } - return _AllItems[source]; + var itemWithAnchors = _AllItems[source]; + if (!string.IsNullOrEmpty(anchor)) + { + if (itemWithAnchors.Anchors.ContainsKey(anchor)) + { + return itemWithAnchors.Anchors[anchor]; + } + } + return itemWithAnchors.Item; } public Command LoadItemsCommand { get; private set; } diff --git a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs index fbfe9a3b..db27763e 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs @@ -73,7 +73,7 @@ namespace AideDeJeu.ViewModels var with = match.Groups["with"].Value; Main.IsBusy = true; Main.IsLoading = true; - var item = await Main.GetItemFromDataAsync(file); + var item = await Main.GetItemFromDataAsync(file, anchor); Main.IsBusy = false; Main.IsLoading = false; if (item != null) @@ -81,37 +81,26 @@ namespace AideDeJeu.ViewModels if (item is Items) { var items = item as Items; - if (!string.IsNullOrEmpty(anchor)) + var filterViewModel = items.GetNewFilterViewModel(); + var itemsViewModel = new ItemsViewModel() { AllItems = items, Filter = filterViewModel }; + itemsViewModel.LoadItemsCommand.Execute(null); + if(!string.IsNullOrEmpty(with)) { - var subitem = items.Where(i => Tools.Helpers.IdFromName(i.Name) == anchor).FirstOrDefault(); - if (subitem != null) + var swith = with.Split('_'); + for (int i = 0; i < swith.Length / 2; i++) { - await GotoItemDetailPageAsync(subitem); + var key = swith[i * 2 + 0]; + var val = swith[i * 2 + 1]; + filterViewModel.FilterWith(key, val); } } + if (filterViewModel == null) + { + await GotoItemsPageAsync(itemsViewModel); + } else { - var filterViewModel = items.GetNewFilterViewModel(); - var itemsViewModel = new ItemsViewModel() { AllItems = items, Filter = filterViewModel }; - itemsViewModel.LoadItemsCommand.Execute(null); - if(!string.IsNullOrEmpty(with)) - { - var swith = with.Split('_'); - for (int i = 0; i < swith.Length / 2; i++) - { - var key = swith[i * 2 + 0]; - var val = swith[i * 2 + 1]; - filterViewModel.FilterWith(key, val); - } - } - if (filterViewModel == null) - { - await GotoItemsPageAsync(itemsViewModel); - } - else - { - await GotoFilteredItemsPageAsync(itemsViewModel); - } + await GotoFilteredItemsPageAsync(itemsViewModel); } } else