Skip to content

v0.28.0

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

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

クロスタイム0.28.0⬆️

Crossterm はバージョン 0.28.0 に更新されました。これは、以前のバージョン (0.27.0) と semver 互換性のないバージョンです。Ratatui は、互換性のある crossterm のバージョンを ratatui::crossterm の下に再エクスポートします。これを使用して、依存関係リスト内の互換性のないバージョンを回避できます。

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


Chart: Add GraphType::Bar 📊

GraphTypeBar という新しいバリアントを導入しました。これは、データセット内の各ポイントにバーを描画するように設計されています。

let chart = Chart::new(vec![Dataset::default()
.data(&data)
.marker(symbols::Marker::Dot)
.graph_type(GraphType::Bar)]);

Demo


非同期の例📚

データを非同期に取得するウィジェットでRatatuiを使用する方法を示す新しい例を追加しました。

352719354-4c70e77d-b24d-4ccf-8af6-1fe1829fb863

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


Barchart: Support Lines 📈

以前は、Axis::labelsVec<Span> を受け入れていました。より柔軟にするために、[Line] に変換できる任意の型のベクトル (例: &strString&LineSpan など) を受け入れるように変更しました。つまり、型を推測する変換メソッドを使用するコードは、次のように書き直す必要があります。

Axis::default().labels(vec!["a".into(), "b".into()])
Axis::default().labels(["a", "b"])

ターミナル: try_draw

Terminaltry_draw という新しいメソッドを追加しました。これは Terminal::draw と同様に機能しますが、レンダリング コールバックを何も返さない (()) のではなく Result を返す関数またはクロージャにすることができます。

これにより、? 演算子を使用して、誤りのあるレンダリング メソッドを処理しやすくなります。

terminal.try_draw(|frame| {
some_method_that_can_fail()?;
another_fallible_method()?;
Ok(())
})?;

このメソッドは、成功した場合は CompletedFrame とともに Result::Ok を返し、失敗した場合は std::io::Error とともに Result::Err を返します。


Terminal: Make terminal module private 🔒

ターミナル モジュールは現在プライベートであり、直接使用することはできません。このモジュールの下の型は、クレートのルートからエクスポートされます。

use ratatui::terminal::{CompletedFrame, Frame, Terminal, TerminalOptions, ViewPort};
use ratatui::{CompletedFrame, Frame, Terminal, TerminalOptions, ViewPort};

これにより、パブリック API が簡素化され、Rust の再エクスポートに慣れていないユーザーにとってより使いやすくなり、バックエンド コード内の terminal という名前の他のモジュールとの衝突を回避できます。


バックエンド: get/set_cursor_position() を追加する

Backend trait を自分で実装する場合は、実装を更新して、カーソルについて設定する内容をより明確に示す get/set_cursor_position メソッドを追加する必要があります。

これらの新しいメソッドは、Position または (u16, u16) タプルのいずれかである Into<Position> を返す/受け入れます。

backend.set_cursor_position(Position { x: 0, y: 20 })?;
let position = backend.get_cursor_position()?;
terminal.set_cursor_position((0, 20))?;
let position = terminal.set_cursor_position()?;

get/set_cursor メソッドは、それらが廃止され、それらのデフォルトの実装が存在するため、実装からメソッドを削除できます。


バッファ: cellcell_mutindex を追加する。

buf.get(x, y) または buf.get_mut(x, y) を使用して要素にアクセスするために使用するバッファ。現在、インデックス演算子のサポートが追加され、buf.cell() メソッドと buf.cell_mut() メソッドが導入されています。

これらの新しいメソッドは、座標に Into<Position> を使用し、Option<&Cell>Option<&mut Cell> を返すことで使いやすく安全になり、パニックを回避できます (やったー)。

