tui-rs v0.9.0 Release Notes
Release Date: 2020-04-14 // almost 4 years ago-
๐ Features
- Introduce stateful widgets, i.e widgets that can take advantage of keeping some state around between two draw calls (#210 goes a bit more into the details).
- ๐ Allow a
Table
row to be selected. ```rust // State initialization let mut state = TableState::default();
// In the terminal.draw closure let header = ["Col1", "Col2", "Col"]; let rows = [ Row::Data(["Row11", "Row12", "Row13"].into_iter()) ]; let table = Table::new(header.into_iter(), rows.into_iter()); f.render_stateful_widget(table, area, &mut state);
// In response to some event: state.select(Some(1));
* โ Add a way to choose the type of border used to draw a block. You can now choose from plain, rounded, double and thick lines. * โ Add a `graph_type` property on the `Dataset` of a `Chart` widget. By 0๏ธโฃ default it will be `Scatter` where the points are drawn as is. An other option is `Line` where a line will be draw between each consecutive points of the dataset. * ๐ Style methods are now const, allowing you to initialize const `Style` objects. * ๐ Improve control over whether the legend in the `Chart` widget is shown or not. You can now set custom constraints using `Chart::hidden_legend_constraints`. * โ Add `Table::header_gap` to add some space between the header and the first row. * โ Remove `log` from the dependencies * โ Add a way to use a restricted set of unicode symbols in several widgets to ๐ improve portability in exchange of a degraded output. (see `BarChart::bar_set`, `Sparkline::bar_set` and `Canvas::marker`). You can check how the `--enhanced-graphics` flag is used in the demos. ### ๐ฅ Breaking Changes * `Widget::render` has been deleted. You should now use `Frame::render_widget` to render a widget on the corresponding `Frame`. This makes the `Widget` implementation totally decoupled from the `Frame`. ```rust // Before Block::default().render(&mut f, size); // After let block = Block::default(); f.render_widget(block, size);
Widget::draw
has been renamed toWidget::render
and the signature has โก๏ธ been updated to reflect that widgets are consumable objects. Thus the method takesself
instead of&mut self
. ```rust // Before impl Widget for MyWidget { fn draw(&mut self, area: Rect, buf: &mut Buffer) { } }
/// After impl Widget for MyWidget { fn render(self, arera: Rect, buf: &mut Buffer) { } }
* `Widget::background` has been replaced by `Buffer::set_background` ```rust // Before impl Widget for MyWidget { fn render(self, arera: Rect, buf: &mut Buffer) { self.background(area, buf, self.style.bg); } } // After impl Widget for MyWidget { fn render(self, arera: Rect, buf: &mut Buffer) { buf.set_background(area, self.style.bg); } }
- โก๏ธ Update the
Shape
trait for objects that can be draw on aCanvas
widgets. Instead of returning an iterator over its points, aShape
is given aPainter
object that provides apaint
as well as aget_point
method. This gives theShape
more information about the surface it will be drawn to. In particular, this change allows theLine
shape to use a more precise and efficient drawing algorithm (Bresenham's line algorithm). SelectableList
has been deleted. You can now take advantage of the associatedListState
of theList
widget to select an item. ```rust // Before List::new(&["Item1", "Item2", "Item3"]) .select(Some(1)) .render(&mut f, area);
// After
// State initialization let mut state = ListState::default();
// In the terminal.draw closure let list = List::new(&["Item1", "Item2", "Item3"]); f.render_stateful_widget(list, area, &mut state);
// In response to some events state.select(Some(1));
* ๐ `widgets::Marker` has been moved to `symbols::Marker`