Golang terminal dashboard (evacuated from NSA/Microsoft Github)
anonymous af568e536b nitpick who maintains | 5 years ago | |
---|---|---|
_docs | 6 years ago | |
_example | 5 years ago | |
_test | 6 years ago | |
debian | 5 years ago | |
debug | 7 years ago | |
extra | 6 years ago | |
.travis.yml | 9 years ago | |
LICENSE | 9 years ago | |
README.md | 6 years ago | |
barchart.go | 7 years ago | |
block.go | 7 years ago | |
block_common.go | 7 years ago | |
block_test.go | 7 years ago | |
block_windows.go | 7 years ago | |
buffer.go | 7 years ago | |
buffer_test.go | 7 years ago | |
canvas.go | 7 years ago | |
canvas_test.go | 7 years ago | |
config.py | 7 years ago | |
doc.go | 5 years ago | |
events.go | 7 years ago | |
events_test.go | 7 years ago | |
gauge.go | 7 years ago | |
glide.yaml | 6 years ago | |
grid.go | 5 years ago | |
grid_test.go | 7 years ago | |
helper.go | 7 years ago | |
helper_test.go | 7 years ago | |
linechart.go | 6 years ago | |
linechart_others.go | 7 years ago | |
linechart_windows.go | 7 years ago | |
list.go | 5 years ago | |
mbarchart.go | 8 years ago | |
mkdocs.yml | 6 years ago | |
par.go | 7 years ago | |
par_test.go | 7 years ago | |
pos.go | 7 years ago | |
pos_test.go | 7 years ago | |
render.go | 6 years ago | |
sparkline.go | 8 years ago | |
table.go | 7 years ago | |
textbuilder.go | 7 years ago | |
textbuilder_test.go | 7 years ago | |
theme.go | 7 years ago | |
theme_test.go | 7 years ago | |
widget.go | 7 years ago |
termui
is a cross-platform, easy-to-compile, and fully-customizable terminal dashboard. It is inspired by blessed-contrib, but purely in Go. It used to be hosted on github.
To use termui
, the very first thing you may want to know is how to manage layout. termui
offers two ways of doing this, known as absolute layout and grid layout.
Absolute layout
Each widget has an underlying block structure which basically is a box model. It has border, label and padding properties. A border of a widget can be chosen to hide or display (with its border label), you can pick a different front/back colour for the border as well. To display such a widget at a specific location in terminal window, you need to assign .X
, .Y
, .Height
, .Width
values for each widget before sending it to .Render
. Let's demonstrate these by a code snippet:
import ui "notabug.org/themusicgod1/termui" // <- ui shortcut, optional
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.BorderLabel = "Text Box"
p.BorderFg = ui.ColorCyan
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
ui.Render(p, g) // feel free to call Render, it's async and non-block
// event handler...
}
Note that components can be overlapped (I'd rather call this a feature...), Render(rs ...Renderer)
renders its args from left to right (i.e. each component's weight is arising from left to right).
Grid layout:
Grid layout uses 12 columns grid system with expressive syntax. To use Grid
, all we need to do is build a widget tree consisting of Row
s and Col
s (Actually a Col
is also a Row
but with a widget endpoint attached).
import ui "notabug.org/themusicgod1/termui"
// init and create widgets...
// build
ui.Body.AddRows(
ui.NewRow(
ui.NewCol(6, 0, widget0),
ui.NewCol(6, 0, widget1)),
ui.NewRow(
ui.NewCol(3, 0, widget2),
ui.NewCol(3, 0, widget30, widget31, widget32),
ui.NewCol(6, 0, widget4)))
// calculate layout
ui.Body.Align()
ui.Render(ui.Body)
termui
ships with a http-like event mux handling system. All events are channeled up from different sources (typing, click, windows resize, custom event) and then encoded as universal Event
object. Event.Path
indicates the event type and Event.Data
stores the event data struct. Add a handler to a certain event is easy as below:
// handle key q pressing
ui.Handle("/sys/kbd/q", func(ui.Event) {
// press q to quit
ui.StopLoop()
})
ui.Handle("/sys/kbd/C-x", func(ui.Event) {
// handle Ctrl + x combination
})
ui.Handle("/sys/kbd", func(ui.Event) {
// handle all other key pressing
})
// handle a 1s timer
ui.Handle("/timer/1s", func(e ui.Event) {
t := e.Data.(ui.EvtTimer)
// t is a EvtTimer
if t.Count%2 ==0 {
// do something
}
})
ui.Loop() // block until StopLoop is called
Click image to see the corresponding demo codes.
This library is under the MIT License