Levanaでとりあえず窓を開く

前回のHello, World!の記事では、メッセージボックスを開いただけで、
全然GUIを扱った実感を受けられなかったかと思いますので、
今日はLevanaで窓を開きましょう。開くだけです。
サイズ変更したり最小化したり閉じたりできますけど、それだけです。


[entry.txt]

require 'all/lua'

frm = lev.frame({title = 'New Window!', w = 640, h = 480})
frm:show()
app.autoloop()


1行目でLevライブラリを呼び出しています。これをしないと、Levanaのラッパー関数が使えません。
3行目で新しいウィンドウクラスを作っています。これはテーブルで必要なフィールドだけ指定できる仕様にしました。
この場合はキャプションにNew Window!と表示され、縦幅640ピクセル、縦幅480ピクセルで作成します。
4行目で作ったウィンドウを表示しています。表示指定しない限りウィンドウは表示されません。
あと、これはメソッド呼び出しなので、frm.show()とするとエラーが出ます。
5行目がイベントループです。昨日の記事で触れましたが、この記事では割愛。
app.autoloop()を呼び出すまでが事実上の初期化処理で、
この関数を呼ぶと、トップウィンドウが閉じられるまで、ループ処理を抜けません。


残念ながら、まだGUIコントロールやOpenGLの描画処理を実装してないので、
ほとんど何も実用的なことができないんですが、これも昨日の話で触れたイベントループに関しては、
app.yield関数を用いて自前のループを作れるように実装しました。
これはwxWidgetsのwxAppBase::Yieldとは違い、
アイドリング処理とイベント処理、タイムスライスの譲歩を含んでいるので、
これを使って描画ループや定期処理が簡単に書けるように実装予定です。
例えば、上の窓を開くサンプルの場合、

require 'lev/all'

frm = lev.frame({title = 'New Window!', w = 640, h = 480})
frm:show()
while (app.top())
  -- ループ毎に行われる任意の処理。何も無い場合、このwhileブロックはapp.autoloop()と等価。
  app.yield()
end

と等価となります。


次回はメニューバーと、メニューコールバックとかについて書こうかな。
メジャーバージョンが0のままの当面は、仕様もコロコロ変わるので気をつけて頂きたいですし、
逆に仕様や関数名とかに不満がある方のご意見は、どんどん取り入れられるかと思います。