Skip to content

v0.21.0

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

新しいバックエンド: termwiz

ratatui は、 wezterm を動かす「ターミナルウィザードリー」クレートである termwiz という新しいバックエンドをサポートします。

それを使用するには、 Cargo.tomltermwiz 機能を有効にします:

[dependencies.ratatui]
version = "0.21.0"
features = ["termwiz"]
default-features = false

次に、ターミナルを作成するために TermwizBackend オブジェクトを使用できます。 ratatui + termwiz を使用して、画面上のテキストを5秒間表示する簡単なプログラムです。

use ratatui::{backend::TermwizBackend, widgets::Paragraph, Terminal};
use std::{
error::Error,
thread,
time::{Duration, Instant},
};
fn main() -> Result<(), Box<dyn Error>> {
let backend = TermwizBackend::new()?;
let mut terminal = Terminal::new(backend)?;
terminal.hide_cursor()?;
let now = Instant::now();
while now.elapsed() < Duration::from_secs(5) {
terminal.draw(|f| f.render_widget(Paragraph::new("termwiz example"), f.size()))?;
thread::sleep(Duration::from_millis(250));
}
terminal.show_cursor()?;
terminal.flush()?;
Ok(())
}

New widget: Calendar

カレンダー ウィジェットが追加されました。これは元々 extra-widgets リポジトリの一部でした。

この新しいウィジェットは time クレートに依存しているため、余分な依存関係を回避するために widget-calendar 機能の背後にゲートしました。

[dependencies.ratatui]
version = "0.21.0"
features = ["widget-calendar"]

使用例は次のとおりです。

Monthly::new(
time::Date::from_calendar_date(2023, time::Month::January, 1).unwrap(),
CalendarEventStore::default(),
)
.show_weekdays_header(Style::default())
.show_month_header(Style::default())
.show_surrounding(Style::default()),

Results in:

January 2023
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 1 2 3 4

新しいウィジェット: 円

Circle ウィジェットは、ワールドマップに精度半径を表示するユースケースで追加されています。

Canvas でそれを使用する方法の例を次に示します。

Canvas::default()
.paint(|ctx| {
ctx.draw(&Circle {
x: 5.0,
y: 2.0,
radius: 5.0,
color: Color::Reset,
});
})
.marker(Marker::Braille)
.x_bounds([-10.0, 10.0])
.y_bounds([-10.0, 10.0]),

結果:

⡠⠤⢤⡀
⢸⡁ ⡧
⠑⠒⠚⠁

Inline Viewport

これは非常に要望の多かった機能で、当初の実装は @fdehau 自身によって行われました。Atuin の人々が実装を完了し、ようやく新しいリリースに組み込むことができてうれしく思います。

インライン ビューポートとは、コンテンツを表示するために確保されているターミナル ウィンドウの長方形のセクションを指します。

リポジトリには、複数のファイルを並行してダウンロードするシミュレーションの例があります: https://github.com/ratatui/ratatui/blob/main/examples/inline.rs


ブロック: 下のタイトル

タイトルをブロックの一番上の行にのみ配置する前に。これで、下の>列に置くことができます!革新的。

たとえば、タイトルを下部と中央に配置します。

Paragraph::new("ratatui")
.alignment(Alignment::Center)
.block(
Block::default()
.title(Span::styled("Title", Style::default()))
.title_on_bottom()
.title_alignment(Alignment::Center)
.borders(Borders::ALL),
)

結果:

┌─────────────────────┐
│ ratatui │
│ │
└────────Title────────┘

Block: support adding padding

Block 内に境界から一定の距離を置いてウィジェットをレンダリングする場合は、外側の Block に基づいて別の Layout 要素を作成し、マージンを追加して Widget をその中にレンダリングする必要があります。ブロック要素に padding プロパティを追加すると、この 2 番目のレイアウトの作成がスキップされます。

このプロパティは、テキストをレンダリングするときに特に機能します。パディング付きのブロックを作成し、それをテキスト ラッパーとして使用すればよいためです。

let block = Block::default()
.borders(Borders::ALL)
.padding(Padding::new(1, 1, 2, 2));
let paragraph = Paragraph::new("example paragraph").block(block);
f.render_widget(paragraph, area);

.inner メソッドを使用すると、別のウィジェットをレンダリングすることも簡単です。

let block = Block::default().borders(Borders::ALL).padding(Padding {
left: todo!(),
right: todo!(),
top: todo!(),
bottom: todo!(),
});
let inner_block = Block::default().borders(Borders::ALL);
let inner_area = block.inner(area);
f.render_widget(block, area);
f.render_widget(inner_block, inner_area);
f.render_widget(paragraph, area);

テキスト: 安全なデータを表示する

Masked と呼ばれる新しいタイプが、マスク文字を使用してデータをマスキングするためにテキスト関連タイプに追加されます。例の使用法は次のとおりです。

Line::from(vec![
Span::raw("Masked text: "),
Span::styled(
Masked::new("password", '*'),
Style::default().fg(Color::Red),
),
])

結果:

Masked text: ********

border!マクロ

border!マクロが追加されました。これは、「トップ」、「ボトム」、「左」、「右」、「すべて」を取り、「境界線」オブジェクトを返します。

空の border! () callは noneを返します。

例えば:

border!(ALL)
border!(LEFT, RIGHT)
border!()

これは、短いビルド時間を確保するために、macros 機能フラグの背後にあるとゲートされています。有効にするには、次のように Cargo.toml を更新します。

[dependencies.ratatui]
version = "0.21.0"
features = ["macros"]

今後は、新しいマクロを macros 機能の後ろに置く可能性が高いでしょう。


色: String からのサポート変換

この変換が必要なことはありますか?

"black" => Color::Black,
"red" => Color::Red,
"green" => Color::Green,
// etc.

心配しないでください、私たちはあなたをカバーしました:

Color::from_str("lightblue") // Color::LightBlue
Color::from_str("10") // Color::Indexed(10)
Color::from_str("#FF0000") // Color::Rgb(255, 0, 0)

Spans -> Line

LineSpans よりはるかに良い名前です。複数形は混乱を招き、型は実際にはスパンで構成されたテキスト行の表現だからです。

そのため、SpansLine に名前が変更され、非推奨の通知が追加されました。

詳しい説明については、https://github.com/ratatui/ratatui/pull/178 を参照してください。


その他の機能

  • List に、アイテム数を返す len() メソッドが追加されました
  • Sparkline に、レンダリング方向 (左から右 / 右から左) を指定する direction() メソッドが追加されました
  • Table および List 状態に、offset() メソッドと offset_mut() メソッドが追加されました
  • Display 実装を使用してテスト バッファ (TestBackend) を公開します

新しいアプリ

追加されたアプリケーションのリストは次のとおりです。

  • oxycards: ターミナル内で構築されたクイズ カード アプリケーション。
  • twitch-tui: ターミナル内の Twitch チャット。
  • tenere: LLM 用の TUI インターフェイス。

また、 apps.mdファイルを Wiki に移動したので、 ratatui で構築されたより多くのアプリケーションを確認してください!


tui-rs からの移行

wikiで移行ガイドをまとめました: Migrating from TUI

また、サポートされている最小限のバージョンは 1.65.0 です


貢献

どんな貢献も高く評価されています!開始するための contribution guidelines があります。

submit issues を自由にして、アイデアを投入してください!

ratatui で問題が発生している場合、またはプロジェクトに貢献したい場合、またはchit-chatをお持ちの場合は、 join our Discord server をお気軽にお問い合わせください。