RustでGUIプログラミング – Icedでtourを触りつつ日本語表示対応をしてみた

RustでGUIプログラミングを触ってみました。MacOS向けのXCode+ObjectiveC実装は難儀しましたが、Rustは比較的手軽な感じです。
2021.03.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Rustを使ってみて、実行ファイル形式はやはり手軽だなーと感じるこの頃です。ただ、毎回ターミナル上での操作となるので「たまにはフォーム形式でやってみたい」と思いました。

RustにもGUIのライブラリが幾つかあり、そのうちの一つIcedを弄ってみることにしました。

Icedを選んだワケ

知名度があると思われるRustのGUIライブラリとして、conrod、druid、OrbTk、azul等があります。それぞれに特徴がありつつも、日本語が十二分に使えるのはconrodのみのようです。

ですが、上記記事にてconrod版を軽快に動かしたい場合に推奨されているvulkanは、MacOSの場合だと動作環境の都合でmetalにする必要があります。

他に何かないかなと検索してみたところ、実践Rustプログラミング入門の中身検索にてIcedを見つけました。クロスプラットフォーム対応により1つの説明で色々カバーできそうという点にて今回の選択としています。

チュートリアルをやってみる

GUIプログラミングは「とても難しそう」という感想がでてきそうですが、こなれたGUI用ライブラリを使えばそんなことはありません

リポジトリのREADMEにかかれているサンプルコードは不足している点もあり動作しません。examples/以下のコードを使ってみましょう。

tourを動かす

たくさんのサンプルがありますが、Icedができることを見る場合にはtourで十分でしょう。

git clone git@github.com:hecrj/iced.git
cd iced/
cargo run --package tour

操作可能なデモが始まります。

そのうちの一つに日本語を入力すると文字化けするデモがあります。

正常表示されるように日本語対応してみましょう。

tourを日本語表示対応してみる

上記issueを参考に、日本語用フォントをダウンロードしてソースコードにて参照させます。

今回は個人・商用サイトで無料利用可能なマメロン Hi-Regularにしました。

ダウンロード後、tour内にfontsディレクトリを追加してコピーします。

% mkdir examples/tour/fonts/
% cp ~/Downloads/mamelon_hireg/Mamelon-5-Hi-Regular.otf examples/tour/fonts/

次にsrc/main.rsに手を入れます。

% vim examples/tour/src/main.rs

 pub fn main() -> iced::Result {
     env_logger::init();

-    Tour::run(Settings::default())
+    Tour::run(Settings {
+        default_font: Some(include_bytes!("../fonts/Mamelon-5-Hi-Regular.otf")),
+        ..Settings::default()
+    })
 }

再度デモを実行しましょう。

文字が正常に表示されました。

その他のサンプル

todoやQRコードジェネレータ等、実用に近いサンプルも多数あります。実行はtourと同じく以下のコマンドで可能です。

cargo run --package <sample>

日本語を使いたい場合には同様に設定が必要です。

あとがき

MacOSによるGUIアプリケーションの作成はXCodeによるObjective-C開発の頃から時折触っていましたが、個人的に馴染みにくく感じていました。Rustでのプログラミングに慣れてきたら、Iced等を使ったGUIプログラミングに手を出してみると出来る事の幅が広がるかもしれません。

conrodについても少し触ってみましたが、現時点でmetalを用いてのビルドは未達の状態です。ビルドに成功したら記事として挙げてみようと思います。

参考リンク