fix: make resolving less jumpy
This commit is contained in:
@@ -60,6 +60,8 @@ disabled by default, and local-only.
|
|||||||
- Shows deterministic per-author colors and read-only reaction counts.
|
- Shows deterministic per-author colors and read-only reaction counts.
|
||||||
- Folds resolved threads by default and distinguishes unread or updated local
|
- Folds resolved threads by default and distinguishes unread or updated local
|
||||||
state.
|
state.
|
||||||
|
- After resolving the selected thread, keeps the cursor nearby by selecting
|
||||||
|
the next thread, or the previous thread when resolving the last one.
|
||||||
- Supports fuzzy path search; whitespace-separated terms may match separate
|
- Supports fuzzy path search; whitespace-separated terms may match separate
|
||||||
portions of the same path.
|
portions of the same path.
|
||||||
- Supports configurable status and within-status ordering.
|
- Supports configurable status and within-status ordering.
|
||||||
|
|||||||
7
tui.go
7
tui.go
@@ -966,6 +966,13 @@ func (m App) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
|
|||||||
if m.threadIndex >= 0 && m.threadIndex < len(m.details.Threads) {
|
if m.threadIndex >= 0 && m.threadIndex < len(m.details.Threads) {
|
||||||
selected = m.details.Threads[m.threadIndex].ID
|
selected = m.details.Threads[m.threadIndex].ID
|
||||||
}
|
}
|
||||||
|
if msg.thread.IsResolved && selected == msg.threadID {
|
||||||
|
if m.threadIndex+1 < len(m.details.Threads) {
|
||||||
|
selected = m.details.Threads[m.threadIndex+1].ID
|
||||||
|
} else if m.threadIndex > 0 {
|
||||||
|
selected = m.details.Threads[m.threadIndex-1].ID
|
||||||
|
}
|
||||||
|
}
|
||||||
for index := range m.details.Threads {
|
for index := range m.details.Threads {
|
||||||
if m.details.Threads[index].ID != msg.threadID {
|
if m.details.Threads[index].ID != msg.threadID {
|
||||||
continue
|
continue
|
||||||
|
|||||||
39
tui_test.go
39
tui_test.go
@@ -1470,6 +1470,45 @@ func TestResolveToggleConfirmsAndUsesCurrentThreadState(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestResolvingSelectedThreadKeepsSelectionNearItsPreviousPosition(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
name string
|
||||||
|
selected int
|
||||||
|
wantID string
|
||||||
|
}{
|
||||||
|
{name: "next thread", selected: 1, wantID: "c"},
|
||||||
|
{name: "previous thread at end", selected: 2, wantID: "b"},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
t.Run(test.name, func(t *testing.T) {
|
||||||
|
m := NewApp(nil, "o", "r", false, 50, time.Second)
|
||||||
|
m.screen, m.loading, m.focus = threadScreen, false, threadDetailPane
|
||||||
|
m.details.Threads = []ReviewThread{
|
||||||
|
{ID: "a", Path: "a.go"},
|
||||||
|
{ID: "b", Path: "b.go"},
|
||||||
|
{ID: "c", Path: "c.go"},
|
||||||
|
}
|
||||||
|
m.threadIndex = test.selected
|
||||||
|
resolvedID := m.details.Threads[test.selected].ID
|
||||||
|
|
||||||
|
updated, _ := m.Update(threadResolvedMsg{
|
||||||
|
threadID: resolvedID,
|
||||||
|
thread: ReviewThread{
|
||||||
|
ID: resolvedID, IsResolved: true, ViewerCanUnresolve: true,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
m = updated.(App)
|
||||||
|
|
||||||
|
if got := m.details.Threads[m.threadIndex].ID; got != test.wantID {
|
||||||
|
t.Fatalf("selected thread = %q, want nearest thread %q", got, test.wantID)
|
||||||
|
}
|
||||||
|
if m.focus != threadDetailPane {
|
||||||
|
t.Fatalf("focus = %d, want detail pane", m.focus)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestPollingMarksNewThreadCommentsUnread(t *testing.T) {
|
func TestPollingMarksNewThreadCommentsUnread(t *testing.T) {
|
||||||
m := NewApp(nil, "o", "r", false, 50, 10*time.Second)
|
m := NewApp(nil, "o", "r", false, 50, 10*time.Second)
|
||||||
m.screen, m.width, m.height = threadScreen, 80, 8
|
m.screen, m.width, m.height = threadScreen, 80, 8
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
const dipleVersion = "0.3.0"
|
const dipleVersion = "0.3.1"
|
||||||
|
|||||||
Reference in New Issue
Block a user