quvyta-framework
qframe
ターミナルアプリのための Rust フレームワーク。ランタイム、ウィジェット一式、テーマ・アイコン・言語のファイルを、ひとつの見た目の決まりとともに渡します。かたちは色から生まれ、角かっこや罫線文字からは生まれません。
cargo add quvyta-framework最小のアプリケーション
データ、それを描くビュー、それを変える更新。
ランタイムはキーとクリックをメッセージに変え、何かが変わったときだけ描き直します。パッケージ名は quvyta-framework、ライブラリ名は qframe なので、コードでは use qframe::prelude::*; と書きます。
同じアプリはターミナルがまったく無いテストの中でも動きます。キーを押し、クリックし、画面をテキストとして読み返せます。
人が読む文字は言語ファイルに置き、t!("key") で読み出します。例は短くするために素の文字列を使っています。Rust 1.95 以降が必要です。
use qframe::prelude::*;
#[derive(Default)]
struct Counter {
count: i32,
}
#[derive(Clone)]
enum Msg {
Increment,
}
impl App for Counter {
type Msg = Msg;
fn update(&mut self, msg: Msg) -> Command<Msg> {
match msg {
Msg::Increment => self.count += 1,
}
Command::none()
}
fn view(&self, ui: &mut View<'_, Msg>) {
ui.column(|ui| {
ui.add(Text::new(format!("Count: {}", self.count)));
ui.add(Button::new("Add one").variant("primary").on_press(Msg::Increment));
})
.gap(1);
}
}
// テストは同じアプリをターミナル無しで動かします。
let mut app = Harness::new(Counter::default(), 30, 4);
app.press("tab").press("enter");
assert!(app.screen().contains("Count: 1"));
何が付いてくるか
ていねいなターミナルアプリに必要なものすべて。
- ウィジェット
ボタン、リスト、ツリー、テーブル、タブ、フォームとウィザード、日付・時刻・時間の入力欄、ファイルとフォルダーの選択、メニュー、トースト、ツールチップ、コマンドパレット、グラフ、Markdown・コード・ログの表示、そしてターミナル。
- テーマ
Iris、Nordic、Amber、Monochrome。色はすべてテーマから来るので、設定ひとつでアプリ全体が変わります。
- 三つのモードのアイコン
Nerd Font、素の Unicode、ASCII。どのモードでも、グリフはちょうど 1 セル分です。
- 九つの言語
英語、トルコ語、ドイツ語、スペイン語、フランス語、ブラジルポルトガル語、ロシア語、簡体字中国語、日本語を全部品に用意。あなたのアプリの言葉もその隣に置けます。
- キーボードとマウス
どの部品も両方に応え、同じ色調の段階をたどります。静止、ホバー、フォーカス、押下。
- ささやくような動き
時間の長さはテーマから来て、動きを減らす設定はどこでも尊重されます。
四つのテーマ
同じ画面を、四つのテーマで。
色はすべてテーマから来るので、設定ひとつでアプリ全体が変わります。下から選べば同じダッシュボードがその色をまといます。切り替えはラジオボタン四つだけで、スクリプトは使いません。
ショーケース
部品ごとに 1 ページ。
ショーケースをインストールして qframe を実行してください。どの部品にも実演、コード、ガイド、リファレンスがあります。このページの画像はどれも、ターミナル無しで描かれたテスト画面のひとつです。
cargo install quvyta-framework-showcase && qframe