Skip to content

Commit 232efcd

Browse files
TableView reorder rows (Drag & Drop)
Now sessions can be rearranged by dragging the sessions in the table
1 parent 1522306 commit 232efcd

File tree

4 files changed

+78
-6
lines changed

4 files changed

+78
-6
lines changed

Sessions Extension/SafariExtensionViewController/SafariExtensionViewController.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ class SafariExtensionViewController: SFSafariExtensionViewController, NSControlT
2222
var filteredSessions = [Session]()
2323
// MARK: table
2424
@IBOutlet weak var tableView: NSTableView!
25+
let dragDropType = NSPasteboard.PasteboardType.string
26+
2527
// MARK: searchfield
2628
@IBOutlet weak var searchField: NSSearchField!
2729
var isSearching = false

Sessions Extension/SafariExtensionViewController/SafariExtensionViewControllerTable.swift

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ extension SafariExtensionViewController: NSTableViewDelegate, NSTableViewDataSou
1515
tableView.delegate = self
1616
tableView.dataSource = self
1717
tableView.menu?.autoenablesItems = true
18+
tableView.registerForDraggedTypes([dragDropType])
1819
}
1920

2021

@@ -53,4 +54,73 @@ extension SafariExtensionViewController: NSTableViewDelegate, NSTableViewDataSou
5354
@IBAction func tableDoubleClick(_ sender: Any?) {
5455
restoreMenuItem(sender: sender)
5556
}
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+
56126
}

Sessions.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -499,7 +499,7 @@
499499
CODE_SIGN_IDENTITY = "Apple Development";
500500
CODE_SIGN_STYLE = Automatic;
501501
DEVELOPMENT_TEAM = XX9N244QQT;
502-
ENABLE_HARDENED_RUNTIME = YES;
502+
ENABLE_HARDENED_RUNTIME = NO;
503503
INFOPLIST_FILE = "Sessions Extension/Others/Info.plist";
504504
LD_RUNPATH_SEARCH_PATHS = (
505505
"$(inherited)",
@@ -522,7 +522,7 @@
522522
CODE_SIGN_IDENTITY = "Apple Development";
523523
CODE_SIGN_STYLE = Automatic;
524524
DEVELOPMENT_TEAM = XX9N244QQT;
525-
ENABLE_HARDENED_RUNTIME = YES;
525+
ENABLE_HARDENED_RUNTIME = NO;
526526
INFOPLIST_FILE = "Sessions Extension/Others/Info.plist";
527527
LD_RUNPATH_SEARCH_PATHS = (
528528
"$(inherited)",

Sessions.xcodeproj/xcuserdata/alex.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,8 +224,8 @@
224224
endingColumnNumber = "9223372036854775807"
225225
startingLineNumber = "106"
226226
endingLineNumber = "106"
227-
landmarkName = "restoreMenuItem(sender:)"
228-
landmarkType = "7">
227+
landmarkName = "SafariExtensionViewController"
228+
landmarkType = "3">
229229
</BreakpointContent>
230230
</BreakpointProxy>
231231
<BreakpointProxy
@@ -256,8 +256,8 @@
256256
endingColumnNumber = "9223372036854775807"
257257
startingLineNumber = "107"
258258
endingLineNumber = "107"
259-
landmarkName = "restoreMenuItem(sender:)"
260-
landmarkType = "7">
259+
landmarkName = "SafariExtensionViewController"
260+
landmarkType = "3">
261261
</BreakpointContent>
262262
</BreakpointProxy>
263263
<BreakpointProxy

0 commit comments

Comments
 (0)