chore: improve UX
This commit is contained in:
+33
-7
@@ -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
|
||||||
@@ -88,8 +91,8 @@ func (o *Overlay) RenderGhostText(buffer string, userNavigated bool) string {
|
|||||||
if padLen < 0 {
|
if padLen < 0 {
|
||||||
padLen = 0
|
padLen = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// add extra padding to erase any stray characters left by fast backspaces
|
// add extra padding to erase any stray characters left by fast backspaces
|
||||||
// before the debounce timer fired. 10 spaces is safe and won't hit right prompts
|
// before the debounce timer fired. 10 spaces is safe and won't hit right prompts
|
||||||
padLen += 10
|
padLen += 10
|
||||||
|
|
||||||
@@ -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
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user