如何:显示复选标记、禁用菜单项、刷新菜单栏
HOW TO: display a check mark, disable a menu item, refresh a menubar
我正在尝试使用带有 applescript 的 menubar/status 脚本在 Mac 上设置一些简单的服务。
上下阅读网络后,记住我是脚本新手,似乎我已经达到了极限,我需要一些帮助...
首先,我想在某个条件下的 menuItem 旁边显示复选标记。在我的示例中,条件是显示分辨率介于 720p 和 1080p 之间。
我根据现有脚本(其中一些我不完全理解)设置了如下菜单栏:
use AppleScript version "2.7"
use scripting additions
use framework "Foundation"
use framework "AppKit"
property aStatusItem : missing value
on init()
set aBar to {"Reset Display", "1080p", "720p", "Open Monitor Preferences...", "", "External Monitor: active", "Quit"}
set aStatusItem to current application's NSStatusBar's systemStatusBar()'s statusItemWithLength:(current application's NSVariableStatusItemLength)
aStatusItem's setTitle:"FTV"
aStatusItem's setHighlightMode:true
aStatusItem's setMenu:(createMenu(aBar) of me)
end init
on createMenu(aList)
set myDisplay to ChkDisplay()
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
if j = myDisplay then (aMenuItem's setState:NSOnState)
(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 repeat
return aMenu
end createMenu
检查显示分辨率的处理程序:
on ChkDisplay()
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane id "com.apple.preference.displays"
end tell
tell application "System Events"
set myDisplay to "720p"
tell table 1 of scroll area 1 of tab group 1 of window "Philips FTV" of process "System Preferences"
if selected of row 1 then set myDisplay to "1080p"
end tell
end tell
tell application "System Preferences" to quit
return myDisplay
end ChkDisplay
基本上我希望复选标记从 720p 移动到 1080p,具体取决于哪个分辨率处于活动状态。如果单击 720p 和 1080p 项目,还将设置显示分辨率。
我的代码 return 有一个错误:NSOnState 未定义...我迷路了。
我的第二个问题是想办法:
a) "grey out"(禁用)一个 menuItem(在这种情况下,项目 "External Monitor: active"
b) 在条件
下将项目更改为 "External Monitor: missing"
我已经尝试过:NSMenuItem highlight:false 和 NSMenuItem enabled:false 并且都 returned 和错误。
另外,我不知道如何刷新菜单and/or一个菜单项。
任何帮助或指点将不胜感激。
我提前感谢任何人花时间让我思考这些问题!
最终解决方案
对于问题 #1,在菜单项旁边显示复选标记,感谢@CJK 的帮助,我找到了一些工作代码:
将if j = myDisplay then (aMenuItem's setState:NSOnState)
替换为
if j = myDisplay then (aMenuItem's setState:1)
或
if j = myDisplay then (aMenuItem's setState:NSOnState)
我还可以使用 NSimage 在菜单项旁边显示任何图像(如果需要,请随时问我)
关于问题#2,enabling/disabling一个菜单项,我也找到了一个工作代码:
在 createMenu(aList) 处理程序中,您需要在重复循环之前添加第二行:
set aMenu to current application's NSMenu's alloc()'s init()
aMenu's setAutoenablesItems:false
然后在重复循环中,到enable/disable一个菜单项:
(aMenuItem's setEnabled:false)
** 最后要刷新菜单项,** 我将代码 aMenu's removeAllItems()
放在 createMenu(aList) 处理程序中,并在我想刷新时调用该处理程序。似乎通过删除脚本开头的 on 运行/ end 运行 ,一切正常!
我正在尝试使用带有 applescript 的 menubar/status 脚本在 Mac 上设置一些简单的服务。 上下阅读网络后,记住我是脚本新手,似乎我已经达到了极限,我需要一些帮助...
首先,我想在某个条件下的 menuItem 旁边显示复选标记。在我的示例中,条件是显示分辨率介于 720p 和 1080p 之间。
我根据现有脚本(其中一些我不完全理解)设置了如下菜单栏:
use AppleScript version "2.7"
use scripting additions
use framework "Foundation"
use framework "AppKit"
property aStatusItem : missing value
on init()
set aBar to {"Reset Display", "1080p", "720p", "Open Monitor Preferences...", "", "External Monitor: active", "Quit"}
set aStatusItem to current application's NSStatusBar's systemStatusBar()'s statusItemWithLength:(current application's NSVariableStatusItemLength)
aStatusItem's setTitle:"FTV"
aStatusItem's setHighlightMode:true
aStatusItem's setMenu:(createMenu(aBar) of me)
end init
on createMenu(aList)
set myDisplay to ChkDisplay()
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
if j = myDisplay then (aMenuItem's setState:NSOnState)
(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 repeat
return aMenu
end createMenu
检查显示分辨率的处理程序:
on ChkDisplay()
tell application "System Preferences"
reveal anchor "displaysDisplayTab" of pane id "com.apple.preference.displays"
end tell
tell application "System Events"
set myDisplay to "720p"
tell table 1 of scroll area 1 of tab group 1 of window "Philips FTV" of process "System Preferences"
if selected of row 1 then set myDisplay to "1080p"
end tell
end tell
tell application "System Preferences" to quit
return myDisplay
end ChkDisplay
基本上我希望复选标记从 720p 移动到 1080p,具体取决于哪个分辨率处于活动状态。如果单击 720p 和 1080p 项目,还将设置显示分辨率。
我的代码 return 有一个错误:NSOnState 未定义...我迷路了。
我的第二个问题是想办法: a) "grey out"(禁用)一个 menuItem(在这种情况下,项目 "External Monitor: active" b) 在条件
下将项目更改为 "External Monitor: missing"我已经尝试过:NSMenuItem highlight:false 和 NSMenuItem enabled:false 并且都 returned 和错误。 另外,我不知道如何刷新菜单and/or一个菜单项。
任何帮助或指点将不胜感激。 我提前感谢任何人花时间让我思考这些问题!
最终解决方案
对于问题 #1,在菜单项旁边显示复选标记,感谢@CJK 的帮助,我找到了一些工作代码:
将if j = myDisplay then (aMenuItem's setState:NSOnState)
替换为
if j = myDisplay then (aMenuItem's setState:1)
或
if j = myDisplay then (aMenuItem's setState:NSOnState)
我还可以使用 NSimage 在菜单项旁边显示任何图像(如果需要,请随时问我)
关于问题#2,enabling/disabling一个菜单项,我也找到了一个工作代码:
在 createMenu(aList) 处理程序中,您需要在重复循环之前添加第二行:
set aMenu to current application's NSMenu's alloc()'s init()
aMenu's setAutoenablesItems:false
然后在重复循环中,到enable/disable一个菜单项:
(aMenuItem's setEnabled:false)
** 最后要刷新菜单项,** 我将代码 aMenu's removeAllItems()
放在 createMenu(aList) 处理程序中,并在我想刷新时调用该处理程序。似乎通过删除脚本开头的 on 运行/ end 运行 ,一切正常!