araMenu

「メニュー表示→選択実行」をお手軽に実現できる様に、araMenu.rb というのを作って使っている。

例えば、

a = %w(http://www.goo.ne.jp http://www.yahoo.co.jp http://google.com)
AraMenu.new(a).select{|i| `fiber #{a[i]}`}

てな感じで実行すると、渡した配列をメニューにして画面上に表示され、メニューを選択するとその番号に従って与えたブロックが実行されるだけのスクリプト。上記の場合だと、指定されたURLがブラウザで表示される。

このスクリプト、メニューを表示するメソッドが選択できる様になっていて、現在のところ、
Ruby/Tk、Tcl/Tk、vruby、curses、Qt
のいずれかが選択できる。つまり、Windows環境、Linux環境、CLI環境、LinuxZaurus環境のそれぞれで、同じスクリプトがそのまま実行できる様になってる。

class AraMenu
  def initialize(menu, how = nil)
    @menu = menu
    if how == nil
      case RUBY_PLATFORM
      when 'arm-linux';  @how = 'qt'
      when 'i386-cygwin';@how = 'tk'
      when 'i386-mswin32';@how = 'vr'
      else @how = 'cu'
      end
    else
      @how = how
    end
  end

  def select(&block)
    case @how
    when 'tk'; select_tk(&block)
    when 'tcltk'; select_tcltk(&block)
    when 'qt'; select_qt(&block)
    when 'vr'; select_vr(&block)
    else select_cu(&block)
    end
  end

  def select_tcltk(&block)
    open("|wish","r+") do |f|
      @menu.size.times do |i|
        f.printf "button .b%d -text {%s} -command { puts {%d} }\n",i,@menu[i],i
        f.printf "pack .b%d\n",i
      end
      f.flush
      while s = f.gets
        if block
          block.call(s.to_i)
        else
          return s.to_i
        end
      end
    end
  end

  def select_vr(&block)
    require 'vr/vruby'
    require "vr/vrcontrol"
    frm = VRLocalScreen.newform
    $menu = @menu
    $block = block
    $ret = 0
    def frm.construct
      self.caption= "VisualuRuby Sample1"
      $menu.size.times do |i|
        addControl(VRButton,"b"+i.to_s,$menu[i],4,20*i,940,18)
      end
# …以下略…

こんな感じ。

美しくない。