From ab4758555b3fcbee3a52112448442eef37e4f06a Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Tue, 12 Jun 2018 22:35:55 +0200 Subject: [PATCH] Mode dual --- AideDeJeu/AideDeJeu/Tools/Comparers.cs | 6 +- AideDeJeu/AideDeJeu/Tools/Helpers.cs | 10 ++ .../AideDeJeu/Tools/MarkdownExtensions.cs | 64 ++++++++----- .../AideDeJeu/ViewModels/FilterViewModel.cs | 13 +-- .../AideDeJeu/ViewModels/ItemsViewModel.cs | 94 ++++++++++--------- .../AideDeJeu/ViewModels/MainViewModel.cs | 5 +- .../ViewModels/SpellDetailViewModel.cs | 4 +- 7 files changed, 113 insertions(+), 83 deletions(-) diff --git a/AideDeJeu/AideDeJeu/Tools/Comparers.cs b/AideDeJeu/AideDeJeu/Tools/Comparers.cs index 3552e982..a3f99b91 100644 --- a/AideDeJeu/AideDeJeu/Tools/Comparers.cs +++ b/AideDeJeu/AideDeJeu/Tools/Comparers.cs @@ -23,8 +23,10 @@ namespace AideDeJeu.Tools if (string.IsNullOrEmpty(x)) return 1; if (string.IsNullOrEmpty(y)) return -1; var regex = new Regex(@"\((?\d*?) (PX|XP)\)"); - int xpx = int.Parse(regex.Match(x).Groups["xp"].Value); - int xpy = int.Parse(regex.Match(y).Groups["xp"].Value); + int xpx; + int.TryParse(regex.Match(x).Groups["xp"].Value, out xpx); + int xpy; + int.TryParse(regex.Match(y).Groups["xp"].Value, out xpy); return xpx - xpy; } } diff --git a/AideDeJeu/AideDeJeu/Tools/Helpers.cs b/AideDeJeu/AideDeJeu/Tools/Helpers.cs index 63a040ea..1f46ae54 100644 --- a/AideDeJeu/AideDeJeu/Tools/Helpers.cs +++ b/AideDeJeu/AideDeJeu/Tools/Helpers.cs @@ -2,9 +2,11 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using System.Net.Http; using System.Reflection; using System.Runtime.Serialization.Json; using System.Text; +using System.Threading.Tasks; namespace AideDeJeu.Tools { @@ -20,6 +22,14 @@ namespace AideDeJeu.Tools } } + public static async Task GetStringFromUrl(string url) + { + using (var client = new HttpClient()) + { + return await client.GetStringAsync(url); + } + } + public static string RemoveDiacritics(string text) { if (string.IsNullOrWhiteSpace(text)) diff --git a/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs b/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs index e024164a..ade695a3 100644 --- a/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs +++ b/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs @@ -12,9 +12,21 @@ namespace AideDeJeu.Tools { public static class MarkdownExtensions { + public static IEnumerable MarkdownToSpells(string md) + { + var document = Markdig.Parsers.MarkdownParser.Parse(md); + return document.ToSpells(); + } + + public static IEnumerable MarkdownToMonsters(string md) + { + var document = Markdig.Parsers.MarkdownParser.Parse(md); + return document.ToMonsters(); + } + public static IEnumerable ToSpells(this Markdig.Syntax.MarkdownDocument document) { - //var spells = new List(); + var spells = new List(); Spell spell = null; foreach (var block in document) { @@ -27,11 +39,11 @@ namespace AideDeJeu.Tools { if (spell != null) { - //spells.Add(spell); - yield return spell; + spells.Add(spell); + //yield return spell; } spell = new Spell(); - spell.Name = spell.NamePHB = headingBlock.Inline.ToContainerString(); + spell.Id = spell.IdVF = spell.IdVO = spell.Name = spell.NamePHB = headingBlock.Inline.ToContainerString(); //Console.WriteLine(spell.Name); } } @@ -130,15 +142,15 @@ namespace AideDeJeu.Tools } if (spell != null) { - yield return spell; - //spells.Add(spell); + //yield return spell; + spells.Add(spell); } - //return spells; + return spells; } public static IEnumerable ToMonsters(this Markdig.Syntax.MarkdownDocument document) { - //var monsters = new List(); + var monsters = new List(); Monster monster = null; List actions = new List(); foreach (var block in document) @@ -152,8 +164,8 @@ namespace AideDeJeu.Tools { if (monster != null) { - //monsters.Add(monster); - yield return monster; + monsters.Add(monster); + //yield return monster; } monster = new Monster(); monster.Name = monster.NamePHB = headingBlock.Inline.ToContainerString(); @@ -278,10 +290,10 @@ namespace AideDeJeu.Tools } if (monster != null) { - //monsters.Add(monster); - yield return monster; + monsters.Add(monster); + //yield return monster; } - //return monsters; + return monsters; } public static string ToString(this Markdig.Syntax.SourceSpan span, string md) @@ -293,7 +305,7 @@ namespace AideDeJeu.Tools var str = string.Empty; foreach (var inline in inlines) { - Debug.WriteLine(inline.GetType()); + //Debug.WriteLine(inline.GetType()); string add = string.Empty; if (inline is Markdig.Syntax.Inlines.LineBreakInline) { @@ -323,7 +335,7 @@ namespace AideDeJeu.Tools { add = inline.ToString(); } - Debug.WriteLine(add); + //Debug.WriteLine(add); str += add; } return str; @@ -425,7 +437,7 @@ namespace AideDeJeu.Tools } public static void Dump(this Markdig.Syntax.ListBlock block) { - Debug.WriteLine(block.BulletType); + //Debug.WriteLine(block.BulletType); foreach (var inblock in block) { inblock.Dump(); @@ -440,8 +452,8 @@ namespace AideDeJeu.Tools } public static void Dump(this Markdig.Syntax.HeadingBlock block) { - Debug.WriteLine(block.HeaderChar); - Debug.WriteLine(block.Level); + //Debug.WriteLine(block.HeaderChar); + //Debug.WriteLine(block.Level); //foreach(var line in block.Lines.Lines) //{ // DumpStringLine(line); @@ -453,14 +465,14 @@ namespace AideDeJeu.Tools } public static void Dump(this Markdig.Syntax.Block block) { - Debug.WriteLine(block.Column); - Debug.WriteLine(block.IsBreakable); - Debug.WriteLine(block.IsOpen); - Debug.WriteLine(block.Line); - Debug.WriteLine(block.RemoveAfterProcessInlines); - Debug.WriteLine(block.Span.ToString()); + //Debug.WriteLine(block.Column); + //Debug.WriteLine(block.IsBreakable); + //Debug.WriteLine(block.IsOpen); + //Debug.WriteLine(block.Line); + //Debug.WriteLine(block.RemoveAfterProcessInlines); + //Debug.WriteLine(block.Span.ToString()); //Debug.WriteLine(block.Span.ToString(MD)); - Debug.WriteLine(block.ToString()); + //Debug.WriteLine(block.ToString()); if (block is Markdig.Syntax.ParagraphBlock) { (block as Markdig.Syntax.ParagraphBlock).Dump(); @@ -482,7 +494,7 @@ namespace AideDeJeu.Tools { foreach (var block in document) { - Debug.WriteLine(block.GetType()); + //Debug.WriteLine(block.GetType()); //block.Dump(); } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs index 7b8ada0e..c883b9af 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/FilterViewModel.cs @@ -127,12 +127,12 @@ namespace AideDeJeu.ViewModels 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()) && + 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.Type.Contains(rituel) && Helpers.RemoveDiacritics(spell.NamePHB).ToLower().Contains(Helpers.RemoveDiacritics(SearchText).ToLower()); }).OrderBy(spell => spell.NamePHB) .AsEnumerable(); @@ -373,8 +373,9 @@ namespace AideDeJeu.ViewModels return items.Where(item => { var monster = item as Monster; - return monster.Type.Contains(type) && - (string.IsNullOrEmpty(size) || monster.Size.Equals(size)) && + return + //monster.Type.Contains(type) && + //(string.IsNullOrEmpty(size) || monster.Size.Equals(size)) && monster.Source.Contains(source) && powerComparer.Compare(monster.Challenge, minPower) >= 0 && powerComparer.Compare(monster.Challenge, maxPower) <= 0 && diff --git a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs index c38c8f08..1ab2fade 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs @@ -9,6 +9,7 @@ using System.Threading.Tasks; using System.Windows.Input; using Xamarin.Forms; using System.Threading; +using System.Linq; namespace AideDeJeu.ViewModels { @@ -28,45 +29,46 @@ namespace AideDeJeu.ViewModels private IEnumerable _AllItems = null; - public IEnumerable AllItems + public async Task> GetAllItemsAsync() { - get + if (_AllItems == null) { - if (_AllItems == null) + string resourceName = null; + switch (ItemSourceType) { - string resourceName = null; - switch (ItemSourceType) - { - case ItemSourceType.MonsterVF: - resourceName = "AideDeJeu.Data.monsters_vf.json"; - break; - case ItemSourceType.MonsterVO: - resourceName = "AideDeJeu.Data.monsters_vo.json"; - break; - case ItemSourceType.MonsterHD: - resourceName = "AideDeJeu.Data.monsters_hd.json"; - break; - case ItemSourceType.SpellVF: - resourceName = "AideDeJeu.Data.spells_vf.json"; - break; - case ItemSourceType.SpellVO: - resourceName = "AideDeJeu.Data.spells_vo.json"; - break; - case ItemSourceType.SpellHD: - resourceName = "AideDeJeu.Data.spells_hd.json"; - break; - } - if (ItemSourceType.HasFlag(ItemSourceType.Spell)) - { - _AllItems = Tools.Helpers.GetResourceObject>(resourceName); - } - else if (ItemSourceType.HasFlag(ItemSourceType.Monster)) - { + case ItemSourceType.MonsterVF: + resourceName = "AideDeJeu.Data.monsters_vf.json"; _AllItems = Tools.Helpers.GetResourceObject>(resourceName); - } + break; + case ItemSourceType.MonsterVO: + resourceName = "AideDeJeu.Data.monsters_vo.json"; + _AllItems = Tools.Helpers.GetResourceObject>(resourceName); + break; + case ItemSourceType.MonsterHD: + resourceName = "AideDeJeu.Data.monsters_hd.json"; + var mdm = await Tools.Helpers.GetStringFromUrl("https://raw.githubusercontent.com/Nioux/AideDeJeu/master/Data/monsters_hd.md"); + _AllItems = Tools.MarkdownExtensions.MarkdownToMonsters(mdm); + //_AllItems = Tools.Helpers.GetResourceObject>(resourceName); + break; + case ItemSourceType.SpellVF: + resourceName = "AideDeJeu.Data.spells_vf.json"; + _AllItems = Tools.Helpers.GetResourceObject>(resourceName); + //var md2 = await Tools.Helpers.GetStringFromUrl("https://raw.githubusercontent.com/Nioux/AideDeJeu/master/Data/spells_hd.md"); + //_AllItems = Tools.MarkdownExtensions.MarkdownToSpells(md2).ToList(); + break; + case ItemSourceType.SpellVO: + resourceName = "AideDeJeu.Data.spells_vo.json"; + _AllItems = Tools.Helpers.GetResourceObject>(resourceName); + break; + case ItemSourceType.SpellHD: + resourceName = "AideDeJeu.Data.spells_hd.json"; + var mds = await Tools.Helpers.GetStringFromUrl("https://raw.githubusercontent.com/Nioux/AideDeJeu/master/Data/spells_hd.md"); + _AllItems = Tools.MarkdownExtensions.MarkdownToSpells(mds); + //_AllItems = Tools.Helpers.GetResourceObject>(resourceName); + break; } - return _AllItems; } + return _AllItems; } async Task LoadItemsAsync(CancellationToken token = default) @@ -77,19 +79,19 @@ namespace AideDeJeu.ViewModels { // Yan : c'est pas plutôt cette partie qui devrait être dans une autre Task ? var filterViewModel = Main.GetFilterViewModel(ItemSourceType); - var items = await filterViewModel.FilterItems(AllItems, token); - - await Task.Run(async () => { - // Yan : plus besoin de boucle si on change toute la liste d'un coup ;) - // Yan : indispensable de repasser sur l'ui thread pour la version uwp - Device.BeginInvokeOnMainThread(() => Main.Items = items); - //Main.Items.Clear(); - //foreach (var item in items) - //{ - // token.ThrowIfCancellationRequested(); - // Main.Items.Add(item); - //} - }, cancellationToken: token); // Yan : c'est ici qu'il faudrait coller le token non ? + var items = await filterViewModel.FilterItems(await GetAllItemsAsync(), token); + Main.Items = items; + //await Task.Run(async () => { + // Yan : plus besoin de boucle si on change toute la liste d'un coup ;) + // Yan : indispensable de repasser sur l'ui thread pour la version uwp + //Device.BeginInvokeOnMainThread(() => Main.Items = items); + //Main.Items.Clear(); + //foreach (var item in items) + //{ + // token.ThrowIfCancellationRequested(); + // Main.Items.Add(item); + //} + //}, cancellationToken: token); // Yan : c'est ici qu'il faudrait coller le token non ? //On arrete le loading ici car on annule toujours avant de lancer une nouvelle opération // Yan : ?? du coup le IsLoading repasse pas à false en cas de cancel ou d'autre exception ? diff --git a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs index 0cc77ce7..d15e19c6 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MainViewModel.cs @@ -139,7 +139,10 @@ namespace AideDeJeu.ViewModels { await GetItemsViewModel(ItemSourceType).ExecuteLoadItemsCommandAsync(); }); - GotoItemCommand = new Command(async (item) => await GetItemsViewModel(ItemSourceType).ExecuteGotoItemCommandAsync(item)); + GotoItemCommand = new Command(async (item) => + { + await GetItemsViewModel(ItemSourceType).ExecuteGotoItemCommandAsync(item); + }); 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); diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs index 5b855a69..03fb4013 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs @@ -63,8 +63,8 @@ namespace AideDeJeu.ViewModels { var fd = FormatedTextHelpers.FontData.FromResource("contentital"); var fs = new FormattedString(); - var capType = Item.Type.First().ToString().ToUpper() + Item.Type.Substring(1); - fs.Spans.Add(new Span() { Text = string.Format("{0} de niveau {1}", capType, Item.Level), FontFamily = fd.FontFamily, FontAttributes = fd.FontAttributes, FontSize = fd.FontSize, ForegroundColor = fd.TextColor}); + var capType = Item?.Type?.First().ToString()?.ToUpper() + Item?.Type?.Substring(1); + fs.Spans.Add(new Span() { Text = string.Format("{0} de niveau {1}", capType, Item?.Level), FontFamily = fd.FontFamily, FontAttributes = fd.FontAttributes, FontSize = fd.FontSize, ForegroundColor = fd.TextColor}); return fs; } }