最近はmrubyでウォシュレットの噴出を監視するシステムも登場し、「TOTO さん、そろそろ本気で mruby 組み込みウォシュレット 考えてみませんか」と言いたくなる状況です。
さて、そろそろ mruby にも GUI が欲しくなってきたので fltk3 を組み込んでみました。
mattn/mruby-fltk3 - GitHubmrbgems 化してあります。
https://github.com/mattn/mruby-fltk3
まぁまぁ忠実に fltk3 を移植してあります。まだ全ての Widget が書けた訳ではないけど、簡単なアプリケーションを書くくらいなら出来る様になってきたので報告がてら記事にしようと思いました。
FLTK1 系を選んでも良かったのですが、FLTK1 は完全な utf-8 対応ではなく、かつ utf-8 対応した物はサードパーティプロダクトだったりします。fltk2 でも良かったのですが、どうやら最新は fltk3 という事で未来もある fltk3 を採用しました。
全てのオブジェクトは
FLTK3
モジュール配下に入っています。例えばウィンドウを作るのであれば
window = FLTK3::DoubleWindow.new(0, 0, 100, 100, "mruby-fltk3")
window.show
FLTK3::run
こんな感じに。ウィンドウにボタンを足すのであれば begin メソッドと end メソッドの中でインスタンスを生成します。
window = FLTK3::DoubleWindow.new(0, 0, 100, 100, "mruby-fltk3")
window.begin
button = FLTK3::Button.new(10, 10, 80, 30, "click me!")
window.end
window.show
FLTK3::run
begin にブロックを取る場合はブロック内で begin/end を行います。
window = FLTK3::DoubleWindow.new(0, 0, 100, 100, "mruby-fltk3")
window.begin do
button = FLTK3::Button.new(10, 10, 80, 30, "click me!")
end
window.show
FLTK3::run
画像も扱えるので、例えば
window = FLTK3::DoubleWindow.new(100, 100, 400, 430, "mruby-fltk3")
window.begin do
widget = FLTK3::Widget.new(10, 10, 380, 400)
button = FLTK3::Button.new(10, 390, 80, 30, "load file")
button.callback do
fn = FLTK3::file_chooser("image file", "*.{bm,bmp,gif,jpg,pbm,pgm,png,ppm,xbm,xpm}")
image = fn ? FLTK3::SharedImage::get(fn) : nil
if image.w > widget.w || image.h > widget.h
if image.w > image.h
temp = image.copy(widget.w, widget.h * image.h / image.w)
else
temp = image.copy(widget.w * image.w / image.h, widget.h)
end
image.release
image = temp
end
widget.image = image
widget.redraw
end
end
window.show
FLTK3::run
これだけのコードで画像ビューワが出来上がり!なんだか mruby を組み込み用途以外で使ってるの、僕だけなんじゃないかと心配になって来ましたが負けません。戦います。
役にたつかどうか分かりませんが、遊びたい方はどうぞ。