From 4be9d35e217adc0eb09978df0495f92079834bef Mon Sep 17 00:00:00 2001 From: koki-develop Date: Sun, 26 Mar 2023 09:14:32 +0900 Subject: [PATCH 1/6] implement max() --- util.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/util.go b/util.go index 5fcafa0..8cc3d85 100644 --- a/util.go +++ b/util.go @@ -28,3 +28,11 @@ func intFilter(is []int, f func(i int) bool) []int { } return rtn } + +func max(l, r int) int { + if l < r { + return r + } else { + return l + } +} From 9759a1147ada070f3cafb28eaccc6bb082d70acf Mon Sep 17 00:00:00 2001 From: koki-develop Date: Sun, 26 Mar 2023 09:28:31 +0900 Subject: [PATCH 2/6] implement model.headerHeight() --- model.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/model.go b/model.go index dc21898..c062ba4 100644 --- a/model.go +++ b/model.go @@ -15,10 +15,6 @@ var ( _ tea.Model = (*model)(nil) ) -const ( - headerHeight = 1 -) - type model struct { fzf *FZF items *items @@ -106,9 +102,15 @@ func (m *model) headerView() string { return m.input.View() } +func (m *model) headerHeight() int { + return lipgloss.Height(m.headerView()) +} + func (m *model) itemsView() string { var v strings.Builder + headerHeight := m.headerHeight() + for i, match := range m.matches[m.windowYPosition:] { cursorLine := m.cursorPosition == i @@ -270,6 +272,8 @@ func (m *model) fixCursor() { } func (m *model) fixYPosition() { + headerHeight := m.headerHeight() + if m.windowHeight-headerHeight > len(m.matches) { m.windowYPosition = 0 return From fac3061db2d529f90a0204f2c9fbaf041fc1963b Mon Sep 17 00:00:00 2001 From: koki-develop Date: Sun, 26 Mar 2023 09:33:36 +0900 Subject: [PATCH 3/6] fix cursorLine --- model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model.go b/model.go index c062ba4..5ae71fb 100644 --- a/model.go +++ b/model.go @@ -112,7 +112,7 @@ func (m *model) itemsView() string { headerHeight := m.headerHeight() for i, match := range m.matches[m.windowYPosition:] { - cursorLine := m.cursorPosition == i + cursorLine := m.cursorPosition == i+m.windowYPosition // write cursor if cursorLine { From 4df2d22d08624585ac1305b4ae716d87f4847dd6 Mon Sep 17 00:00:00 2001 From: koki-develop Date: Sun, 26 Mar 2023 09:38:39 +0900 Subject: [PATCH 4/6] fix m.choice() --- model.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/model.go b/model.go index 5ae71fb..d12d3b5 100644 --- a/model.go +++ b/model.go @@ -209,9 +209,15 @@ func (m *model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { } func (m *model) choice() { - if len(m.choices) == 0 && m.cursorPosition >= 0 { - m.choices = append(m.choices, m.matches[m.cursorPosition].Index) + if len(m.choices) > 0 { + return + } + + if m.matches.Len() == 0 { + return } + + m.choices = append(m.choices, m.matches[m.cursorPosition].Index) } func (m *model) toggle() { From cedc7de3f9c29187062073f40643d2717a6abae4 Mon Sep 17 00:00:00 2001 From: koki-develop Date: Sun, 26 Mar 2023 09:40:07 +0900 Subject: [PATCH 5/6] fix m.fixCursor() --- model.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model.go b/model.go index d12d3b5..27ac274 100644 --- a/model.go +++ b/model.go @@ -266,7 +266,7 @@ func (m *model) filter() { } func (m *model) fixCursor() { - if m.cursorPosition < 0 && len(m.matches) > 0 { + if m.cursorPosition < 0 { m.cursorPosition = 0 return } From 36123fbccf0a5eba92070d9aba7621953abf5cec Mon Sep 17 00:00:00 2001 From: koki-develop Date: Sun, 26 Mar 2023 09:48:13 +0900 Subject: [PATCH 6/6] display items count --- model.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/model.go b/model.go index 27ac274..49540b2 100644 --- a/model.go +++ b/model.go @@ -2,6 +2,7 @@ package fzf import ( "fmt" + "strconv" "strings" "github.com/charmbracelet/bubbles/key" @@ -99,7 +100,22 @@ func (m *model) View() string { } func (m *model) headerView() string { - return m.input.View() + var v strings.Builder + + // input + _, _ = v.WriteString(m.input.View()) + _, _ = v.WriteRune('\n') + + // count + var cv strings.Builder + _, _ = cv.WriteString(strconv.Itoa(m.matches.Len())) + _, _ = cv.WriteRune('/') + _, _ = cv.WriteString(strconv.Itoa(m.items.Len())) + _, _ = cv.WriteRune(' ') + _, _ = v.WriteString(cv.String()) + _, _ = v.WriteString(strings.Repeat("─", max(m.windowWidth-cv.Len(), 0))) + + return v.String() } func (m *model) headerHeight() int {