Window を Modal Sheet として扱う

このタイトルは、もしかしたらふさわしくないかもしれないが、Save パネルが Window のタイトルバーのところから出てくるように、普通の Window も扱いたい場合のメモ。

まずは、NSWindow のオブジェクトを 2 つ用意する。Interface Builder で NSWindow を 2 つ配置して、スクリプトの方で、@window と @sheet としておく。

ib_outlets :window, :sheet

@sheet にした方は、次のようにオプションを外しておく。Hide On Deactivate はどちらでもいい。

スクリプトでは、NSApplicationbeginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo(sheet,window,delegate,selector,info) を使う。この sheet を呼び出したいメソッドの中で使う。

NSApplication.sharedApplication.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo(@sheet,@window,self,nil,nil)

ボタンをクリックしたら、この Sheet をしまうために、@sheet の上にボタンを配置する。そして、runScript という名の(何でもいい)メソッドを作り、ボタンと結びつける。

def runScript(sender)

処理

end

ib_action :runScript

このメソッドに実行したい処理を書くのだが、その前に、close でウィンドウを閉じて、NSApplicationendSheet(sheet) というメソッドで、sheet としての役割を終わらせる。これを使わないと、次回にこの sheet を呼び出しても開かない。

@sheet.close

NSApplication.sharedApplication.endSheet(@sheet)

まとめてみると、@window にボタンを配置して、openSheet というメソッドを割り当ててみる。

ib_outlets :window, :sheet

def openSheet(sender)

NSApplication.sharedApplication.beginSheet_modalForWindow_modalDelegate_didEndSelector_contextInfo(@sheet,@window,self,nil,nil)

end

ib_action :openSheet

def runScript(sender)

@sheet.close

NSApplication.sharedApplication.endSheet(@sheet)

処理

end

ib_action :runScript