さすがxcatsan師匠、私のためにちゃんとサンプルを作ってくれていた。(^^;)
このページの通り作業してみる。
まずInterfaceBuilderでmenuを一つプロジェクトに追加する。それをとりあえずメインの透明ウィンドウ上のViewにOutletでつないでおく。attr_accessor :my_menu、ですな。
書いたメソッドはmouseDownを含めて4つだけ。
def mouseDown(event)
task_set
menu_set
NSMenu.popUpContextMenu(my_menu,withEvent: event ,forView: self)
end
def task_set
@icons.clear
ws=NSWorkspace.sharedWorkspace
ra=ws.launchedApplications
ra.each do |app|
icon=ws.iconForFile(app['NSApplicationPath'])
name=app['NSApplicationName']
icon.setSize(NSMakeSize(32,32))
@icons[name]=icon
end
end
def menu_set
my_menu.removeAllItems
if @icons then
@icons.each do |name,icon|
app_name=name
image=icon
item=NSMenuItem.alloc.init
item.setTitle(name)
item.setImage(image)
item.setTarget(self)
item.setAction("select:")
my_menu.addItem(item)
end
end
end
def select(sender)
#puts "select"+sender.title.to_s
ws=NSWorkspace.sharedWorkspace
ws.launchApplication(sender.title)
end
task_setで起動中のアプリを取得してHashにアプリ名とアイコンを(NSImageで)収め、menu_setでInterfaceBuilderで作っておいたmenuにアイコンとアプリ名をセット、selectでlaunchApplication。非常に簡単。今日の自由時間、2時間程度でできた。popupするメニューにはこうなる。
上が16×16、下が32×32。
ただ、launchApplicationだと期待通りの動作をしないことあると予想される。複数のインスタンスを起動できるappとか。現実にFirefoxだと「一つしか起動できません」という警告ダイアログが表示された。
他のアプリを、ただ単にアクティブにするにはどうするか。明日以降の課題。
今日の収穫は、senderの書き方。
item.setAction("select")
と書くと引数なしの「def select」しか許してもらえない。しかし
item.setAction("select:")
なら引数「sender」があってもOK。「select(sender)」と書けるわけ。ふむ、なるほどなあ。こういうのは実際に書いてみて、いろいろ失敗しないとわかんないよな。
それともうひとつ。rubyの書き方がよくわかっていないことがばれちゃうけど、Hashについてかなり調べました。(^^;)
@icons.each do |name,icon|
というふうにkeyとvalueをいっぺんに取り出すのってすごく便利だ。いいぞruby。(^^;)


0 件のコメント:
コメントを投稿