Implementing Simple Buffer Searching
Searching the Global Database although is enough but I have felt a need to have a quick and fast search option to search the current buffer. Buffer Search is also one of the views It can be only turned on if the File Browser has focus. ( Thinking of making it global ). The Searching is done through the fuzzy module. FileNode now implements the Source Interface. The Changed Function of the Search Bar checks for text changes and then modifies the Matches Variable which is used by the Update Function to Draw the Results. The Results have the Matching Characters Highlighted Differently. Maximum of 15 results are displayed to avoid lag. Upon Selecting the Result through the Search Bar navigation is possible and selection of the item is done the same way it works for file Browser. After Selection the Focus is returned Back to the File Browser. For The Tracks only the title is used for searching.
This commit is contained in:
109
main.go
109
main.go
@@ -4,17 +4,15 @@ import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/aditya-K2/gomp/ui/notify"
|
||||
|
||||
"github.com/aditya-K2/gomp/cache"
|
||||
"github.com/aditya-K2/gomp/client"
|
||||
"github.com/aditya-K2/gomp/config"
|
||||
"github.com/aditya-K2/gomp/render"
|
||||
"github.com/aditya-K2/gomp/ui"
|
||||
|
||||
"github.com/aditya-K2/gomp/client"
|
||||
"github.com/aditya-K2/gomp/ui/notify"
|
||||
"github.com/aditya-K2/gomp/utils"
|
||||
|
||||
"github.com/aditya-K2/fuzzy"
|
||||
"github.com/aditya-K2/gomp/cache"
|
||||
"github.com/aditya-K2/gomp/config"
|
||||
"github.com/fhs/gompd/mpd"
|
||||
"github.com/gdamore/tcell/v2"
|
||||
"github.com/spf13/viper"
|
||||
@@ -81,6 +79,7 @@ func main() {
|
||||
|
||||
// This is the Slice that is used to Display Content in the SearchView
|
||||
var SearchContentSlice []interface{}
|
||||
var Matches fuzzy.Matches
|
||||
|
||||
// This Function Is Responsible for Changing the Focus it uses the Focus Map and Based on it Chooses
|
||||
// the Draw Function
|
||||
@@ -91,6 +90,8 @@ func main() {
|
||||
client.UpdateSearchView(UI.ExpandedView, SearchContentSlice)
|
||||
} else if ui.HasFocus("FileBrowser") {
|
||||
client.Update(dirTree.Children, UI.ExpandedView)
|
||||
} else if ui.HasFocus("BuffSearchView") {
|
||||
client.UpdateBuffSearchView(UI.ExpandedView, Matches, dirTree.Children)
|
||||
}
|
||||
return UI.ExpandedView.GetInnerRect()
|
||||
})
|
||||
@@ -100,20 +101,36 @@ func main() {
|
||||
// the respective function in this case togglePlayBack is called.
|
||||
var FuncMap = map[string]func(){
|
||||
"showChildrenContent": func() {
|
||||
r, _ := UI.ExpandedView.GetSelection()
|
||||
if ui.HasFocus("FileBrowser") {
|
||||
r, _ := UI.ExpandedView.GetSelection()
|
||||
ui.SetFocus("FileBrowser")
|
||||
if len(dirTree.Children[r].Children) == 0 {
|
||||
id, _ := CONN.AddId(dirTree.Children[r].AbsolutePath, -1)
|
||||
CONN.PlayId(id)
|
||||
} else {
|
||||
client.Update(dirTree.Children[r].Children, UI.ExpandedView)
|
||||
dirTree = &dirTree.Children[r]
|
||||
UI.ExpandedView.Select(0, 0)
|
||||
}
|
||||
} else if ui.HasFocus("Playlist") {
|
||||
r, _ := UI.ExpandedView.GetSelection()
|
||||
CONN.Play(r)
|
||||
} else if ui.HasFocus("SearchView") {
|
||||
r, _ := UI.ExpandedView.GetSelection()
|
||||
client.AddToPlaylist(SearchContentSlice[r], true)
|
||||
} else if ui.HasFocus("BuffSearchView") {
|
||||
r, _ := UI.ExpandedView.GetSelection()
|
||||
ui.SetFocus("FileBrowser")
|
||||
if len(dirTree.Children[r].Children) == 0 {
|
||||
id, _ := CONN.AddId(dirTree.Children[Matches[r].Index].AbsolutePath, -1)
|
||||
CONN.PlayId(id)
|
||||
} else {
|
||||
client.Update(dirTree.Children[Matches[r].Index].Children, UI.ExpandedView)
|
||||
dirTree = &dirTree.Children[Matches[r].Index]
|
||||
}
|
||||
UI.SearchBar.SetText("")
|
||||
// Resetting Matches
|
||||
Matches = nil
|
||||
}
|
||||
},
|
||||
"togglePlayBack": func() {
|
||||
@@ -192,7 +209,13 @@ func main() {
|
||||
UI.Navbar.Select(3, 0)
|
||||
},
|
||||
"quit": func() {
|
||||
UI.App.Stop()
|
||||
if ui.HasFocus("BuffSearchView") {
|
||||
ui.SetFocus("FileBrowser")
|
||||
UI.SearchBar.SetText("")
|
||||
Matches = nil
|
||||
} else {
|
||||
UI.App.Stop()
|
||||
}
|
||||
},
|
||||
"stop": func() {
|
||||
CONN.Stop()
|
||||
@@ -214,6 +237,12 @@ func main() {
|
||||
"FocusSearch": func() {
|
||||
UI.App.SetFocus(UI.SearchBar)
|
||||
},
|
||||
"FocusBuffSearch": func() {
|
||||
if ui.HasFocus("FileBrowser") || ui.HasFocus("BuffSearchView") {
|
||||
ui.SetFocus("BuffSearchView")
|
||||
UI.App.SetFocus(UI.SearchBar)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// Generating the Key Map Based on the Function Map Here Basically the Values will be flipped
|
||||
@@ -222,19 +251,23 @@ func main() {
|
||||
config.GenerateKeyMap(FuncMap)
|
||||
|
||||
UI.SearchBar.SetAutocompleteFunc(func(c string) []string {
|
||||
if c != "" && c != " " && c != " " {
|
||||
_, _, w, _ := UI.SearchBar.GetRect()
|
||||
matches := fuzzy.Find(c, ArtistTreeContent)
|
||||
var suggestions []string
|
||||
for i, match := range matches {
|
||||
if i == 10 {
|
||||
break
|
||||
}
|
||||
suggestions = append(suggestions, utils.GetFormattedString(match.Str, w-2))
|
||||
}
|
||||
return suggestions
|
||||
if ui.HasFocus("BuffSearchView") {
|
||||
return nil
|
||||
} else {
|
||||
return make([]string, 0)
|
||||
if c != "" && c != " " && c != " " {
|
||||
_, _, w, _ := UI.SearchBar.GetRect()
|
||||
matches := fuzzy.Find(c, ArtistTreeContent)
|
||||
var suggestions []string
|
||||
for i, match := range matches {
|
||||
if i == 10 {
|
||||
break
|
||||
}
|
||||
suggestions = append(suggestions, utils.GetFormattedString(match.Str, w-2))
|
||||
}
|
||||
return suggestions
|
||||
} else {
|
||||
return make([]string, 0)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
@@ -251,23 +284,41 @@ func main() {
|
||||
UI.SearchBar.SetDoneFunc(func(e tcell.Key) {
|
||||
if e == tcell.KeyEnter {
|
||||
UI.ExpandedView.Select(0, 0)
|
||||
ui.SetFocus("SearchView")
|
||||
SearchContentSlice = nil
|
||||
SearchContentSlice, err = client.GenerateContentSlice(UI.SearchBar.GetText())
|
||||
if err != nil {
|
||||
Notify.Send("Could Not Retrieve the Results")
|
||||
} else {
|
||||
UI.SearchBar.SetText("")
|
||||
if ui.HasFocus("BuffSearchView") {
|
||||
UI.App.SetFocus(UI.ExpandedView)
|
||||
UI.Navbar.Select(3, 0)
|
||||
} else {
|
||||
ui.SetFocus("SearchView")
|
||||
SearchContentSlice = nil
|
||||
SearchContentSlice, err = client.GenerateContentSlice(UI.SearchBar.GetText())
|
||||
if err != nil {
|
||||
Notify.Send("Could Not Retrieve the Results")
|
||||
} else {
|
||||
UI.SearchBar.SetText("")
|
||||
UI.App.SetFocus(UI.ExpandedView)
|
||||
UI.Navbar.Select(3, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
if e == tcell.KeyEscape {
|
||||
ui.FocusMap["SearchView"] = false
|
||||
if ui.HasFocus("SearchView") {
|
||||
ui.FocusMap["SearchView"] = false
|
||||
} else if ui.HasFocus("BuffSearchView") {
|
||||
ui.SetFocus("FileBrowser")
|
||||
Matches = nil
|
||||
}
|
||||
UI.SearchBar.SetText("")
|
||||
UI.App.SetFocus(UI.ExpandedView)
|
||||
}
|
||||
})
|
||||
|
||||
UI.SearchBar.SetChangedFunc(func(text string) {
|
||||
if ui.HasFocus("BuffSearchView") {
|
||||
var f client.FileNodes = dirTree.Children
|
||||
Matches = fuzzy.FindFrom(text, f)
|
||||
client.UpdateBuffSearchView(UI.ExpandedView, Matches, dirTree.Children)
|
||||
}
|
||||
})
|
||||
|
||||
go func() {
|
||||
for {
|
||||
UI.App.Draw()
|
||||
|
||||
Reference in New Issue
Block a user