AVRSack/AVRsack/ASSketchBook.swift

112 lines
4.0 KiB
Swift
Raw Permalink Normal View History

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
}