func main() { err := termui.Init() if err != nil { panic(err) } defer termui.Close() termui.UseTheme("helloworld") strs := []string{ "[0] github.com/gizak/termui", "[1] 你好,世界", "[2] こんにちは世界", "[3] keyboard.go", "[4] output.go", "[5] random_out.go", "[6] dashboard.go", "[7] nsf/termbox-go"} ls := termui.NewList() ls.Items = strs ls.ItemFgColor = termui.ColorYellow ls.Border.Label = "List" ls.Height = 7 ls.Width = 25 ls.Y = 0 termui.Render(ls) <-termui.EventCh() }
func main() { err := termui.Init() if err != nil { panic(err) } defer termui.Close() termui.UseTheme("helloworld") bc := termui.NewBarChart() data := []int{3, 2, 5, 3, 9, 5, 3, 2, 5, 8, 3, 2, 4, 5, 3, 2, 5, 7, 5, 3, 2, 6, 7, 4, 6, 3, 6, 7, 8, 3, 6, 4, 5, 3, 2, 4, 6, 4, 8, 5, 9, 4, 3, 6, 5, 3, 6} bclabels := []string{"S0", "S1", "S2", "S3", "S4", "S5"} bc.Border.Label = "Bar Chart" bc.Data = data bc.Width = 26 bc.Height = 10 bc.DataLabels = bclabels bc.TextColor = termui.ColorGreen bc.BarColor = termui.ColorRed bc.NumColor = termui.ColorYellow termui.Render(bc) <-termui.EventCh() }
func main() { err := termui.Init() if err != nil { panic(err) } defer termui.Close() termui.UseTheme("helloworld") data := []int{4, 2, 1, 6, 3, 9, 1, 4, 2, 15, 14, 9, 8, 6, 10, 13, 15, 12, 10, 5, 3, 6, 1, 7, 10, 10, 14, 13, 6} spl0 := termui.NewSparkline() spl0.Data = data[3:] spl0.Title = "Sparkline 0" spl0.LineColor = termui.ColorGreen // single spls0 := termui.NewSparklines(spl0) spls0.Height = 2 spls0.Width = 20 spls0.HasBorder = false spl1 := termui.NewSparkline() spl1.Data = data spl1.Title = "Sparkline 1" spl1.LineColor = termui.ColorRed spl2 := termui.NewSparkline() spl2.Data = data[5:] spl2.Title = "Sparkline 2" spl2.LineColor = termui.ColorMagenta // group spls1 := termui.NewSparklines(spl0, spl1, spl2) spls1.Height = 8 spls1.Width = 20 spls1.Y = 3 spls1.Border.Label = "Group Sparklines" spl3 := termui.NewSparkline() spl3.Data = data spl3.Title = "Enlarged Sparkline" spl3.Height = 8 spl3.LineColor = termui.ColorYellow spls2 := termui.NewSparklines(spl3) spls2.Height = 11 spls2.Width = 30 spls2.Border.FgColor = termui.ColorCyan spls2.X = 21 spls2.Border.Label = "Tweeked Sparkline" termui.Render(spls0, spls1, spls2) <-termui.EventCh() }
func main() { err := termui.Init() if err != nil { panic(err) } defer termui.Close() termui.UseTheme("helloworld") sinps := (func() []float64 { n := 220 ps := make([]float64, n) for i := range ps { ps[i] = 1 + math.Sin(float64(i)/5) } return ps })() lc0 := termui.NewLineChart() lc0.Border.Label = "braille-mode Line Chart" lc0.Data = sinps lc0.Width = 50 lc0.Height = 12 lc0.X = 0 lc0.Y = 0 lc0.AxesColor = termui.ColorWhite lc0.LineColor = termui.ColorGreen | termui.AttrBold lc1 := termui.NewLineChart() lc1.Border.Label = "dot-mode Line Chart" lc1.Mode = "dot" lc1.Data = sinps lc1.Width = 26 lc1.Height = 12 lc1.X = 51 lc1.DotStyle = '+' lc1.AxesColor = termui.ColorWhite lc1.LineColor = termui.ColorYellow | termui.AttrBold lc2 := termui.NewLineChart() lc2.Border.Label = "dot-mode Line Chart" lc2.Mode = "dot" lc2.Data = sinps[4:] lc2.Width = 77 lc2.Height = 16 lc2.X = 0 lc2.Y = 12 lc2.AxesColor = termui.ColorWhite lc2.LineColor = termui.ColorCyan | termui.AttrBold termui.Render(lc0, lc1, lc2) <-termui.EventCh() }
func main() { err := termui.Init() if err != nil { panic(err) } defer termui.Close() termui.UseTheme("helloworld") g0 := termui.NewGauge() g0.Percent = 40 g0.Width = 50 g0.Height = 3 g0.Border.Label = "Slim Gauge" g0.BarColor = termui.ColorRed g0.Border.FgColor = termui.ColorWhite g0.Border.LabelFgColor = termui.ColorCyan g2 := termui.NewGauge() g2.Percent = 60 g2.Width = 50 g2.Height = 3 g2.PercentColor = termui.ColorBlue g2.Y = 3 g2.Border.Label = "Slim Gauge" g2.BarColor = termui.ColorYellow g2.Border.FgColor = termui.ColorWhite g1 := termui.NewGauge() g1.Percent = 30 g1.Width = 50 g1.Height = 5 g1.Y = 6 g1.Border.Label = "Big Gauge" g1.PercentColor = termui.ColorYellow g1.BarColor = termui.ColorGreen g1.Border.FgColor = termui.ColorWhite g1.Border.LabelFgColor = termui.ColorMagenta g3 := termui.NewGauge() g3.Percent = 50 g3.Width = 50 g3.Height = 3 g3.Y = 11 g3.Border.Label = "Gauge with custom label" g3.Label = "{{percent}}% (100MBs free)" g3.LabelAlign = termui.AlignRight termui.Render(g0, g1, g2, g3) <-termui.EventCh() }
func main() { err := termui.Init() if err != nil { panic(err) } defer termui.Close() termui.UseTheme("helloworld") bc := termui.NewMBarChart() math := []int{90, 85, 90, 80} english := []int{70, 85, 75, 60} science := []int{75, 60, 80, 85} compsci := []int{100, 100, 100, 100} bc.Data[0] = math bc.Data[1] = english bc.Data[2] = science bc.Data[3] = compsci studentsName := []string{"Ken", "Rob", "Dennis", "Linus"} bc.Border.Label = "Student's Marks X-Axis=Name Y-Axis=Marks[Math,English,Science,ComputerScience] in %" bc.Width = 100 bc.Height = 50 bc.Y = 10 bc.BarWidth = 10 bc.DataLabels = studentsName bc.ShowScale = true //Show y_axis scale value (min and max) bc.SetMax(400) bc.TextColor = termui.ColorGreen //this is color for label (x-axis) bc.BarColor[3] = termui.ColorGreen //BarColor for computerscience bc.BarColor[1] = termui.ColorYellow //Bar Color for english bc.NumColor[3] = termui.ColorRed // Num color for computerscience bc.NumColor[1] = termui.ColorRed // num color for english //Other colors are automatically populated, btw All the students seems do well in computerscience. :p termui.Render(bc) <-termui.EventCh() }
func main() { err := termui.Init() if err != nil { panic(err) } defer termui.Close() termui.UseTheme("helloworld") par0 := termui.NewPar("Borderless Text") par0.Height = 1 par0.Width = 20 par0.Y = 1 par0.HasBorder = false par1 := termui.NewPar("你好,世界。") par1.Height = 3 par1.Width = 17 par1.X = 20 par1.Border.Label = "标签" par2 := termui.NewPar("Simple text\nwith label. It can be multilined with \\n or break automatically") par2.Height = 5 par2.Width = 37 par2.Y = 4 par2.Border.Label = "Multiline" par2.Border.FgColor = termui.ColorYellow par3 := termui.NewPar("Long text with label and it is auto trimmed.") par3.Height = 3 par3.Width = 37 par3.Y = 9 par3.Border.Label = "Auto Trim" termui.Render(par0, par1, par2, par3) <-termui.EventCh() }
func main() { err := ui.Init() if err != nil { panic(err) } defer ui.Close() sinps := (func() []float64 { n := 400 ps := make([]float64, n) for i := range ps { ps[i] = 1 + math.Sin(float64(i)/5) } return ps })() sinpsint := (func() []int { ps := make([]int, len(sinps)) for i, v := range sinps { ps[i] = int(100*v + 10) } return ps })() ui.UseTheme("helloworld") spark := ui.Sparkline{} spark.Height = 8 spdata := sinpsint spark.Data = spdata[:100] spark.LineColor = ui.ColorCyan spark.TitleColor = ui.ColorWhite sp := ui.NewSparklines(spark) sp.Height = 11 sp.Border.Label = "Sparkline" lc := ui.NewLineChart() lc.Border.Label = "braille-mode Line Chart" lc.Data = sinps lc.Height = 11 lc.AxesColor = ui.ColorWhite lc.LineColor = ui.ColorYellow | ui.AttrBold gs := make([]*ui.Gauge, 3) for i := range gs { gs[i] = ui.NewGauge() gs[i].Height = 2 gs[i].HasBorder = false gs[i].Percent = i * 10 gs[i].PaddingBottom = 1 gs[i].BarColor = ui.ColorRed } ls := ui.NewList() ls.HasBorder = false ls.Items = []string{ "[1] Downloading File 1", "", // == \newline "[2] Downloading File 2", "", "[3] Uploading File 3", } ls.Height = 5 par := ui.NewPar("<> This row has 3 columns\n<- Widgets can be stacked up like left side\n<- Stacked widgets are treated as a single widget") par.Height = 5 par.Border.Label = "Demonstration" // build layout ui.Body.AddRows( ui.NewRow( ui.NewCol(6, 0, sp), ui.NewCol(6, 0, lc)), ui.NewRow( ui.NewCol(3, 0, ls), ui.NewCol(3, 0, gs[0], gs[1], gs[2]), ui.NewCol(6, 0, par))) // calculate layout ui.Body.Align() done := make(chan bool) redraw := make(chan bool) update := func() { for i := 0; i < 103; i++ { for _, g := range gs { g.Percent = (g.Percent + 3) % 100 } sp.Lines[0].Data = spdata[:100+i] lc.Data = sinps[2*i:] time.Sleep(time.Second / 2) redraw <- true } done <- true } evt := ui.EventCh() ui.Render(ui.Body) go update() for { select { case e := <-evt: if e.Type == ui.EventKey && e.Ch == 'q' { return } if e.Type == ui.EventResize { ui.Body.Width = ui.TermWidth() ui.Body.Align() go func() { redraw <- true }() } case <-done: return case <-redraw: ui.Render(ui.Body) } } }
func main() { // never use more than one process runtime.GOMAXPROCS(1) // wait group to let the main program run forever in batchmode var wg sync.WaitGroup // options var batchmode, servermode bool var address string var stepSec int var nIter int var evt <-chan termui.Event var widgets *osmain.DisplayWidgets var uiSummaryBody *termui.Grid var uiHelpBody *termui.Grid var uiDetailList *termui.List flag.BoolVar(&batchmode, "b", false, "Run in batch mode; suitable for parsing") flag.BoolVar(&batchmode, "batchmode", false, "Run in batch mode; suitable for parsing") flag.IntVar(&nIter, "n", 0, "Quit after these many iterations") flag.IntVar(&nIter, "iterations", 0, "Quit after these many iterations") flag.BoolVar(&servermode, "server", false, "Runs continously and exposes metrics as JSON on HTTP") flag.StringVar(&address, "address", ":19999", "address to listen on for http if running in server mode") flag.IntVar(&stepSec, "step", 2, "metrics are collected every step seconds") flag.Usage = func() { fmt.Fprintf(os.Stderr, "Options \n") fmt.Fprintf(os.Stderr, "------- \n") flag.PrintDefaults() fmt.Fprintf(os.Stderr, "Notes \n") fmt.Fprintf(os.Stderr, "------- \n") fmt.Fprintf(os.Stderr, "All CPU percentages are normalized to total number of logical cpus \n") } flag.Parse() if servermode { batchmode = true } if !batchmode { err := termui.Init() termui.UseTheme("helloworld") if err != nil { log.Fatalf("Unable to initialize termui", err) } widgets = uiWidgets() uiSummaryBody = uiSummary(widgets) uiHelpBody = uiHelp() uiDetailList = termui.NewList() evt = termui.EventCh() // display summary view termui.Body = uiSummaryBody uiRefresh() } // Initialize a metric context m := metrics.NewMetricContext("system") // Default step for collectors step := time.Millisecond * time.Duration(stepSec) * 1000 // Register various stats we are interested in tracking stats := osmain.Register(m, step) // run http server if servermode { go func() { http.HandleFunc("/api/v1/metrics.json", m.HttpJsonHandler) log.Fatal(http.ListenAndServe(address, nil)) }() } iterationsRun := 0 // runs forever wg.Add(1) go func() { for { // Clear previous problems var problems []string stats.Problems = problems // Quit after n iterations if specified iterationsRun++ if nIter > 0 && iterationsRun > nIter { break } stats.Print(batchmode, widgets) if !batchmode { termui.Render(termui.Body) } time.Sleep(step) // be aggressive about reclaiming memory // tradeoff with CPU usage runtime.GC() debug.FreeOSMemory() } }() if !batchmode { for { e := <-evt if e.Type == termui.EventKey { switch e.Ch { case 'q': termui.Close() return case 'c': uiDetailList = widgets.ProcessesByCPU termui.Body = uiDetail(uiDetailList) case 'd': uiDetailList = widgets.DiskIOUsage termui.Body = uiDetail(uiDetailList) case 'C': uiDetailList = widgets.CgroupsCPU termui.Body = uiDetail(uiDetailList) case 'f': uiDetailList = widgets.FileSystemUsage termui.Body = uiDetail(uiDetailList) case 'm': uiDetailList = widgets.ProcessesByMemory termui.Body = uiDetail(uiDetailList) case 'p': uiDetailList = widgets.Problems termui.Body = uiDetail(uiDetailList) case 'M': uiDetailList = widgets.CgroupsMem termui.Body = uiDetail(uiDetailList) case 'n': uiDetailList = widgets.InterfaceUsage termui.Body = uiDetail(uiDetailList) case 'i': uiDetailList = widgets.ProcessesByIO termui.Body = uiDetail(uiDetailList) case 's': uiResetAttributes(widgets) termui.Body = uiSummaryBody case 'h': termui.Body = uiHelpBody } uiRefresh() } if e.Type == termui.EventResize { uiRefresh() } } } wg.Wait() }