168 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.ObjectModel;
 | |
| using System.Collections.Generic;
 | |
| using System.Linq;
 | |
| using Aurora.Design.Components.NavigationMenu;
 | |
| using Aurora.Design.Views.MainView;
 | |
| using Xamarin.Forms;
 | |
| using Xamarin.Forms.Xaml;
 | |
| using Aurora.Models.Media;
 | |
| using Aurora.Design.Components.MediaPlayer;
 | |
| 
 | |
| namespace Aurora.Design.Views.Main
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Delegate for updating player metadata
 | |
|     /// </summary>
 | |
|     /// <param name="media"></param>
 | |
|     public delegate void SetPlayerMetadataDelegate(BaseMedia media);
 | |
| 
 | |
|     [XamlCompilation(XamlCompilationOptions.Compile)]
 | |
|     public partial class MainView : MasterDetailPage, IDisposable
 | |
|     {
 | |
|         private Dictionary<int, BaseViewModel> _viewModels;
 | |
|         private BaseViewModel _lastViewModel;
 | |
| 
 | |
|         public MainView()
 | |
|         {
 | |
|             InitializeComponent();
 | |
|             BindingContext = new MainViewModel();
 | |
|             _viewModels = new Dictionary<int, BaseViewModel>();
 | |
|             MasterPage.ListView.ItemSelected += OnNavItemSelected;
 | |
| 
 | |
|             Appearing += OnAppearing;
 | |
|         }
 | |
| 
 | |
|         public void Dispose()
 | |
|         {
 | |
|             Appearing -= OnAppearing;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Event handler for side bar items being selected
 | |
|         /// </summary>
 | |
|         /// <param name="sender"></param>
 | |
|         /// <param name="e"></param>
 | |
|         private void OnNavItemSelected(object sender, SelectedItemChangedEventArgs e)
 | |
|         {
 | |
|             var item = e.SelectedItem as NavigationItem;
 | |
|             if (item == null)
 | |
|                 return;
 | |
| 
 | |
|             var view = (View)Activator.CreateInstance(item.TargetType);
 | |
| 
 | |
|             //Check if we have an instantiated viewModel
 | |
|             BaseViewModel vm = new BaseViewModel();
 | |
|             if (_viewModels.ContainsKey(item.Id))
 | |
|             {
 | |
|                 _viewModels.TryGetValue(item.Id, out vm);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 if (item.TargetViewModelType.BaseType != typeof(BaseViewModel))
 | |
|                 {
 | |
|                     throw new InvalidOperationException("TargetViewModel field must be of type BaseViewModel");
 | |
|                 }
 | |
| 
 | |
|                 //Instantiate new view model
 | |
|                 vm = (BaseViewModel)Activator.CreateInstance(item.TargetViewModelType);
 | |
|                 _viewModels.Add(item.Id, vm);
 | |
| 
 | |
|             }
 | |
| 
 | |
|             //Activate viewmodel
 | |
|             vm.OnActive();
 | |
| 
 | |
|             //Deactivate last viewModel
 | |
|             _lastViewModel.OnInactive();
 | |
|             //Unasign deactivating vm
 | |
|             UnassignPlayerControls(_lastViewModel);
 | |
| 
 | |
|             //Assign viewModel
 | |
|             _lastViewModel = vm;
 | |
|             view.BindingContext = vm;
 | |
|             //Assign player controls to viewmodel
 | |
|             AssignPlayerControls(vm);
 | |
| 
 | |
|             ContentPresenter viewContent = (ContentPresenter)ContentPage.Content.FindByName("ViewContent");
 | |
|             viewContent.Content = view;
 | |
| 
 | |
|             MasterPage.ListView.SelectedItem = null;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Event handler for page appearing.
 | |
|         /// </summary>
 | |
|         /// <param name="sender">The object that fired the event.</param>
 | |
|         /// <param name="args">The event arguments</param>
 | |
|         private void OnAppearing(object sender, EventArgs args)
 | |
|         {
 | |
|             //Set initial view from first item in list
 | |
|             ObservableCollection<NavigationGroupItem> screenList = (ObservableCollection<NavigationGroupItem>)MasterPage.ListView.ItemsSource;
 | |
| 
 | |
|             //Assign viewModel
 | |
|             NavigationItem firstNavItem = screenList.FirstOrDefault().FirstOrDefault();
 | |
|             var view = (View)Activator.CreateInstance(firstNavItem.TargetType);
 | |
| 
 | |
|             BaseViewModel vm = new BaseViewModel();
 | |
|             if (_viewModels.ContainsKey(firstNavItem.Id))
 | |
|             {
 | |
|                 _viewModels.TryGetValue(firstNavItem.Id, out vm);
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 //Instantiate new view model
 | |
|                 vm = (BaseViewModel)Activator.CreateInstance(firstNavItem.TargetViewModelType);
 | |
|                 _viewModels.Add(firstNavItem.Id, vm);
 | |
|             }
 | |
| 
 | |
|             view.BindingContext = vm;
 | |
|             _lastViewModel = vm;
 | |
|             AssignPlayerControls(vm);
 | |
|             vm.OnActive();
 | |
| 
 | |
| 
 | |
|             ContentPresenter viewContent = (ContentPresenter)ContentPage.Content.FindByName("ViewContent");
 | |
|             viewContent.Content = view;
 | |
| 
 | |
|             MasterPage.ListView.SelectedItem = screenList.FirstOrDefault();
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Unassign setplayer delegate to prevent vms from changing player info when inactive
 | |
|         /// </summary>
 | |
|         /// <param name="vm"></param>
 | |
|         private void UnassignPlayerControls(BaseViewModel vm)
 | |
|         {
 | |
|             vm.SetPlayerMetadata = null;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Assign main views music player controls to a view model
 | |
|         /// </summary>
 | |
|         /// <param name="vm">BaseViewModel to assign controls to</param>
 | |
|         private void AssignPlayerControls(BaseViewModel vm)
 | |
|         {
 | |
|             Player player = (Player)ContentPage.FindByName("Player");
 | |
|             player.PlayButtonCommand = new Command(vm.OnPlayExecute, vm.CanPlayExecute);
 | |
|             player.NextButtonCommand = new Command(vm.OnNextExecute, vm.CanNextExecute);
 | |
|             player.PreviousButtonCommand = new Command(vm.OnPreviousExecute, vm.CanPreviousExecute);
 | |
| 
 | |
|             //Assign SetPlayer delegate
 | |
|             vm.SetPlayerMetadata = SetPlayerDelegate;
 | |
|         }
 | |
| 
 | |
|         private void SetPlayerDelegate(BaseMedia media)
 | |
|         {
 | |
|             Player player = (Player)ContentPage.FindByName("Player");
 | |
|             if (media.Metadata is AudioMetadata)
 | |
|             {
 | |
|                 AudioMetadata meta = (AudioMetadata)media.Metadata;
 | |
|                 player.ArtistName = meta.Artist;
 | |
|                 player.SongTitle = meta.Title;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
| }
 |