func draw() { display = ui.NewPar("") display.Height = 1 display.Border = false prompt = ui.NewPar(promptMsg) prompt.Height = 1 prompt.Border = false help := ui.NewPar(`:c, :h for profiles; :f to filter; ↓ and ↑ to paginate`) help.Height = 1 help.Border = false help.TextBgColor = ui.ColorBlue help.Bg = ui.ColorBlue help.TextFgColor = ui.ColorWhite gs := ui.Sparkline{} gs.Title = "goroutines" gs.Height = 4 gs.LineColor = ui.ColorCyan ts := ui.Sparkline{} ts.Title = "threads" ts.Height = 4 ts.LineColor = ui.ColorCyan sp = ui.NewSparklines(gs, ts) sp.Height = 10 sp.Border = false ls = ui.NewList() ls.Border = false ui.Body.AddRows( ui.NewRow(ui.NewCol(4, 0, prompt), ui.NewCol(8, 0, help)), ui.NewRow(ui.NewCol(12, 0, sp)), ui.NewRow(ui.NewCol(12, 0, display)), ui.NewRow(ui.NewCol(12, 0, ls)), ) }
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() { configFile := flag.String("config", "config.json", "Configuration file") flag.Parse() monitors := readConfig(*configFile) updates := make(chan monitor.CheckUpdate) logbuf := new(bytes.Buffer) log.SetOutput(logbuf) err := termui.Init() if err != nil { log.Fatalf("Unable to init termui: %v\n", err) } defer termui.Close() list := termui.NewList() var urls []string for _, m := range monitors { e := fmt.Sprintf("[%v] %v", m.index, m.monitor.Source()) urls = append(urls, e) if list.Width < int(float64(len(e))*float64(1.5)) { list.Width = int(float64(len(e)) * float64(1.5)) } } list.Items = urls list.ItemFgColor = termui.ColorYellow list.BorderLabel = "URLs" list.Height = 8 list.Y = 0 list.X = 0 sp := termui.NewSparklines() sp.BorderLabel = "Response times" sp.Y = list.Height sp.X = 0 sp.Height = list.Height for i, _ := range urls { spark := termui.Sparkline{} spark.Height = 1 spark.Title = fmt.Sprintf("URL %v", i) spark.LineColor = termui.ColorCyan spark.TitleColor = termui.ColorYellow sp.Add(spark) } logPar := termui.NewPar(logbuf.String()) logPar.Height = 20 termui.Body.AddRows( termui.NewRow( termui.NewCol(6, 0, list), termui.NewCol(6, 0, sp)), termui.NewRow( termui.NewCol(12, 0, logPar))) termui.Body.Align() for _, m := range monitors { go m.monitor.Check(updates, m.index) } loop: for { select { case u := <-updates: if u.Healthy && u.Err == nil { sp.Lines[u.Id].LineColor = COLOR_OK } else { sp.Lines[u.Id].LineColor = COLOR_KO } case <-time.After(2 * time.Second): break loop } } termui.Render(termui.Body) termui.Handle("/sys/kbd/q", func(termui.Event) { termui.StopLoop() }) termui.Handle("/timer/1s", func(e termui.Event) { t := e.Data.(termui.EvtTimer) if t.Count%5 == 0 { for _, m := range monitors { go m.monitor.Check(updates, m.index) } loop: for { select { case u := <-updates: sp.Lines[u.Id].Data = append(sp.Lines[u.Id].Data, int(u.Duration)) if u.Healthy && u.Err == nil { sp.Lines[u.Id].LineColor = COLOR_OK } else { sp.Lines[u.Id].LineColor = COLOR_KO } case <-time.After(2 * time.Second): break loop } } logPar.Text = logbuf.String() termui.Render(termui.Body) } }) termui.Loop() }
func main() { err := ui.Init() if err != nil { panic(err) } defer ui.Close() p := ui.NewPar(":PRESS q TO QUIT DEMO") p.Height = 3 p.Width = 50 p.TextFgColor = ui.ColorWhite p.Border.Label = "Text Box" p.Border.FgColor = ui.ColorCyan strs := []string{"[0] gizak/termui", "[1] editbox.go", "[2] iterrupt.go", "[3] keyboard.go", "[4] output.go", "[5] random_out.go", "[6] dashboard.go", "[7] nsf/termbox-go"} list := ui.NewList() list.Items = strs list.ItemFgColor = ui.ColorYellow list.Border.Label = "List" list.Height = 7 list.Width = 25 list.Y = 4 g := ui.NewGauge() g.Percent = 50 g.Width = 50 g.Height = 3 g.Y = 11 g.Border.Label = "Gauge" g.BarColor = ui.ColorRed g.Border.FgColor = ui.ColorWhite g.Border.LabelFgColor = ui.ColorCyan spark := ui.Sparkline{} spark.Height = 1 spark.Title = "srv 0:" spdata := []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} spark.Data = spdata spark.LineColor = ui.ColorCyan spark.TitleColor = ui.ColorWhite spark1 := ui.Sparkline{} spark1.Height = 1 spark1.Title = "srv 1:" spark1.Data = spdata spark1.TitleColor = ui.ColorWhite spark1.LineColor = ui.ColorRed sp := ui.NewSparklines(spark, spark1) sp.Width = 25 sp.Height = 7 sp.Border.Label = "Sparkline" sp.Y = 4 sp.X = 25 sinps := (func() []float64 { n := 220 ps := make([]float64, n) for i := range ps { ps[i] = 1 + math.Sin(float64(i)/5) } return ps })() lc := ui.NewLineChart() lc.Border.Label = "dot-mode Line Chart" lc.Data = sinps lc.Width = 50 lc.Height = 11 lc.X = 0 lc.Y = 14 lc.AxesColor = ui.ColorWhite lc.LineColor = ui.ColorRed | ui.AttrBold lc.Mode = "dot" bc := ui.NewBarChart() bcdata := []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.Width = 26 bc.Height = 10 bc.X = 51 bc.Y = 0 bc.DataLabels = bclabels bc.BarColor = ui.ColorGreen bc.NumColor = ui.ColorBlack lc1 := ui.NewLineChart() lc1.Border.Label = "braille-mode Line Chart" lc1.Data = sinps lc1.Width = 26 lc1.Height = 11 lc1.X = 51 lc1.Y = 14 lc1.AxesColor = ui.ColorWhite lc1.LineColor = ui.ColorYellow | ui.AttrBold p1 := ui.NewPar("Hey!\nI am a borderless block!") p1.HasBorder = false p1.Width = 26 p1.Height = 2 p1.TextFgColor = ui.ColorMagenta p1.X = 52 p1.Y = 11 draw := func(t int) { g.Percent = t % 101 list.Items = strs[t%9:] sp.Lines[0].Data = spdata[t%10:] sp.Lines[1].Data = spdata[t/2%10:] lc.Data = sinps[t/2:] lc1.Data = sinps[2*t:] bc.Data = bcdata[t/2%10:] ui.Render(p, list, g, sp, lc, bc, lc1, p1) } evt := ui.EventCh() i := 0 for { select { case e := <-evt: if e.Type == ui.EventKey && e.Ch == 'q' { return } default: draw(i) i++ if i == 102 { return } time.Sleep(time.Second / 2) } } }
func main() { if err := ui.Init(); err != nil { panic(err) } defer ui.Close() p := ui.NewPar(":PRESS q TO QUIT DEMO") p.Height = 3 p.Width = 50 p.TextFgColor = ui.ColorWhite p.BorderLabel = "Text Box" p.BorderFg = ui.ColorCyan p.Handle("/timer/1s", func(e ui.Event) { cnt := e.Data.(ui.EvtTimer) if cnt.Count%2 == 0 { p.TextFgColor = ui.ColorRed } else { p.TextFgColor = ui.ColorWhite } }) strs := []string{"[0] gizak/termui", "[1] editbox.go", "[2] iterrupt.go", "[3] keyboard.go", "[4] output.go", "[5] random_out.go", "[6] dashboard.go", "[7] nsf/termbox-go"} list := ui.NewList() list.Items = strs list.ItemFgColor = ui.ColorYellow list.BorderLabel = "List" list.Height = 7 list.Width = 25 list.Y = 4 g := ui.NewGauge() g.Percent = 50 g.Width = 50 g.Height = 3 g.Y = 11 g.BorderLabel = "Gauge" g.BarColor = ui.ColorRed g.BorderFg = ui.ColorWhite g.BorderLabelFg = ui.ColorCyan spark := ui.Sparkline{} spark.Height = 1 spark.Title = "srv 0:" spdata := []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, 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, 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, 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} spark.Data = spdata spark.LineColor = ui.ColorCyan spark.TitleColor = ui.ColorWhite spark1 := ui.Sparkline{} spark1.Height = 1 spark1.Title = "srv 1:" spark1.Data = spdata spark1.TitleColor = ui.ColorWhite spark1.LineColor = ui.ColorRed sp := ui.NewSparklines(spark, spark1) sp.Width = 25 sp.Height = 7 sp.BorderLabel = "Sparkline" sp.Y = 4 sp.X = 25 sinps := (func() []float64 { n := 220 ps := make([]float64, n) for i := range ps { ps[i] = 1 + math.Sin(float64(i)/5) } return ps })() lc := ui.NewLineChart() lc.BorderLabel = "dot-mode Line Chart" lc.Data = sinps lc.Width = 50 lc.Height = 11 lc.X = 0 lc.Y = 14 lc.AxesColor = ui.ColorWhite lc.LineColor = ui.ColorRed | ui.AttrBold lc.Mode = "dot" bc := ui.NewBarChart() bcdata := []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.BorderLabel = "Bar Chart" bc.Width = 26 bc.Height = 10 bc.X = 51 bc.Y = 0 bc.DataLabels = bclabels bc.BarColor = ui.ColorGreen bc.NumColor = ui.ColorBlack lc1 := ui.NewLineChart() lc1.BorderLabel = "braille-mode Line Chart" lc1.Data = sinps lc1.Width = 26 lc1.Height = 11 lc1.X = 51 lc1.Y = 14 lc1.AxesColor = ui.ColorWhite lc1.LineColor = ui.ColorYellow | ui.AttrBold p1 := ui.NewPar("Hey!\nI am a borderless block!") p1.Border = false p1.Width = 26 p1.Height = 2 p1.TextFgColor = ui.ColorMagenta p1.X = 52 p1.Y = 11 draw := func(t int) { g.Percent = t % 101 list.Items = strs[t%9:] sp.Lines[0].Data = spdata[:30+t%50] sp.Lines[1].Data = spdata[:35+t%50] lc.Data = sinps[t/2%220:] lc1.Data = sinps[2*t%220:] bc.Data = bcdata[t/2%10:] ui.Render(p, list, g, sp, lc, bc, lc1, p1) } ui.Handle("/sys/kbd/q", func(ui.Event) { ui.StopLoop() }) ui.Handle("/timer/1s", func(e ui.Event) { t := e.Data.(ui.EvtTimer) draw(int(t.Count)) }) ui.Loop() }
func main() { if err := ui.Init(); 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 })() 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.BorderLabel = "Sparkline" lc := ui.NewLineChart() lc.BorderLabel = "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].LabelAlign = ui.AlignCenter gs[i].Height = 2 gs[i].Border = false gs[i].Percent = i * 10 gs[i].PaddingBottom = 1 gs[i].BarColor = ui.ColorRed } ls := ui.NewList() ls.Border = 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.BorderLabel = "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() ui.Render(ui.Body) ui.Handle("/sys/kbd/q", func(ui.Event) { ui.StopLoop() }) ui.Handle("/timer/1s", func(e ui.Event) { t := e.Data.(ui.EvtTimer) i := t.Count if i > 103 { ui.StopLoop() return } for _, g := range gs { g.Percent = (g.Percent + 3) % 100 } sp.Lines[0].Data = spdata[:100+i] lc.Data = sinps[2*i:] ui.Render(ui.Body) }) ui.Handle("/sys/wnd/resize", func(e ui.Event) { ui.Body.Width = ui.TermWidth() ui.Body.Align() ui.Render(ui.Body) }) ui.Loop() }
func buildUI(info info.Info) { urlLabel := ui.NewPar(fmt.Sprintf("%s", info.Url)) urlLabel.Height = 3 urlLabel.TextFgColor = ui.ColorWhite urlLabel.BorderLabel = "URL" urlLabel.BorderFg = ui.ColorCyan basicInfoStrings := []string{ fmt.Sprintf("IP: %s", strings.Join(info.Ip, ",")), fmt.Sprintf("Host: %s", strings.Join(info.RealHost, ",")), fmt.Sprintf("Distribution: %s", info.Distribution), } basicInfoList := ui.NewList() basicInfoList.Items = basicInfoStrings basicInfoList.ItemFgColor = ui.ColorYellow basicInfoList.BorderLabel = "BasicInfo" basicInfoList.Height = 15 basicInfoList.Width = 25 basicInfoList.Y = 0 serverLabel := ui.NewPar(fmt.Sprintf("Name: %s\nVersion: %s", info.Server.Name, info.Server.Version)) serverLabel.Height = 4 serverLabel.TextFgColor = ui.ColorWhite serverLabel.BorderLabel = "Server" serverLabel.BorderFg = ui.ColorCyan languageLabel := ui.NewPar(fmt.Sprintf("Name: %s\nVersion: %s", info.Language.Name, info.Language.Version)) languageLabel.Height = 4 languageLabel.TextFgColor = ui.ColorWhite languageLabel.BorderLabel = "Language" languageLabel.BorderFg = ui.ColorCyan frameworkLabel := ui.NewPar(fmt.Sprintf("Name: %s\nVersion: %s", info.Framework.Name, info.Framework.Version)) frameworkLabel.Height = 4 frameworkLabel.TextFgColor = ui.ColorWhite frameworkLabel.BorderLabel = "Framework" frameworkLabel.BorderFg = ui.ColorCyan packageLabel := ui.NewPar(fmt.Sprintf("Name: %s\nVersion: %s", info.Package.Name, info.Package.Version)) packageLabel.Height = 4 packageLabel.TextFgColor = ui.ColorWhite packageLabel.BorderLabel = "Package" packageLabel.BorderFg = ui.ColorCyan ispLabel := ui.NewPar(fmt.Sprintf("Name: %s\nRegion: %s", info.ISP.Name, info.ISP.Region)) ispLabel.Height = 4 ispLabel.TextFgColor = ui.ColorWhite ispLabel.BorderLabel = "ISP" ispLabel.BorderFg = ui.ColorCyan var headerStrings []string for key, values := range info.RawHeaders { headerStrings = append(headerStrings, fmt.Sprintf("%s: %s", key, strings.Join(values[:], ","))) } headerList := ui.NewList() headerList.Items = headerStrings headerList.ItemFgColor = ui.ColorYellow headerList.BorderLabel = "Raw Headers" headerList.Height = 25 headerList.Y = 0 var cookieStrings []string for key, values := range info.Cookies { cookieStrings = append(cookieStrings, fmt.Sprintf("%s: %s", key, values)) } cookieList := ui.NewList() cookieList.Items = cookieStrings cookieList.ItemFgColor = ui.ColorYellow cookieList.BorderLabel = "Cookies" cookieList.Height = 25 cookieList.Y = 0 /* demo */ 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 })() spark := ui.Sparkline{} spark.Height = 12 spdata := sinpsint spark.Data = spdata[:100] spark.LineColor = ui.ColorCyan spark.TitleColor = ui.ColorWhite sp := ui.NewSparklines(spark) sp.Height = 15 sp.BorderLabel = "Sparkline" g1 := ui.NewGauge() g1.Percent = 30 g1.Height = 4 g1.Y = 6 g1.BorderLabel = "Progress" g1.PercentColor = ui.ColorYellow g1.BarColor = ui.ColorGreen g1.BorderFg = ui.ColorWhite g1.BorderLabelFg = ui.ColorMagenta ui.Body.AddRows( ui.NewRow( ui.NewCol(12, 0, urlLabel), ), ui.NewRow( ui.NewCol(6, 0, basicInfoList), ui.NewCol(6, 0, sp), ), ui.NewRow( ui.NewCol(4, 0, serverLabel), ui.NewCol(4, 0, languageLabel), ui.NewCol(4, 0, frameworkLabel), ), ui.NewRow( ui.NewCol(4, 0, packageLabel), ui.NewCol(4, 0, ispLabel), ui.NewCol(4, 0, g1), ), ui.NewRow( ui.NewCol(6, 0, headerList), ui.NewCol(6, 0, cookieList), ), ) ui.Body.Align() ui.Render(ui.Body) // redraw := make(chan bool) ui.Handle("/sys/kbd/q", func(ui.Event) { // press q to quit ui.StopLoop() }) ui.Handle("/sys/wnd/resize", func(ui.Event) { // press q to quit ui.Body.Width = ui.TermWidth() ui.Body.Align() }) ui.Handle("/timer/1s", func(e ui.Event) { ui.Body.Align() }) ui.Loop() }