50 lines
2.6 KiB
Python
50 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Replace SwiftUI Transferable drag/drop with NSItemProvider drag/drop for Settings servers."""
|
|
from pathlib import Path
|
|
from datetime import datetime
|
|
import shutil
|
|
|
|
root = Path.cwd()
|
|
file = root / 'OrionToolbar/SettingsView.swift'
|
|
if not file.is_file():
|
|
raise SystemExit('Run from /Volumes/Developer/Applications/OrionToolbar')
|
|
s = file.read_text()
|
|
old = ''' .draggable(server.id.uuidString)
|
|
.dropDestination(for: String.self) { values, _ in
|
|
guard let first = values.first,
|
|
let dragged = UUID(uuidString: first),
|
|
dragged != server.id else { return false }
|
|
vm.reorderServer(draggedID: dragged, onto: server.id)
|
|
return true
|
|
}'''
|
|
new = ''' // Native macOS drag source. Works in the menu-bar Settings window.
|
|
.onDrag {
|
|
NSItemProvider(object: server.id.uuidString as NSString)
|
|
}
|
|
.onDrop(of: [UTType.utf8PlainText.identifier, UTType.plainText.identifier], isTargeted: nil) { providers in
|
|
guard let provider = providers.first(where: {
|
|
$0.canLoadObject(ofClass: NSString.self)
|
|
}) else { return false }
|
|
let targetID = server.id
|
|
_ = provider.loadObject(ofClass: NSString.self) { object, _ in
|
|
guard let raw = object as? String,
|
|
let draggedID = UUID(uuidString: raw) else { return }
|
|
Task { @MainActor in
|
|
vm.reorderServer(draggedID: draggedID, onto: targetID)
|
|
}
|
|
}
|
|
return true
|
|
}'''
|
|
if old not in s:
|
|
raise SystemExit('Expected V3 Settings drag/drop block not found. No changes made; show current SettingsView.swift.')
|
|
if 'import UniformTypeIdentifiers' not in s:
|
|
s = s.replace('import SwiftUI', 'import SwiftUI\nimport UniformTypeIdentifiers', 1)
|
|
s = s.replace(old, new, 1)
|
|
backup = root / 'backups' / datetime.now().strftime('%Y%m%d-%H%M%S-%f') / 'OrionToolbar' / 'SettingsView.swift'
|
|
backup.parent.mkdir(parents=True, exist_ok=True)
|
|
shutil.copy2(file, backup)
|
|
file.write_text(s)
|
|
print('Updated:', file)
|
|
print('Backup:', backup)
|
|
print('Drag a server row onto another server row in Settings.')
|