Skip to content

v0.25.0

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

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

Ratatui Webサイト📚

Webサイト全体を刷新し(ratatui.rs) with Astro を使用して、ドキュメント/チュートリアルを更新しました。

image

チェックアウトをお勧めするセクションの一部は次のとおりです。

すべてのコードは https://github.com/ratatui/ratatui-website で利用できます

私たちのウェブサイトに貢献することに興味があるなら、 good first issues here をチェックしてください!


Awesome Ratatui 🦀

ratatui で構築された素晴らしいアプリケーション/ライブラリをキュレートするための素晴らしいリストを作成しました!

参照: https://github.com/ratatui/awesome-ratatui

Ratatui で構築した/Ratatui 用に構築したものがある方は、お気軽に このリストに追加 してください!


Ratatuiテンプレート📝

利用可能な ratatui テンプレートを 1 つのリポジトリに集めました: https://github.com/ratatui/templates

現在、2 つのテンプレートがあります:

  • シンプル: シンプルな ratatui アプリケーションをすばやくブートストラップするためのテンプレート。
  • 非同期: tokiotracing などのクレートを使用して非同期 ratatui アプリケーションを作成する、より高度なテンプレート。

これらは、次のように cargo-generate で使用できます:

Terminal window
cargo generate ratatui/ratatui-template

このリポジトリはまだ構築中ですので、お気軽にご覧ください。さらに、別のテンプレートがあり、貢献することに興味がある場合は本当に感謝しています。


New/Updated Examples 🆕

ハーフブロックを使用して大きなテキストをレンダリングする方法を示す新しい例 (ratatui-logo) を追加しました。

ratatui-logo

また、アニメーションと FPS カウンターを追加するために、colors_rgb 例を更新しました。


List: Better Construction ✨

List::newIntoIterator<Item = Into<ListItem>> を受け入れるようになりました。

List::new(["Item 1", "Item 2"])

ただし、この変更により、 IntoIterator のコンパイルエラーが不定のアイテム (空のベクトルなど) を使用します。

let list = List::new(vec![]);
// instead, this should be:
let list = List::default();

リスト: ラインアライメント📏

List ウィジェットは Line の配置を尊重し、期待どおりにレンダリングするようになりました。

例えば:

let items = [
Line::from("Left").alignment(Alignment::Left),
Line::from("Center").alignment(Alignment::Center),
Line::from("Right").alignment(Alignment::Right),
]

リストになります:

Left
Center
Right

リスト: start_corner -> direction

以前の名前 start_corner では、メソッドの意図が明確に伝わりませんでした。

新しいメソッド List::direction と新しい列挙型 ListDirection が追加されました。

List::start_corner は非推奨になりました。


Layout: Better Construction ✨

ビルダー パターンを使用して一般的に構成される最も一般的なパラメーターである、方向と制約のリストを含むレイアウトを作成するための便利な関数を追加しました。

let layout = Layout::new(Direction::Horizontal, [
Constraint::Percentage(50),
Constraint::Percentage(50),
]);

制約は、制約の任意のイテレータとして渡すことができます。


Layout: 塗りつぶしの構成を許可する

レイアウト分割は、通常、split() が呼び出されたときに残りの領域を埋めます。

この機能により、呼び出し側が Rect に追加のスペースを割り当てる方法を設定できるようになりました。これは、呼び出し側が Rect の 1 つに固定サイズを設定し、残りのスペースを他の Rect で埋めたい場合に便利です。

この機能を使用するには、Cargo.tomlunstable または unstable-segment-size 機能フラグを追加します。

その理由は、型の正確な名前がまだバイクシェッド中であるためです。

デフォルトの動作は SegmentSize::LastTakesRemainder で、最後のセグメントに残りのスペースが割り当てられます。

Layout::new(
Direction::Horizontal,
[Constraint::Percentage(50), Constraint::Percentage(25)],
)
.split(frame.size());

SegmentSize::LastTakesRemainder

SegmentSize::None はこの動作を無効にします。

