@@ -15,6 +15,7 @@ extension SafariExtensionViewController: NSTableViewDelegate, NSTableViewDataSou
15
15
tableView. delegate = self
16
16
tableView. dataSource = self
17
17
tableView. menu? . autoenablesItems = true
18
+ tableView. registerForDraggedTypes ( [ dragDropType] )
18
19
}
19
20
20
21
@@ -53,4 +54,73 @@ extension SafariExtensionViewController: NSTableViewDelegate, NSTableViewDataSou
53
54
@IBAction func tableDoubleClick( _ sender: Any ? ) {
54
55
restoreMenuItem ( sender: sender)
55
56
}
57
+
58
+ // MARK: reorder rows
59
+
60
+ func tableView( _ tableView: NSTableView , pasteboardWriterForRow row: Int ) -> NSPasteboardWriting ? {
61
+ let item = NSPasteboardItem ( )
62
+ item. setString ( String ( row) , forType: dragDropType)
63
+ return item
64
+ }
65
+
66
+ func tableView( _ tableView: NSTableView , validateDrop info: NSDraggingInfo , proposedRow row: Int , proposedDropOperation dropOperation: NSTableView . DropOperation ) -> NSDragOperation {
67
+ if dropOperation == . above {
68
+ return . move
69
+ }
70
+ return [ ]
71
+ }
72
+
73
+ func tableView( _ tableView: NSTableView , acceptDrop info: NSDraggingInfo , row: Int , dropOperation: NSTableView . DropOperation ) -> Bool {
74
+ let originalRow = Int ( ( info. draggingPasteboard. pasteboardItems? . first!. string ( forType: . string) ) !) ?? - 5
75
+ if originalRow == - 5 { return false }
76
+
77
+ var newRow = row
78
+ // When you drag an item downwards, the "new row" index is actually --1. Remember dragging operation is `.above`.
79
+ if originalRow < newRow {
80
+ newRow = row - 1
81
+ }
82
+
83
+ // Animate the rows
84
+ tableView. beginUpdates ( )
85
+ tableView. moveRow ( at: originalRow, to: newRow)
86
+ tableView. endUpdates ( )
87
+
88
+ // Persist the ordering by saving your data model
89
+ let trackItem = sessions [ originalRow] //saving item
90
+ sessions. remove ( at: originalRow) //removing from old position
91
+ sessions. insert ( trackItem, at: newRow) //inserting at new pos
92
+
93
+ return true
94
+
95
+
96
+ /*
97
+ var oldIndexes = [Int]()
98
+ info.enumerateDraggingItems(options: [], for: tableView, classes: [NSPasteboardItem.self], searchOptions: [:]) { (item, i, pointer) in
99
+ if let str = (item.item as! NSPasteboardItem).string(forType: self.dragDropType), let index = Int(str) {
100
+ oldIndexes.append(index)
101
+ }
102
+ }
103
+
104
+ var oldIndexOffset = 0
105
+ var newIndexOffset = 0
106
+
107
+ // For simplicity, the code below uses `tableView.moveRowAtIndex` to move rows around directly.
108
+ // You may want to move rows in your content array and then call `tableView.reloadData()` instead.
109
+ tableView.beginUpdates()
110
+ for oldIndex in oldIndexes {
111
+ if oldIndex < row {
112
+ tableView.moveRow(at: oldIndex + oldIndexOffset, to: row - 1)
113
+ sessions.swapAt(oldIndex + oldIndexOffset, row - 1)
114
+ oldIndexOffset -= 1
115
+ } else {
116
+ tableView.moveRow(at: oldIndex, to: row + newIndexOffset)
117
+ sessions.swapAt(oldIndex, row + newIndexOffset)
118
+ newIndexOffset += 1
119
+ }
120
+ }
121
+ tableView.endUpdates()
122
+ */
123
+ return true
124
+ }
125
+
56
126
}
0 commit comments