/// +build ignore package main import ( "log" ui "git.tebitea.media/sashakoshka/termui/v3" "git.tebitea.media/sashakoshka/termui/v3/widgets" ) type nodeValue string func (nv nodeValue) String() string { return string(nv) } func main() { if err := ui.Init(); err != nil { log.Fatalf("failed to initialize termui: %v", err) } defer ui.Close() nodes := []*widgets.TreeNode{ { Value: nodeValue("Key 1"), Nodes: []*widgets.TreeNode{ { Value: nodeValue("Key 1.1"), Nodes: []*widgets.TreeNode{ { Value: nodeValue("Key 1.1.1"), Nodes: nil, }, { Value: nodeValue("Key 1.1.2"), Nodes: nil, }, }, }, { Value: nodeValue("Key 1.2"), Nodes: nil, }, }, }, { Value: nodeValue("Key 2"), Nodes: []*widgets.TreeNode{ { Value: nodeValue("Key 2.1"), Nodes: nil, }, { Value: nodeValue("Key 2.2"), Nodes: nil, }, { Value: nodeValue("Key 2.3"), Nodes: nil, }, }, }, { Value: nodeValue("Key 3"), Nodes: nil, }, } l := widgets.NewTree() l.TextStyle = ui.NewStyle(ui.ColorYellow) l.WrapText = false l.SetNodes(nodes) x, y := ui.TerminalDimensions() l.SetRect(0, 0, x, y) ui.Render(l) previousKey := "" uiEvents := ui.PollEvents() for { e := <-uiEvents switch e.ID { case "q", "": return case "j", "": l.ScrollDown() case "k", "": l.ScrollUp() case "": l.ScrollHalfPageDown() case "": l.ScrollHalfPageUp() case "": l.ScrollPageDown() case "": l.ScrollPageUp() case "g": if previousKey == "g" { l.ScrollTop() } case "": l.ScrollTop() case "": l.ToggleExpand() case "G", "": l.ScrollBottom() case "E": l.ExpandAll() case "C": l.CollapseAll() case "": x, y := ui.TerminalDimensions() l.SetRect(0, 0, x, y) } if previousKey == "g" { previousKey = "" } else { previousKey = e.ID } ui.Render(l) } }