2014-12-21 03:05:51 +00:00
|
|
|
//
|
|
|
|
// ASSketchBook.swift
|
|
|
|
// AVRsack
|
|
|
|
//
|
|
|
|
// Created by Matthias Neeracher on 12/20/14.
|
|
|
|
// Copyright © 2014 Aere Perennius. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
|
|
|
|
class ASSketchBook {
|
|
|
|
enum SketchBookItem {
|
|
|
|
case Nothing
|
|
|
|
case Sketch(String, String)
|
|
|
|
case SketchDir(String, [SketchBookItem])
|
|
|
|
}
|
|
|
|
|
2015-02-14 16:43:20 +00:00
|
|
|
class func findSketch(path: String) -> SketchBookItem {
|
2016-11-13 11:03:51 +00:00
|
|
|
let fileManager = FileManager.default
|
2014-12-27 01:21:25 +00:00
|
|
|
var inoSketch = SketchBookItem.Nothing
|
2016-11-13 11:03:51 +00:00
|
|
|
let contents = (try! fileManager.contentsOfDirectory(atPath: path))
|
2015-11-16 01:56:33 +00:00
|
|
|
let nspath = path as NSString
|
2014-12-21 03:05:51 +00:00
|
|
|
for item in contents {
|
2015-11-16 01:56:33 +00:00
|
|
|
switch (item as NSString).pathExtension {
|
2014-12-27 01:21:25 +00:00
|
|
|
case "avrsackproj":
|
2016-11-13 11:03:51 +00:00
|
|
|
return .Sketch(nspath.lastPathComponent, nspath.appendingPathComponent(item))
|
2014-12-27 01:21:25 +00:00
|
|
|
case "ino":
|
2016-11-13 11:03:51 +00:00
|
|
|
inoSketch = .Sketch(nspath.lastPathComponent, nspath.appendingPathComponent(item))
|
2014-12-21 03:05:51 +00:00
|
|
|
default:
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
2014-12-27 01:21:25 +00:00
|
|
|
return inoSketch
|
|
|
|
}
|
|
|
|
|
2015-02-14 16:43:20 +00:00
|
|
|
private class func enumerateSketches(path: String) -> SketchBookItem {
|
2016-11-13 11:03:51 +00:00
|
|
|
let fileManager = FileManager.default
|
|
|
|
let contents = (try! fileManager.contentsOfDirectory(atPath: path))
|
2015-11-16 01:56:33 +00:00
|
|
|
let nspath = path as NSString
|
2016-11-13 11:03:51 +00:00
|
|
|
let sketch = findSketch(path: path)
|
2014-12-27 01:21:25 +00:00
|
|
|
switch sketch {
|
|
|
|
case .Sketch:
|
|
|
|
return sketch
|
|
|
|
default:
|
|
|
|
break
|
|
|
|
}
|
2014-12-21 03:05:51 +00:00
|
|
|
var sketches = [SketchBookItem]()
|
|
|
|
for item in contents {
|
2016-11-13 11:03:51 +00:00
|
|
|
let subpath = nspath.appendingPathComponent(item)
|
2014-12-21 03:05:51 +00:00
|
|
|
var isDir : ObjCBool = false
|
2016-11-13 11:03:51 +00:00
|
|
|
if fileManager.fileExists(atPath: subpath, isDirectory: &isDir) && isDir.boolValue {
|
|
|
|
let subEnum = enumerateSketches(path: subpath)
|
2014-12-21 03:05:51 +00:00
|
|
|
switch subEnum {
|
|
|
|
case .Nothing:
|
|
|
|
break
|
|
|
|
default:
|
|
|
|
sketches.append(subEnum)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2016-11-13 11:03:51 +00:00
|
|
|
sketches.sort(by: { (a: SketchBookItem, b: SketchBookItem) -> Bool in
|
2014-12-21 03:05:51 +00:00
|
|
|
var itemA : String = ""
|
|
|
|
switch a {
|
|
|
|
case .Sketch(let item, _):
|
|
|
|
itemA = item
|
|
|
|
case .SketchDir(let item, _):
|
|
|
|
itemA = item
|
|
|
|
default:
|
|
|
|
break
|
|
|
|
}
|
|
|
|
switch b {
|
|
|
|
case .Sketch(let item, _):
|
|
|
|
return itemA < item
|
|
|
|
case .SketchDir(let item, _):
|
|
|
|
return itemA < item
|
|
|
|
default:
|
|
|
|
return itemA < ""
|
|
|
|
}
|
|
|
|
})
|
2015-11-16 01:56:33 +00:00
|
|
|
return sketches.count > 0 ? .SketchDir(nspath.lastPathComponent, sketches) : .Nothing
|
2014-12-21 03:05:51 +00:00
|
|
|
}
|
|
|
|
|
2016-11-13 11:03:51 +00:00
|
|
|
class func appendSketchesToMenu(menu: NSMenu, target: AnyObject, action: Selector, sketchList: [SketchBookItem], sketches: inout [String]) {
|
2014-12-21 03:05:51 +00:00
|
|
|
for sketch in sketchList {
|
|
|
|
switch (sketch) {
|
|
|
|
case .Sketch(let item, let path):
|
2016-11-13 11:03:51 +00:00
|
|
|
let menuItem = menu.addItem(withTitle: item, action: action, keyEquivalent: "")
|
|
|
|
menuItem.target = target
|
|
|
|
menuItem.tag = sketches.count
|
2014-12-21 03:05:51 +00:00
|
|
|
sketches.append(path)
|
|
|
|
case .SketchDir(let item, let subSketches):
|
2016-11-13 11:03:51 +00:00
|
|
|
let menuItem = menu.addItem(withTitle: item, action: nil, keyEquivalent: "")
|
2014-12-21 03:05:51 +00:00
|
|
|
let submenu = NSMenu()
|
|
|
|
submenu.autoenablesItems = false
|
2016-11-13 11:03:51 +00:00
|
|
|
appendSketchesToMenu(menu: submenu, target: target, action: action, sketchList: subSketches, sketches: &sketches)
|
|
|
|
menu.setSubmenu(submenu, for: menuItem)
|
2014-12-21 03:05:51 +00:00
|
|
|
default:
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-13 11:03:51 +00:00
|
|
|
class func addSketches(menu: NSMenu, target: AnyObject, action: Selector, path: String, sketches: inout [String]) {
|
|
|
|
switch enumerateSketches(path: path) {
|
2015-11-16 01:56:33 +00:00
|
|
|
case .SketchDir(_, let sketchList):
|
2016-11-13 11:03:51 +00:00
|
|
|
appendSketchesToMenu(menu: menu, target: target, action: action, sketchList: sketchList, sketches: &sketches)
|
2014-12-21 03:05:51 +00:00
|
|
|
default:
|
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
2016-11-13 11:03:51 +00:00
|
|
|
}
|