< Summary

Information
Class: MyNet.UI.ViewModels.Shell.Chrome.ShellCultureViewModel
Assembly: MyNet.UI
File(s): https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/ViewModels/Shell/Chrome/ShellCultureViewModel.cs
Tag: 323_28699572109
Line coverage
94%
Covered lines: 33
Uncovered lines: 2
Coverable lines: 35
Total lines: 116
Line coverage: 94.2%
Branch coverage
70%
Covered branches: 17
Total branches: 24
Branch coverage: 70.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)62.5%88100%
set_SelectedCulture(...)66.66%6687.5%
OnCultureServiceCultureChanged(...)75%44100%
ResolveSupportedCulture(...)83.33%6685.71%

File(s)

https://raw.githubusercontent.com/sandre58/MyNet/85372080fe102cd9ee155ceab49ae000e7f66103/src/MyNet.UI/ViewModels/Shell/Chrome/ShellCultureViewModel.cs

#LineLine coverage
 1// -----------------------------------------------------------------------
 2// <copyright file="ShellCultureViewModel.cs" company="Stéphane ANDRE">
 3// Copyright (c) Stéphane ANDRE. All rights reserved.
 4// </copyright>
 5// -----------------------------------------------------------------------
 6
 7using System;
 8using System.Collections.Generic;
 9using System.Collections.ObjectModel;
 10using System.Globalization;
 11using System.Linq;
 12using System.Reactive.Disposables;
 13using System.Windows.Input;
 14using MyNet.Globalization.Culture;
 15using MyNet.UI.Commands;
 16using MyNet.Utilities.Suspending;
 17
 18namespace MyNet.UI.ViewModels.Shell.Chrome;
 19
 20/// <summary>
 21/// Shell chrome for UI culture selection (status bar, title bar, etc.).
 22/// </summary>
 23public sealed class ShellCultureViewModel : ViewModelBase
 24{
 25    private readonly ICultureService _cultureService;
 3626    private readonly Suspender _cultureSyncSuspender = new();
 27
 28    /// <summary>
 29    /// Initializes a new instance of the <see cref="ShellCultureViewModel"/> class.
 30    /// </summary>
 31    /// <param name="cultureService">Application culture service.</param>
 32    /// <param name="commandFactory">Factory to create commands.</param>
 33    /// <param name="supportedCultures">
 34    /// Cultures offered in the selector. When omitted, <see cref="SupportedCultures.French"/> and
 35    /// <see cref="SupportedCultures.English"/> are used. Register a custom factory in DI to define
 36    /// the list for your host application.
 37    /// </param>
 3638    public ShellCultureViewModel(
 3639        ICultureService cultureService,
 3640        ICommandFactory? commandFactory = null,
 3641        IEnumerable<CultureInfo>? supportedCultures = null)
 42    {
 3643        _cultureService = cultureService ?? throw new ArgumentNullException(nameof(cultureService));
 3644        var commands = commandFactory.GetOrDefault();
 45
 16846        foreach (var culture in supportedCultures ?? [SupportedCultures.French, SupportedCultures.English])
 4847            Cultures.Add(culture);
 48
 3649        var initialCulture = ResolveSupportedCulture(_cultureService.CurrentCulture);
 3650        if (initialCulture is not null)
 3651            SelectedCulture = initialCulture;
 52
 3653        _cultureService.CultureChanged += OnCultureServiceCultureChanged;
 54        Disposables.Add(Disposable.Create(() => _cultureService.CultureChanged -= OnCultureServiceCultureChanged));
 55
 56        ChangeCultureCommand = commands.Create<CultureInfo>(cultureInfo => SelectedCulture = cultureInfo);
 3657    }
 58
 59    /// <summary>
 60    /// Gets the cultures available for selection.
 61    /// </summary>
 62    public ObservableCollection<CultureInfo> Cultures { get; } = [];
 63
 64    /// <summary>
 65    /// Gets or sets the selected UI culture.
 66    /// </summary>
 67    public CultureInfo? SelectedCulture
 68    {
 69        get;
 70        set
 71        {
 4272            if (_cultureSyncSuspender.IsSuspended)
 73            {
 374                SetProperty(ref field, value);
 375                return;
 76            }
 77
 3978            if (!SetProperty(ref field, value))
 079                return;
 80
 3981            var culture = value ?? CultureInfo.InstalledUICulture;
 3982            _cultureService.SetCulture(culture);
 3983        }
 84    }
 85
 86    /// <summary>
 87    /// Gets the command to change the current culture. The command parameter is the target culture.
 88    /// </summary>
 89    public ICommand ChangeCultureCommand { get; }
 90
 91    private void OnCultureServiceCultureChanged(object? sender, CultureChangedEventArgs e)
 92    {
 693        var culture = ResolveSupportedCulture(_cultureService.CurrentCulture);
 694        if (culture is null || Equals(SelectedCulture, culture))
 395            return;
 96
 397        using (_cultureSyncSuspender.Suspend())
 398            SelectedCulture = culture;
 399    }
 100
 101    private CultureInfo? ResolveSupportedCulture(CultureInfo culture)
 102    {
 42103        var current = culture;
 45104        while (!current.Equals(CultureInfo.InvariantCulture))
 105        {
 45106            var match = Cultures.FirstOrDefault(c => c.Equals(current));
 45107            if (match is not null)
 42108                return match;
 109
 3110            current = current.Parent;
 111        }
 112
 0113        return Cultures.FirstOrDefault();
 114    }
 115}
 116