func didSelectBookmark(_ bookmark: Bookmark)
}
-fileprivate struct DragingType {
+extension NSPasteboard.PasteboardType {
- static let bookmarkItem = "com.masakih.KCD.BookmarkItem"
+ static let bookmarkItem = NSPasteboard.PasteboardType("com.masakih.KCD.BookmarkItem")
}
final class BookmarkListViewController: NSViewController {
- let managedObjectContext = BookmarkManager.shared().manageObjectContext
+ @objc let managedObjectContext = BookmarkManager.shared.manageObjectContext
- @IBOutlet var tableView: NSTableView!
- @IBOutlet var bookmarkController: NSArrayController!
- @IBOutlet var contextMenu: NSMenu!
- @IBOutlet var popover: NSPopover!
+ @IBOutlet private var tableView: NSTableView!
+ @IBOutlet private var bookmarkController: NSArrayController!
+ @IBOutlet private var contextMenu: NSMenu!
+ @IBOutlet private var popover: NSPopover!
weak var delegate: BookmarkListViewControllerDelegate?
var editorController: BookmarkEditorViewController?
// tableView support
- var objectRange: CountableClosedRange = 0...0
+ var draggingRange: CountableClosedRange = 0...0
- override var nibName: String! {
+ override var nibName: NSNib.Name {
- return "BookmarkListViewController"
+ return .nibName(instanceOf: self)
}
override func viewDidLoad() {
editorController = BookmarkEditorViewController()
popover.contentViewController = editorController
- tableView.register(forDraggedTypes: [DragingType.bookmarkItem])
+ tableView.registerForDraggedTypes([.bookmarkItem])
tableView.setDraggingSourceOperationMask(.move, forLocal: true)
}
let clickedRow = tableView.clickedRow
- guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
- case 0..<bookmarks.count = clickedRow
- else { return }
+ guard let bookmarks = bookmarkController.arrangedObjects as? [Any] else {
+
+ return
+ }
+ guard case 0..<bookmarks.count = clickedRow else {
+
+ return
+ }
editorController?.representedObject = bookmarks[clickedRow]
popover.show(relativeTo: tableView.rect(ofRow: clickedRow), of: tableView, preferredEdge: .minY)
let clickedRow = tableView.clickedRow
- guard let bookmarks = bookmarkController.arrangedObjects as? [Any],
- case 0..<bookmarks.count = clickedRow
- else { return }
+ guard let bookmarks = bookmarkController.arrangedObjects as? [Any] else {
+
+ return
+ }
+ guard case 0..<bookmarks.count = clickedRow else {
+
+ return
+ }
bookmarkController.remove(atArrangedObjectIndex: clickedRow)
}
func reorderingBoolmarks() {
- guard let objects = bookmarkController.arrangedObjects as? [Bookmark]
- else { return }
+ guard let objects = bookmarkController.arrangedObjects as? [Bookmark] else {
+
+ return
+ }
var order = 100
objects.forEach {
+
$0.order = order
order += 100
}
func tableViewSelectionDidChange(_ notification: Notification) {
- guard let tableView = notification.object as? NSTableView,
- let bookmarks = bookmarkController.arrangedObjects as? [Bookmark]
- else { return }
+ guard let tableView = notification.object as? NSTableView else {
+
+ return
+ }
+ guard let bookmarks = bookmarkController.arrangedObjects as? [Bookmark] else {
+
+ return
+ }
let selection = tableView.selectedRow
tableView.deselectAll(nil)
- guard case 0..<bookmarks.count = selection
- else { return }
+ guard case 0..<bookmarks.count = selection else {
+
+ return
+ }
delegate?.didSelectBookmark(bookmarks[selection])
}
func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? {
- guard let objects = bookmarkController.arrangedObjects as? [NSPasteboardWriting]
- else { return nil }
+ guard let objects = bookmarkController.arrangedObjects as? [NSPasteboardWriting] else {
+
+ return nil
+ }
return objects[row]
}
func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forRowIndexes rowIndexes: IndexSet) {
- guard let first = rowIndexes.first,
- let last = rowIndexes.last
- else { return }
+ guard let first = rowIndexes.first else {
+
+ return
+ }
+ guard let last = rowIndexes.last else {
+
+ return
+ }
- objectRange = first...last
+ draggingRange = first...last
}
func tableView(_ tableView: NSTableView, draggingSession session: NSDraggingSession, endedAt screenPoint: NSPoint, operation: NSDragOperation) {
- objectRange = 0...0
+ draggingRange = 0...0
}
func tableView(_ tableView: NSTableView,
validateDrop info: NSDraggingInfo,
proposedRow row: Int,
- proposedDropOperation dropOperation: NSTableViewDropOperation) -> NSDragOperation {
+ proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
- guard dropOperation == .above,
- !(objectRange ~= row),
- let tableView = info.draggingSource() as? NSTableView,
- tableView == self.tableView
- else { return [] }
+ guard dropOperation == .above else {
+
+ return []
+ }
+ guard !(draggingRange ~= row) else {
+
+ return []
+ }
+ guard let tableView = info.draggingSource() as? NSTableView, tableView == self.tableView else {
+
+ return []
+ }
return .move
}
- func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableViewDropOperation) -> Bool {
+ func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
tableView.beginUpdates()
defer { tableView.endUpdates() }
guard let objects = bookmarkController.arrangedObjects as? [Any],
case 1...objects.count = row,
- let target = objects[row - 1] as? Bookmark
- else { return 0 }
+ let target = objects[row - 1] as? Bookmark else {
+
+ return 0
+ }
return target.order
}()
- guard let items = info.draggingPasteboard().pasteboardItems
- else { return false }
+ guard let items = info.draggingPasteboard().pasteboardItems else {
+
+ return false
+ }
- let store = BookmarkManager.shared().editorStore
- items.enumerated().forEach {
+ let store = BookmarkManager.shared.editorStore
+ store.sync {
+
+ items.enumerated().forEach {
+
+ guard let data = $0.element.data(forType: .bookmarkItem) else {
+
+ return
+ }
+ guard let uri = NSKeyedUnarchiver.unarchiveObject(with: data) as? URL else {
+
+ return
+ }
+ guard let bookmark = store.object(of: Bookmark.entity, forURIRepresentation: uri) else {
+
+ return
+ }
+
+ bookmark.order = targetOrder + $0.offset + 1
+ }
- guard let data = $0.element.data(forType: DragingType.bookmarkItem),
- let uri = NSKeyedUnarchiver.unarchiveObject(with: data) as? URL,
- let oID = managedObjectContext.persistentStoreCoordinator?.managedObjectID(forURIRepresentation: uri),
- let bookmark = store.object(with: oID) as? Bookmark
- else { return }
+ store.save()
- bookmark.order = targetOrder + $0.offset + 1
+ self.bookmarkController.rearrangeObjects()
+ self.reorderingBoolmarks()
+ self.bookmarkController.rearrangeObjects()
}
- store.save()
- bookmarkController.rearrangeObjects()
- reorderingBoolmarks()
- bookmarkController.rearrangeObjects()
+ tableView.reloadData()
return true
}