Skip to content

v0.29.0

animation

Ratatui 0.29.0 を発表できることを楽しみにしています!このリリース here の壊れた変更を参照してください。

上記のKickassアニメーションのために、 @dekirsu への大声で大声で叫ぶ!すぐにウェブサイトの改善を開始します!

スパークライン: 空のバースタイル📊

Sparkline ウィジェットで、空のバーと値が 0 のバーを区別できるようになりました。

前に:

image

後:

image

これを実現するために、Sparkline ウィジェットに absent_value_style 関数と absent_value_symbol 関数を追加しました。

let widget = Sparkline::default()
.absent_value_style(Style::default().fg(Color::Red)) // new!
.absent_value_symbol(symbols::shade::FULL) // new!
.data([
None, // absent, will be rendered as a red full block
Some(1),
Some(2),
Some(3),
Some(4),
Some(5),
Some(6),
Some(7),
Some(8),
]);
let buffer = render(widget, 12);
let mut expected = Buffer::with_lines(["█▁▂▃▄▅▆▇█xxx"]);
expected.set_style(Rect::new(0, 0, 1, 1), Style::default().fg(Color::Red));
assert_eq!(buffer, expected);

Overlapping layouts 🔄

Layout::spacing は汎用的になり、次の値を取ることができます:

  • ゼロまたは正の数、例: Layout::spacing(1) (現在の機能)
  • 負の数、例: Layout::spacing(-1) (新機能!)
  • Spacing のバリアント (新機能!)
    • Spacing::Space
    • Spacing::Overlap

これにより、セグメントにピクセルを共有するレイアウトを作成できます。spacing(negative_value) を使用すると、間隔は無視され、すべてのセグメントが隣接し、ピクセルが重なり合います。

実装 からの抜粋を以下に示します:

let (segments, spacers) = Layout::horizontal([Length(10), Length(10), Length(10)])
.flex(Flex::Center)
.spacing(-1) // new feature
.split_with_spacers(lower);
for segment in segments.iter() {
frame.render_widget(
crate::widgets::Block::bordered()
.border_set(crate::symbols::border::DOUBLE),
*segment,
);
}
for spacer in spacers.iter() {
frame.render_widget(crate::widgets::Block::bordered(), *spacer);
}

既存の境界線の上に境界線を描くと、既存の境界線が上書きされることがわかります。

┌─────────┐╔════════╔════════╔════════╗┌─────────┐
└─────────┘╚════════╚════════╚════════╝└─────────┘

将来のバージョンでは、境界線を組み合わせて重なりをより適切に処理することで、境界線の描画が強化されます。


表: 列とセルの選択をサポートする🗃️

これで、 Table ウィジェットで列とセルを選択できるようになりました!

列またはセルを選択するには、TableState メソッドの select_columnselect_cell を使用します。また、他の便利なメソッドとともに scroll_right_byscroll_left_by も追加しました。

let mut state = TableState::new().with_selected_column(Some(1));
state.select_first_column();
state.select_next_column();
state.select_previous_column();
state.select_last_column();
state.scroll_right_by(4);
state.scroll_left_by(20);
state.select_column(Some(1));
state.select_cell(Some((1, 5)));

選択した列とセルのスタイルは、 Table::column_highlight_style および Table::cell_highlight_style を使用して設定できます。

例えば:

let table = Table::new(rows, [Constraint::Length(5); 3])
.highlight_symbol(">>")
.row_highlight_style(Style::new().red())
.column_highlight_style(Style::new().blue());

Tabs: Support deselection 🚫

Tabs::select() は、usize の代わりに Into<Option<usize>> を受け入れるようになりました。これにより、None を渡すことでタブの選択を解除できるようになります。

let tabs = Tabs::new(vec!["Tab 1", "Tab 2"]).select(None);

ただし、これにより、すでにパラメータ型推論を使用しているコードは動作しなくなります。

let selected = 1u8;
let tabs = Tabs::new(["A", "B"]).select(selected.into())
let tabs = Tabs::new(["A", "B"]).select(selected as usize)

ターミナル: サポートスクロール領域🖥️

現在の Terminal::insert_before の実装では、この問題 で説明されているように、ビューポートがちらつくことがありました。

この問題に対処するために、scrolling-regions という新しいクレート機能を導入しました。この機能は、ターミナルのスクロール領域を使用して、ちらつきのない Terminal::insert_before を実装します。

Viewport のこの機能を有効にするには、次のように Cargo.toml を更新してください。

[dependencies]
ratatui = { version = "0.29", features = ["scrolling-regions"] }

詳細については、 implementation を参照してください。


色: HSLUVサポート🎨

palette 機能を有効にすると、Hsluv 構造体を使用して HSLuv カラー スペース に色を作成できるようになります。

use ratatui::{palette::Hsluv, style::Color};
let color: Color = Color::from_hsluv(Hsluv::new(0.0, 100.0, 0.0));
assert_eq!(color, Color::Rgb(0, 0, 0));

キャンバス: 例を描きます

Canvas の例を拡張して描画機能を追加しました。これでマウスを使ってキャンバスに描画できるようになりました。


