Skip to content

Commit 44aeaa2

Browse files
committed
feat: add circular scrolling to lists
Only possible via j/k/down/up keys.
1 parent 2efa8cb commit 44aeaa2

File tree

1 file changed

+76
-12
lines changed

1 file changed

+76
-12
lines changed

internal/ui/update.go

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
163163
return m, tea.Batch(cmds...)
164164
}
165165

166+
skipListUpdate := false
167+
166168
switch msg := msg.(type) {
167169
case tea.WindowSizeMsg:
168170
w, h := listStyle.GetFrameSize()
@@ -424,16 +426,43 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
424426
return m, tea.Batch(cmds...)
425427

426428
case "down", "j":
427-
if m.activeView != taskDetailsView && m.activeView != helpView {
428-
break
429-
}
430-
431429
switch m.activeView {
430+
case taskListView, archivedTaskListView, contextBookmarksView, prefixSelectionView:
431+
// cycle back to top
432+
var list *list.Model
433+
switch m.activeView {
434+
case taskListView:
435+
list = &m.taskList
436+
case archivedTaskListView:
437+
list = &m.archivedTaskList
438+
case contextBookmarksView:
439+
list = &m.taskBMList
440+
case prefixSelectionView:
441+
list = &m.prefixSearchList
442+
default:
443+
break
444+
}
445+
446+
if list.IsFiltered() {
447+
break
448+
}
449+
450+
numItems := len(list.Items())
451+
if numItems <= 1 {
452+
break
453+
}
454+
455+
if list.Index() == numItems-1 {
456+
list.Select(0)
457+
skipListUpdate = true
458+
}
459+
432460
case taskDetailsView:
433461
if m.taskDetailsVP.AtBottom() {
434462
break
435463
}
436464
m.taskDetailsVP.LineDown(viewPortMoveLineCount)
465+
437466
case helpView:
438467
if m.helpVP.AtBottom() {
439468
break
@@ -442,16 +471,43 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
442471
}
443472

444473
case "up", "k":
445-
if m.activeView != taskDetailsView && m.activeView != helpView {
446-
break
447-
}
448-
449474
switch m.activeView {
475+
case taskListView, archivedTaskListView, contextBookmarksView, prefixSelectionView:
476+
// cycle to the end
477+
var list *list.Model
478+
switch m.activeView {
479+
case taskListView:
480+
list = &m.taskList
481+
case archivedTaskListView:
482+
list = &m.archivedTaskList
483+
case contextBookmarksView:
484+
list = &m.taskBMList
485+
case prefixSelectionView:
486+
list = &m.prefixSearchList
487+
default:
488+
break
489+
}
490+
491+
if list.IsFiltered() {
492+
break
493+
}
494+
495+
numItems := len(list.Items())
496+
if numItems <= 1 {
497+
break
498+
}
499+
500+
if list.Index() == 0 {
501+
list.Select(numItems - 1)
502+
skipListUpdate = true
503+
}
504+
450505
case taskDetailsView:
451506
if m.taskDetailsVP.AtTop() {
452507
break
453508
}
454509
m.taskDetailsVP.LineUp(viewPortMoveLineCount)
510+
455511
case helpView:
456512
if m.helpVP.AtTop() {
457513
break
@@ -1415,7 +1471,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
14151471
var viewUpdateCmd tea.Cmd
14161472
switch m.activeView {
14171473
case taskListView:
1418-
m.taskList, viewUpdateCmd = m.taskList.Update(msg)
1474+
if !skipListUpdate {
1475+
m.taskList, viewUpdateCmd = m.taskList.Update(msg)
1476+
}
14191477

14201478
if !m.cfg.ShowContext {
14211479
break
@@ -1452,7 +1510,9 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
14521510
m.contextVPTaskId = t.ID
14531511

14541512
case archivedTaskListView:
1455-
m.archivedTaskList, viewUpdateCmd = m.archivedTaskList.Update(msg)
1513+
if !skipListUpdate {
1514+
m.archivedTaskList, viewUpdateCmd = m.archivedTaskList.Update(msg)
1515+
}
14561516

14571517
if !m.cfg.ShowContext {
14581518
break
@@ -1490,10 +1550,14 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
14901550
m.taskDetailsVP, viewUpdateCmd = m.taskDetailsVP.Update(msg)
14911551

14921552
case contextBookmarksView:
1493-
m.taskBMList, viewUpdateCmd = m.taskBMList.Update(msg)
1553+
if !skipListUpdate {
1554+
m.taskBMList, viewUpdateCmd = m.taskBMList.Update(msg)
1555+
}
14941556

14951557
case prefixSelectionView:
1496-
m.prefixSearchList, viewUpdateCmd = m.prefixSearchList.Update(msg)
1558+
if !skipListUpdate {
1559+
m.prefixSearchList, viewUpdateCmd = m.prefixSearchList.Update(msg)
1560+
}
14971561

14981562
case helpView:
14991563
m.helpVP, viewUpdateCmd = m.helpVP.Update(msg)

0 commit comments

Comments
 (0)