case bookmark = 5000
case separator = 9999
+
case bookmarkItem = 999999
}
final class BookmarkManager: NSObject, NSMenuDelegate {
- private static let sharedInstance: BookmarkManager = BookmarkManager()
-
- class func shared() -> BookmarkManager {
-
- return sharedInstance
- }
-
- private let bookmarksController: NSArrayController
+ static let shared = BookmarkManager()
private override init() {
- bookmarksController = NSArrayController()
-
super.init()
bookmarksController.managedObjectContext = self.manageObjectContext
buildBookmarkMenu()
}
- private(set) var editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
+ let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
+ let manageObjectContext = BookmarkDataStore.default.context
+ private let bookmarksController = NSArrayController()
+
private var bookmarkMenu: NSMenu!
- var manageObjectContext = BookmarkDataStore.default.context
var bookmarks: [Bookmark] {
bookmarksController.fetch(nil)
- guard let items = bookmarksController.arrangedObjects as? [Bookmark] else { return [] }
+ guard let items = bookmarksController.arrangedObjects as? [Bookmark] else {
+
+ return []
+ }
return items
}
- func createNewBookmark() -> Bookmark? {
+ func createNewBookmark(configurator: @escaping (Bookmark) -> Bool) -> Bookmark? {
guard let maxOrder = bookmarksController.value(forKeyPath: "arrangedObjects.@max.order") as? Int else {
- print("BookmarkManager: Can no convert max order to Int")
+ Logger.shared.log("BookmarkManager: Can no convert max order to Int")
+
return nil
}
- guard let new = editorStore.createBookmark() else {
+ let editorStore: BookmarkDataStore = BookmarkDataStore.oneTimeEditor()
+
+ guard let new = editorStore.sync(execute: { editorStore.createBookmark() }) else {
+
+ Logger.shared.log("BookmarkManager: Can not insert BookMarkItem")
- print("BookmarkManager: Can not insert BookMarkItem")
return nil
}
- new.identifier = String(format: "B%@", arguments: [NSDate()])
- new.order = maxOrder + 100
-
- DispatchQueue.main.asyncAfter(deadline: .now()) {
+ return editorStore.sync {
- self.editorStore.save()
+ new.identifier = String(format: "B%@", arguments: [NSDate()])
+ new.order = maxOrder + 100
+
+ if !configurator(new) {
+
+ editorStore.delete(new)
+
+ return nil
+ }
+
+ editorStore.save()
+
+ return new
}
-
- return new
}
func menuNeedsUpdate(_ menu: NSMenu) {