« テスト環境のディスクイメージをつくる | トップページ | NSTreeController + NSPredicate なサンプル FilteringOutlineEdit »

2006.04.22

NSApplication を使うコードを簡単に

Cocoa では AppKit の多くの機能が、NSApplication に依存している。こういった処理を、RubyCocoa でのスクリプト(アプリケーションでなく)で動作させるのがめんどい。とくにテストコードを書くときに、こういう状況がけっこうある。

サンプルの HelloWorld.rb にあるように、

  1. delegate 用のオブジェクトを用意
  2. NSApplication.sharedApplication で アプリケーションを生成
  3. 2. のアプリケーションの delegate として 1. をセット
  4. アプリケーション を run で実行
  5. (処理が終わったら)アプリケーションを terminate: で終了

とするのがセオリー。これを簡単に扱う方法を、RubyCocoa 側で用意しておくといいかなと思って書いてみた。

 require 'osx/cocoa'
 
 module OSX
 
   class TempDelegate < OSX::NSObject
     attr_accessor :proc
     attr_reader :result
 
     def initialize
       @result = nil
     end
 
     def applicationDidFinishLaunching(notification)
       begin
         @result = @proc.call
       ensure
         OSX::NSApplication.sharedApplication.terminate(self)
       end
     end
   end
 
   def NSApplication.run_with_new_runloop(&proc)
     delegate = TempDelegate.alloc.init
     delegate.proc = proc
     app = NSApplication.sharedApplication
     app.setDelegate(delegate)
     app.run
     return delegate.result
   end
 
 end

使いかたはこんな感じ。

 OSX::NSApplication.run_with_new_runloop {
   # your code
   #  :
 }

ブロック付きメソッドてば便利。メソッドの名前をもうちょっと検討したら、devel で本体に取り込めるか提案してみよう。こういった細かいところも整備していきたいよな。

|

« テスト環境のディスクイメージをつくる | トップページ | NSTreeController + NSPredicate なサンプル FilteringOutlineEdit »