iced (crates.io, GitHub)はRustで書かれたGUIライブラリの1つであり、宣言的なUIの定義が特徴である。

特徴

A cross-platform GUI library for Rust focused on simplicity and type-safety. Inspired by Elm.

日本語にすると、

単純性と型安全性に注視したRustのクラスプラットフォームGUIライブラリ。Elmにインスパイアされました。

となりますね。

クロスプラットフォーム

デスクトップ(Windows、macOS、Linux)とWeb(WebAssembly)で、同じコードで動作します。

また、Rustはクロスコンパイルが可能なので、その点はかなり便利じゃないかな―って思います。

宣言的UI

UIを宣言する形で書く。
つまり、UIを「どう見えるべきか」を宣言的に、単純に書くことができる。

例えば、ボタンやテキストなどをコードで直感的に記述できるよ。

非同期対応

アプリケーション全体が非同期タスク(async)に対応しているので、APIリクエストや長時間かかる処理も簡単に扱える。

よかったね、Rustが非同期対応してて。

プラグイン可能な柔軟性

カスタムウィジェットやスタイルを実装できるので、自由度が高い。

ちなみにこれの実装にはちょっとクセが合ったりします。

バックエンド

icedはバックエンドにwgpuを採用している。
また、パフォーマンスこそまずまずだが、tiny-skiaにも対応している。
iced backend

サンプルコード

icedは、関数型言語Elmのアーキテクチャにインスパイアされて設計されています。

アプリの状態(State)を明確に管理しやすく、UIイベントもスッキリと書くことができます。

構成要素:

  • Model: アプリケーションの状態
  • Message: ユーザーやシステムからのイベント
  • Update: 状態を更新するロジック
  • View: 状態に基づいてUIを描画
#[derive(Default)]
struct Counter {
    value: i32,
}
 
#[derive(Debug, Clone, Copy)]
pub enum Message {
    Increment,
    Decrement,
}
 
 
use iced::widget::{button, column, text, Column};
 
impl Counter {
    pub fn view(&self) -> Column<Message> {
        column![
            button("+").on_press(Message::Increment),
            
            text(self.value).size(50),
            
            button("-").on_press(Message::Decrement),
        ]
    }
	
	pub fn update(&mut self, message: Message) {
        match message {
            Message::Increment => {
                self.value += 1;
            }
            Message::Decrement => {
                self.value -= 1;
            }
        }
    }
}
 
fn main() -> iced::Result {
    iced::run("A cool counter", Counter::update, Counter::view)
}

関数view部分にはマクロと純粋関数を使用しています。ここに関数型言語としての特徴が出てきていますね。

ボタンを押したときのイベントをon_pressで割り当て、イベント発生時にupdate関数が呼び出されます。
self.valueを変更すると、view関数が呼び出されます。

そうやってローテーションしていきます。

0件のページ