Layout::new(
Direction::Horizontal,
[Constraint::Percentage(50), Constraint::Percentage(25)],
)
.segment_size(layout::SegmentSize::None)
.split(frame.size());

SegmentSize::None

残りのスペースを均等に埋めるようにレイアウトを構成するには、 Layout::segment_size(SegmentSize::EvenDistribution) を使用します。

詳細については、 Layout::segment_size() および layout::SegmentSize のドキュメントを参照してください。


Table: Segment Size 🗃️

前のエントリと同様に、これはテーブルに対して Layout::segment_size と同じように機能します。

let widths = [Constraint::Min(10), Constraint::Min(10), Constraint::Min(10)];
let table = Table::new([])
.widths(widths)
.segment_size(SegmentSize::LastTakesRemainder);

これは、制約の少ないテーブルに追加のスペースを配分する方法を制御します。デフォルトの従来の動作では、追加スペースは未使用のままになります。

新しいオプションは、スペースをすべて使用できる右端の列に割り当て る LastTakesRemainder と、スペースをすべての列に分配する EvenDistribution です。


表: 幅の改善✨

Table::new() は、列の幅を指定する必要があります

以前は、Table は幅なしで構築できました。ほとんどの場合、これはエラーになるため、widths パラメータを必須にしました。

つまり、既存のコードを次のように更新する必要があります。

Table::new(rows).widths(widths)
Table::new(rows, widths)

自動置換を容易にするために、この変更によって壊れたコードの量が多い場合や複雑な場合は、Table::newTable::default().rows に置き換えると便利な場合があります。

Table::new(rows).block(block).widths(widths);
Table::default().rows(rows).block(block).widths(widths)

Table::widths()AsRef<[Constraint]> を受け入れるようになりました

これにより、制約の配列、スライス、または Vec を渡すことが可能になり、常にスライスである必要がある場合よりも人間工学的に優れています。

Table::default().widths([Constraint::Length(5), Constraint::Length(5)]);
Table::default().widths(&[Constraint::Length(5), Constraint::Length(5)]);
// widths could also be computed at runtime
let widths = vec![Constraint::Length(5), Constraint::Length(5)];
Table::default().widths(widths.clone());
Table::default().widths(&widths);

Constraint Helpers 🆘

u16 値のイテレータから特定の Constraint 型に変換するヘルパー メソッドを追加しました。

これにより、次のような制約を簡単に作成できます。

// a fixed layout
let constraints = Constraint::from_lengths([10, 20, 10]);
// a centered layout
let constraints = Constraint::from_ratios([(1, 4), (1, 2), (1, 4)]);
let constraints = Constraint::from_percentages([25, 50, 25]);
// a centered layout with a minimum size
let constraints = Constraint::from_mins([0, 100, 0]);
// a sidebar / main layout with maximum sizes
let constraints = Constraint::from_maxes([30, 200]);

段落: line_countline_width 📏

レンダリングされた段落に関する情報を取得するのに役立つ新しい不安定な機能が追加されました

次のメソッドにアクセスするには、unstable または unstable-rendered-line-info 機能フラグを有効にします:

  • Paragraph::line_count: 境界幅を受け取り、レンダリング時に段落全体を表示するために必要な行数を返します。このメソッドの目的は、スクロールバーで使用することです。段落に折り返しテキストがある場合、必要な行数を取得することは現時点では不可能です。
  • Paragraph::line_width: 段落のすべての行を完全に表示するために必要な最小の行幅を返します。これは単に最大行幅です。

これら 2 つのメソッドを組み合わせて、段落の最小境界ボックスを計算できます。 これらは実験的なものであり、将来変更される可能性があることに注意してください。


Rect: offset 📐

Rect には offset という新しいメソッドがあり、これを使用して、x 方向と y 方向に指定された量だけ移動する新しい Rect を作成できます。これらの値は正または負の値にすることができます。これは、手動レイアウト タスクに役立ちます。

let rect = area.offset(Offset { x: 10, y -10 });

