| | | 1 | | using CommunityToolkit.Mvvm.ComponentModel; |
| | | 2 | | using CommunityToolkit.Mvvm.Input; |
| | | 3 | | |
| | | 4 | | namespace LOCKnet.App.ViewModels; |
| | | 5 | | |
| | | 6 | | /// <summary> |
| | | 7 | | /// ViewModel für die Tutorial-/Hilfe-Ansicht. |
| | | 8 | | /// </summary> |
| | | 9 | | public partial class TutorialViewModel : ViewModelBase |
| | | 10 | | { |
| | | 11 | | public event EventHandler? Closed; |
| | | 12 | | |
| | | 13 | | [ObservableProperty] |
| | | 14 | | private int _currentStep; |
| | | 15 | | |
| | | 16 | | public TutorialStep[] Steps { get; } = |
| | | 17 | | [ |
| | | 18 | | new( |
| | | 19 | | "🔒 Willkommen bei LOCKnet", |
| | | 20 | | "LOCKnet ist dein persönlicher, vollständig offline arbeitender Passwortmanager. " + |
| | | 21 | | "Alle Daten liegen verschlüsselt auf deinem USB-Stick — keine Cloud, keine externen Server.", |
| | | 22 | | "1 / 5"), |
| | | 23 | | new( |
| | | 24 | | "🔑 Master-Passwort", |
| | | 25 | | "Beim ersten Start richtest du ein Master-Passwort ein. " + |
| | | 26 | | "Dieses Passwort schützt alle deine Zugangsdaten. " + |
| | | 27 | | "Wähle ein starkes Passwort und bewahre es sicher auf — es gibt keine Wiederherstellung.", |
| | | 28 | | "2 / 5"), |
| | | 29 | | new( |
| | | 30 | | "➕ Neuen Eintrag anlegen", |
| | | 31 | | "Klicke auf \"+ Neu\" in der oberen Leiste, um einen neuen Eintrag zu erstellen. " + |
| | | 32 | | "Trage Titel, Benutzernamen, Passwort, URL und optionale Notizen ein. " + |
| | | 33 | | "Mit 🙈/👁️ kannst du das Passwort ein- und ausblenden.", |
| | | 34 | | "3 / 5"), |
| | | 35 | | new( |
| | | 36 | | "📋 Eintrag verwenden", |
| | | 37 | | "Klicke auf einen Eintrag in der Liste, um ihn auszuwählen. " + |
| | | 38 | | "Dann kannst du das Passwort mit \"📋 Passwort kopieren\" in die Zwischenablage kopieren. " + |
| | | 39 | | "Das Passwort wird nach 30 Sekunden automatisch aus der Zwischenablage gelöscht.", |
| | | 40 | | "4 / 5"), |
| | | 41 | | new( |
| | | 42 | | "🛡️ Sicherheitshinweise", |
| | | 43 | | "• LOCKnet sperrt sich nach 60 Sekunden Inaktivität automatisch.\n" + |
| | | 44 | | "• Klicke auf \"🔒 Sperren\" um die App sofort zu sperren.\n" + |
| | | 45 | | "• Trenne den USB-Stick niemals während des Betriebs.\n" + |
| | | 46 | | "• Erstelle regelmäßig eine Sicherungskopie des Sticks.", |
| | | 47 | | "5 / 5"), |
| | | 48 | | ]; |
| | | 49 | | |
| | | 50 | | public TutorialStep CurrentStepData => Steps[CurrentStep]; |
| | | 51 | | public bool CanGoBack => CurrentStep > 0; |
| | | 52 | | public bool CanGoForward => CurrentStep < Steps.Length - 1; |
| | | 53 | | public bool IsLastStep => CurrentStep == Steps.Length - 1; |
| | | 54 | | |
| | | 55 | | [RelayCommand(CanExecute = nameof(CanGoBack))] |
| | | 56 | | private void Back() |
| | | 57 | | { |
| | | 58 | | if (CurrentStep > 0) |
| | | 59 | | { |
| | | 60 | | CurrentStep--; |
| | | 61 | | OnPropertyChanged(nameof(CurrentStepData)); |
| | | 62 | | OnPropertyChanged(nameof(CanGoBack)); |
| | | 63 | | OnPropertyChanged(nameof(CanGoForward)); |
| | | 64 | | OnPropertyChanged(nameof(IsLastStep)); |
| | | 65 | | BackCommand.NotifyCanExecuteChanged(); |
| | | 66 | | ForwardCommand.NotifyCanExecuteChanged(); |
| | | 67 | | } |
| | | 68 | | } |
| | | 69 | | |
| | | 70 | | [RelayCommand(CanExecute = nameof(CanGoForward))] |
| | | 71 | | private void Forward() |
| | | 72 | | { |
| | | 73 | | if (CurrentStep < Steps.Length - 1) |
| | | 74 | | { |
| | | 75 | | CurrentStep++; |
| | | 76 | | OnPropertyChanged(nameof(CurrentStepData)); |
| | | 77 | | OnPropertyChanged(nameof(CanGoBack)); |
| | | 78 | | OnPropertyChanged(nameof(CanGoForward)); |
| | | 79 | | OnPropertyChanged(nameof(IsLastStep)); |
| | | 80 | | BackCommand.NotifyCanExecuteChanged(); |
| | | 81 | | ForwardCommand.NotifyCanExecuteChanged(); |
| | | 82 | | } |
| | | 83 | | } |
| | | 84 | | |
| | | 85 | | [RelayCommand] |
| | | 86 | | 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> |
| | 15 | 93 | | public record TutorialStep(string Title, string Content, string StepLabel); |