Browse Source

【页面编辑】拖拽提取兼容本地拖拽

tangchao 1 year ago
parent
commit
139cf9b903

+ 8 - 8
PDF Office/PDF Master.xcodeproj/xcuserdata/kdanmobile.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -286,13 +286,13 @@
             filePath = "PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailView.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "317"
-            endingLineNumber = "317"
+            startingLineNumber = "319"
+            endingLineNumber = "319"
             landmarkName = "filePromiseProvider(_:writePromiseTo:completionHandler:)"
             landmarkType = "7">
             <Locations>
                <Location
-                  uuid = "A0A0A48B-7DF5-4D82-B251-34C4E3CBA828 - 739688ab4838eb53"
+                  uuid = "A0A0A48B-7DF5-4D82-B251-34C4E3CBA828 - 739688ab4838eb9d"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
@@ -302,12 +302,12 @@
                   urlString = "file:///Users/kdanmobile/work/tangchao/git/PDFOffice/PDF%20Office/PDF%20Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailView.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "317"
-                  endingLineNumber = "317"
+                  startingLineNumber = "319"
+                  endingLineNumber = "319"
                   offsetFromSymbolStart = "322">
                </Location>
                <Location
-                  uuid = "A0A0A48B-7DF5-4D82-B251-34C4E3CBA828 - 739688ab4838eb53"
+                  uuid = "A0A0A48B-7DF5-4D82-B251-34C4E3CBA828 - 739688ab4838eb9d"
                   shouldBeEnabled = "Yes"
                   ignoreCount = "0"
                   continueAfterRunningActions = "No"
@@ -317,8 +317,8 @@
                   urlString = "file:///Users/kdanmobile/work/tangchao/git/PDFOffice/PDF%20Office/PDF%20Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailView.swift"
                   startingColumnNumber = "9223372036854775807"
                   endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "317"
-                  endingLineNumber = "317"
+                  startingLineNumber = "319"
+                  endingLineNumber = "319"
                   offsetFromSymbolStart = "1621">
                </Location>
             </Locations>

+ 23 - 0
PDF Office/PDF Master/Class/Common/Control/KMThumbnailView.swift

