sharee.bike-App/TINKLib/ViewModel/Map/GroupFilterMapPageHelper.cs
Anja Müller-Meißner 0468955d49 Version 3.0.338
2022-09-08 09:55:14 +02:00

75 lines
2.8 KiB
C#

using System.Collections.Generic;
using System.Linq;
using TINK.Model;
namespace TINK.ViewModel.Map
{
/// <summary> Helper functionality. </summary>
/// <remarks> Former name: MapPageFilterFactory</remarks>
public static class GroupFilterMapPageHelper
{
/// <summary> Verifies that filters available are always consistent with filter configuration from settings page/ user group. </summary>
/// <param name="mapPageFilterDictionary">Last filter from map page. Might have to be updated.</param>
/// <param name="settingsAndUserFilter">Filter from settings page/ user group.</param>
public static IGroupFilterMapPage CreateUpdated(
this IGroupFilterMapPage mapPageFilterDictionary,
IEnumerable<string> settingsAndUserFilter)
{
if (settingsAndUserFilter == null)
{
// All filters are null filters no update has to be performed.
return mapPageFilterDictionary;
}
if (mapPageFilterDictionary == null || mapPageFilterDictionary.Count <= 0)
{
return new GroupFilterMapPage();
}
// Filter dictionary by enumeration.
var updatedMapPageFilterDictionary = new Dictionary<string, FilterState>(mapPageFilterDictionary).Where(x => settingsAndUserFilter.Contains(x.Key)).ToDictionary(x => x.Key, x => x.Value);
// Get key of activated filter if there is still one.
var activatedFilter = updatedMapPageFilterDictionary.FirstOrDefault(x => x.Value == FilterState.On).Key
?? string.Empty;
// Add entries which have become available.
var filterState = FilterState.On; // Set first filter added to on.
var filtersToAdd = settingsAndUserFilter.Except(updatedMapPageFilterDictionary.Select(x => x.Key));
foreach (var l_oEntry in filtersToAdd)
{
updatedMapPageFilterDictionary.Add(l_oEntry, filterState);
filterState = FilterState.Off;
}
if (updatedMapPageFilterDictionary.Count <= 0)
{
return new GroupFilterMapPage(updatedMapPageFilterDictionary);
}
// Ensure that there is at least one element on.
if (updatedMapPageFilterDictionary.Where(x => x.Value == FilterState.On).Count() == 0)
{
// No element is active. Set one element active.
updatedMapPageFilterDictionary[updatedMapPageFilterDictionary.ToArray()[0].Key] = FilterState.On;
return new GroupFilterMapPage(updatedMapPageFilterDictionary);
}
// Ensure that there is only one selected element.
if (updatedMapPageFilterDictionary.Where(x => x.Value == FilterState.On).Count() > 1)
{
// More than one element is active. Set element inactive.
if (updatedMapPageFilterDictionary.ContainsKey(activatedFilter))
{
// Turn filter off.
updatedMapPageFilterDictionary[activatedFilter] = FilterState.Off;
}
return new GroupFilterMapPage(updatedMapPageFilterDictionary);
}
return new GroupFilterMapPage(updatedMapPageFilterDictionary);
}
}
}