Files
lazyssh/internal/adapters/ui/server_list.go
T

81 lines
1.8 KiB
Go

package ui
import (
"github.com/Adembc/lazyssh/internal/core/domain"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
type ServerList struct {
*tview.List
servers []domain.Server
onSelection func(domain.Server)
onSelectionChange func(domain.Server)
}
func NewServerList() *ServerList {
list := &ServerList{
List: tview.NewList(),
}
list.build()
return list
}
func (sl *ServerList) build() {
sl.ShowSecondaryText(false)
sl.SetBorder(true).
SetTitle("Servers").
SetBorderColor(tcell.Color238).
SetTitleColor(tcell.Color250)
sl.
SetSelectedBackgroundColor(tcell.Color24).
SetSelectedTextColor(tcell.Color255).
SetHighlightFullLine(true)
sl.SetChangedFunc(func(index int, mainText string, secondaryText string, shortcut rune) {
if index >= 0 && index < len(sl.servers) && sl.onSelectionChange != nil {
sl.onSelectionChange(sl.servers[index])
}
})
}
func (sl *ServerList) UpdateServers(servers []domain.Server) {
sl.servers = servers
sl.Clear()
for i := range servers {
primary, secondary := formatServerLine(servers[i])
idx := i
sl.AddItem(primary, secondary, 0, func() {
if sl.onSelection != nil {
sl.onSelection(sl.servers[idx])
}
})
}
if sl.GetItemCount() > 0 {
sl.SetCurrentItem(0)
if sl.onSelectionChange != nil {
sl.onSelectionChange(sl.servers[0])
}
}
}
func (sl *ServerList) GetSelectedServer() (domain.Server, bool) {
idx := sl.GetCurrentItem()
if idx >= 0 && idx < len(sl.servers) {
return sl.servers[idx], true
}
return domain.Server{}, false
}
func (sl *ServerList) OnSelection(fn func(server domain.Server)) *ServerList {
sl.onSelection = fn
return sl
}
func (sl *ServerList) OnSelectionChange(fn func(server domain.Server)) *ServerList {
sl.onSelectionChange = fn
return sl
}