Archive for the 'NSStatusBar' Category

2017/03/03 ステータスバーのじっけん2

macOSのメニューバー上にステータスバー・アイテムを作成するAppleScriptです。

AppleScriptからステータスバーを作成し、メニューを作成・登録できることを確認しましたが、アプレットで実行するのは面倒なのでScript Editor上でそのまま実行できるようにしてみました。

stat10.png

実行・呼び出しに問題があるのではなく、どちらかといえばステータスバー自体を消去する手段を通常のAppleScriptでは用意できなかったことに問題がありました。

そこで、自分で作ったステータスバーのメニューに「Quit」項目を用意し、ステータスバーアイテムの抹消を行えるようにしてみました。

メニュー自体にはCommand Keyなどの指定も行えるのですが、ステータスバー・アイテムだとキーボード・ショートカットを取得できないようで(他のツール類もそんな感じ)、そういうもののようです。

AppleScript名:ステータスバーのじっけん2
– Created 2017-03-03 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4502

property aStatusItem : missing value

on run
  init() of me
end run

on init()
  set aList to {“Piyomaru”, “Software”, “”, “Takaaki”, “Naganoya”, “”, “Quit”}
  
  
set aStatusItem to current application’s NSStatusBar’s systemStatusBar()’s statusItemWithLength:(current application’s NSVariableStatusItemLength)
  
  
aStatusItem’s setTitle:🚗
  
aStatusItem’s setHighlightMode:true
  
aStatusItem’s setMenu:(createMenu(aList) of me)
end init

on createMenu(aList)
  set aMenu to current application’s NSMenu’s alloc()’s init()
  
set aCount to 1
  
  
repeat with i in aList
    set j to contents of i
    
if j is not equal to “” then
      set aMenuItem to (current application’s NSMenuItem’s alloc()’s initWithTitle:j action:“actionHandler:” keyEquivalent:“”)
    else
      set aMenuItem to (current application’s NSMenuItem’s separatorItem())
    end if
    (
aMenuItem’s setTarget:me)
    (
aMenuItem’s setTag:aCount)
    (
aMenu’s addItem:aMenuItem)
    
    
if j is not equal to “” then
      set aCount to aCount + 1
    end if
  end repeat
  
  
return aMenu
end createMenu

on actionHandler:sender
  set aTag to tag of sender as integer
  
set aTitle to title of sender as string
  
  
if aTitle is not equal to “Quit” then
    display dialog aTag as string
  else
    current application’s NSStatusBar’s systemStatusBar()’s removeStatusItem:aStatusItem
  end if
end actionHandler:

★Click Here to Open This Script 

2017/03/03 ステータスバーのじっけん

macOSのメニューバー上にステータスバー・アイテムを作成するAppleScriptです。

初心者にAppleScriptで何を作りたいか聞くと、けっこうな確率で「ステータスバーにメニューを表示するものが作りたい」と答えられてゲッソリします。ステータスバーにメニューを作成することがいかに難しいことか(Xcodeを使わないと無理だったので)。

Script Editor上でASOCが使えるようになって「そういえばステータスバーはどうなった?」と確認してみたら、あっけないほど簡単にAppleScriptで書けるようになっていました(^ー^;;;;

stat1.png

stat2.png

本AppleScriptを実行すると、ステータスバーおよびそこにブラ下げたメニューを表示し、メニュー項目を選択すると、上から順に割り振ったTag No.を表示します。つまり、個別に識別できていることの確認です。

30秒たつと実行が終了し、ステータスバーが消えます。本当は表示させたまま放置も可能ですが、再実行するたびにステータスバー・アイテムが増加していってしまうので、

stat3.png

消すことだけは明示的に行う必要があります(実験してみたところ5個までは増える様子)。もし、手違いでいくつもステータスバー・アイテムを作ってしまっても、Script Editorを終了させれば消えます。

AppleScriptをアプレットとして実行させれば、on quitハンドラで自分の表示させたステータスバーアイテムを削除するようにして、かなり簡単にステータスバー用のAppleScriptアプレットを作れることでしょう。

AppleScript名:ステータスバーのじっけん
– Created 2017-03-03 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”
–http://piyocast.com/as/archives/4495

set aList to {“Piyomaru”, “Software”, “”, “Takaaki”, “Naganoya”}

set aStatusItem to current application’s NSStatusBar’s systemStatusBar()’s statusItemWithLength:(current application’s NSVariableStatusItemLength)

aStatusItem’s setTitle:😀
aStatusItem’s setHighlightMode:true
aStatusItem’s setMenu:(createMenu(aList) of me)

delay 30

set aStatusItem to current application’s NSStatusBar’s systemStatusBar()’s removeStatusItem:aStatusItem

on createMenu(aList)
  set aMenu to current application’s NSMenu’s alloc()’s init()
  
set aCount to 1
  
  
repeat with i in aList
    set j to contents of i
    
if j is not equal to “” then
      set aMenuItem to (current application’s NSMenuItem’s alloc()’s initWithTitle:j action:“actionHandler:” keyEquivalent:“”)
    else
      set aMenuItem to (current application’s NSMenuItem’s separatorItem())
    end if
    (
aMenuItem’s setTarget:me)
    (
aMenuItem’s setTag:aCount)
    (
aMenu’s addItem:aMenuItem)
    
    
if j is not equal to “” then
      set aCount to aCount + 1
    end if
  end repeat
  
  
return aMenu
end createMenu

on actionHandler:sender
  set aTag to tag of sender as integer
  
display dialog aTag as string
end actionHandler:

★Click Here to Open This Script