2011年1月31日月曜日

MacRuby・Snatcher・タスクセレクタ

現在起動中のアプリを探して、一覧表示する。で、選択したアプリをアクティブにする機能を考える。

さすが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 件のコメント:

コメントを投稿