chore: improve UX

This commit is contained in:
verse91
2026-04-29 19:45:37 +07:00
parent 3c8eca3a62
commit 7af4d56572
2 changed files with 39 additions and 13 deletions
+31 -5
View File
@@ -19,6 +19,7 @@ type Overlay struct {
Visible bool Visible bool
Items []core.Suggestion Items []core.Suggestion
Cursor int Cursor int
StartIdx int
LastGhostLen int LastGhostLen int
} }
@@ -40,8 +41,9 @@ var (
func NewOverlay() *Overlay { func NewOverlay() *Overlay {
return &Overlay{ return &Overlay{
Visible: false, Visible: false,
Cursor: 0, Cursor: 0,
StartIdx: 0,
} }
} }
@@ -52,6 +54,7 @@ func (o *Overlay) UpdateItems(items []core.Suggestion) {
o.Items = items o.Items = items
o.Visible = len(o.Items) > 0 o.Visible = len(o.Items) > 0
o.Cursor = 0 // reset to top result on update o.Cursor = 0 // reset to top result on update
o.StartIdx = 0
} }
// fixedWidth pads or truncates a string to exact rune width // fixedWidth pads or truncates a string to exact rune width
@@ -125,10 +128,33 @@ func (o *Overlay) Render() string {
windowSize = len(o.Items) windowSize = len(o.Items)
} }
start := 0 // when you use up arrow key, the selection bar will stick with the second item
if o.Cursor >= windowSize { // it stays still at second position until you reach the limit of the list
start = o.Cursor - windowSize + 1 // but not apply the same with down arrow key
scrolloffUp := 1
scrolloffDown := 0
if windowSize <= 3 {
scrolloffUp = 0
} }
if o.Cursor < o.StartIdx+scrolloffUp {
o.StartIdx = o.Cursor - scrolloffUp
}
if o.Cursor >= o.StartIdx+windowSize-scrolloffDown {
o.StartIdx = o.Cursor - windowSize + scrolloffDown + 1
}
if o.StartIdx < 0 {
o.StartIdx = 0
}
if o.StartIdx > len(o.Items)-windowSize {
o.StartIdx = len(o.Items) - windowSize
}
if o.StartIdx < 0 {
o.StartIdx = 0
}
start := o.StartIdx
end := start + windowSize end := start + windowSize
totalLines := windowSize + 2 // top border + items + bottom border totalLines := windowSize + 2 // top border + items + bottom border
+6 -6
View File
@@ -380,28 +380,28 @@ func runWrapper() {
results := mergeResults("", "history") results := mergeResults("", "history")
if len(results) > 0 { if len(results) > 0 {
limit := 10 limit := 100
if len(results) < limit { if len(results) < limit {
limit = len(results) limit = len(results)
} }
var top10 []core.Suggestion var historyList []core.Suggestion
if inputSlice[i+2] == 'A' { if inputSlice[i+2] == 'A' {
// Up arrow: Reverse the list so newest is at the bottom // Up arrow: Reverse the list so newest is at the bottom
for j := limit - 1; j >= 0; j-- { for j := limit - 1; j >= 0; j-- {
top10 = append(top10, results[j]) historyList = append(historyList, results[j])
} }
} else { } else {
// Down arrow: Normal order, newest is at the top // Down arrow: Normal order, newest is at the top
for j := 0; j < limit; j++ { for j := 0; j < limit; j++ {
top10 = append(top10, results[j]) historyList = append(historyList, results[j])
} }
} }
overlay.UpdateItems(top10) overlay.UpdateItems(historyList)
if inputSlice[i+2] == 'A' { if inputSlice[i+2] == 'A' {
overlay.Cursor = len(top10) - 1 // Up arrow: Start at the bottom overlay.Cursor = len(historyList) - 1 // Up arrow: Start at the bottom
} else { } else {
overlay.Cursor = 0 // Down arrow: Start at the top overlay.Cursor = 0 // Down arrow: Start at the top
} }