mirror of
https://github.com/fdehau/tui-rs.git
synced 2024-10-30 21:20:22 +00:00
11 KiB
11 KiB
Changelog
To be released
Breaking Changes
Terminal::draw()
now requires a closure that takes&mut Frame
.
Features
- Add feature-gated (
serde
) serialization ofStyle
. - Add
Frame::set_cursor()
to dictate where the cursor should be placed after the call toTerminial::draw()
. Calling this method would also make the cursor visible after the call todraw()
. See example usage in examples/user_input.rs.
v0.9.5 - 2020-05-21
Bug Fixes
- Fix out of bounds panic in
widgets::Tabs
when the widget is rendered on small areas.
v0.9.4 - 2020-05-12
Bug Fixes
- Ignore zero-width graphemes in
Buffer::set_stringn
.
v0.9.3 - 2020-05-11
Bug Fixes
- Fix usize overflows in
widgets::Chart
when a dataset is empty.
v0.9.2 - 2020-05-10
Bug Fixes
- Fix usize overflows in
widgets::canvas::Line
drawing algorithm.
v0.9.1 - 2020-04-16
Bug Fixes
- The
List
widget now takes into account the width of thehighlight_symbol
when calculating the total width of its items. It prevents items to overflow outside of the widget area.
v0.9.0 - 2020-04-14
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
v0.8.0 - 2019-12-15
Breaking Changes
- Bump crossterm to 0.14.
- Add cross symbol to the symbols list.
Bug Fixes
- Use the value of
title_style
to style the title ofAxis
.
v0.7.0 - 2019-11-29
Breaking Changes
- Use
Constraint
instead of integers to specify the widths of theTable
widget's columns. This will allow more responsive tables.
Table::new(header, row)
.widths(&[15, 15, 10])
.render(f, chunk);
becomes:
Table::new(header, row)
.widths(&[
Constraint::Length(15),
Constraint::Length(15),
Constraint::Length(10),
])
.render(f, chunk);
- Bump crossterm to 0.13.
- Use Github Actions for CI (Travis and Azure Pipelines integrations have been deleted).
Features
- Add support for horizontal and vertical margins in
Layout
.
v0.6.2 - 2019-07-16
Features
Text
implements PartialEq
Bug Fixes
- Avoid overflow errors in canvas
v0.6.1 - 2019-06-16
Bug Fixes
- Avoid a division by zero when all values in a barchart are equal to 0.
- Fix the inverted cursor position in the curses backend.
- Ensure that the correct terminal size is returned when using the crossterm backend.
- Avoid highlighting the separator after the selected item in the Tabs widget.
v0.6.0 - 2019-05-18
Breaking Changes
- Update crossterm backend
v0.5.1 - 2019-04-14
Bug Fixes
- Fix a panic in the Sparkline widget
v0.5.0 - 2019-03-10
Features
- Add a new curses backend (with Windows support thanks to
pancurses
). - Add
Backend::get_cursor
andBackend::set_cursor
methods to query and set the position of the cursor. - Add more constructors to the
Crossterm
backend. - Add a demo for all backends using a shared UI and application state.
- Add
Ratio
as a new variant of layoutConstraint
. It can be used to define exact ratios constraints.
Breaking Changes
- Add support for multiple modifiers on the same
Style
by changingModifier
from an enum to a bitflags struct.
So instead of writing:
let style = Style::default().modifier(Modifier::Italic);
one should use:
let style = Style::default().modifier(Modifier::ITALIC);
// or
let style = Style::default().modifier(Modifier::ITALIC | Modifier::BOLD);
Bug Fixes
- Ensure correct behavoir of the alternate screens with the
Crossterm
backend. - Fix out of bounds panic when two
Buffer
are merged.
v0.4.0 - 2019-02-03
Features
- Add a new canvas shape:
Rectangle
. - Official support of
Crossterm
backend. - Make it possible to choose the divider between
Tabs
. - Add word wrapping on Paragraph.
- The gauge widget accepts a ratio (f64 between 0 and 1) in addition of a percentage.
Breaking Changes
- Upgrade to Rust 2018 edition.
Bug Fixes
- Fix rendering of double-width characters.
- Fix race condition on the size of the terminal and expose a size that is
safe to use when drawing through
Frame::size
. - Prevent unsigned int overflow on large screens.
v0.3.0 - 2018-11-04
Features
- Add experimental test backend
v0.3.0-beta.3 - 2018-09-24
Features
show_cursor
is called whenTerminal
is dropped if the cursor is hidden.
v0.3.0-beta.2 - 2018-09-23
Breaking Changes
- Remove custom
termion
backends. This is motivated by the fact thattermion
structs are meant to be combined/wrapped to provide additional functionalities to the terminal (e.g AlternateScreen, Mouse support, ...). Thus providing exclusive types do not make a lot of sense and give a false hint that additional features cannot be used together. The recommended approach is now to create your own version ofstdout
:
let stdout = io::stdout().into_raw_mode()?;
let stdout = MouseTerminal::from(stdout);
let stdout = AlternateScreen::from(stdout);
and then to create the corresponding termion
backend:
let backend = TermionBackend::new(stdout);
The resulting code is more verbose but it works with all combinations of
additional termion
features.
v0.3.0-beta.1 - 2018-09-08
Breaking Changes
- Replace
Item
by a generic and flexibleText
that can be used in bothParagraph
andList
widgets. - Remove unecessary borrows on
Style
.
v0.3.0-beta.0 - 2018-09-04
Features
- Add a basic
Crossterm
backend
Breaking Changes
- Remove
Group
and introduceLayout
in its placeTerminal
is no longer required to compute a layoutSize
has been renamedConstraint
- Widgets are rendered on a
Frame
instead of aTerminal
in order to avoid mixingdraw
andrender
calls draw
onTerminal
expects a closure where the UI is built by rendering widgets on the givenFrame
- Update
Widget
traitdraw
takes area by valuerender
takes aFrame
instead of aTerminal
- All widgets use the consumable builder pattern
SelectableList
can have no selected item and the highlight symbol is hidden in this case- Remove markup langage inside
Paragraph
.Paragraph
now expects an iterator ofText
items
v0.2.3 - 2018-06-09
Features
- Add
start_corner
option forList
- Add more text aligment options for
Paragraph
v0.2.2 - 2018-05-06
Features
Terminal
implementsDebug
Breaking Changes
- Use
FnOnce
instead ofFnMut
in Group::render
v0.2.1 - 2018-04-01
Features
- Add
AlternateScreenBackend
intermion
backend - Add
TermionBackend::with_stdout
in order to let an user of the library provides its own termion struct - Add tests and documentation for
Buffer::pos_of
- Remove leading whitespaces when wrapping text
Bug Fixes
- Fix
debug_assert
inBuffer::pos_of
- Pass the style of
SelectableList
to the underlyingList
- Fix missing character when wrapping text
- Fix panic when specifying layout constraints
v0.2.0 - 2017-12-26
Features
- Add
MouseBackend
intermion
backend to handle scroll and mouse events - Add generic
Item
for items in aList
- Drop
log4rs
as a dev-dependencies in favor ofstderrlog
Breaking Changes
- Rename
TermionBackend
toRawBackend
(to distinguish it from theMouseBackend
) - Generic parameters for
List
to allow passing iterators as items - Generic parameters for
Table
to allow using iterators as rows and header - Generic parameters for
Tabs
- Rename
border
bitflags toBorders