#!/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.')