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 📊
GraphType
に Bar
という新しいバリアントを導入しました。これは、データセット内の各ポイントにバーを描画するように設計されています。
let chart = Chart::new(vec![Dataset::default() .data(&data) .marker(symbols::Marker::Dot) .graph_type(GraphType::Bar)]);
非同期の例📚
データを非同期に取得するウィジェットでRatatuiを使用する方法を示す新しい例を追加しました。
コードは here を利用できます。
Barchart: Support Lines 📈
以前は、Axis::labels
は Vec<Span>
を受け入れていました。より柔軟にするために、[Line
] に変換できる任意の型のベクトル (例: &str
、String
、&Line
、Span
など) を受け入れるように変更しました。つまり、型を推測する変換メソッドを使用するコードは、次のように書き直す必要があります。
Axis::default().labels(vec!["a".into(), "b".into()])Axis::default().labels(["a", "b"])
ターミナル: try_draw
✨
Terminal
に try_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
メソッドは、それらが廃止され、それらのデフォルトの実装が存在するため、実装からメソッドを削除できます。
バッファ: cell
、cell_mut
、index
を追加する。
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 cellslet cell = buf[(0, 0)];let cell = buf[Position::new(0, 0)];
// Get symbollet symbol = buf.cell((0, 0)).map(|cell| cell.symbol());let symbol = buf.cell(Position::new(0, 0)).map(|cell| cell.symbol());
// Set symbolbuf[(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 🔽
ListState
と TableState
の両方に新しい 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)List
とTable
をレンダリングするときに余分な割り当てを回避します (#1244 & #1242)Layout
にSize::ZERO
およびPosition::ORIGIN
定数を追加 (#1253)Margin
、Position
、Rect
、Size
の 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