はじめに
GUIアプリを作りたいって思いませんか?
UbuntuではGnomeが標準的な環境で、ここではGTKアプリが広く使われています。Crystal言語でもGTKアプリを使いたいそういう人のためのメモです。
良い資料
いきなりですが、素晴らしい資料のリンクです。
この資料を読みこなせれば、以下の文章は不要といっても過言ではないでしょう。
GTK3か、GTK4か
現在主流なのはGTK3だと思いますが、今後はGTK4が主流になっていくと思われます。GTK3と、GTK4は互換性のない部分も少なくないようで、GTK3のコードはそのままではGTK4で動かないようです。Crystalでは、
を使います。GTK4では、
を利用します。ライブラリの名称が大変わかりにくいことになっていますが、crystal-gobjectはなかなかGTK4に対応しないために、gtk4.crをはじめられたそうで、今後の動向はわかりませんが、現時点では crystal-gobject の開発をまつよりも、gtk4.crを利用するほうが良さそうです。
GUI builder
GTK3ではGladeというGUIビルダーが利用されていました。このGUIビルダーは(私の環境が良くないのかも知れませんが)かなりバグがあるという印象で、しばらく使っているとなにかのタイミングで異常終了してしまうことが多かったです。このツールはC言語で実装されています。
Crystal言語では、Gladeの変わりにCambalacheというツールを利用します。このツールはPythonで実装されており、Gladeよりもかなり安定しているようです。Pythonなのでコードを編集できる人も多く、Gladeよりも継続的なメンテナンスが期待できるかも知れません。
Pythonを利用するGUIツールはインストールが煩雑なことが予想されますが、Flatpakからのインストールが推奨されているようです。スクリプト系言語でGUIツールを作った場合は、Flatpakで配布するのがGTK4のベストプラクティスなのかも知れません。
cambalache の問題点として、Storeに関してまだまだ弱いという点があげられる。TreeStoreやListStoreなどを編集するとなかなかうまくいかない。それに、TreeViewを使おうとすると、Attributeを追加しなければならないようだ。だから、GTK4を利用しようとすると、実際にはXMLを手動でいじる必要性が出てくる。
プロジェクトのはじめかた
shard.yml に gtk4.cr を追加します。
通常のshardsと異なるのは、gtk4はインストールしたあとに bin/gi-crystal を実行してやる必要があります。
基本原則
- 引数はキーワード引数で渡す
- enumは定数で表現する
GUIビルダーとの接続
こんな感じにしてuiファイルを読み込む。少しだけ注意するべきなのは、Cambalacheは2段階のファイル生成になっていて、プロジェクト自体は、cmbという拡張子で保存される。これをXML形式に書き出す必要がある。
builder = Gtk::Builder.new_from_file("#{__DIR__}/../data/tree.cmb.ui")
builderから要素を取り出すときは、 [] を利用するようだ。具体的には、
label = Gtk::Label.cast(builder["label"])
こんな感じである。さらにシグナルに接続しようとするときは、
app.activate_signal.connect(->activate(Gtk::Application))
こんな感じで接続する。
翻訳には po ファイルと gettext が必要である
GResourceはとても便利
Ruby/GTKではGResourceを使う機会はほとんどないと思う。しかしCrystalではGResourceはすごく便利である。これは実行ファイルにデータを直接添付することができる。Rubyの場合はGemファイル(ZIP圧縮)なので、GResourceを使うメリットはほとんどないと思う。
アイコンの作成
アイコンはSVGファイルを用意する。これは、inkscapeなどで作成することが可能である。
デスクトップ
ランチャー用のデスクトップファイルを用意する
インストールはMakefileで
この慣習が本当にいいかわからないけれども、Crystal言語ではMakefileが使われている。
installコマンドなどを使用してインストール時のファイルの配置を直接記述する。
shards build は、--release を受け取ることができる。
つづく
(この記事はもっといろいろ書こうかと思ったのですが、とりあえず上記のチュートリアルに対するググラビリティがあまりよくないと思うので、日本語話者でCrystalのGUIを作成したい人が、チュートリアル記事に到達しやすくするために未完成の状態で、公開にします。もっと勉強が進んでCrystalのGUI作成をかなり理解したら、細かいノウハウは別の記事で公開したいと思います〜)