Skip to content

Commit 47a06e1

Browse files
committed
Adjust RSVP phrase navigation controls (#31)
1 parent 35d27c7 commit 47a06e1

20 files changed

Lines changed: 155 additions & 46 deletions

src/PrompterOne.Shared/Contracts/UiTestIds.Learn.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public static class Learn
2525
public const string PlayIcon = "learn-play-icon";
2626
public const string ProgressFill = "learn-progress-fill";
2727
public const string ProgressLabel = "learn-progress-label";
28+
public const string RestartPhrase = "learn-restart-phrase";
2829
public const string SpeedValue = "learn-speed-value";
2930
public const string SpeedDown = "learn-speed-down";
3031
public const string SpeedUp = "learn-speed-up";

src/PrompterOne.Shared/Learn/Pages/LearnPage.Playback.cs

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,70 @@ await PersistLearnSettingsAsync(settings => settings with
7272
}
7373

7474
private async Task StepRsvpWordAsync(int delta)
75+
{
76+
await StepRsvpToIndexAsync(_currentIndex + delta);
77+
}
78+
79+
private async Task StepRsvpToIndexAsync(int index)
7580
{
7681
if (_timeline.Count == 0)
7782
{
7883
return;
7984
}
8085

81-
_currentIndex = ResolveNavigationIndex(_currentIndex + delta);
86+
_currentIndex = ResolveNavigationIndex(index);
8287
UpdateDisplayedState();
8388
RestartPlaybackLoopIfActive();
8489
await InvokeAsync(StateHasChanged);
8590
await AwaitPendingFocusLayoutSyncAsync();
8691
}
8792

93+
private int ResolveCurrentPhraseStartIndex()
94+
{
95+
if (_timeline.Count == 0)
96+
{
97+
return 0;
98+
}
99+
100+
var currentEntry = _timeline[Math.Clamp(_currentIndex, 0, _timeline.Count - 1)];
101+
return currentEntry.SentenceStartIndex;
102+
}
103+
104+
private int ResolveNextPhraseIndex()
105+
{
106+
if (_timeline.Count == 0)
107+
{
108+
return 0;
109+
}
110+
111+
var currentEntry = _timeline[Math.Clamp(_currentIndex, 0, _timeline.Count - 1)];
112+
return currentEntry.SentenceEndIndex + 1;
113+
}
114+
115+
private int ResolvePreviousPhraseIndex()
116+
{
117+
if (_timeline.Count == 0)
118+
{
119+
return 0;
120+
}
121+
122+
var currentEntry = _timeline[Math.Clamp(_currentIndex, 0, _timeline.Count - 1)];
123+
if (_currentIndex > currentEntry.SentenceStartIndex)
124+
{
125+
return currentEntry.SentenceStartIndex;
126+
}
127+
128+
var previousIndex = currentEntry.SentenceStartIndex - 1;
129+
if (previousIndex < 0)
130+
{
131+
return _isLoopEnabled
132+
? _timeline[^1].SentenceStartIndex
133+
: 0;
134+
}
135+
136+
return _timeline[previousIndex].SentenceStartIndex;
137+
}
138+
88139
private void RestartPlaybackLoopIfActive()
89140
{
90141
if (_isPlaying)

src/PrompterOne.Shared/Learn/Pages/LearnPage.Tooltips.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ public partial class LearnPage
2525
? Text(UiTextKey.TooltipPausePlayback)
2626
: Text(UiTextKey.TooltipPlayPlayback);
2727

28+
private string RestartPhraseTooltip => Text(UiTextKey.TooltipRestartPhrase);
29+
2830
private string Text(UiTextKey key) => Localizer[key.ToString()];
2931

3032
private string Format(UiTextKey key, params object[] arguments) =>

src/PrompterOne.Shared/Learn/Pages/LearnPage.razor

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,14 @@
138138
</TooltipAnchor>
139139
</div>
140140
<div class="rsvp-play-band">
141-
<div class="rsvp-play-side-slot" aria-hidden="true"></div>
141+
<div class="rsvp-play-side-slot">
142+
<TooltipAnchor OwnerTestId="@UiTestIds.Learn.RestartPhrase" Text="@RestartPhraseTooltip">
143+
<button class="rsvp-btn rsvp-btn-sm rsvp-restart-phrase"
144+
@onclick="RestartCurrentPhraseAsync"
145+
aria-label="@RestartPhraseTooltip"
146+
data-test="@UiTestIds.Learn.RestartPhrase"><UiIcon Kind="UiIconKind.RecordTarget" Size="15" StrokeWidth="2.4m" /></button>
147+
</TooltipAnchor>
148+
</div>
142149
<div class="rsvp-play-row">
143150
<TooltipAnchor OwnerTestId="@UiTestIds.Learn.StepBackwardLarge" Text="@BackFiveWordsTooltip">
144151
<button class="rsvp-btn"

src/PrompterOne.Shared/Learn/Pages/LearnPage.razor.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public partial class LearnPage : IAsyncDisposable
2222
private const int RsvpMaxSpeed = 600;
2323
private const int RsvpMinSpeed = 100;
2424
private const int RsvpSpeedStep = 10;
25-
private const int RsvpStepLarge = 5;
2625
private const int RsvpStepSmall = 1;
2726
private const string WpmSuffix = " WPM";
2827
[Inject] private AppBootstrapper Bootstrapper { get; set; } = null!;
@@ -150,13 +149,15 @@ private void PopulateLearnState()
150149

151150
private Task IncreaseRsvpSpeedAsync() => ChangeRsvpSpeedAsync(RsvpSpeedStep);
152151

153-
private Task StepRsvpBackwardLargeAsync() => StepRsvpWordAsync(-RsvpStepLarge);
152+
private Task StepRsvpBackwardLargeAsync() => StepRsvpToIndexAsync(ResolvePreviousPhraseIndex());
154153

155154
private Task StepRsvpBackwardAsync() => StepRsvpWordAsync(-RsvpStepSmall);
156155

157156
private Task StepRsvpForwardAsync() => StepRsvpWordAsync(RsvpStepSmall);
158157

159-
private Task StepRsvpForwardLargeAsync() => StepRsvpWordAsync(RsvpStepLarge);
158+
private Task StepRsvpForwardLargeAsync() => StepRsvpToIndexAsync(ResolveNextPhraseIndex());
159+
160+
private Task RestartCurrentPhraseAsync() => StepRsvpToIndexAsync(ResolveCurrentPhraseStartIndex());
160161

161162
private async Task NavigateBackToEditorAsync()
162163
{

src/PrompterOne.Shared/Localization/SharedResource.de.resx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@
487487
<value>Tempo erhöhen</value>
488488
</data>
489489
<data name="TooltipBackFiveWords" xml:space="preserve">
490-
<value>5 Wörter zurück</value>
490+
<value>Vorherige Phrase</value>
491491
</data>
492492
<data name="TooltipBackOneWord" xml:space="preserve">
493493
<value>1 Wort zurück</value>
@@ -498,11 +498,14 @@
498498
<data name="TooltipPausePlayback" xml:space="preserve">
499499
<value>Wiedergabe pausieren</value>
500500
</data>
501+
<data name="TooltipRestartPhrase" xml:space="preserve">
502+
<value>Phrase neu starten</value>
503+
</data>
501504
<data name="TooltipForwardOneWord" xml:space="preserve">
502505
<value>1 Wort vor</value>
503506
</data>
504507
<data name="TooltipForwardFiveWords" xml:space="preserve">
505-
<value>5 Wörter vor</value>
508+
<value>Nächste Phrase</value>
506509
</data>
507510
<data name="TooltipLoopPlaybackOn" xml:space="preserve">
508511
<value>Schleifenwiedergabe ist an</value>
@@ -2722,7 +2725,7 @@
27222725
<value>Vorheriger Phrasensprung</value>
27232726
</data>
27242727
<data name="SettingsHotkeyLearnStepBackwardLargeDescription" xml:space="preserve">
2725-
<value>Gehen Sie fünf Wörter zurück.</value>
2728+
<value>Zur vorherigen Phrase springen.</value>
27262729
</data>
27272730
<data name="SettingsHotkeyLearnStepForwardLabel" xml:space="preserve">
27282731
<value>Nächstes Wort</value>
@@ -2734,7 +2737,7 @@
27342737
<value>Nächster Phrasensprung</value>
27352738
</data>
27362739
<data name="SettingsHotkeyLearnStepForwardLargeDescription" xml:space="preserve">
2737-
<value>Gehen Sie fünf Wörter vor.</value>
2740+
<value>Zur nächsten Phrase springen.</value>
27382741
</data>
27392742
<data name="SettingsHotkeyLearnLoopLabel" xml:space="preserve">
27402743
<value>Loop-Wiedergabe</value>

src/PrompterOne.Shared/Localization/SharedResource.es.resx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@
487487
<value>Aumentar velocidad</value>
488488
</data>
489489
<data name="TooltipBackFiveWords" xml:space="preserve">
490-
<value>Retroceder 5 palabras</value>
490+
<value>Frase anterior</value>
491491
</data>
492492
<data name="TooltipBackOneWord" xml:space="preserve">
493493
<value>Retroceder 1 palabra</value>
@@ -498,11 +498,14 @@
498498
<data name="TooltipPausePlayback" xml:space="preserve">
499499
<value>Pausar reproducción</value>
500500
</data>
501+
<data name="TooltipRestartPhrase" xml:space="preserve">
502+
<value>Reiniciar frase</value>
503+
</data>
501504
<data name="TooltipForwardOneWord" xml:space="preserve">
502505
<value>Avanzar 1 palabra</value>
503506
</data>
504507
<data name="TooltipForwardFiveWords" xml:space="preserve">
505-
<value>Avanzar 5 palabras</value>
508+
<value>Frase siguiente</value>
506509
</data>
507510
<data name="TooltipLoopPlaybackOn" xml:space="preserve">
508511
<value>La reproducción en bucle está activada</value>
@@ -2722,7 +2725,7 @@
27222725
<value>Salto de frase anterior</value>
27232726
</data>
27242727
<data name="SettingsHotkeyLearnStepBackwardLargeDescription" xml:space="preserve">
2725-
<value>Retroceda cinco palabras.</value>
2728+
<value>Salta a la frase anterior.</value>
27262729
</data>
27272730
<data name="SettingsHotkeyLearnStepForwardLabel" xml:space="preserve">
27282731
<value>siguiente palabra</value>
@@ -2734,7 +2737,7 @@
27342737
<value>Salto de siguiente frase</value>
27352738
</data>
27362739
<data name="SettingsHotkeyLearnStepForwardLargeDescription" xml:space="preserve">
2737-
<value>Avanza cinco palabras.</value>
2740+
<value>Salta a la frase siguiente.</value>
27382741
</data>
27392742
<data name="SettingsHotkeyLearnLoopLabel" xml:space="preserve">
27402743
<value>Reproducción en bucle</value>

src/PrompterOne.Shared/Localization/SharedResource.fr.resx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@
487487
<value>Augmenter la vitesse</value>
488488
</data>
489489
<data name="TooltipBackFiveWords" xml:space="preserve">
490-
<value>Reculer de 5 mots</value>
490+
<value>Phrase précédente</value>
491491
</data>
492492
<data name="TooltipBackOneWord" xml:space="preserve">
493493
<value>Reculer d’un mot</value>
@@ -498,11 +498,14 @@
498498
<data name="TooltipPausePlayback" xml:space="preserve">
499499
<value>Mettre la lecture en pause</value>
500500
</data>
501+
<data name="TooltipRestartPhrase" xml:space="preserve">
502+
<value>Reprendre la phrase</value>
503+
</data>
501504
<data name="TooltipForwardOneWord" xml:space="preserve">
502505
<value>Avancer d’un mot</value>
503506
</data>
504507
<data name="TooltipForwardFiveWords" xml:space="preserve">
505-
<value>Avancer de 5 mots</value>
508+
<value>Phrase suivante</value>
506509
</data>
507510
<data name="TooltipLoopPlaybackOn" xml:space="preserve">
508511
<value>La lecture en boucle est activée</value>
@@ -2722,7 +2725,7 @@
27222725
<value>Saut de phrase précédente</value>
27232726
</data>
27242727
<data name="SettingsHotkeyLearnStepBackwardLargeDescription" xml:space="preserve">
2725-
<value>Reculez de cinq mots.</value>
2728+
<value>Sautez à la phrase précédente.</value>
27262729
</data>
27272730
<data name="SettingsHotkeyLearnStepForwardLabel" xml:space="preserve">
27282731
<value>Mot suivant</value>
@@ -2734,7 +2737,7 @@
27342737
<value>Saut de phrase suivant</value>
27352738
</data>
27362739
<data name="SettingsHotkeyLearnStepForwardLargeDescription" xml:space="preserve">
2737-
<value>Avancez de cinq mots.</value>
2740+
<value>Sautez à la phrase suivante.</value>
27382741
</data>
27392742
<data name="SettingsHotkeyLearnLoopLabel" xml:space="preserve">
27402743
<value>Lecture en boucle</value>

src/PrompterOne.Shared/Localization/SharedResource.it.resx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@
487487
<value>Aumenta velocità</value>
488488
</data>
489489
<data name="TooltipBackFiveWords" xml:space="preserve">
490-
<value>Indietro di 5 parole</value>
490+
<value>Frase precedente</value>
491491
</data>
492492
<data name="TooltipBackOneWord" xml:space="preserve">
493493
<value>Indietro di una parola</value>
@@ -498,11 +498,14 @@
498498
<data name="TooltipPausePlayback" xml:space="preserve">
499499
<value>Metti in pausa la riproduzione</value>
500500
</data>
501+
<data name="TooltipRestartPhrase" xml:space="preserve">
502+
<value>Riavvia frase</value>
503+
</data>
501504
<data name="TooltipForwardOneWord" xml:space="preserve">
502505
<value>Avanti di una parola</value>
503506
</data>
504507
<data name="TooltipForwardFiveWords" xml:space="preserve">
505-
<value>Avanti di 5 parole</value>
508+
<value>Frase successiva</value>
506509
</data>
507510
<data name="TooltipLoopPlaybackOn" xml:space="preserve">
508511
<value>La riproduzione in loop è attiva</value>
@@ -2722,7 +2725,7 @@
27222725
<value>Salto della frase precedente</value>
27232726
</data>
27242727
<data name="SettingsHotkeyLearnStepBackwardLargeDescription" xml:space="preserve">
2725-
<value>Fai un passo indietro di cinque parole.</value>
2728+
<value>Salta alla frase precedente.</value>
27262729
</data>
27272730
<data name="SettingsHotkeyLearnStepForwardLabel" xml:space="preserve">
27282731
<value>Parola successiva</value>
@@ -2734,7 +2737,7 @@
27342737
<value>Salta la frase successiva</value>
27352738
</data>
27362739
<data name="SettingsHotkeyLearnStepForwardLargeDescription" xml:space="preserve">
2737-
<value>Fai un passo avanti di cinque parole.</value>
2740+
<value>Salta alla frase successiva.</value>
27382741
</data>
27392742
<data name="SettingsHotkeyLearnLoopLabel" xml:space="preserve">
27402743
<value>Riproduzione in loop</value>

src/PrompterOne.Shared/Localization/SharedResource.pt.resx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@
487487
<value>Aumentar velocidade</value>
488488
</data>
489489
<data name="TooltipBackFiveWords" xml:space="preserve">
490-
<value>Voltar 5 palavras</value>
490+
<value>Frase anterior</value>
491491
</data>
492492
<data name="TooltipBackOneWord" xml:space="preserve">
493493
<value>Voltar 1 palavra</value>
@@ -498,11 +498,14 @@
498498
<data name="TooltipPausePlayback" xml:space="preserve">
499499
<value>Pausar reprodução</value>
500500
</data>
501+
<data name="TooltipRestartPhrase" xml:space="preserve">
502+
<value>Reiniciar frase</value>
503+
</data>
501504
<data name="TooltipForwardOneWord" xml:space="preserve">
502505
<value>Avançar 1 palavra</value>
503506
</data>
504507
<data name="TooltipForwardFiveWords" xml:space="preserve">
505-
<value>Avançar 5 palavras</value>
508+
<value>Próxima frase</value>
506509
</data>
507510
<data name="TooltipLoopPlaybackOn" xml:space="preserve">
508511
<value>A reprodução em loop está ativada</value>
@@ -2500,7 +2503,7 @@
25002503
<value>Salto de frase anterior</value>
25012504
</data>
25022505
<data name="SettingsHotkeyLearnStepBackwardLargeDescription" xml:space="preserve">
2503-
<value>Recue cinco palavras.</value>
2506+
<value>Pule para a frase anterior.</value>
25042507
</data>
25052508
<data name="SettingsHotkeyLearnStepForwardLabel" xml:space="preserve">
25062509
<value>Próxima palavra</value>
@@ -2512,7 +2515,7 @@
25122515
<value>Próxima frase pular</value>
25132516
</data>
25142517
<data name="SettingsHotkeyLearnStepForwardLargeDescription" xml:space="preserve">
2515-
<value>Avance cinco palavras.</value>
2518+
<value>Pule para a próxima frase.</value>
25162519
</data>
25172520
<data name="SettingsHotkeyLearnLoopLabel" xml:space="preserve">
25182521
<value>Reprodução em loop</value>

0 commit comments

Comments
 (0)