Window を Modal Sheet として扱う
このタイトルは、もしかしたらふさわしくないかもしれないが、Save パネルが Window のタイトルバーのところから出てくるように、普通の Window も扱いたい場合のメモ。
まずは、NSWindow のオブジェクトを 2 つ用意する。Interface Builder で NSWindow を 2 つ配置して、スクリプトの方で、@window と @sheet としておく。
ib_outlets :window, :sheet
@sheet にした方は、次のようにオプションを外しておく。Hide On Deactivate はどちらでもいい。
スクリプトでは、NSApplication の beginSheet_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 でウィンドウを閉じて、NSApplication の endSheet(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