Ver Fonte

【BOTA】undo/redo 缩略图 - 拖拽排序页面

lizhe há 2 anos atrás
pai
commit
b2e319fafb

+ 95 - 19
PDF Office/PDF Office/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMThumbnailViewController.swift

@@ -145,23 +145,23 @@ class KMThumbnailViewController: NSViewController {
             return
         }
         
-        // 插入位置偏移量
-        var toIndexOffset: Int = 0
-        // 需要移动的页面index数组
-        var newPages: [CPDFPage] = []
-        for index in indexs {
-            let newPage: CPDFPage = self.listView?.document.page(at: UInt(index)).copy() as! CPDFPage
-            newPages.append(newPage)
-            self.listView?.document.removePage(at: UInt(index))
-            if (index < toIndex) { /// 删除了插入位置前面的页面,需要改变 toIndex
-                toIndexOffset += 1
-            }
-        }
-        
-        let insertIndex = max(0, toIndex-toIndexOffset)
-        for (index, page) in newPages.enumerated() {
-            self.listView?.document.insertPageObject(page, at: UInt(insertIndex+index))
-        }
+//        // 插入位置偏移量
+//        var toIndexOffset: Int = 0
+//        // 需要移动的页面index数组
+//        var newPages: [CPDFPage] = []
+//        for index in indexs {
+//            let newPage: CPDFPage = self.listView?.document.page(at: UInt(index)).copy() as! CPDFPage
+//            newPages.append(newPage)
+//            self.listView?.document.removePage(at: UInt(index))
+//            if (index < toIndex) { /// 删除了插入位置前面的页面,需要改变 toIndex
+//                toIndexOffset += 1
+//            }
+//        }
+//
+//        let insertIndex = max(0, toIndex-toIndexOffset)
+//        for (index, page) in newPages.enumerated() {
+//            self.listView?.document.insertPageObject(page, at: UInt(insertIndex+index))
+//        }
         
         // 新增 undo
 //        self.undoRedoManager.registerUndo(withTarget: self) { target in
@@ -169,11 +169,33 @@ class KMThumbnailViewController: NSViewController {
 //        }
         
         // 刷新UI
-        self.listView?.layoutDocumentView()
+//        self.listView?.layoutDocumentView()
 //        self.thumbnailView.refreshUI()
         
-        self.thumbnailView.reloadData()
+//        self.thumbnailView.reloadData()
+        
+        //获取原有page的下标 和 开始添加的下标
+        var indexTemp: Int = toIndex
+        var pageItems: [KMThumbnailPageItem] = []
+        for index in indexs {
+            let newPage: CPDFPage = self.listView?.document.page(at: UInt(index)).copy() as! CPDFPage
+            let pageItem = KMThumbnailPageItem(page: newPage, index: index, oldIndex: index)
+            pageItems.append(pageItem)
+            if (toIndex > index) { /// 删除了插入位置前面的页面,需要改变 toIndex
+                indexTemp -= 1
+            }
+        }
         
+        //建立模型
+        var tPageItems: [KMThumbnailPageItem] = []
+        for index in 0...pageItems.count - 1 {
+            let pageItem: KMThumbnailPageItem = pageItems[index]
+            let tItem = KMThumbnailPageItem(page: pageItem.page, index: indexTemp + index, oldIndex: pageItem.index)
+            tPageItems.append(tItem)
+        }
+        
+        //进行移动
+        self.dragPageItems(pageItems: tPageItems)
     }
     
     //MARK: Noti
@@ -734,3 +756,57 @@ extension KMThumbnailViewController : NSMenuDelegate,NSMenuItemValidation {
         
     }
 }
+
+//MARK: undoRedo
+extension KMThumbnailViewController {
+    
+    
+    
+    
+    func dragPageItems(pageItems: [KMThumbnailPageItem]) {
+        var tempPageItems = pageItems
+        //按照原下标顺序
+        tempPageItems.sort(){$0.oldIndex > $1.oldIndex}
+        //移除现有
+        for pageItem in tempPageItems {
+            self.listView?.document.removePage(at: UInt(pageItem.oldIndex))
+        }
+        //在原位置添加
+        tempPageItems.sort(){$0.index < $1.index}
+        for pageItem in tempPageItems {
+            self.listView?.document.insertPageObject(pageItem.page, at: UInt(pageItem.index))
+        }
+        
+        // 刷新UI
+        self.listView?.layoutDocumentView()
+        self.thumbnailView.reloadData()
+        
+        self.undoRedoManager.registerUndo(withTarget: self) { targetType in
+            //替换下标顺序
+            var tempPageItems: [KMThumbnailPageItem] = []
+            for pageItem in pageItems {
+                let item = KMThumbnailPageItem(page: pageItem.page, index: pageItem.oldIndex, oldIndex: pageItem.index)
+                tempPageItems.append(item)
+            }
+            self.dragPageItems(pageItems: tempPageItems)
+        }
+    }
+    
+    @IBAction func undo(_ sender: Any) {
+        if (self.undoRedoManager.canUndo) {
+            self.undoRedoManager.undo()
+        }
+    }
+    
+    @IBAction func redo(_ sender: Any) {
+        if (self.undoRedoManager.canRedo) {
+            self.undoRedoManager.redo()
+        }
+    }
+    
+    struct KMThumbnailPageItem {
+        var page: CPDFPage
+        var index: Int
+        var oldIndex: Int
+    }
+}