< Summary

Information
Class: LOCKnet.App.ViewModels.TutorialViewModel
Assembly: LOCKnet.App
File(s): /home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.App/ViewModels/TutorialViewModel.cs
Line coverage
98%
Covered lines: 61
Uncovered lines: 1
Coverable lines: 62
Total lines: 93
Line coverage: 98.3%
Branch coverage
83%
Covered branches: 5
Total branches: 6
Branch coverage: 83.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Steps()100%11100%
.ctor()100%11100%
get_CurrentStepData()100%210%
get_CanGoBack()100%11100%
get_CanGoForward()100%11100%
get_IsLastStep()100%11100%
Back()100%22100%
Forward()100%22100%
Close()50%22100%

File(s)

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

#LineLine coverage
 1using CommunityToolkit.Mvvm.ComponentModel;
 2using CommunityToolkit.Mvvm.Input;
 3
 4namespace LOCKnet.App.ViewModels;
 5
 6/// <summary>
 7/// ViewModel für die Tutorial-/Hilfe-Ansicht.
 8/// </summary>
 9public partial class TutorialViewModel : ViewModelBase
 10{
 11  public event EventHandler? Closed;
 12
 13  [ObservableProperty]
 14  private int _currentStep;
 15
 916  public TutorialStep[] Steps { get; } =
 317  [
 318    new(
 319      "🔒 Willkommen bei LOCKnet",
 320      "LOCKnet ist dein persönlicher, vollständig offline arbeitender Passwortmanager. " +
 321      "Alle Daten liegen verschlüsselt auf deinem USB-Stick — keine Cloud, keine externen Server.",
 322      "1 / 5"),
 323    new(
 324      "🔑 Master-Passwort",
 325      "Beim ersten Start richtest du ein Master-Passwort ein. " +
 326      "Dieses Passwort schützt alle deine Zugangsdaten. " +
 327      "Wähle ein starkes Passwort und bewahre es sicher auf — es gibt keine Wiederherstellung.",
 328      "2 / 5"),
 329    new(
 330      "➕ Neuen Eintrag anlegen",
 331      "Klicke auf \"+ Neu\" in der oberen Leiste, um einen neuen Eintrag zu erstellen. " +
 332      "Trage Titel, Benutzernamen, Passwort, URL und optionale Notizen ein. " +
 333      "Mit 🙈/👁️ kannst du das Passwort ein- und ausblenden.",
 334      "3 / 5"),
 335    new(
 336      "📋 Eintrag verwenden",
 337      "Klicke auf einen Eintrag in der Liste, um ihn auszuwählen. " +
 338      "Dann kannst du das Passwort mit \"📋 Passwort kopieren\" in die Zwischenablage kopieren. " +
 339      "Das Passwort wird nach 30 Sekunden automatisch aus der Zwischenablage gelöscht.",
 340      "4 / 5"),
 341    new(
 342      "🛡️ Sicherheitshinweise",
 343      "• LOCKnet sperrt sich nach 60 Sekunden Inaktivität automatisch.\n" +
 344      "• Klicke auf \"🔒 Sperren\" um die App sofort zu sperren.\n" +
 345      "• Trenne den USB-Stick niemals während des Betriebs.\n" +
 346      "• Erstelle regelmäßig eine Sicherungskopie des Sticks.",
 347      "5 / 5"),
 348  ];
 49
 050  public TutorialStep CurrentStepData => Steps[CurrentStep];
 151  public bool CanGoBack => CurrentStep > 0;
 252  public bool CanGoForward => CurrentStep < Steps.Length - 1;
 153  public bool IsLastStep => CurrentStep == Steps.Length - 1;
 54
 55  [RelayCommand(CanExecute = nameof(CanGoBack))]
 56  private void Back()
 257  {
 258    if (CurrentStep > 0)
 159    {
 160      CurrentStep--;
 161      OnPropertyChanged(nameof(CurrentStepData));
 162      OnPropertyChanged(nameof(CanGoBack));
 163      OnPropertyChanged(nameof(CanGoForward));
 164      OnPropertyChanged(nameof(IsLastStep));
 165      BackCommand.NotifyCanExecuteChanged();
 166      ForwardCommand.NotifyCanExecuteChanged();
 167    }
 268  }
 69
 70  [RelayCommand(CanExecute = nameof(CanGoForward))]
 71  private void Forward()
 572  {
 573    if (CurrentStep < Steps.Length - 1)
 474    {
 475      CurrentStep++;
 476      OnPropertyChanged(nameof(CurrentStepData));
 477      OnPropertyChanged(nameof(CanGoBack));
 478      OnPropertyChanged(nameof(CanGoForward));
 479      OnPropertyChanged(nameof(IsLastStep));
 480      BackCommand.NotifyCanExecuteChanged();
 481      ForwardCommand.NotifyCanExecuteChanged();
 482    }
 583  }
 84
 85  [RelayCommand]
 186  private void Close() => Closed?.Invoke(this, EventArgs.Empty);
 87}
 88
 89/// <summary>Ein einzelner Tutorial-Schritt.</summary>
 90/// <param name="Title">Überschrift des Schritts.</param>
 91/// <param name="Content">Erklärungstext.</param>
 92/// <param name="StepLabel">Fortschrittsanzeige z.B. "1 / 5".</param>
 93public record TutorialStep(string Title, string Content, string StepLabel);