diff --git a/OpenSim.xcodeproj/project.pbxproj b/OpenSim.xcodeproj/project.pbxproj index 2271738..d352c49 100644 --- a/OpenSim.xcodeproj/project.pbxproj +++ b/OpenSim.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 312A27FD21A753E600699668 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 312A27FC21A753E600699668 /* Constants.swift */; }; 31A79B15219B81660024DF7B /* Simulator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 31A79B14219B81660024DF7B /* Simulator.swift */; }; 31C4BF3221A8AC56008B97A1 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 31C4BF3021A8AC56008B97A1 /* Localizable.strings */; }; + 78C2C79B2450FE5E007E4560 /* OpenUserDefaultsAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78C2C79A2450FE5E007E4560 /* OpenUserDefaultsAction.swift */; }; AF9D003A1D110E750065AFD0 /* Helper.swift in Sources */ = {isa = PBXBuildFile; fileRef = AF9D00391D110E750065AFD0 /* Helper.swift */; }; B20671202353ECAA00D6ED0D /* SimulatorShutdownMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B206711F2353ECAA00D6ED0D /* SimulatorShutdownMenuItem.swift */; }; B20671222353ECB600D6ED0D /* SimulatorResetMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B20671212353ECB600D6ED0D /* SimulatorResetMenuItem.swift */; }; @@ -50,6 +51,7 @@ 31A79B14219B81660024DF7B /* Simulator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Simulator.swift; sourceTree = ""; }; 31C4BF3121A8AC56008B97A1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/Localizable.strings; sourceTree = ""; }; 31C4BF3421A8AC72008B97A1 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; + 78C2C79A2450FE5E007E4560 /* OpenUserDefaultsAction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenUserDefaultsAction.swift; sourceTree = ""; }; AF9D00391D110E750065AFD0 /* Helper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Helper.swift; sourceTree = ""; }; B206711F2353ECAA00D6ED0D /* SimulatorShutdownMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimulatorShutdownMenuItem.swift; sourceTree = ""; }; B20671212353ECB600D6ED0D /* SimulatorResetMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimulatorResetMenuItem.swift; sourceTree = ""; }; @@ -170,6 +172,7 @@ B39B2B741EBF58EC00CDD74C /* OpenInItermAction.swift */, B39B2B781EBF614400CDD74C /* OpenRealmAction.swift */, 256B782B2278A08500052809 /* LaunchAction.swift */, + 78C2C79A2450FE5E007E4560 /* OpenUserDefaultsAction.swift */, ); name = Actions; sourceTree = ""; @@ -299,6 +302,7 @@ B3E67B5E1CA412BD00744B38 /* MenuManager.swift in Sources */, B39B2B671EBF0D0600CDD74C /* LaunchAtLoginHelper.swift in Sources */, B39B2B631EBEFFB700CDD74C /* AppInfoView.swift in Sources */, + 78C2C79B2450FE5E007E4560 /* OpenUserDefaultsAction.swift in Sources */, B3A1E3301BF05F980090EC58 /* DeviceManager.swift in Sources */, 312A27FD21A753E600699668 /* Constants.swift in Sources */, B3A1E3231BF049690090EC58 /* AppDelegate.swift in Sources */, diff --git a/OpenSim/ActionMenu.swift b/OpenSim/ActionMenu.swift index c21d3d6..840dc30 100644 --- a/OpenSim/ActionMenu.swift +++ b/OpenSim/ActionMenu.swift @@ -21,6 +21,7 @@ final class ActionMenu: NSMenu { ] private static let extraActions: [ApplicationActionable.Type] = [ + OpenUserDefaultsAction.self, OpenInItermAction.self, OpenRealmAction.self ] diff --git a/OpenSim/Assets.xcassets/userDefaults.imageset/Contents.json b/OpenSim/Assets.xcassets/userDefaults.imageset/Contents.json new file mode 100644 index 0000000..7628e89 --- /dev/null +++ b/OpenSim/Assets.xcassets/userDefaults.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "UserDefaults.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "preserves-vector-representation" : true + } +} \ No newline at end of file diff --git a/OpenSim/Assets.xcassets/userDefaults.imageset/UserDefaults.pdf b/OpenSim/Assets.xcassets/userDefaults.imageset/UserDefaults.pdf new file mode 100644 index 0000000..717571c Binary files /dev/null and b/OpenSim/Assets.xcassets/userDefaults.imageset/UserDefaults.pdf differ diff --git a/OpenSim/Base.lproj/Localizable.strings b/OpenSim/Base.lproj/Localizable.strings index dead27b..d59d23b 100644 --- a/OpenSim/Base.lproj/Localizable.strings +++ b/OpenSim/Base.lproj/Localizable.strings @@ -25,6 +25,7 @@ "Action.EraseSimulatorAlertConfirmButton" = "Erase Simulator"; "Action.EraseSimulatorAlertCancelButton" = "Cancel"; "Action.EraseSimulatorAlertMessage" = "Are you sure you want to erase the %@ Simulator? This will remove the simulator from your system, but a new simulator can still be created."; +"Action.OpenUserDefaults" = "Open UserDefaults"; "Extension.OpenInIterm" = "Open Sandbox in iTerm"; "Extension.OpenRealmDatabase" = "Open Realm Database"; "AppInfo.Version" = "Version"; @@ -32,3 +33,5 @@ "MenuHeader.Actions" = "Actions"; "MenuHeader.Extensions" = "Extensions"; "MenuHeader.AppInformation" = "App Information"; +"Action.Dismiss" = "Dismiss"; +"Action.DismissMessage" = "No user defaults file detected"; diff --git a/OpenSim/Constants.swift b/OpenSim/Constants.swift index 1fbca58..dad4ef2 100644 --- a/OpenSim/Constants.swift +++ b/OpenSim/Constants.swift @@ -31,6 +31,9 @@ struct UIConstants { static let actionFactoryResetAlertMessage = NSLocalizedString("Action.FactoryResetAlertMessage", comment: "Factory reset confirmation message") static let actionFactoryResetAllSimulatorsMessage = NSLocalizedString("Action.FactoryResetAllSimulatorsMessage", comment: "Factory Reset All Simulators") static let actionFactoryResetAllShutdownSimulatorsMessage = NSLocalizedString("Action.FactoryResetAllShutdownSimulatorsMessage", comment: "Factory Reset All Shutdown Simulators") + static let actionOpenUserDefaults = NSLocalizedString("Action.OpenUserDefaults", comment: "Open UserDefaults") + static let actionDismissUserDefaultsTitle = NSLocalizedString("Action.DismissMessage", comment: "Dismiss title") + static let actionDismissUserDefaultsButton = NSLocalizedString("Action.Dismiss", comment: "Dismiss menu") static let extensionOpenInIterm = NSLocalizedString("Extension.OpenInIterm", comment: "Open in iTerm label") static let extensionOpenRealmDatabase = NSLocalizedString("Extension.OpenRealmDatabase", comment: "Open Realm Database label") static let appInfoVersion = NSLocalizedString("AppInfo.Version", comment: "App Info Version Label") diff --git a/OpenSim/OpenUserDefaultsAction.swift b/OpenSim/OpenUserDefaultsAction.swift new file mode 100644 index 0000000..f807f7f --- /dev/null +++ b/OpenSim/OpenUserDefaultsAction.swift @@ -0,0 +1,49 @@ +// +// Created for OpenSim in 2020 +// Using Swift 5.2 +// Created by Gene Crucean on 4/20/20 +// + +import Cocoa + +final class OpenUserDefaultsAction: ApplicationActionable { + + var application: Application? + + let title = UIConstants.strings.actionOpenUserDefaults + + let icon = templatize(#imageLiteral(resourceName: "userDefaults")) + + var isAvailable: Bool { + return Bundle.main.bundleIdentifier != nil + } + + var userDefaultsPath: String? + + init(application: Application) { + self.application = application + + // There is probably a better way of doing this. I need to do a bit of research. + if let pathUrl = application.sandboxUrl?.appendingPathComponent("Library").appendingPathComponent("Preferences"), let enumerator = FileManager.default.enumerator(at: pathUrl, includingPropertiesForKeys: nil) { + while let fileUrl = enumerator.nextObject() as? URL { + if fileUrl.lastPathComponent == "\(application.bundleID).plist" { + userDefaultsPath = fileUrl.path + } + } + } + } + + func perform() { + if let userDefaultsPath = userDefaultsPath { + NSWorkspace.shared.openFile(userDefaultsPath, withApplication: nil) + } else { + print("No user defaults file detected.") + + let alert: NSAlert = NSAlert() + alert.messageText = String(format: UIConstants.strings.actionDismissUserDefaultsTitle) + alert.alertStyle = .informational + alert.addButton(withTitle: UIConstants.strings.actionDismissUserDefaultsButton) + alert.runModal() + } + } +}