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.
// 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 theDataset
of aChart
widget. By default it will beScatter
where the points are drawn as is. An other option isLine
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 usingChart::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
andCanvas::marker
). You can check how the--enhanced-graphics
flag is used in the demos.
Breaking Changes
Widget::render
has been deleted. You should now useFrame::render_widget
to render a widget on the correspondingFrame
. This makes theWidget
implementation totally decoupled from theFrame
.
// 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
.
// 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 byBuffer::set_background
// 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.
// 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 tosymbols::Marker