さすが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) endtask_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 件のコメント:
コメントを投稿