IUPを使ってみた

GUI

GUIをどうやって用意するか、というのはリッチなIDEを持たない環境で開発する場合において永遠のテーマのように思える。

僕はずっとDelphiでやってきて基本的にはDelphiが気に入っているが、それを除くと今のところいい解決手段は見つけられていない。Visual C++でのダイアログベースの開発はしっくりこないので、今のところ論外ということにしている*1Flashは気に入っているが、Flash Playerが必要になるし、組み込み可能なFlash Playerのオープンな実装がないというのが気がかりだ。Visual Studio.NETではC#が使えるし、C#コンパイルも速いし言語的にも魅力的だが、.NET Frameworkが必要で、再配布は可能だがサイズが20MBほどあるので厄介だと思う。

こうしてみると、僕は以下の点を満たすGUI開発環境を求めているようだ。

  • GUIを変更しても短時間でビルドできること
  • GUIを利用するために特別なランタイムなどを必要としないこと
  • ヴィジュアルデザイナが付属していること

LuaGUI

最近は相変わらずLuaにはまっているため、*2Lua用のGUIツールキットとして使える「IUP」を試してみた。

さすがにヴィジュアルデザイナはないものの、Luaスクリプトである程度シンプルに書ける。個人的にLuaはデータ記述に向いている言語だと思うのだが、それが幸いしているのかもしれない。

IUPのシンプルなコード

たとえば、ボタンを載せたダイアログを作るときはこうだ。

local button = iup.button{ title = "click me" }
local vbox = iup.vbox{ button; }
local dialog = iup.dialog{ vbox }
dialog:showxy( iup.CENTER, iup.CENTER )

IUPでの気がかり

ただ、コントロールの生成の際に「{〜}」でくくるのにちょっと違和感を感じる。これは、実際にはiup.buttonという関数があってそれに引数として{〜}というテーブル型変数を渡す、という意味だ。Luaは括弧なしでも関数を呼び出せるため、こうした記述が可能なのだ。

あと、マルチプラットフォームを意識してのことか、コントロールを絶対座標で配置する、という感覚で作られてはいないようだ。wxWidgetsとかもこういう感じだった気がする。

IUPでイベントハンドラを設定する

コントロールに対してイベントハンドラを記述するときは以下のようになる。

local button = iup.button{ title = "click me" }
function button:action()
    print( "on click" )
end
local vbox = iup.vbox{ button; }
local dialog = iup.dialog{ vbox }
dialog:showxy( iup.CENTER, iup.CENTER )

シンプルなコードであれば、これで十分だと思う。しかし、ボタン生成時にアクションを記述する方法がリファレンスに記載されていないのだろうか。もしかしたら、オープンソースだしリファレンスが整っていないと言うことも考えられるから、何か方法があるんじゃないかと思い、以下のようなコードを書いてみたがだめだった。

function on_click()
    print( "on click" )
end
local button = iup.button{ title = "click me", action = on_click }

個人的にイベントハンドラに対して直接的なコードを書くのはあまり好きじゃないので、*3欲を言えば関数オブジェクト的な振る舞いをするデータを渡したいところだ。

IUPでウィザードを作るには

動的にコントロールを作成して、それをコンテナに追加/削除する方法がうまくいかなかった。iup.Map、iup.Append、iup.Detach、iup.Destroyの使い方と挙動がいまいちよく分からない。一旦作成されて利用されてしまったコントロールやコンテナに対しては、コントロール・コンテナの削除しかうまく出来なかった。

そこで、iup.zboxというのを利用して表示されるコントロール・コンテナを切り替えるだけ、という手法をとることにした。表示されていないコントロール・コンテナの振る舞い*4が気になるが、上記の手法がうまくいかないので仕方なくこれでやることにした。iup.zboxに関しては、サンプルが理解の役に立つ。

最後に

IUPに対する数々の不満点は、日本語で書いても作者たちに届かないだろうから、なんとか英語にしてIUPに対するフィードバックとして送信する必要がある。がんばろうっと・・・。

*1:しっくりこないでは理由にならないので、もっと明示すべきだと思うけど、今俺はLua+IUPについて書きたいため省略する

*2:C/C++コンパイル時間には耐えられそうににない。いっそのこと30分以上かかれば他に何かすることを考えるが、中途半端に5〜10分というのが嫌だ。

*3:GUIとロジックを分離したいため

*4:メモリにどういう状態で存在しているのかを調べ切れていない