diff --git a/AVRsack.xcodeproj/project.pbxproj b/AVRsack.xcodeproj/project.pbxproj index 7f16e7d..2a02e5a 100644 --- a/AVRsack.xcodeproj/project.pbxproj +++ b/AVRsack.xcodeproj/project.pbxproj @@ -19,6 +19,8 @@ 951CD1771A2615000066C1A1 /* BuildProject in Resources */ = {isa = PBXBuildFile; fileRef = 951CD1761A2615000066C1A1 /* BuildProject */; }; 95468DDF1A228BE600668EE2 /* ASHardware.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95468DDE1A228BE600668EE2 /* ASHardware.swift */; }; 95468DE31A228E1300668EE2 /* Defaults.plist in Resources */ = {isa = PBXBuildFile; fileRef = 95468DE21A228E1300668EE2 /* Defaults.plist */; }; + 95A7C6401A38914300EF1963 /* ASPreferences.xib in Resources */ = {isa = PBXBuildFile; fileRef = 95A7C63E1A38914300EF1963 /* ASPreferences.xib */; }; + 95A7C6461A3894C900EF1963 /* ASPreferences.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95A7C6451A3894C900EF1963 /* ASPreferences.swift */; }; 95BF80EB1A185C9E0004A693 /* ASFileTree.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95BF80EA1A185C9E0004A693 /* ASFileTree.swift */; }; 95EA32621A17B90600F66EB0 /* ACEView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EA325B1A17B8DA00F66EB0 /* ACEView.framework */; }; 95EA32651A17BA8C00F66EB0 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95EA32631A17BA8C00F66EB0 /* Cocoa.framework */; }; @@ -80,6 +82,8 @@ 95468DDE1A228BE600668EE2 /* ASHardware.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASHardware.swift; sourceTree = ""; }; 95468DE21A228E1300668EE2 /* Defaults.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Defaults.plist; sourceTree = ""; }; 958D76811A17DA1C00917D96 /* AVRsack-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "AVRsack-Bridging-Header.h"; sourceTree = ""; }; + 95A7C63F1A38914300EF1963 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ASPreferences.xib; sourceTree = ""; }; + 95A7C6451A3894C900EF1963 /* ASPreferences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASPreferences.swift; sourceTree = ""; }; 95BF80EA1A185C9E0004A693 /* ASFileTree.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ASFileTree.swift; sourceTree = ""; }; 95EA32541A17B8DA00F66EB0 /* ACEView.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ACEView.xcodeproj; path = ../ACEView/ACEView.xcodeproj; sourceTree = ""; }; 95EA32631A17BA8C00F66EB0 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; @@ -171,6 +175,7 @@ 95468DDE1A228BE600668EE2 /* ASHardware.swift */, 950AB9281A2D4F9B0033A9DA /* ASSerial.swift */, 951CD1731A23C9FC0066C1A1 /* ASBuilder.swift */, + 95A7C6451A3894C900EF1963 /* ASPreferences.swift */, 951CD1761A2615000066C1A1 /* BuildProject */, ); name = Source; @@ -183,6 +188,7 @@ 950AB9261A296A160033A9DA /* ProjIcon.icns */, 9501D80A1A17025C0034C530 /* MainMenu.xib */, 9501D8051A17025C0034C530 /* ASProjDoc.xib */, + 95A7C63E1A38914300EF1963 /* ASPreferences.xib */, 95468DE21A228E1300668EE2 /* Defaults.plist */, ); name = Resources; @@ -318,6 +324,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 95A7C6401A38914300EF1963 /* ASPreferences.xib in Resources */, 95468DE31A228E1300668EE2 /* Defaults.plist in Resources */, 9501D8071A17025C0034C530 /* ASProjDoc.xib in Resources */, 950AB9271A296A160033A9DA /* ProjIcon.icns in Resources */, @@ -347,6 +354,7 @@ 950AB9291A2D4F9B0033A9DA /* ASSerial.swift in Sources */, 9501D8021A17025C0034C530 /* ASApplication.swift in Sources */, 95BF80EB1A185C9E0004A693 /* ASFileTree.swift in Sources */, + 95A7C6461A3894C900EF1963 /* ASPreferences.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -390,6 +398,14 @@ name = MainMenu.xib; sourceTree = ""; }; + 95A7C63E1A38914300EF1963 /* ASPreferences.xib */ = { + isa = PBXVariantGroup; + children = ( + 95A7C63F1A38914300EF1963 /* Base */, + ); + name = ASPreferences.xib; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ diff --git a/AVRsack/ASApplication.swift b/AVRsack/ASApplication.swift index dd37b45..1ac5a54 100644 --- a/AVRsack/ASApplication.swift +++ b/AVRsack/ASApplication.swift @@ -34,6 +34,11 @@ class ASApplication: NSObject, NSApplicationDelegate { sketchbooks.append(doc.URLByAppendingPathComponent("AVRSack").path!) } appDefaults["Sketchbooks"] = sketchbooks + if fileManager.fileExistsAtPath("/usr/local/CrossPack-AVR") { + appDefaults["Toolchain"] = "/usr/local/CrossPack-AVR" + } else { + appDefaults["Toolchain"] = "" + } userDefaults.registerDefaults(appDefaults) } diff --git a/AVRsack/ASPreferences.swift b/AVRsack/ASPreferences.swift new file mode 100644 index 0000000..c24cc8b --- /dev/null +++ b/AVRsack/ASPreferences.swift @@ -0,0 +1,95 @@ +// +// ASPreferences.swift +// AVRsack +// +// Created by Matthias Neeracher on 12/10/14. +// Copyright © 2014 Aere Perennius. All rights reserved. +// + +import Cocoa + +private let kASToolchainCrosspack = 0 +private let kASToolchainArduino = 1 +private let kASToolchainOther = 2 + +class ASPreferences: NSWindowController, NSOpenSavePanelDelegate { + dynamic var toolchainPref : String = "" { + didSet(oldPref) { + NSUserDefaults.standardUserDefaults().setObject(toolchainPref, forKey: "Toolchain") + } + } + var toolchainType : Int { + get { + switch toolchainPref { + case "/usr/local/CrossPack-AVR": + return kASToolchainCrosspack + case "": + return kASToolchainArduino + default: + return kASToolchainOther + } + } + + set (toolchain) { + switch toolchain { + case kASToolchainCrosspack: + toolchainPref = "/usr/local/CrossPack-AVR" + case kASToolchainArduino: + toolchainPref = "" + default: + otherToolchainDialog() + } + } + } + class func keyPathsForValuesAffectingToolchainType() -> NSSet { + return NSSet(objects: "toolchainPref") + } + + var toolchainPath : String { + get { + if toolchainPref != "" { + return toolchainPref + } else { + return NSWorkspace.sharedWorkspace().URLForApplicationWithBundleIdentifier("cc.arduino.Arduino")!.path! + + "/Contents/Resources/Java/hardware/tools/avr" + } + } + } + class func keyPathsForValuesAffectingToolchainPath() -> NSSet { + return NSSet(objects: "toolchainPref") + } + + override convenience init() { + self.init(windowNibName:"ASPreferences") + } + + override func awakeFromNib() { + super.awakeFromNib() + toolchainPref = NSUserDefaults.standardUserDefaults().objectForKey("Toolchain") as String + } + + var hasCrossPackAVR : Bool { + get { + return NSFileManager.defaultManager().fileExistsAtPath("/usr/local/CrossPack-AVR/bin") + } + } + + func otherToolchainDialog() { + let openPanel = NSOpenPanel() + openPanel.delegate = self + openPanel.canChooseFiles = false + openPanel.canChooseDirectories = true + openPanel.allowsMultipleSelection = false + openPanel.resolvesAliases = true + openPanel.beginSheetModalForWindow(window!, completionHandler: { (returnCode: Int) -> Void in + if returnCode == NSFileHandlingPanelOKButton { + self.toolchainPref = openPanel.URL!.path! + } + }) + } + + func panel(sender: AnyObject, shouldEnableURL url: NSURL) -> Bool { + let gccPath = url.URLByAppendingPathComponent("bin/avr-gcc") + return NSFileManager.defaultManager().fileExistsAtPath(gccPath.path!) + } +} diff --git a/AVRsack/Base.lproj/ASPreferences.xib b/AVRsack/Base.lproj/ASPreferences.xib new file mode 100644 index 0000000..7daf5e4 --- /dev/null +++ b/AVRsack/Base.lproj/ASPreferences.xib @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AVRsack/Base.lproj/MainMenu.xib b/AVRsack/Base.lproj/MainMenu.xib index 19d0dc6..cd597d4 100644 --- a/AVRsack/Base.lproj/MainMenu.xib +++ b/AVRsack/Base.lproj/MainMenu.xib @@ -1,5 +1,5 @@ - + @@ -18,6 +18,7 @@ + @@ -31,7 +32,11 @@ - + + + + + diff --git a/AVRsack/Defaults.plist b/AVRsack/Defaults.plist index 585e59e..f963774 100644 --- a/AVRsack/Defaults.plist +++ b/AVRsack/Defaults.plist @@ -2,6 +2,10 @@ + ShowSourceInDisassembly + + UploadVerbosity + 2 RecentProgrammers usbasp