本文へスキップ

はじめに

#動作要件

  • macOS 14 以降
  • Rust 1.90 以降
  • Bun 1.4 以降
  • Xcode Command Line Tools(xcode-select --install)

現在サポートしている対象は macOS です。

#プロジェクトを作成

bunx @quickgui/cli init my-app --language rust
cd my-app
quickgui dev

init はプロジェクトを作成し、依存関係をインストールします。--language を省略すると、Go、TypeScript、Rust を対話的に選べます。

#最初のウィンドウ

生成された src/main.rs はウィンドウを開きます。状態は View に保持し、変更したあとに cx.invalidate() を呼び出します。

use quickgui::{
    App, AppInfo, Application, Color, EventContext, IntoElement, View, ViewContext, WindowOptions,
    div, text,
};

fn main() -> Result<(), quickgui::AppError> {
    Application::new()
        .app_info(AppInfo::new("My App", "0.1.0", "com.example.my-app").expect("valid identity"))
        .on_reopen(|has_visible_windows, cx| {
            if !has_visible_windows {
                open_window(cx);
            }
        })
        .run(open_window)
}

fn open_window(cx: &mut App) {
    cx.open_window(WindowOptions::new("My App").size(760.0, 520.0), Counter { count: 0 });
}

struct Counter {
    count: usize,
}

impl View for Counter {
    fn render(&mut self, cx: &mut ViewContext<'_, Self>) -> impl IntoElement {
        let increment = cx.listener("increment", |this, cx: &mut EventContext| {
            this.count += 1;
            cx.invalidate();
        });
        div()
            .size_full()
            .flex_col()
            .items_center()
            .justify_center()
            .gap_3()
            .child(text(format!("Count: {}", self.count)))
            .child(
                div()
                    .on_click(increment)
                    .px_4()
                    .py_2()
                    .rounded_lg()
                    .bg(Color::rgb8(37, 99, 235))
                    .child("Increment"),
            )
    }
}

表示中のウィンドウがないときに Dock アイコンをクリックすると、on_reopen がウィンドウを開き直します。

#実行とビルド

quickgui check
quickgui test
quickgui fmt
quickgui dev
quickgui build

dev は編集に合わせて再ビルドします。build はパッケージ済みアプリを dist/ に書き出します。

#次のステップ