Skip to content

Commit 9ae6bb7

Browse files
committed
Pass application to each action's initializer
1 parent 0bc2aae commit 9ae6bb7

8 files changed

Lines changed: 68 additions & 23 deletions

OpenSim/ActionMenu.swift

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@ final class ActionMenu: NSMenu {
1212

1313
private weak var application: Application!
1414

15-
private static let standardActions: [ApplicationActionable] = [
16-
RevealInFinderAction(),
17-
CopyToPasteboardAction(),
18-
OpenInTerminalAction(),
19-
UninstallAction()
15+
private static let standardActions: [ApplicationActionable.Type] = [
16+
RevealInFinderAction.self,
17+
CopyToPasteboardAction.self,
18+
OpenInTerminalAction.self,
19+
UninstallAction.self
2020
]
2121

22-
private static let extraActions: [ApplicationActionable] = [
23-
OpenInItermAction(),
24-
OpenRealmAction()
22+
private static let extraActions: [ApplicationActionable.Type] = [
23+
OpenInItermAction.self,
24+
OpenRealmAction.self
2525
]
2626

2727
private var appInfoItem: NSMenuItem {
@@ -43,8 +43,10 @@ final class ActionMenu: NSMenu {
4343
}
4444

4545
private func buildMenuItems() {
46-
self.buildMenuSection(title: NSLocalizedString("Actions", comment: ""), actions: ActionMenu.standardActions)
47-
self.buildMenuSection(title: NSLocalizedString("Extensions", comment: ""), actions: ActionMenu.extraActions)
46+
let createAction: (ApplicationActionable.Type) -> ApplicationActionable = { $0.init(application: self.application) }
47+
48+
self.buildMenuSection(title: NSLocalizedString("Actions", comment: ""), actions: ActionMenu.standardActions.map(createAction))
49+
self.buildMenuSection(title: NSLocalizedString("Extensions", comment: ""), actions: ActionMenu.extraActions.map(createAction))
4850
self.addItem(self.buildSectionTitle(title: NSLocalizedString("App Information", comment: "")))
4951
self.addItem(appInfoItem)
5052
}
@@ -79,7 +81,7 @@ final class ActionMenu: NSMenu {
7981
}
8082

8183
@objc private func actionMenuItemClicked(_ sender: NSMenuItem) {
82-
(sender.representedObject as? ApplicationActionable)?.perform(with: application)
84+
(sender.representedObject as? ApplicationActionable)?.perform()
8385
}
8486

8587
}

OpenSim/ApplicationActionable.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,16 @@ import Cocoa
1010

1111
protocol ApplicationActionable {
1212

13+
init(application: Application)
14+
15+
var application: Application? { get set }
16+
1317
var title: String { get }
1418

1519
var icon: NSImage? { get }
1620

1721
var isAvailable: Bool { get }
1822

19-
func perform(with application: Application)
23+
func perform()
2024

2125
}

OpenSim/CopyToPasteboardAction.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,20 @@ import Cocoa
1010

1111
final class CopyToPasteboardAction: ApplicationActionable {
1212

13+
var application: Application?
14+
1315
let title = NSLocalizedString("Copy Sandbox Path to Pasteboard", comment: "")
1416

1517
let icon = templatize(#imageLiteral(resourceName: "share"))
1618

1719
let isAvailable: Bool = true
1820

19-
func perform(with application: Application) {
20-
if let url = application.sandboxUrl {
21+
init(application: Application) {
22+
self.application = application
23+
}
24+
25+
func perform() {
26+
if let url = application?.sandboxUrl {
2127
NSPasteboard.general().setString(url.path, forType: NSPasteboardTypeString)
2228
}
2329
}

OpenSim/OpenInItermAction.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,18 @@ import Cocoa
1010

1111
class OpenInItermAction: ExtraApplicationActionable {
1212

13+
var application: Application?
14+
1315
let appBundleIdentifier = "com.googlecode.iterm2"
1416

1517
let title = NSLocalizedString("Open Sandbox in iTerm", comment: "")
1618

17-
func perform(with application: Application) {
18-
if let url = application.sandboxUrl {
19+
required init(application: Application) {
20+
self.application = application
21+
}
22+
23+
func perform() {
24+
if let url = application?.sandboxUrl {
1925
NSWorkspace.shared().openFile(url.path, withApplication: "iTerm")
2026
}
2127
}

OpenSim/OpenInTerminalAction.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,20 @@ import Cocoa
1010

1111
final class OpenInTerminalAction: ApplicationActionable {
1212

13+
var application: Application?
14+
1315
let title = NSLocalizedString("Open Sandbox in Terminal", comment: "")
1416

1517
let icon = templatize(#imageLiteral(resourceName: "terminal"))
1618

1719
let isAvailable = true
1820

19-
func perform(with application: Application) {
20-
if let url = application.sandboxUrl {
21+
init(application: Application) {
22+
self.application = application
23+
}
24+
25+
func perform() {
26+
if let url = application?.sandboxUrl {
2127
NSWorkspace.shared().openFile(url.path, withApplication: "Terminal")
2228
}
2329
}

OpenSim/OpenRealmAction.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,19 @@
88

99
import Cocoa
1010

11-
class OpenRealmAction: ExtraApplicationActionable {
11+
final class OpenRealmAction: ExtraApplicationActionable {
12+
13+
var application: Application?
1214

1315
let appBundleIdentifier = "io.realm.Realm-Browser"
1416

1517
let title = "Open Realm Database"
1618

17-
func perform(with application: Application) {
19+
init(application: Application) {
20+
self.application = application
21+
}
22+
23+
func perform() {
1824

1925
}
2026

OpenSim/RevealInFinderAction.swift

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,20 @@ import Cocoa
1010

1111
final class RevealInFinderAction: ApplicationActionable {
1212

13+
var application: Application?
14+
1315
let title = NSLocalizedString("Reveal Sandbox in Finder", comment: "")
1416

1517
let icon = templatize(#imageLiteral(resourceName: "reveal"))
1618

1719
let isAvailable: Bool = true
1820

19-
func perform(with application: Application) {
20-
if let url = application.sandboxUrl {
21+
init(application: Application) {
22+
self.application = application
23+
}
24+
25+
func perform() {
26+
if let url = application?.sandboxUrl {
2127
NSWorkspace.shared().open(url)
2228
}
2329
}

OpenSim/UninstallAction.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,22 @@ import Cocoa
1010

1111
final class UninstallAction: ApplicationActionable {
1212

13+
var application: Application?
14+
1315
let title = NSLocalizedString("Uninstall…", comment: "")
1416

1517
let icon = templatize(#imageLiteral(resourceName: "uninstall"))
1618

1719
let isAvailable = true
1820

19-
func perform(with application: Application) {
21+
init(application: Application) {
22+
self.application = application
23+
}
24+
25+
func perform() {
26+
guard let application = application else {
27+
return
28+
}
2029
let alert: NSAlert = NSAlert()
2130
let alertFormat = "Are you sure you want to uninstall %1$@ from %1$@?"
2231
alert.messageText = String(format: NSLocalizedString(alertFormat, comment: ""), application.bundleDisplayName, application.device.name)

0 commit comments

Comments
 (0)