using System.Collections.Generic; using System.Linq; using ShareeBike.Model; using ShareeBike.Model.Connector; using ShareeBike.Model.Connector.Filter; using Xamarin.Forms; namespace ShareeBike.ViewModel.Map { /// Old name: MapPageFilter. public class CargoCitybikeToggleViewModel : ICargoCitybikeToggleViewModel { /// Constructs a map page filter view model object from values. /// Filters and options dictionary. public CargoCitybikeToggleViewModel(IGroupFilterMapPage currentFilter) { FilterDictionary = currentFilter ?? new GroupFilterMapPage(); } /// Gets the filter values. public IGroupFilterMapPage FilterDictionary { get; } /// Gets the activated filter. public string CurrentFilter { get { return FilterDictionary.FirstOrDefault(x => x.Value == FilterState.On).Key ?? string.Empty; } } /// Gets value whether ShareeBike is enabled or not. public bool IsCargoEnabled => !string.IsNullOrEmpty(CurrentFilter) && CurrentFilter.GetBikeCategory() != FilterHelper.CARGOBIKE; /// Gets color of the ShareeBike button. public Color CargoColor => CurrentFilter.GetBikeCategory() == FilterHelper.CARGOBIKE ? Color.White : Color.FromRgba(0, 0, 0, 0); public Color NoCargoColor => CurrentFilter.GetBikeCategory() == FilterHelper.CARGOBIKE ? Color.FromRgb(210, 17, 20) : Color.White; /// Gets value whether Citybike is enabled or not. public bool IsCitybikeEnabled => !string.IsNullOrEmpty(CurrentFilter) && CurrentFilter.GetBikeCategory() != FilterHelper.CITYBIKE; /// Gets color of the Citybike button. public Color CitybikeColor => CurrentFilter.GetBikeCategory() == FilterHelper.CITYBIKE ? Color.White : Color.FromRgba(0, 0, 0, 0); public Color NoCitybikeColor => CurrentFilter.GetBikeCategory() == FilterHelper.CITYBIKE ? Color.FromRgb(210, 17, 20) : Color.White; /// Gets whether toggle functionality is visible or not. public bool IsToggleVisible => FilterDictionary.Select(x => x.Key).ContainsGroupId(FilterHelper.CITYBIKE) && FilterDictionary.Select(x => x.Key).ContainsGroupId(FilterHelper.CARGOBIKE) && (IsCargoEnabled || IsCitybikeEnabled); /// /// Toggles from bike group Cargo to Citybike or vice versa. /// Toggling means one of /// - ShareeBike => Citybike or /// - ShareeBike => Citybike. /// /// Filter set to toggle. /// public CargoCitybikeToggleViewModel DoToggle() { var currentFilterSet = FilterDictionary.ToArray(); if (currentFilterSet.Length < 2) { // There is nothing to toggle because filter set contains only one element. return new CargoCitybikeToggleViewModel(FilterDictionary); } var currentState = currentFilterSet[currentFilterSet.Length - 1].Value == FilterState.On ? FilterState.On : FilterState.Off; var toggledFilterSet = new Dictionary(); foreach (var filterElement in currentFilterSet) { toggledFilterSet.Add(filterElement.Key, currentState); currentState = filterElement.Value; } return new CargoCitybikeToggleViewModel(new GroupFilterMapPage(toggledFilterSet)); } } }