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:
parent
d67b209e62
commit
b8bee4de51
@ -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]
|
||||
}
|
||||
|
@ -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)
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -89,6 +89,7 @@ type Context interface {
|
||||
|
||||
type IFilterableContext interface {
|
||||
Context
|
||||
IListPanelState
|
||||
|
||||
SetFilter(string)
|
||||
GetFilter() string
|
||||
|
Loading…
x
Reference in New Issue
Block a user