From 07718efe91e32d0a02f1974464d820cb9f667cd4 Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Wed, 2 May 2018 23:00:51 +0200 Subject: [PATCH] Refonte navigation avec une seule MasterDetailPage et plein de binding ^^ --- AideDeJeu/AideDeJeu/AideDeJeu.csproj | 3 + AideDeJeu/AideDeJeu/App.xaml.cs | 5 +- AideDeJeu/AideDeJeu/Tools/Converters.cs | 27 ++ .../AideDeJeu/ViewModels/BaseViewModel.cs | 2 - .../AideDeJeu/ViewModels/ItemsViewModel.cs | 81 ++++ .../AideDeJeu/ViewModels/MonstersViewModel.cs | 7 +- .../ViewModels/SpellDetailViewModel.cs | 2 +- .../AideDeJeu/ViewModels/SpellsViewModel.cs | 7 +- AideDeJeu/AideDeJeu/Views/ItemsPage.xaml | 163 ++++++++ AideDeJeu/AideDeJeu/Views/ItemsPage.xaml.cs | 58 +++ AideDeJeu/AideDeJeu/Views/MonstersPage.xaml | 17 - .../AideDeJeu/Views/SpellDetailPage.xaml | 2 +- .../AideDeJeu/Views/SpellDetailPage.xaml.cs | 2 +- AideDeJeu/AideDeJeuLib/Cards/Converters.cs | 2 +- AideDeJeu/AideDeJeuLib/Item.cs | 10 + AideDeJeu/AideDeJeuLib/Monsters/Monster.cs | 2 +- AideDeJeu/AideDeJeuLib/Spells/Spell.cs | 10 +- .../AideDeJeuLib/Spells/SpellsScrappers.cs | 6 +- clerc0.json | 179 +++++++++ clerc1.json | 377 ++++++++++++++++++ clerc2.json | 348 ++++++++++++++++ clerc3.json | 217 ++++++++++ 22 files changed, 1487 insertions(+), 40 deletions(-) create mode 100644 AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs create mode 100644 AideDeJeu/AideDeJeu/Views/ItemsPage.xaml create mode 100644 AideDeJeu/AideDeJeu/Views/ItemsPage.xaml.cs create mode 100644 AideDeJeu/AideDeJeuLib/Item.cs create mode 100644 clerc0.json create mode 100644 clerc1.json create mode 100644 clerc2.json create mode 100644 clerc3.json diff --git a/AideDeJeu/AideDeJeu/AideDeJeu.csproj b/AideDeJeu/AideDeJeu/AideDeJeu.csproj index 6c7d451f..c12df7c8 100644 --- a/AideDeJeu/AideDeJeu/AideDeJeu.csproj +++ b/AideDeJeu/AideDeJeu/AideDeJeu.csproj @@ -33,6 +33,9 @@ SpellDetailPage.xaml + + ItemsPage.xaml + Code SpellsPage.xaml diff --git a/AideDeJeu/AideDeJeu/App.xaml.cs b/AideDeJeu/AideDeJeu/App.xaml.cs index ca495301..9c54e826 100644 --- a/AideDeJeu/AideDeJeu/App.xaml.cs +++ b/AideDeJeu/AideDeJeu/App.xaml.cs @@ -12,10 +12,11 @@ namespace AideDeJeu { InitializeComponent(); - MainPage = new NavigationPage(new MainPage()); + //MainPage = new ItemsPage(); + MainPage = new NavigationPage(new ItemsPage()); } - protected override void OnStart () + protected override void OnStart () { // Handle when your app starts } diff --git a/AideDeJeu/AideDeJeu/Tools/Converters.cs b/AideDeJeu/AideDeJeu/Tools/Converters.cs index 93fc2296..f1ebc5b7 100644 --- a/AideDeJeu/AideDeJeu/Tools/Converters.cs +++ b/AideDeJeu/AideDeJeu/Tools/Converters.cs @@ -83,4 +83,31 @@ namespace AideDeJeu.Tools } } + public class ItemsTypeTemplateConverter : IValueConverter + { + public ControlTemplate SpellsTemplate { get; set; } + public ControlTemplate MonstersTemplate { get; set; } + + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + var itemType = value as ViewModels.ItemsViewModel.ItemType?; + if (itemType == ViewModels.ItemsViewModel.ItemType.Spell) + { + return SpellsTemplate; + } + if (itemType == ViewModels.ItemsViewModel.ItemType.Monster) + { + return MonstersTemplate; + } + return null; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + return null; + } + } + + + } diff --git a/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs index fae225bd..f77b8e12 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/BaseViewModel.cs @@ -12,8 +12,6 @@ namespace AideDeJeu.ViewModels { public class BaseViewModel : INotifyPropertyChanged { - //public IDataStore DataStore => DependencyService.Get>() ?? new MockDataStore(); - //public IDataStore SpellDataStore => DependencyService.Get>() ?? new SpellDataStore(); public SpellsScrappers SpellsScrappers => DependencyService.Get() ?? new SpellsScrappers(); public MonstersScrappers MonsterScrappers => DependencyService.Get() ?? new MonstersScrappers(); diff --git a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs new file mode 100644 index 00000000..acd46f56 --- /dev/null +++ b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.ObjectModel; +using System.Diagnostics; +using System.Threading.Tasks; + +using Xamarin.Forms; + +using AideDeJeuLib.Spells; +using System.Collections.Generic; +using AideDeJeuLib; + +namespace AideDeJeu.ViewModels +{ + public class ItemsViewModel : BaseViewModel + { + public enum ItemType + { + Spell, + Monster, + } + public SpellsViewModel Spells { get; set; } = new SpellsViewModel(); + public MonstersViewModel Monsters { get; set; } = new MonstersViewModel(); + + private ItemType _ItemsType = ItemType.Spell; + public ItemType ItemsType + { + get + { + return _ItemsType; + } + set + { + SetProperty(ref _ItemsType, value); + OnPropertyChanged(nameof(Items)); + LoadItemsCommand.Execute(null); + } + } + + public ObservableCollection Items + { + get + { + if(ItemsType == ItemType.Spell) + { + return Spells.Items; + } + if (ItemsType == ItemType.Monster) + { + return Monsters.Items; + } + return null; + } + } + + public Command LoadItemsCommand { get; set; } + + public Command SwitchToSpells { get; set; } + public Command SwitchToMonsters { get; set; } + + public ItemsViewModel() + { + //Title = "Browse"; + //Items = new ObservableCollection(); + LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand()); + SwitchToSpells = new Command(() => ItemsType = ItemType.Spell); + SwitchToMonsters = new Command(() => ItemsType = ItemType.Monster); + } + + async Task ExecuteLoadItemsCommand() + { + if(ItemsType == ItemType.Spell) + { + await Spells.ExecuteLoadItemsCommand(); + } + if (ItemsType == ItemType.Monster) + { + await Monsters.ExecuteLoadItemsCommand(); + } + } + } +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs index 945d7bc9..80364c65 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/MonstersViewModel.cs @@ -7,12 +7,13 @@ using Xamarin.Forms; using System.Collections.Generic; using AideDeJeuLib.Monsters; +using AideDeJeuLib; namespace AideDeJeu.ViewModels { public class MonstersViewModel : BaseViewModel { - public ObservableCollection Items { get; set; } + public ObservableCollection Items { get; set; } public List> Categories { get; set; } = new List>() { @@ -189,11 +190,11 @@ namespace AideDeJeu.ViewModels public MonstersViewModel() { - Items = new ObservableCollection(); + Items = new ObservableCollection(); LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand()); } - async Task ExecuteLoadItemsCommand() + public async Task ExecuteLoadItemsCommand() { if (IsBusy) return; diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs index 344adf1f..3930cd54 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellDetailViewModel.cs @@ -107,7 +107,7 @@ namespace AideDeJeu.ViewModels public SpellDetailViewModel(Spell item = null) { - Title = item?.Title; + Title = item?.Name; Item = item; LoadItemCommand = new Command(async () => await ExecuteLoadItemCommand()); } diff --git a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs index 23ec254d..dc8300f2 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/SpellsViewModel.cs @@ -7,12 +7,13 @@ using Xamarin.Forms; using AideDeJeuLib.Spells; using System.Collections.Generic; +using AideDeJeuLib; namespace AideDeJeu.ViewModels { public class SpellsViewModel : BaseViewModel { - public ObservableCollection Items { get; set; } + public ObservableCollection Items { get; set; } public List> Classes { get; set; } = new List>() { @@ -161,7 +162,7 @@ namespace AideDeJeu.ViewModels public SpellsViewModel() { //Title = "Browse"; - Items = new ObservableCollection(); + Items = new ObservableCollection(); LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand()); //MessagingCenter.Subscribe(this, "AddItem", async (obj, item) => @@ -172,7 +173,7 @@ namespace AideDeJeu.ViewModels //}); } - async Task ExecuteLoadItemsCommand() + public async Task ExecuteLoadItemsCommand() { if (IsBusy) return; diff --git a/AideDeJeu/AideDeJeu/Views/ItemsPage.xaml b/AideDeJeu/AideDeJeu/Views/ItemsPage.xaml new file mode 100644 index 00000000..4ca65ec2 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/ItemsPage.xaml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/ItemsPage.xaml.cs b/AideDeJeu/AideDeJeu/Views/ItemsPage.xaml.cs new file mode 100644 index 00000000..49b5b6b2 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Views/ItemsPage.xaml.cs @@ -0,0 +1,58 @@ +using AideDeJeu.ViewModels; +using AideDeJeuLib.Monsters; +using AideDeJeuLib.Spells; +using System; + +using Xamarin.Forms; +using Xamarin.Forms.Xaml; + +namespace AideDeJeu.Views +{ + [XamlCompilation(XamlCompilationOptions.Compile)] + public partial class ItemsPage : MasterDetailPage //TabbedPage + { + ItemsViewModel viewModel; + + public ItemsPage () + { + InitializeComponent (); + + BindingContext = viewModel = new ItemsViewModel(); + } + + async void OnItemSelected(object sender, SelectedItemChangedEventArgs args) + { + if (args.SelectedItem is Spell) + { + var item = args.SelectedItem as Spell; + if (item == null) + return; + + var vm = new SpellDetailViewModel(item); + vm.LoadItemCommand.Execute(null); + await Navigation.PushAsync(new SpellDetailPage(vm)); + } + else if (args.SelectedItem is Monster) + { + var item = args.SelectedItem as Monster; + if (item == null) + return; + + var vm = new MonsterDetailViewModel(item); + vm.LoadItemCommand.Execute(null); + await Navigation.PushAsync(new MonsterDetailPage(vm)); + } + + // Manually deselect item. + ItemsListView.SelectedItem = null; + } + + protected override void OnAppearing() + { + base.OnAppearing(); + + if (viewModel.Items.Count == 0) + viewModel.LoadItemsCommand.Execute(null); + } + } +} \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml b/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml index 27bfd12e..8903bebb 100644 --- a/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml +++ b/AideDeJeu/AideDeJeu/Views/MonstersPage.xaml @@ -11,23 +11,6 @@ - - -