2016-11-07 00:07:53 +00:00
|
|
|
# tui-rs
|
|
|
|
|
2016-11-08 10:03:01 +00:00
|
|
|
[![Build Status](https://travis-ci.org/fdehau/tui-rs.svg?branch=master)](https://travis-ci.org/fdehau/tui-rs)
|
2019-02-03 18:00:49 +00:00
|
|
|
[![Build status](https://ci.appveyor.com/api/projects/status/t724mb1q31xpyxy5/branch/master?svg=true)](https://ci.appveyor.com/project/fdehau/tui-rs/branch/master)
|
2017-05-21 12:21:29 +00:00
|
|
|
[![Crate Status](https://img.shields.io/crates/v/tui.svg)](https://crates.io/crates/tui)
|
|
|
|
[![Docs Status](https://docs.rs/tui/badge.svg)](https://docs.rs/crate/tui/)
|
|
|
|
|
2018-09-09 06:55:51 +00:00
|
|
|
<img src="./assets/demo.gif" alt="Demo cast under Linux Termite with Inconsolata font 12pt">
|
2016-11-07 00:07:53 +00:00
|
|
|
|
|
|
|
`tui-rs` is a [Rust](https://www.rust-lang.org) library to build rich terminal
|
|
|
|
user interfaces and dashboards. It is heavily inspired by the `Javascript`
|
|
|
|
library [blessed-contrib](https://github.com/yaronn/blessed-contrib) and the
|
|
|
|
`Go` library [termui](https://github.com/gizak/termui).
|
|
|
|
|
2019-01-24 18:45:59 +00:00
|
|
|
The library itself supports four different backends to draw to the terminal. You
|
2016-11-07 00:07:53 +00:00
|
|
|
can either choose from:
|
|
|
|
|
|
|
|
- [termion](https://github.com/ticki/termion)
|
|
|
|
- [rustbox](https://github.com/gchp/rustbox)
|
2019-01-14 20:16:37 +00:00
|
|
|
- [crossterm](https://github.com/TimonPost/crossterm)
|
2019-01-24 18:45:59 +00:00
|
|
|
- [pancurses](https://github.com/ihalila/pancurses)
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2019-03-11 02:26:30 +00:00
|
|
|
However, some features may only be available in one of the four.
|
2016-11-07 23:35:46 +00:00
|
|
|
|
|
|
|
The library is based on the principle of immediate rendering with intermediate
|
2016-11-08 10:20:59 +00:00
|
|
|
buffers. This means that at each new frame you should build all widgets that are
|
|
|
|
supposed to be part of the UI. While providing a great flexibility for rich and
|
|
|
|
interactive UI, this may introduce overhead for highly dynamic content. So, the
|
|
|
|
implementation try to minimize the number of ansi escapes sequences generated to
|
|
|
|
draw the updated UI. In practice, given the speed of `Rust` the overhead rather
|
2016-11-07 23:35:46 +00:00
|
|
|
comes from the terminal emulator than the library itself.
|
|
|
|
|
|
|
|
Moreover, the library does not provide any input handling nor any event system and
|
|
|
|
you may rely on the previously cited libraries to achieve such features.
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2017-12-26 11:03:25 +00:00
|
|
|
### [Documentation](https://docs.rs/tui)
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2018-06-09 09:31:02 +00:00
|
|
|
### Demo
|
|
|
|
|
2019-02-10 21:35:44 +00:00
|
|
|
The demo shown in the gif can be run with all available backends
|
|
|
|
(`exmples/*_demo.rs` files). For example to see the `termion` version one could
|
|
|
|
run:
|
|
|
|
|
|
|
|
```
|
2019-02-15 15:53:20 +00:00
|
|
|
cargo run --example termion_demo --release -- --tick-rate 200
|
2019-02-10 21:35:44 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
The UI code is in [examples/demo/ui.rs](examples/demo/ui.rs) while the
|
|
|
|
application state is in [examples/demo/app.rs](examples/demo/app.rs).
|
2018-06-09 09:31:02 +00:00
|
|
|
|
2016-11-07 23:35:46 +00:00
|
|
|
### Widgets
|
|
|
|
|
|
|
|
The library comes with the following list of widgets:
|
|
|
|
|
|
|
|
* [Block](examples/block.rs)
|
|
|
|
* [Gauge](examples/gauge.rs)
|
|
|
|
* [Sparkline](examples/sparkline.rs)
|
|
|
|
* [Chart](examples/chart.rs)
|
2019-03-27 12:22:32 +00:00
|
|
|
* [BarChart](examples/barchart.rs)
|
2016-11-07 23:35:46 +00:00
|
|
|
* [List](examples/list.rs)
|
|
|
|
* [Table](examples/table.rs)
|
|
|
|
* [Paragraph](examples/paragraph.rs)
|
|
|
|
* [Canvas (with line, point cloud, map)](examples/canvas.rs)
|
|
|
|
* [Tabs](examples/tabs.rs)
|
|
|
|
|
2017-10-28 23:44:09 +00:00
|
|
|
Click on each item to see the source of the example. Run the examples with with
|
|
|
|
cargo (e.g. to run the demo `cargo run --example demo`), and quit by pressing `q`.
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2019-02-10 21:35:44 +00:00
|
|
|
You can run all examples by running `make run-examples`.
|
|
|
|
|
2018-06-09 09:31:02 +00:00
|
|
|
### Third-party widgets
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2018-06-09 09:31:02 +00:00
|
|
|
* [tui-logger](https://github.com/gin66/tui-logger)
|
2016-11-07 23:35:46 +00:00
|
|
|
|
2018-06-09 09:31:02 +00:00
|
|
|
### Alternatives
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2018-06-09 09:31:02 +00:00
|
|
|
You might want to checkout [Cursive](https://github.com/gyscos/Cursive) for an
|
|
|
|
alternative solution to build text user interfaces in Rust.
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2018-06-09 09:31:02 +00:00
|
|
|
## License
|
2016-11-07 00:07:53 +00:00
|
|
|
|
2018-06-09 09:31:02 +00:00
|
|
|
[MIT](LICENSE)
|