128 lines
2.0 KiB
Go
128 lines
2.0 KiB
Go
/// +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", "<C-c>":
|
|
return
|
|
case "j", "<Down>":
|
|
l.ScrollDown()
|
|
case "k", "<Up>":
|
|
l.ScrollUp()
|
|
case "<C-d>":
|
|
l.ScrollHalfPageDown()
|
|
case "<C-u>":
|
|
l.ScrollHalfPageUp()
|
|
case "<C-f>":
|
|
l.ScrollPageDown()
|
|
case "<C-b>":
|
|
l.ScrollPageUp()
|
|
case "g":
|
|
if previousKey == "g" {
|
|
l.ScrollTop()
|
|
}
|
|
case "<Home>":
|
|
l.ScrollTop()
|
|
case "<Enter>":
|
|
l.ToggleExpand()
|
|
case "G", "<End>":
|
|
l.ScrollBottom()
|
|
case "E":
|
|
l.ExpandAll()
|
|
case "C":
|
|
l.CollapseAll()
|
|
case "<Resize>":
|
|
x, y := ui.TerminalDimensions()
|
|
l.SetRect(0, 0, x, y)
|
|
}
|
|
|
|
if previousKey == "g" {
|
|
previousKey = ""
|
|
} else {
|
|
previousKey = e.ID
|
|
}
|
|
|
|
ui.Render(l)
|
|
}
|
|
}
|