@@ -307,6 +307,29 @@ extension KMThumbnailView: NSCollectionViewDelegate {
             self.delegate?.thumbnailView?(thumbanView: self, didDrag: self.dragedIndexPaths, indexpath: indexPath)
             self.dragedIndexPaths.removeAll()
             return true
+        } else if (pboard.availableType(from: [.itemDragType]) != nil) {
+            var _dragIndexpaths = Set<IndexPath>()
+            draggingInfo.enumerateDraggingItems(
+                options: NSDraggingItemEnumerationOptions.concurrent,
+                for: collectionView,
+                classes: [NSPasteboardItem.self],
+                searchOptions: [:],
+                using: {(draggingItem, idx, stop) in
+                    if let pasteboardItem = draggingItem.item as? NSPasteboardItem {
+                        do {
+                            if let indexPathData = pasteboardItem.data(forType: .itemDragType), let _indexPath =
+                                try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(indexPathData) as? IndexPath {
+                                
+                                _dragIndexpaths.insert(_indexPath)
+                            }
+                        } catch {
+                            Swift.debugPrint("failed to unarchive indexPath for dropped photo item.")
+                        }
+                    }
+                })
+            
+            self.delegate?.thumbnailView?(thumbanView: self, didDrag: _dragIndexpaths.sorted(), indexpath: indexPath)
+            self.dragedIndexPaths.removeAll()
         } else if ((pboard.availableType(from: [.fileURL])) != nil) {
             var array: [URL] = []
             for item: NSPasteboardItem in pboard.pasteboardItems! {

+ 42 - 36
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailView.swift

@@ -164,6 +164,8 @@ extension KMPDFThumbnailView {
                 return false
             }
 
+            return super.collectionView(collectionView, acceptDrop: draggingInfo, indexPath: indexPath, dropOperation: dropOperation)
+        } else if (pboard.availableType(from: [.itemDragType]) != nil) {
             return super.collectionView(collectionView, acceptDrop: draggingInfo, indexPath: indexPath, dropOperation: dropOperation)
         } else if ((pboard.availableType(from: [.fileURL])) != nil) {
             //获取url
@@ -190,45 +192,45 @@ extension KMPDFThumbnailView {
         return false
     }
     
-//    func collectionView(_ collectionView: NSCollectionView,
-//                        pasteboardWriterForItemAt indexPath: IndexPath) -> NSPasteboardWriting? {
-//        /** Here the sample provide a custom NSFilePromise#imageLiteral(resourceName: "_DSC9930.jpeg")#imageLiteral(resourceName: "_DSC9930.jpeg")Provider.
-//            Here we provide a custom provider, offering the row to the drag object, and its URL.
-//        */
-////        var provider: NSFilePromiseProvider?
-////
-//////        guard let photoItem =
-//////            dataSource.itemIdentifier(for: IndexPath(item: indexPath.item, section: 0)) else { return provider }
-//////        let photoFileExtension = photoItem.fileURL.pathExtension
-////        let photoFileExtension = "pdf"
-////
-////        if #available(macOS 11.0, *) {
-////            let typeIdentifier = UTType(filenameExtension: photoFileExtension)
-////            provider = FilePromiseProvider(fileType: typeIdentifier!.identifier, delegate: self)
-////        } else {
-////            let typeIdentifier =
-////                  UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, photoFileExtension as CFString, nil)
-////            provider = FilePromiseProvider(fileType: typeIdentifier!.takeRetainedValue() as String, delegate: self)
-////        }
-////
-////        // Send out the indexPath and photo's url dictionary.
-////        do {
-////            let data = try NSKeyedArchiver.archivedData(withRootObject: indexPath, requiringSecureCoding: false)
-////            provider!.userInfo = [FilePromiseProvider.UserInfoKeys.urlKey: self.document!.documentURL as Any,
-////                                  FilePromiseProvider.UserInfoKeys.indexPathKey: data]
-////        } catch {
-////            fatalError("failed to archive indexPath to pasteboard")
-////        }
-////        return provider
-//        
+    func collectionView(_ collectionView: NSCollectionView,
+                        pasteboardWriterForItemAt indexPath: IndexPath) -> NSPasteboardWriting? {
+        /** Here the sample provide a custom NSFilePromise#imageLiteral(resourceName: "_DSC9930.jpeg")#imageLiteral(resourceName: "_DSC9930.jpeg")Provider.
+            Here we provide a custom provider, offering the row to the drag object, and its URL.
+        */
+        var provider: NSFilePromiseProvider?
+
+//        guard let photoItem =
+//            dataSource.itemIdentifier(for: IndexPath(item: indexPath.item, section: 0)) else { return provider }
+//        let photoFileExtension = photoItem.fileURL.pathExtension
+        let photoFileExtension = "pdf"
+
+        if #available(macOS 11.0, *) {
+            let typeIdentifier = UTType(filenameExtension: photoFileExtension)
+            provider = FilePromiseProvider(fileType: typeIdentifier!.identifier, delegate: self)
+        } else {
+            let typeIdentifier =
+                  UTTypeCreatePreferredIdentifierForTag(kUTTagClassFilenameExtension, photoFileExtension as CFString, nil)
+            provider = FilePromiseProvider(fileType: typeIdentifier!.takeRetainedValue() as String, delegate: self)
+        }
+
+        // Send out the indexPath and photo's url dictionary.
+        do {
+            let data = try NSKeyedArchiver.archivedData(withRootObject: indexPath, requiringSecureCoding: false)
+            provider!.userInfo = [FilePromiseProvider.UserInfoKeys.urlKey: self.document!.documentURL as Any,
+                                  FilePromiseProvider.UserInfoKeys.indexPathKey: data]
+        } catch {
+            fatalError("failed to archive indexPath to pasteboard")
+        }
+        return provider
+        
 //        guard let model = indexPath as? IndexPath else {
 //            return nil
 //        }
-//        
+        
 //        let  pastBoard = NSPasteboardItem.init()
 //        pastBoard.setString(String(format: "%ld", model.item), forType: NSPasteboard.PasteboardType.string)
 //        return pastBoard
-//    }
+    }
 }
 
 class FilePromiseProvider: NSFilePromiseProvider {
@@ -249,8 +251,8 @@ class FilePromiseProvider: NSFilePromiseProvider {
     */
     override func writableTypes(for pasteboard: NSPasteboard) -> [NSPasteboard.PasteboardType] {
         var types = super.writableTypes(for: pasteboard)
-        types.append(kKMLocalForDraggedTypes) // Add our own internal drag type (row drag and drop reordering).
-        types.append(.fileURL) // Add the .fileURL drag type (to promise files to other apps).
+        types.append(.fileURL) // Add our own internal drag type (row drag and drop reordering).
+        types.append(.itemDragType) // Add the .fileURL drag type (to promise files to other apps).
         return types
     }
     
@@ -267,7 +269,7 @@ class FilePromiseProvider: NSFilePromiseProvider {
             if let url = userInfoDict[FilePromiseProvider.UserInfoKeys.urlKey] as? NSURL {
                 return url.pasteboardPropertyList(forType: type)
             }
-        case kKMLocalForDraggedTypes:
+        case .itemDragType:
             // Incoming type is "com.mycompany.mydragdrop", return (from our userInfo) the item's indexPath.
             let indexPathData = userInfoDict[FilePromiseProvider.UserInfoKeys.indexPathKey]
             return indexPathData
@@ -353,4 +355,8 @@ extension KMPDFThumbnailView: NSFilePromiseProviderDelegate {
     
 }
 
+extension NSPasteboard.PasteboardType {
+    static let itemDragType = NSPasteboard.PasteboardType("com.mycompany.mydragdrop")
+}
+