A small menubar app that allows you to switch between R versions quickly (if you have multiple versions of R framework installed).
https://rud.is/rswitch
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
5.4 KiB
149 lines
5.4 KiB
//
|
|
// Menu.swift
|
|
// RSwitch
|
|
//
|
|
// Created by hrbrmstr on 8/24/19.
|
|
// Copyright © 2019 Bob Rudis. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
import Cocoa
|
|
|
|
extension AppDelegate: NSMenuDelegate {
|
|
|
|
@objc func toggle_dock_icon(_ sender: NSMenuItem) {
|
|
|
|
Preferences.showDockIcon = !Preferences.showDockIcon
|
|
|
|
DockIcon.standard.setVisibility(Preferences.showDockIcon)
|
|
|
|
if let menu = statusItem.menu, let item = menu.item(withTag: 99) {
|
|
item.state = Preferences.showDockIcon.stateValue
|
|
}
|
|
|
|
}
|
|
|
|
@objc func toggle_hourly_rstudio_check(_ sender: NSMenuItem) {
|
|
|
|
Preferences.hourlyRStudioCheck = !Preferences.hourlyRStudioCheck
|
|
|
|
if (Preferences.hourlyRStudioCheck) { performRStudioCheck(sender) }
|
|
|
|
if let menu = statusItem.menu, let item = menu.item(withTag: 98) {
|
|
item.state = Preferences.hourlyRStudioCheck.stateValue
|
|
}
|
|
|
|
}
|
|
|
|
@objc func toggle_ensure_file_handlers(_ sender: NSMenuItem) {
|
|
|
|
Preferences.ensureFileHandlers = !Preferences.ensureFileHandlers
|
|
|
|
if (Preferences.ensureFileHandlers) { FileAssociationUtils.setHandlers() }
|
|
|
|
if let menu = statusItem.menu, let item = menu.item(withTag: 98) {
|
|
item.state = Preferences.ensureFileHandlers.stateValue
|
|
}
|
|
|
|
}
|
|
|
|
@objc func subscribeToMailingList(_ sender: NSMenuItem) {
|
|
NSWorkspace.shared.open(URL(string: "https://lists.sr.ht/~hrbrmstr/rswitch")!)
|
|
}
|
|
|
|
func menuWillOpen(_ menu: NSMenu) {
|
|
|
|
if (menu != self.statusMenu) { return }
|
|
|
|
// clear the menu
|
|
menu.removeAllItems()
|
|
|
|
// add selection to open frameworks dir in Finder
|
|
menu.addItem(NSMenuItem(title: "Open R Frameworks Directory", action: #selector(openFrameworksDir), keyEquivalent: ""))
|
|
menu.addItem(NSMenuItem.separator())
|
|
|
|
menu.addItem(NSMenuItem(title: "Current R Version:", action: nil, keyEquivalent: ""))
|
|
|
|
// populate installed versions
|
|
RVersions.populateRVersionsMenu(menu: menu, handler: #selector(handleRSwitch))
|
|
|
|
// Add items to download latest r-devel tarball and latest macOS daily
|
|
menu.addItem(NSMenuItem.separator())
|
|
|
|
let rdevelItem = NSMenuItem(title: NSLocalizedString("Download latest R-devel tarball", comment: "Download latest tarball item"), action: self.rdevel_enabled ? #selector(download_latest_tarball) : nil, keyEquivalent: "")
|
|
rdevelItem.isEnabled = self.rdevel_enabled
|
|
menu.addItem(rdevelItem)
|
|
|
|
let rstudioItem = NSMenuItem(title: NSLocalizedString("Download latest RStudio daily build", comment: "Download latest RStudio item"), action: self.rstudio_enabled ? #selector(download_latest_rstudio) : nil, keyEquivalent: "")
|
|
rstudioItem.isEnabled = self.rstudio_enabled
|
|
menu.addItem(rstudioItem)
|
|
|
|
menu.addItem(NSMenuItem.separator())
|
|
|
|
let refsDropdown = NSMenuItem(title: "Reference Desk", action: nil, keyEquivalent: "")
|
|
let refsSub = NSMenu()
|
|
menu.addItem(refsDropdown)
|
|
menu.setSubmenu(refsSub, for: refsDropdown)
|
|
|
|
// Add items to open various R for macOS pages
|
|
BrowseMenuAction.populateWebItems(menu: refsSub)
|
|
|
|
menu.addItem(NSMenuItem.separator())
|
|
|
|
// Add links to local copies of the R Manuals
|
|
BrowseMenuAction.populateLocalRManualsItems(menu: refsSub)
|
|
|
|
// Add links to free R online books
|
|
BrowseMenuAction.populateRBooksItems(menu: refsSub)
|
|
|
|
// Add running apps
|
|
populateRunningApps(menu: menu)
|
|
|
|
// Add launchers
|
|
AppMenuAction.populateLaunchers(menu: menu)
|
|
|
|
RStudioServerMenuAction.populateRStudioServerSessions(menu: menu, manager: sess)
|
|
|
|
menu.addItem(NSMenuItem.separator())
|
|
|
|
// Toggle Dock Icon
|
|
menu.addItem(NSMenuItem.separator())
|
|
|
|
let prefsDropdown = NSMenuItem(title: "Preferences", action: nil, keyEquivalent: "")
|
|
let prefSub = NSMenu()
|
|
|
|
menu.addItem(prefsDropdown)
|
|
menu.setSubmenu(prefSub, for: prefsDropdown)
|
|
|
|
let dockItem = NSMenuItem(title: "Show Dock Icon", action: #selector(toggle_dock_icon), keyEquivalent: "")
|
|
dockItem.tag = 99
|
|
dockItem.target = self
|
|
dockItem.state = Preferences.showDockIcon.stateValue
|
|
prefSub.addItem(dockItem)
|
|
|
|
let rstudioCheckItem = NSMenuItem(title: "Notify me when a new RStudio Daily is available", action: #selector(toggle_hourly_rstudio_check), keyEquivalent: "")
|
|
rstudioCheckItem.tag = 98
|
|
rstudioCheckItem.target = self
|
|
rstudioCheckItem.state = Preferences.hourlyRStudioCheck.stateValue
|
|
prefSub.addItem(rstudioCheckItem)
|
|
|
|
let fileHandlersCheckItem = NSMenuItem(title: "Ensure RStudio opens R/Rmd files", action: #selector(toggle_ensure_file_handlers), keyEquivalent: "")
|
|
fileHandlersCheckItem.tag = 97
|
|
fileHandlersCheckItem.target = self
|
|
fileHandlersCheckItem.state = Preferences.ensureFileHandlers.stateValue
|
|
prefSub.addItem(fileHandlersCheckItem)
|
|
|
|
menu.addItem(NSMenuItem(title: "Check for update…", action: #selector(checkForUpdate), keyEquivalent: ""))
|
|
menu.addItem(NSMenuItem(title: "Subscribe to mailing list…", action: #selector(subscribeToMailingList), keyEquivalent: ""))
|
|
menu.addItem(NSMenuItem(title: "About RSwitch…", action: #selector(showAbout), keyEquivalent: ""))
|
|
menu.addItem(NSMenuItem(title: "RSwitch Help…", action: #selector(rswitch_help), keyEquivalent: ""))
|
|
|
|
// Add a Quit item
|
|
menu.addItem(NSMenuItem.separator())
|
|
let quitItem = NSMenuItem(title: "Quit", action: #selector(NSApp.terminate), keyEquivalent: "q")
|
|
quitItem.keyEquivalentModifierMask = NSEvent.ModifierFlags.option
|
|
menu.addItem(quitItem)
|
|
|
|
}
|
|
|
|
}
|
|
|