Ratatui logo widget 🖼️

ターミナルで Ratatui ロゴをレンダリングするために使用できる「Ratatui ロゴ」という新しいウィジェットを追加しました。

use ratatui::{Frame, widgets::RatatuiLogo};
fn draw(frame: &mut Frame) {
frame.render_widget(RatatuiLogo::tiny(), frame.area()); // 2x15 characters
frame.render_widget(RatatuiLogo::small(), frame.area()); // 2x27 characters
}

Results in:

▛▚▗▀▖▜▘▞▚▝▛▐ ▌▌
▛▚▐▀▌▐ ▛▜ ▌▝▄▘▌
█▀▀▄ ▄▀▀▄▝▜▛▘▄▀▀▄▝▜▛▘█ █ █
█▀▀▄ █▀▀█ ▐▌ █▀▀█ ▐▌ ▀▄▄▀ █

次のコマンドを使用して例を実行することもできます。

Terminal window
cargo run --example ratatui-logo

行: From<Cow<str>> を実装する

Line は、より柔軟な変換を可能にするために From<Cow<str>> を実装します。

let cow_str: Cow<'static, str> = Cow::Borrowed("hello, world");
let line = Line::from(cow_str);

これにより追加の変換が追加されるため、あいまいな推論値はコンパイルされなくなる可能性があります。その場合は、代わりに Line::from(String::from(...)) を使用してください。


Rect::area now returns u32 📏

Rect::area() 関数は、より大きな領域を計算できるように、u16 ではなく u32 を返すようになりました。

以前は、Rect::new() は長方形の合計領域を u16::MAX に制限し、アスペクト比を維持していました。現在は、幅と高さを個別に制限し、u16::MAX 内に収まるようにしています。


block::Title ⚠️を非難する

ratatui::widgets::block::Title は非推奨となり、タイトルを表すために Line を使用するようになりました。

これにより、不要な折り返しレイヤー (string -> Span -> Line -> Title) が削除されます。

コードを更新するには:

Block::new().title(Title::from("foo"));
// becomes any of
Block::new().title("foo");
Block::new().title(Line::from("foo"));
Block::new().title(Title::from("foo").position(Position::TOP));
// becomes any of
Block::new().title_top("foo");
Block::new().title_top(Line::from("foo"));
Block::new().title(Title::from("foo").position(Position::BOTTOM));
// becomes any of
Block::new().title_bottom("foo");
Block::new().title_bottom(Line::from("foo"));

Title structは、Ratatuiの将来のリリースで削除されます (0.31の可能性が高い) 。

詳細については、 this issue を参照してください。


より良い「デバッグ」出力🐞

TextLineSpanStyle のデバッグ出力が改善され、より簡潔で読みやすくなりました。

たとえば、次のコードがあるとします。

Text::styled("Hello, world!", Color::Yellow).centered(),

デバッグ出力 ({:?}) は次のようになります。

Text::from(Line::from(“Hello, world!“)).yellow().centered()


Columns および Rows for DoubleEndedIterator

レイアウト内の列と行を逆の順序で反復処理できるようになりました。

let rect = Rect::new(0, 0, 3, 2);
let mut columns = Columns::new(rect);
assert_eq!(columns.next_back(), Some(Rect::new(2, 0, 1, 2)));
assert_eq!(columns.next_back(), Some(Rect::new(1, 0, 1, 2)));
assert_eq!(columns.next_back(), Some(Rect::new(0, 0, 1, 2)));
assert_eq!(columns.next_back(), None);
assert_eq!(columns.next(), None);

Pin unicode-width 📌

文字の幅を計算するために、unicode-width クレートを使用します。0.1.14 では 物議を醸す変更 があり、その結果 0.1.130.2.0 として公開されました。これにより、テストも失敗しました。

assert_eq!("👩".width(), 2); // Woman
assert_eq!("🔬".width(), 2); // Microscope
assert_eq!("👩‍🔬".width(), 4); // Woman scientist -> should be 4 but it expect 2

ライブラリに重大な変更があった場合にアプリケーションが壊れるのを避けるため、0.2.0 に固定することでこれらの変更に準拠することにしました。

#1271 のディスカッションを参照してください。


cargoをチェックインロック✔️

Cargo.lock をリポジトリに追加しました。

これを最新の状態にしておくと、どのバージョンでも使用された同じバージョンのクレートを使用して任意の git バージョンをビルドできます。これを使用しない場合は、現在のバージョンしか使用できません。これにより、semver 互換コードのバグを検出することが難しくなります。

見る:


他の💼

  • cargo-machete で検出された未使用の依存関係を削除 (#1362)
  • ドキュメントの例で prelude の使用を削除 (#1390)
  • Table のベンチマークを追加 (#1408)
  • Rect イテレータのサイズヒントを実装 (#1420)
  • README.md を更新 (#1431 & #1419)
  • ビューポートのサイズ変更とクリアを修正 (#1353 & #1427)

“Food will come, Remy. Food always comes to those who love to cook.” – Gusteau