Skip to content

v0.27.0

https://github.com/ratatui/ratatui/releases/tag/v0.27.0

このリリースについては、 breaking changes を参照してください。

ラインゲージ: バックグラウンドスタイル📊

LineGauge::gauge_style は非推奨となり、代わりに filled_style および unfilled_style メソッドが採用されました。これにより、さまざまな状態の前景/背景スタイルを設定できるようになります。

let gauge = LineGauge::default()
.filled_style(Style::default().fg(Color::Green))
.unfilled_style(Style::default().fg(Color::White))
.ratio(0.43);

また、 Line Gauge example を追加しました。


List: Navigation Methods 🧭

以下の方法を使用して、List ウィジェット内を移動できるようになりました。

let mut state = ListState::default();
state.select_first();
state.select_next();
state.select_previous();
state.select_last();

また、ナビゲート時に、選択されたインデックスをリストの境界に固定します。


テキスト: ディスプレイからの変換

TextSpanLine は、Display trait を実装する任意の型からの変換をサポートするようになりました。

let text = "line1
line2".to_text();
let span = (6.66).to_span();
let line = 42.to_line();

これは、それぞれ新しく追加された ToTextToSpanToLine trait によって可能になりました。


Palette Colors 🎨

⚠️ これは「パレット」機能フラグの背後にあります。

Ratatui で パレット クレートから色を使用できるようになりました。

use palette::{LinSrgb, Srgb};
use ratatui::style::Color;
let color = Color::from(Srgb::new(1.0f32, 0.0, 0.0));
let color = Color::from(LinSrgb::new(1.0f32, 0.0, 0.0));

新しい境界線は🖼️を設定する

border::EMPTY

空のスペースシンボル (░) を使用します

let block = Block::bordered().title("Title").border_set(border::EMPTY);
░░░░░░░░
░░ ░░
░░ ░░ ░░
░░ ░░ ░░
░░ ░░
░░░░░░░░

これは、境界線用のスペースを割り当て、実際に境界線を描画せずに境界線スタイルをブロックに適用する必要がある場合に便利です。これにより、タイトル コンテンツだけでなく、タイトル領域全体またはブロックのスタイルを設定できます。

border::FULL

フルブロックシンボル (█) を使用します

let block = Block::bordered().title("Title").border_set(border::FULL);
████
█xx█
█xx█
████

Re-export Backends 📤

crosstermtermiontermwiz はそれぞれ ratatui::{crossterm, termion, termwiz} としてアクセスできるようになりました。

これにより、Ratatui クレートを依存関係として追加するだけで、バックエンド クレートを依存関係として追加することなく、選択したバックエンドを使用できるようになります。

既存のコードを更新するには、crossterm:: のすべてのインスタンスを ratatui::crossterm:: に、 termion::ratatui::termion:: に、termwiz::ratatui::termwiz:: に置き換えます。

crossterm の例:

use crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind};
use ratatui::crossterm::event::{Event, KeyCode, KeyEvent, KeyEventKind};

そして、Cargo.toml から crossterm を削除できます。


プレリュードを更新する

suggestion on Reddit に基づいて、 prelude モジュールに変更を加えました。

注: このモジュールを使用すると、膨大な量のインポートなしで ratatui を簡単に使用できます!例えば use ratatui::prelude::*;

次の項目はプレリュードから削除されました。

  • style::Styled - このtrait は、Stylize trait をサポートしたいウィジェットに便利ですが、ウィジェットには 2 つの style メソッドと 1 つの set_style メソッドがあるため、複雑になります。
  • symbols::Marker - この項目は、Canvas ウィジェットに描画する必要があるコードによって使用されますが、ライブラリのほとんどのユーザーが使用する一般的な項目ではありません。
  • terminal::{CompletedFrame, TerminalOptions, Viewport} - これらの項目は、ターミナルと対話する必要があるコードによって使用されることはほとんどなく、通常はどのアプリでも 1 回しか使用されません。

次の項目がプレリュードに追加されました:

  • layout::{Position, Size} - これらの項目は、レイアウト システムと対話する必要があるコードによって使用されます。これらは、最近のいくつかのリリースで追加された新しい項目であり、より自由に使用する必要があります。

Tracing Example 🔍

TUI アプリのデバッグ方法を知りたいですか? println を試したけどうまくいかなかった? お手伝いします!

ファイルにログを記録する方法を示す例を追加しました:

トレースの例


ハイパーリンクの例🔗

ターミナルでハイパーリンクを使用するための概念実証例を追加しました。

Demo

コードは here を利用できます。


Cell: New methods 🔧

次のようにして空の Cell を作成できるようになりました。

let mut cell = Cell::EMPTY;
assert_eq!(cell.symbol(), " ");

次のように構築を簡素化するために、定数 Cell:new メソッドも追加しました。

let mut cell = Cell::default();
cell.set_symbol("a");
let cell = Cell::new("a");

Stylize::bg() ジェネリック🔄を作成する

以前は、 Stylize::bg()Color を受け入れましたが、 Into<Color> を受け入れます。これにより、呼び出しスコープからより柔軟なタイプが可能になりますが、呼び出し範囲のタイプの推論を破ることができます。

let srgb_color: Srgb<u8> = Srgb::new(255, 0, 0);
foo.bg(srgb_color);

Writer Methods on Backends 🖋️

crossterm および termion バックエンドに、基盤となるライターにアクセスするための writer() および writer_mut() メソッドが追加されました。

これは、これまでに何が書かれたかを確認したい場合などに便利です。

let terminal = Terminal::new(CrosstermBackend::new(Vec::<u8>::new()));
let ui = |frame| { ... };
terminal.draw(ui);
let crossterm_backend = terminal.backend();
let buffer = crossterm_backend.writer();

不足しているVHSテープを追加する📼

いくつかの例のデモがありませんでした。それらが追加されました!

Constraint explorer example :

constraint-explorer

Minimal example :

minimal


List: Remove deprecated start_corner() 🚫

List::start_corner は v0.25 で非推奨になりました。

代わりに List::directionListDirection を使用してください:

list.start_corner(Corner::TopLeft);
list.start_corner(Corner::TopRight);
// This is not an error, BottomRight rendered top to bottom previously
list.start_corner(Corner::BottomRight);
// all becomes
list.direction(ListDirection::TopToBottom);
list.start_corner(Corner::BottomLeft);
// becomes
list.direction(ListDirection::BottomToTop);

layout::Corner も完全に削除されます。


パディング: zero() 🚫を非難する

今では一定です!

Padding::zero()
Padding::ZERO

Buffer: Improve Performance ⚡️

Buffer::filled は参照を取得する代わりにセルを移動するようになりました。

Buffer::filled(area, &Cell::new("X"));
Buffer::filled(area, Cell::new("X"));

rect: パフォーマンスの向上⚡️

Margin は参照なしで渡す必要があります:

let area = area.inner(&Margin {
let area = area.inner(Margin {
vertical: 0,
horizontal: 2,
});

他の💼

  • PositionSizeDisplay を実装するようになりました (#1162)
  • 文字列を Line に変換するときに改行を削除します (#1191)
    • Line::from("a\nb") が 1 つではなく 2 つの Span を持つ Line を返すようになりました
  • ゼロ幅の文字が正しくレンダリングされるようにします (#1165)
  • &str と String をレンダリングするときに領域の幅を尊重します (#1177)
  • ベンチマークの一貫性を改善します(#1126)

“I can’t believe it! A real gourmet kitchen, and I get to watch!” – Remy