Dynamically replace Atom version in application menu

Fixes #952
This commit is contained in:
Matt Colyer 2013-10-11 10:46:26 -07:00
parent ff8577b7d6
commit 9b7bc34d44
2 changed files with 27 additions and 9 deletions

View File

@ -3,7 +3,7 @@
label: 'Atom'
submenu: [
{ label: 'About Atom', command: 'application:about' }
{ label: "Version #{@version}", enabled: false }
{ label: "VERSION", enabled: false }
{ label: "Install update", command: 'application:install-update', visible: false }
{ type: 'separator' }
{ label: 'Preferences...', command: 'application:show-settings' }

View File

@ -24,7 +24,8 @@ class ApplicationMenu
# An Object where the keys are commands and the values are Arrays containing
# the keystrokes.
update: (template, keystrokesByCommand) ->
@translateTemplate template, keystrokesByCommand
@translateTemplate(template, keystrokesByCommand)
@substituteVersion(template)
@menu = Menu.buildFromTemplate(template)
Menu.setApplicationMenu(@menu)
@ -34,11 +35,24 @@ class ApplicationMenu
# A complete menu configuration object for atom-shell's menu API.
#
# Returns an Array of native menu items.
allItems: (menu=@menu) ->
flattenMenuItems: (menu) ->
items = []
for index, item of menu.items or {}
items.push(item)
items = items.concat(@allItems(item.submenu)) if item.submenu
items = items.concat(@flattenMenuItems(item.submenu)) if item.submenu
items
# Private: Flattens the given menu template into an single Array.
#
# * template:
# An object describing the menu item.
#
# Returns an Array of native menu items.
flattenMenuTemplate: (template) ->
items = []
for item in template
items.push(item)
items = items.concat(@flattenMenuTemplate(item.submenu)) if item.submenu
items
# Public: Used to make all window related menu items are active.
@ -47,9 +61,14 @@ class ApplicationMenu
# If true enables all window specific items, if false disables all window
# specific items.
enableWindowSpecificItems: (enable) ->
for item in @allItems()
for item in @flattenMenuItems(@menu)
item.enabled = enable if item.metadata?['windowSpecific']
# Private: Replaces VERSION with the current version.
substituteVersion: (template) ->
if (item = _.find(@flattenMenuTemplate(template), (i) -> i.label == 'VERSION'))
item.label = "Version #{@version}"
# Public: Makes the download menu item visible if available.
#
# Note: The update menu item's must match 'Install update' exactly otherwise
@ -60,10 +79,9 @@ class ApplicationMenu
# * quitAndUpdateCallback:
# Function to call when the install menu item has been clicked.
showDownloadUpdateItem: (newVersion, quitAndUpdateCallback) ->
downloadUpdateItem = _.find @allItems(), (item) -> item.label == 'Install update'
if downloadUpdateItem
downloadUpdateItem.visible = true
downloadUpdateItem.click = quitAndUpdateCallback
if (item = _.find(@flattenMenuItems(@menu), (i) -> i.label == 'Install update'))
item.visible = true
item.click = quitAndUpdateCallback
# Private: Default list of menu items.
#