IntoIterator 制約のための

LayoutTable は、AsRef<Constraint> である Item を持つ制約に対して IntoIterator を受け入れるようになりました。

これにより、配列、ベクター、スライス、イテレータなど、ほぼすべての制約のコレクションをレイアウト関数に渡すことができます (collect() を呼び出す必要はありません)。

let layout = Layout::default().constraints([Constraint::Min(0)]);
let layout = Layout::default().constraints(&[Constraint::Min(0)]);
let layout = Layout::default().constraints(vec![Constraint::Min(0)]);
let layout = Layout::default().constraints([Constraint::Min(0)].iter().filter(|_| true));
let layout = Layout::default().constraints([1,2,3].iter().map(|&c| Constraint::Length(c)));

Chart: Legend Position 📊

Chart には legend_position という新しい setter メソッドがあります。

let chart: Chart = Chart::new(vec![])
.legend_position(Some(LegendPosition::TopLeft));

他の可能な値については、Chart::LegendPosition を参照してください。


デフォルトのハイライトスタイル🎨

以前は、デフォルトの highlight_styleStyle::default() に設定されていました。つまり、ハイライト スタイルは通常のスタイルと同じでした。

つまり、たとえば、デフォルト構成の Tabs ウィジェットでは、選択されたタブの表示は表示されません。

現在は、highlight_style をデフォルトで反転スタイル (Style::new().reversed()) に設定しています。


Tab: Custom Padding 📇

Tab ウィジェットに padding_left プロパティと padding_right プロパティが追加されました。

これらの値は、Into<Line> を受け入れる関数 padding_left()padding_right()、および padding() を使用して設定できます。

便宜上、padding メソッドを使用して左/右のパディングを適宜設定することもできます。

// A space on either side of the tabs.
let tabs = Tabs::new(vec!["Tab 1", "Tab 2"]).padding(" ", " ");
/// Nothing on either side of the tabs.
let tabs = Tabs::new(vec!["Tab 1", "Tab 2"]).padding("", "");

Cell::symbol 🚫を非難する

Cell::symbol フィールドは、getter メソッド (symbol()) を介してアクセスできるようになりました。これにより、Stringcompact_str に置き換えるなど、Cell 内部に将来的な変更を加えることができます。

cell.symbol
cell.symbol()

Remove Deprecated Items 💀

0.10 以降非推奨となった Axis::title_styleBuffer::set_background を削除しました。


他の💼

  • 新しいセッターメソッドを追加: Span::contentSpan::style
  • Style 関連構造体に crossterm/termionFrom trait を実装
  • バグを修正し、高さの上限を削除するために Terminalinsert_before メソッドを書き直す
  • リフローモジュールに WrappedLine 構造体を追加する
  • SparklineChartListItem およびコードベースの他の多くの部分にドキュメントを追加する
  • 自然な読み取り順序を尊重するようにモジュール/ドキュメントを再編成する
  • ウィジェットから不要な動的ディスパッチとヒープ割り当てを削除する
  • 例に Vim キーバインディング (移動) を追加する
  • 流暢なセッターメソッドに #[must_use] を追加する
  • セキュリティポリシー を作成する
  • MSRV を次のものにアップグレードする1.70.0

最後に、@Valentin271 をメンテナーとして迎え入れます! 🥳


新しいソーシャル🌐

ratatui のために、次のソーシャルメディアプレゼンスを作成しました。

最新の ratatui ニュースやその他のクールなものをフォローしてください!


Githubスポンサー💖

私たちは、私たちの組織のためにGithubスポンサーを有効にしました: https://github.com/sponsors/ratatui

私たちの使命は、開発者がよりインタラクティブで視覚的にリッチなコマンドライン>ターミナルユーザーインターフェイス (TUIS) を作成できるようにすることです。Ratatuiを後援することで、あなたはプロジェクトに資金を提供するだけではありません。あなたは、Rustのターミナルアプリケーションの生態系をより良くするのを手伝っています。