< Summary

Information
Class: LOCKnet.App.ViewModels.MainWindowViewModel
Assembly: LOCKnet.App
File(s): /home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.App/ViewModels/MainWindowViewModel.cs
Line coverage
91%
Covered lines: 41
Uncovered lines: 4
Coverable lines: 45
Total lines: 80
Line coverage: 91.1%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
ShowLogin()100%11100%
ShowCredentialList()100%11100%
ShowTutorial()100%11100%
ShowLockScreen()100%1150%
ShowCredentialDetail(...)100%22100%
WireLoginEvents(...)100%11100%

File(s)

/home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.App/ViewModels/MainWindowViewModel.cs

#LineLine coverage
 1using CommunityToolkit.Mvvm.ComponentModel;
 2using LOCKnet.Core.DataAbstractions;
 3
 4namespace LOCKnet.App.ViewModels;
 5
 6/// <summary>
 7/// Shell-ViewModel: verwaltet die aktive View über <see cref="CurrentView"/>.
 8/// Navigation geschieht durch Austauschen des CurrentView-Objekts.
 9/// </summary>
 10public partial class MainWindowViewModel : ViewModelBase
 11{
 12  [ObservableProperty]
 13  private ViewModelBase _currentView;
 14
 215  public MainWindowViewModel()
 216  {
 217    _currentView = new LoginViewModel();
 218    WireLoginEvents((LoginViewModel)_currentView);
 19
 20    // Auf Auto-Lock reagieren
 421    AppServices.Current.SessionManager.Locked += (_, _) => ShowLockScreen();
 222  }
 23
 24  // ── Navigation ────────────────────────────────────────────────────────────
 25
 26  private void ShowLogin()
 127  {
 128    var vm = new LoginViewModel();
 129    WireLoginEvents(vm);
 130    CurrentView = vm;
 131  }
 32
 33  private void ShowCredentialList()
 234  {
 235    var vm = new CredentialListViewModel();
 236    vm.LockRequested += (_, _) => ShowLockScreen();
 237    vm.AddEditRequested += (_, record) => ShowCredentialDetail(record);
 238    vm.TutorialRequested += (_, _) => ShowTutorial();
 239    CurrentView = vm;
 240  }
 41
 42  private void ShowTutorial()
 143  {
 144    var vm = new TutorialViewModel();
 145    vm.Closed += (_, _) => ShowCredentialList();
 146    CurrentView = vm;
 147  }
 48
 49  private void ShowLockScreen()
 350  {
 51    // Auf UI-Thread
 352    Avalonia.Threading.Dispatcher.UIThread.InvokeAsync(() =>
 053    {
 054      var vm = new LockScreenViewModel();
 055      vm.UnlockSucceeded += (_, _) => ShowCredentialList();
 056      CurrentView = vm;
 357    });
 358  }
 59
 60  private void ShowCredentialDetail(CredentialRecord? record)
 261  {
 262    var vm = record is null
 263      ? new CredentialDetailViewModel()
 264      : new CredentialDetailViewModel(record);
 65
 266    vm.SaveCompleted += (_, _) =>
 167    {
 168      ShowCredentialList();
 369    };
 270    vm.Cancelled += (_, _) => ShowCredentialList();
 271    CurrentView = vm;
 272  }
 73
 74  // ── Wiring ────────────────────────────────────────────────────────────────
 75
 76  private void WireLoginEvents(LoginViewModel vm)
 377  {
 378    vm.UnlockSucceeded += (_, _) => ShowCredentialList();
 379  }
 80}