1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-04-23 12:18:51 +02:00

Scroll to top when filtering and retain selection when cancelling filter

This commit is contained in:
Jesse Duffield 2023-06-03 12:12:32 +10:00
parent d67b209e62
commit b8bee4de51
4 changed files with 29 additions and 3 deletions

View File

@ -68,3 +68,17 @@ func (self *FilteredList[T]) applyFilter() {
func (self *FilteredList[T]) match(haystack string, needle string) bool {
return utils.CaseInsensitiveContains(haystack, needle)
}
func (self *FilteredList[T]) UnfilteredIndex(index int) int {
if self.filteredIndices == nil {
return index
}
// we use -1 when there are no items
if index == -1 {
return -1
}
// TODO: mutex
return self.filteredIndices[index]
}

View File

@ -21,3 +21,13 @@ func NewFilteredListViewModel[T any](getList func() []T, getFilterFields func(T)
// used for type switch
func (self *FilteredListViewModel[T]) IsFilterableContext() {}
func (self *FilteredListViewModel[T]) ClearFilter() {
// Set the selected line index to the unfiltered index of the currently selected line,
// so that the current item is still selected after the filter is cleared.
unfilteredIndex := self.FilteredList.UnfilteredIndex(self.GetSelectedLineIdx())
self.FilteredList.ClearFilter()
self.SetSelectedLineIdx(unfilteredIndex)
}

View File

@ -123,14 +123,13 @@ func (self *SearchHelper) ConfirmFilter() error {
// We also do this on each keypress but we do it here again just in case
state := self.searchState()
context, ok := state.Context.(types.IFilterableContext)
_, ok := state.Context.(types.IFilterableContext)
if !ok {
self.c.Log.Warnf("Context %s is not filterable", state.Context.GetKey())
return nil
}
context.SetFilter(self.promptContent())
_ = self.c.PostRefreshUpdate(state.Context)
self.OnPromptContentChanged(self.promptContent())
return self.c.PopContext()
}
@ -187,6 +186,8 @@ func (self *SearchHelper) OnPromptContentChanged(searchString string) {
state := self.searchState()
switch context := state.Context.(type) {
case types.IFilterableContext:
context.SetSelectedLineIdx(0)
_ = context.GetView().SetOriginY(0)
context.SetFilter(searchString)
_ = self.c.PostRefreshUpdate(context)
case types.ISearchableContext:

View File

@ -89,6 +89,7 @@ type Context interface {
type IFilterableContext interface {
Context
IListPanelState
SetFilter(string)
GetFilter() string