let mut buffer = Buffer::empty(Rect::new(0, 0, 10, 10));
// Access cells
let cell = buf[(0, 0)];
let cell = buf[Position::new(0, 0)];
// Get symbol
let symbol = buf.cell((0, 0)).map(|cell| cell.symbol());
let symbol = buf.cell(Position::new(0, 0)).map(|cell| cell.symbol());
// Set symbol
buf[(0, 0)].set_symbol("🐀");
buf[Position::new(0, 0)].set_symbol("🐀");
buf.cell_mut((0, 0)).map(|cell| cell.set_symbol("🐀"));
buf.cell_mut(Position::new(0, 0)).map(|cell| cell.set_symbol("🐀"));

既存の get () および get_mut () メソッドは、非推奨としてマークされるようになりました。


フレーム: size()area() に変更する

それはほんの正しい名前です。🧀

Frame::size が非推奨になりました。


Text: Add Add and AddAssign implementations ✏️

Line、Span、Text の各タイプを推測しながら組み合わせることができるようになりました。

let line = Span::raw("Red").red() + Span::raw("blue").blue();
let line = Line::raw("Red").red() + Span::raw("blue").blue();
let line = Line::raw("Red").red() + Line::raw("Blue").blue();
let text = Line::raw("Red").red() + Line::raw("Blue").blue();
let text = Text::raw("Red").red() + Line::raw("Blue").blue();
let mut line = Line::raw("Red").red();
line += Span::raw("Blue").blue();
let mut text = Text::raw("Red").red();
text += Line::raw("Blue").blue();
line.extend(vec![Span::raw("1"), Span::raw("2"), Span::raw("3")]);

テキスト: 不要な寿命を削除する🔧

[ToText](https://docs.rs/ratatui/latest/ratatui/text/trait .ToText.html) trait には、ライフタイム パラメータがなくなりました。

この変更により、trait が簡素化され、実装が容易になります。


List/Table: New Scroll Methods 🔽

ListStateTableState の両方に新しい scroll_down_by(u16) および scroll_up_by(u16) メソッドを実装しました。これにより、指定した位置数だけ項目をスクロールできるようになります。

let mut state = ListState::default();
state.select(Some(2));
state.scroll_down_by(4);
assert_eq!(state.selected, Some(6));
let mut state = TableState::default();
state.select(Some(3));
state.scroll_up_by(3);
assert_eq!(state.selected, Some(0));

表: ナビゲーション方法🧭

次の方法を使用して、 Table ウィジェットでナビゲートできるようになりました。

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

これは、 ListState のように同等のAPIです。


Tracking Benchmarks ⏲️

私たちは、Bencher.dev を使用して、時間の経過とともにベンチマークを追跡し、簡単に回帰をキャッチし始めました。

ベンチマークは https://bencher.dev/console/projects/ratatui でご覧いただけます。

今後の改善に関する議論については、追跡問題 をご覧ください。


semver違反を確認してください

私たちは、CI で cargo-semver-checks を使用して、API の semver 違反を検査する実験を始めました。

関連する議論については、PR を参照してください。


他の💼

  • Rect ではなく Backend::size から Size を返す (#1254)
  • Layout キャッシュの不要な同期を削除 (#1245)
  • Layout::init_cache は bool を返さなくなり、usize ではなく NonZeroUsize を受け取ります
  • Line を作成するときに不要な割り当てを削除します (#1237)
  • ListTable をレンダリングするときに余分な割り当てを回避します (#1244 & #1242)
  • LayoutSize::ZERO および Position::ORIGIN 定数を追加 (#1253)
  • MarginPositionRectSize の serde を有効にする (#1255)
  • TestBackend での領域の不一致を防ぐ (serde 表現を変更する) (#1252)
  • Chart のすべての軸ラベルを削除できるようにする (#1282)
  • Line をレンダリングするときに最初の行にのみスタイルを適用します (#1247)
  • 絵文字がレンダリングされるようにします (#1258)
  • 行動規範を追加します (#1279)

“If you are what you eat, then I only want to eat the good stuff.” – Remy