Ruby/FLTKの特徴

[Ruby/FLTK]

拡張性

FLTKではすべてのウェジットはFl_Widgetクラスからの派生クラスとして実現さ れています.Fl_Widgetクラスでは描画関数draw()とイベント処理関数handle() そして,サイズ更新関数resize()がvirtualとして定義されており,特に, draw()は抽象関数となっています.これらの関数はそれぞれのサブクラスにおい て再定義して,それぞれのウェジットに合ったものを定義することを目的として いるためです.
Ruby/FLTKでもこの特徴を実現しています.サンプルの draw.rbを例として挙げます.この中のMyCanvasクラスに注目して下さい. MyCanvasはFLTK::Widgetという最も基本的なクラスから派生したクラスです. この中ではdrawというメソッドと,handleというメソッドが再定義されています. drawメソッドは次の通りです.
  def draw
    super()
    clear
    color(FLTK::BLACK)
    @lines.each{|line| line.draw}
  end
派生元のクラスに定義されているdrawメソッドを呼んだ後に,一度ウェジット内 部をクリアし,そして,描画色を黒(FLTK::BLACK)に設定してからそれぞれの線 を描画しています.こうすることで,MyCanvasというウェジットが再描画される ときには常にこのメソッドが呼び出されます. 同様に,イベントを処理するための関数handleは次の通りです.
  def handle(e)
    case e
    when FLTK::PUSH
      return true
    when FLTK::DRAG
      if( @cur )
        @cur.position(FLTK.event_x, FLTK.event_y)
      end
      redraw
      return true
    else
      return false
    end
  end
MyCanvasウェジット内で発生したイベントは最初にこのメソッドに渡されます. この中では,マウスボタンが押されたらドラッグの用意をするためのイベント受 理したものとしてtrueを返します.そして,ドラッグ(FLTK::DRAG)イベントが起 こると,@curに保存された子ウェジットの位置を変更して,そして再描画します. イベントは受理されたのでここでもtrueを返します.その他の場合は,falseを 返して,イベントが子ウェジットに渡されるようにします.
このようなオーバーロードすることで動作を変更することができるメソッドには, Widget#resize, Window#flush, Window#show, Window#hideなどがあります.

描画モジュール FLTK::Drawable

FLTKでは基本的な描画関数のみを用意しています.これらの関数は,トップウィ ンドウの左上を基準点としてピクセル単位で位置を指定します. そのため,それぞれのウェジット内部について描画するためには毎回オフセット を計算しなくてはなりません.これでは面倒なので,Ruby/FLTKでは FLTK::Drawableというモジュールを用意しています.このモジュールをinclude したウェジットは,それぞれのウェジットの左上を基準点とした描画メソッドを 提供します.このため,毎回オフセットを計算する手間が省けます. 例えば,先ほどのdraw.rbのMyCanvasクラスはFLTK::Drawableをincludeしていま す.このため,color()やline()というメソッドが使えるようになっています.

レイアウトマネージャ

FLTKでは,Fl_Packというウェジット内のウェジットを除いて,すべてのウェジッ トはトップウィンドウ内の絶対位置を指定しなければなりません. これでは動的に適切な位置にウェジットを配置するのは非常に難しいです. このためRuby/FLTKでは独自にレイアウトマネージャを保持することを考えてい ます.

PDA -- Agenda VR3

Agenda VR3 というPDA上でRuby/FLTKが動作します.私自身がこのPDAを持ってい るわけではないので詳細は書けませんが,トップページの関連リンクを参照して 下さい.
しかし, Agenda VR3の開発/販売をしていたAgenda Computingがなくなってしまったようです.