NSApplication を使うコードを簡単に
Cocoa では AppKit の多くの機能が、NSApplication に依存している。こういった処理を、RubyCocoa でのスクリプト(アプリケーションでなく)で動作させるのがめんどい。とくにテストコードを書くときに、こういう状況がけっこうある。
サンプルの HelloWorld.rb にあるように、
- delegate 用のオブジェクトを用意
- NSApplication.sharedApplication で アプリケーションを生成
- 2. のアプリケーションの delegate として 1. をセット
- アプリケーション を run で実行
- (処理が終わったら)アプリケーションを 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 で本体に取り込めるか提案してみよう。こういった細かいところも整備していきたいよな。