v0.29.0
Ratatui 0.29.0 を発表できることを楽しみにしています!このリリース here の壊れた変更を参照してください。
上記のKickassアニメーションのために、 @dekirsu への大声で大声で叫ぶ!すぐにウェブサイトの改善を開始します!
スパークライン: 空のバースタイル📊
Sparkline
ウィジェットで、空のバーと値が 0 のバーを区別できるようになりました。
前に:
後:
これを実現するために、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_column
と select_cell
を使用します。また、他の便利なメソッドとともに scroll_right_by
と scroll_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:
▛▚▗▀▖▜▘▞▚▝▛▐ ▌▌▛▚▐▀▌▐ ▛▜ ▌▝▄▘▌
█▀▀▄ ▄▀▀▄▝▜▛▘▄▀▀▄▝▜▛▘█ █ ██▀▀▄ █▀▀█ ▐▌ █▀▀█ ▐▌ ▀▄▄▀ █
次のコマンドを使用して例を実行することもできます。
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 ofBlock::new().title("foo");Block::new().title(Line::from("foo"));
Block::new().title(Title::from("foo").position(Position::TOP));// becomes any ofBlock::new().title_top("foo");Block::new().title_top(Line::from("foo"));
Block::new().title(Title::from("foo").position(Position::BOTTOM));// becomes any ofBlock::new().title_bottom("foo");Block::new().title_bottom(Line::from("foo"));
Title
structは、Ratatuiの将来のリリースで削除されます (0.31の可能性が高い) 。
詳細については、 this issue を参照してください。
より良い「デバッグ」出力🐞
Text
、Line
、Span
、Style
のデバッグ出力が改善され、より簡潔で読みやすくなりました。
たとえば、次のコードがあるとします。
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.13
が 0.2.0
として公開されました。これにより、テストも失敗しました。
assert_eq!("👩".width(), 2); // Womanassert_eq!("🔬".width(), 2); // Microscopeassert_eq!("👩🔬".width(), 4); // Woman scientist -> should be 4 but it expect 2
ライブラリに重大な変更があった場合にアプリケーションが壊れるのを避けるため、0.2.0
に固定することでこれらの変更に準拠することにしました。
#1271 のディスカッションを参照してください。
cargoをチェックインロック✔️
Cargo.lock
をリポジトリに追加しました。
これを最新の状態にしておくと、どのバージョンでも使用された同じバージョンのクレートを使用して任意の git バージョンをビルドできます。これを使用しない場合は、現在のバージョンしか使用できません。これにより、semver 互換コードのバグを検出することが難しくなります。
見る:
- https://doc.rust-lang.org/cargo/faq.html#why-have-cargolock-in-version-control
- https://blog.rust-lang.org/2023/08/29/committing-lockfiles.html
他の💼
- 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