2023-05-27 14:14:43 +10:00
|
|
|
package context
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/gui/keybindings"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/theme"
|
|
|
|
)
|
|
|
|
|
|
|
|
type SearchTrait struct {
|
|
|
|
c *ContextCommon
|
2023-08-04 14:01:30 +03:00
|
|
|
*SearchHistory
|
2023-05-27 14:14:43 +10:00
|
|
|
|
|
|
|
searchString string
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewSearchTrait(c *ContextCommon) *SearchTrait {
|
2023-08-04 14:01:30 +03:00
|
|
|
return &SearchTrait{
|
|
|
|
c: c,
|
|
|
|
SearchHistory: NewSearchHistory(),
|
|
|
|
}
|
2023-05-27 14:14:43 +10:00
|
|
|
}
|
|
|
|
|
|
|
|
func (self *SearchTrait) GetSearchString() string {
|
|
|
|
return self.searchString
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self *SearchTrait) SetSearchString(searchString string) {
|
|
|
|
self.searchString = searchString
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self *SearchTrait) ClearSearchString() {
|
|
|
|
self.SetSearchString("")
|
|
|
|
}
|
|
|
|
|
|
|
|
// used for type switch
|
|
|
|
func (self *SearchTrait) IsSearchableContext() {}
|
|
|
|
|
|
|
|
func (self *SearchTrait) onSelectItemWrapper(innerFunc func(int) error) func(int, int, int) error {
|
2023-09-25 15:34:15 +10:00
|
|
|
return func(selectedLineIdx int, index int, total int) error {
|
|
|
|
self.RenderSearchStatus(index, total)
|
2023-05-27 14:14:43 +10:00
|
|
|
|
2023-09-25 15:34:15 +10:00
|
|
|
if total != 0 {
|
|
|
|
if err := innerFunc(selectedLineIdx); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2023-05-27 14:14:43 +10:00
|
|
|
}
|
2023-09-25 15:34:15 +10:00
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (self *SearchTrait) RenderSearchStatus(index int, total int) {
|
|
|
|
keybindingConfig := self.c.UserConfig.Keybinding
|
|
|
|
|
|
|
|
if total == 0 {
|
|
|
|
self.c.SetViewContent(
|
|
|
|
self.c.Views().Search,
|
|
|
|
fmt.Sprintf(
|
|
|
|
self.c.Tr.NoMatchesFor,
|
|
|
|
self.searchString,
|
|
|
|
theme.OptionsFgColor.Sprintf(self.c.Tr.ExitSearchMode, keybindings.Label(keybindingConfig.Universal.Return)),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
} else {
|
2023-05-27 14:14:43 +10:00
|
|
|
self.c.SetViewContent(
|
|
|
|
self.c.Views().Search,
|
|
|
|
fmt.Sprintf(
|
|
|
|
self.c.Tr.MatchesFor,
|
|
|
|
self.searchString,
|
|
|
|
index+1,
|
|
|
|
total,
|
|
|
|
theme.OptionsFgColor.Sprintf(
|
|
|
|
self.c.Tr.SearchKeybindings,
|
|
|
|
keybindings.Label(keybindingConfig.Universal.NextMatch),
|
|
|
|
keybindings.Label(keybindingConfig.Universal.PrevMatch),
|
|
|
|
keybindings.Label(keybindingConfig.Universal.Return),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|
2023-05-27 20:38:49 +10:00
|
|
|
|
|
|
|
func (self *SearchTrait) IsSearching() bool {
|
|
|
|
return self.searchString != ""
|
|
|
|
}
|