1
0
mirror of https://github.com/gizak/termui.git synced 2025-04-24 13:48:50 +08:00

Merge d4437230e80d8d3a09ae0611907efcfbed5ae1f7 into 2b8f0c7960e9553acea6d579a740713066da5e13

This commit is contained in:
2jiangjiang 2024-03-11 13:59:21 +08:00 committed by GitHub
commit 3cb898fe65
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

90
widgets/chainlist Normal file
View File

@ -0,0 +1,90 @@
package widgets
import (
ui "github.com/gizak/termui/v3"
"github.com/gizak/termui/v3/widgets"
"golang.org/x/exp/maps"
)
type ChainData struct {
parent *ChainData
Children map[string]*ChainData
Clicker func()
OnChange func()
selectAt int
}
type ChainList struct {
widgets.List
chainAt *ChainData
}
func NewChainList() *ChainList {
chainList := &ChainList{
List: *widgets.NewList(),
}
chainList.TextStyle = ui.Style{
Fg: ui.ColorBlack,
Bg: ui.ColorWhite,
Modifier: 0,
}
chainList.SelectedRowStyle = ui.Style{
Fg: ui.ColorWhite,
Bg: ui.ColorBlack,
Modifier: 0,
}
return chainList
}
func (l *ChainList) LoopSet(data ChainData) {
l.chainAt = &data
l.Rows = maps.Keys(l.chainAt.Children)
l.SelectedRow = 0
}
func (l *ChainList) Set(data ChainData) {
l.LoopSet(data)
if l.chainAt.OnChange != nil {
l.chainAt.OnChange()
}
}
func (l *ChainList) DoSelect() {
if l.chainAt.Children[l.Rows[l.SelectedRow]].Clicker != nil {
l.chainAt.Children[l.Rows[l.SelectedRow]].Clicker()
} else {
l.Enter()
}
}
func (l *ChainList) Enter() {
l.chainAt.selectAt = l.SelectedRow
if l.chainAt.Children[l.Rows[l.SelectedRow]] != nil {
l.chainAt.Children[l.Rows[l.SelectedRow]].parent = l.chainAt
l.chainAt = l.chainAt.Children[l.Rows[l.SelectedRow]]
l.Rows = maps.Keys(l.chainAt.Children)
l.SelectedRow = 0
if l.chainAt.OnChange != nil {
l.chainAt.OnChange()
}
}
}
func (l *ChainList) Exit() {
if l.chainAt.parent != nil {
l.chainAt = l.chainAt.parent
l.Rows = maps.Keys(l.chainAt.Children)
l.SelectedRow = l.chainAt.selectAt
if l.chainAt.OnChange != nil {
l.chainAt.OnChange()
}
}
}
func (l *ChainList) ScrollUp() {
l.List.ScrollUp()
if l.chainAt.OnChange != nil {
l.chainAt.OnChange()
}
}
func (l *ChainList) ScrollDown() {
l.List.ScrollDown()
if l.chainAt.OnChange != nil {
l.chainAt.OnChange()
}
}