Skip to content

Commit 3bda42a

Browse files
committed
feat(tui): add navigation to first and last slides with safety checks
- Add `Top` and `Bottom` key bindings for navigation to first/last slides - Map home/shift+up/0 keys to jump to first slide - Map end/shift+down/$ keys to jump to last slide - Add null pointer safety checks in transition view logic - Handle edge cases for backwards transitions at last slide
1 parent 2e42e85 commit 3bda42a

File tree

2 files changed

+29
-6
lines changed

2 files changed

+29
-6
lines changed

internal/tui/slide.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/museslabs/kyma/internal/tui/transitions"
1111
)
1212

13-
1413
type Slide struct {
1514
Data string
1615
Prev *Slide
@@ -63,9 +62,17 @@ func (s Slide) view() string {
6362
if s.ActiveTransition != nil && s.ActiveTransition.Animating() {
6463
direction := s.ActiveTransition.Direction()
6564
if direction == transitions.Backwards {
66-
b.WriteString(s.ActiveTransition.View(s.Next.View(), s.Style.LipGlossStyle.Render(out)))
65+
if s.Next == nil {
66+
panic("backwards transition at the last slide")
67+
} else {
68+
b.WriteString(s.ActiveTransition.View(s.Next.View(), s.Style.LipGlossStyle.Render(out)))
69+
}
6770
} else {
68-
b.WriteString(s.ActiveTransition.View(s.Prev.View(), s.Style.LipGlossStyle.Render(out)))
71+
if s.Prev != nil {
72+
b.WriteString(s.ActiveTransition.View(s.Prev.View(), s.Style.LipGlossStyle.Render(out)))
73+
} else {
74+
b.WriteString(s.Style.LipGlossStyle.Render(out))
75+
}
6976
}
7077
} else {
7178
b.WriteString(s.Style.LipGlossStyle.Render(out))

internal/tui/tui.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,11 @@ import (
1111
)
1212

1313
type keyMap struct {
14-
Quit key.Binding
15-
Next key.Binding
16-
Prev key.Binding
14+
Quit key.Binding
15+
Next key.Binding
16+
Prev key.Binding
17+
Top key.Binding
18+
Bottom key.Binding
1719
}
1820

1921
func (k keyMap) ShortHelp() []key.Binding {
@@ -37,6 +39,14 @@ var keys = keyMap{
3739
key.WithKeys("left", "h"),
3840
key.WithHelp("<, h", "previous"),
3941
),
42+
Top: key.NewBinding(
43+
key.WithKeys("home", "shift+up", "0"),
44+
key.WithHelp("home, shift+up, 0", "top"),
45+
),
46+
Bottom: key.NewBinding(
47+
key.WithKeys("end", "shift+down", "$"),
48+
key.WithHelp("end, shift+down, $", "bottom"),
49+
),
4050
}
4151

4252
func style(width, height int, config config.StyleConfig) config.SlideStyle {
@@ -116,6 +126,12 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
116126
Start(m.width, m.height, transitions.Backwards)
117127

118128
return m, transitions.Animate(transitions.Fps)
129+
} else if key.Matches(msg, m.keys.Top) {
130+
m.slide = m.slide.First()
131+
return m, nil
132+
} else if key.Matches(msg, m.keys.Bottom) {
133+
m.slide = m.slide.Last()
134+
return m, nil
119135
}
120136
case transitions.FrameMsg:
121137
slide, cmd := m.slide.Update()

0 commit comments

Comments
 (0)