Browse Source

综合-PDF缩略图列表整理代码

tangchao 1 year ago
parent
commit
c5e18dfae1

+ 16 - 0
PDF Office/PDF Master.xcodeproj/project.pbxproj

@@ -2657,6 +2657,12 @@
 		BBB5C80729F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */; };
 		BBB5C80829F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */; };
 		BBB5C80929F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */; };
+		BBB7B4892A033F6200B58A5A /* KMThumbnailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B4882A033F6200B58A5A /* KMThumbnailView.swift */; };
+		BBB7B48A2A033F6200B58A5A /* KMThumbnailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B4882A033F6200B58A5A /* KMThumbnailView.swift */; };
+		BBB7B48B2A033F6200B58A5A /* KMThumbnailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B4882A033F6200B58A5A /* KMThumbnailView.swift */; };
+		BBB7B48D2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */; };
+		BBB7B48E2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */; };
+		BBB7B48F2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */; };
 		BBB9B30D299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = BBB9B2F2299A5D6C004F3235 /* KMCloudUploadOperationQueue.m */; };
 		BBB9B30E299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = BBB9B2F2299A5D6C004F3235 /* KMCloudUploadOperationQueue.m */; };
 		BBB9B30F299A5D6D004F3235 /* KMCloudUploadOperationQueue.m in Sources */ = {isa = PBXBuildFile; fileRef = BBB9B2F2299A5D6C004F3235 /* KMCloudUploadOperationQueue.m */; };
@@ -4352,6 +4358,8 @@
 		BBB1A39D29F6128200E54E47 /* KMSystemMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMSystemMenu.swift; sourceTree = "<group>"; };
 		BBB1A3A529F6B66400E54E47 /* NSPanel+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSPanel+KMExtension.swift"; sourceTree = "<group>"; };
 		BBB5C80629F4CEE40054F261 /* KMLinkAnnotationPropertyEmptyController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMLinkAnnotationPropertyEmptyController.swift; sourceTree = "<group>"; };
+		BBB7B4882A033F6200B58A5A /* KMThumbnailView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMThumbnailView.swift; sourceTree = "<group>"; };
+		BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSCollectionViewItem+KMExtension.swift"; sourceTree = "<group>"; };
 		BBB9B2EA299A5D6C004F3235 /* DropboxModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DropboxModel.h; sourceTree = "<group>"; };
 		BBB9B2EB299A5D6C004F3235 /* KMCloudDownloadOperationQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMCloudDownloadOperationQueue.h; sourceTree = "<group>"; };
 		BBB9B2EC299A5D6C004F3235 /* KMCloudOperation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KMCloudOperation.h; sourceTree = "<group>"; };
@@ -6939,6 +6947,7 @@
 			isa = PBXGroup;
 			children = (
 				BBB1A3A529F6B66400E54E47 /* NSPanel+KMExtension.swift */,
+				BBB7B48C2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift */,
 			);
 			path = Category;
 			sourceTree = "<group>";
@@ -8006,6 +8015,7 @@
 			isa = PBXGroup;
 			children = (
 				BBA5429B29F13A140041BAD0 /* KMMemorandumPattern.swift */,
+				BBB7B4882A033F6200B58A5A /* KMThumbnailView.swift */,
 			);
 			path = Control;
 			sourceTree = "<group>";
@@ -10380,7 +10390,9 @@
 				BB5F8A0E29BB04F000365ADB /* GBDeviceInfo_OSX.m in Sources */,
 				ADB1FE962975300B00ED072D /* KMBatchHeaderAndFooterView.swift in Sources */,
 				ADE614B529861CCC00F62ED7 /* KMBatchSelectedFilesView.swift in Sources */,
+				BBB7B4892A033F6200B58A5A /* KMThumbnailView.swift in Sources */,
 				9F0CB4F5298655D500007028 /* KMDesignToken+Fill.swift in Sources */,
+				BBB7B48D2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */,
 				F3732323292DFFFE0013862C /* CPDFListView+Extension.m in Sources */,
 				BB4EEF4C2976544F003A3537 /* KMRedactAligementView.swift in Sources */,
 				9F1FE4C029406E4700E952CA /* NSWindow+CTThemed.m in Sources */,
@@ -11142,7 +11154,9 @@
 				BB5F8A0F29BB04F000365ADB /* GBDeviceInfo_OSX.m in Sources */,
 				ADB1FE972975300B00ED072D /* KMBatchHeaderAndFooterView.swift in Sources */,
 				ADE614B629861CCC00F62ED7 /* KMBatchSelectedFilesView.swift in Sources */,
+				BBB7B48A2A033F6200B58A5A /* KMThumbnailView.swift in Sources */,
 				9F0CB4F6298655D500007028 /* KMDesignToken+Fill.swift in Sources */,
+				BBB7B48E2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */,
 				BBA8B7A42935CD740097D183 /* KMRemovePasswordAlertWindowController.swift in Sources */,
 				BB4EEF4D2976544F003A3537 /* KMRedactAligementView.swift in Sources */,
 				F37322EE292DF9410013862C /* CPDFMarkupAnnotation+PDFListView.m in Sources */,
@@ -11875,6 +11889,7 @@
 				89E4E76B29656B35002DBA6F /* KMButton.m in Sources */,
 				BB8F456F295AC1220037EA22 /* KMHeaderFooterAdjectiveModel.swift in Sources */,
 				F386D15C293E152F00C44524 /* CPDFListViewColorMenuItemView.m in Sources */,
+				BBB7B48F2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */,
 				BB146FFE299DC0D100784A6A /* OIDAuthState+Mac.m in Sources */,
 				AD88108F29A760D100178CA1 /* KMRegisterPresenter.swift in Sources */,
 				BB3AAB9229878CE000992A5A /* KMWatermarkAdjectivePropertyMainController.swift in Sources */,
@@ -11937,6 +11952,7 @@
 				BB0542172965705D00F2665C /* KMCropTipView.swift in Sources */,
 				BB89726F294DB67D0045787C /* KMWatermarkAdjectiveBaseView.swift in Sources */,
 				BB2EDF4E296E63E5003BCF58 /* KMPageEditInsertCustomPageWindowController.swift in Sources */,
+				BBB7B48B2A033F6200B58A5A /* KMThumbnailView.swift in Sources */,
 				9FBA0EF728FFC8A0001117AF /* KMCollectionView.swift in Sources */,
 				BB897226294B07960045787C /* KMWatermarkAdjectiveTopBarItemView.swift in Sources */,
 				89D2D2C7294972B900BFF5FE /* KMFormCellView.swift in Sources */,

+ 16 - 0
PDF Office/PDF Master/Class/Common/Category/NSCollectionViewItem+KMExtension.swift

@@ -0,0 +1,16 @@
+//
+//  NSCollectionViewItem+KMExtension.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/5/4.
+//
+
+import Foundation
+
+extension NSCollectionViewItem {
+    public class var km_identifier: NSUserInterfaceItemIdentifier {
+        get {
+            return NSUserInterfaceItemIdentifier(NSStringFromClass(self))
+        }
+    }
+}

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

@@ -0,0 +1,307 @@
+//
+//  KMThumbnailView.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/5/4.
+//
+
+import Cocoa
+
+@objc protocol KMThumbnailViewDelegate : NSObjectProtocol {
+    // layout
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, minimumLineSpacingForSectionAt section: Int) -> CGFloat
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, insetForSectionAt section: Int) -> NSEdgeInsets
+    
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, sizeForItemAt indexpath: IndexPath) -> NSSize
+    
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, numberOfItemsInSection section: Int) -> Int
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, itemForRepresentedObjectAt indexpath: IndexPath) -> NSCollectionViewItem
+    
+    // Drag & Drop
+    // 本地拖拽
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, didDrag dragedIndexPaths: [IndexPath], indexpath: IndexPath)
+    // 外部拖拽
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, didDragAddFiles files: [URL], indexpath: IndexPath)
+    
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, didSelectItemAt indexpath: IndexPath, object: AnyObject?)
+    @objc optional func thumbnailView(thumbanView: KMThumbnailView, rightMouseDidClick indexpath: IndexPath, item: NSCollectionViewItem?, object: AnyObject?)
+}
+
+@objc class KMThumbnailView: NSView {
+    
+    open weak var delegate: KMThumbnailViewDelegate?
+    
+    internal let localForDraggedTypes = kKMLocalForDraggedTypes
+    internal var dragedIndexPaths: [IndexPath] = []
+
+    override init(frame frameRect: NSRect) {
+        super.init(frame: frameRect)
+        
+        self.initDefaultValue()
+        self.initSubViews()
+    }
+    
+    required public init?(coder: NSCoder) {
+        super.init(coder: coder)
+        
+        self.initDefaultValue()
+        self.initSubViews()
+    }
+    
+    open var minimumLineSpacing: CGFloat = 0.0 {
+        didSet {
+            self.collectionView.reloadData()
+        }
+    }
+
+    open var minimumInteritemSpacing: CGFloat = 0.0 {
+        didSet {
+            self.collectionView.reloadData()
+        }
+    }
+
+    open var itemSize: NSSize = NSMakeSize(60, 80) {
+        didSet {
+            self.collectionView.reloadData()
+        }
+    }
+
+    open var sectionInset: NSEdgeInsets = NSEdgeInsetsZero {
+        didSet {
+            self.collectionView.reloadData()
+        }
+    }
+    
+    open var numberOfSections: Int = 0 {
+        didSet {
+            self.collectionView.reloadData()
+        }
+    }
+    
+    // MARK: - Publick Methods
+    
+    public func initDefaultValue() {
+        self.collectionView.registerForDraggedTypes([self.localForDraggedTypes, .fileURL,.string,.pdf])
+    }
+    
+    public func initSubViews() {
+        self.addSubview(self.scrollView)
+        self.scrollView.frame = self.bounds
+        self.scrollView.autoresizingMask = [.width, .height]
+        
+        self.scrollView.documentView = self.collectionView
+    }
+    
+    // MARK: - register ItemClass
+    
+    open func register(_ itemClass: AnyClass?) {
+        guard let itemClass_ = itemClass else {
+            return
+        }
+        
+        self.register(itemClass_, forItemWithIdentifier: NSStringFromClass(itemClass_))
+    }
+    
+    open func register(_ itemClass: AnyClass?, forItemWithIdentifier identifier: String) {
+        self.collectionView.register(itemClass, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: identifier))
+    }
+    
+    // MARK: - 刷新UI
+    
+    public func reloadData(indexs: Set<IndexPath> = NSSet() as! Set<IndexPath>) {
+        if (indexs.count == 0) {
+            self.collectionView.reloadData()
+        } else {
+            var indexpaths: Set<IndexPath> = []
+            for index in indexs {
+                if (index.section >= self.collectionView.numberOfSections) {
+                    continue
+                }
+                if (index.item >= self.collectionView.numberOfItems(inSection: index.section)) {
+                    continue
+                }
+                
+                indexpaths.insert(index)
+            }
+            if (indexpaths.count == 0) {
+                return
+            }
+            
+            if (Thread.isMainThread) {
+                self.collectionView.reloadItems(at: indexpaths)
+            } else {
+                DispatchQueue.main.async {
+                    self.collectionView.reloadItems(at: indexpaths)
+                }
+            }
+        }
+    }
+    
+    // MARK: - 属性 【懒加载】
+    
+    internal lazy var scrollView_: NSScrollView = {
+        let view = NSScrollView()
+        
+        view.hasHorizontalScroller = true
+        view.hasVerticalScroller = true
+        view.autohidesScrollers = true
+        view.minMagnification = 1.0
+        view.scrollerStyle = .overlay
+        
+        view.wantsLayer = true
+        view.layer?.backgroundColor = NSColor.clear.cgColor
+        
+        view.wantsLayer = true
+        view.contentView.layer?.backgroundColor = .white
+        
+        return view
+    }()
+    var scrollView: NSScrollView {
+        get {
+            return self.scrollView_
+        }
+    }
+    
+    internal lazy var collectionView_: NSCollectionView = {
+        let view = NSCollectionView()
+        view.autoresizingMask = [.width, .height]
+        
+        let layout = NSCollectionViewFlowLayout()
+        layout.sectionInset = NSEdgeInsetsMake(8, 15, 8, 15)
+        layout.minimumLineSpacing = 0
+        layout.minimumInteritemSpacing = 0
+        view.collectionViewLayout = layout
+        
+        view.delegate = self
+        view.dataSource = self
+        
+        view.register(NSCollectionViewItem.self, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMPDFThumbnailItem"))
+        view.isSelectable = true
+        
+        view.wantsLayer = true
+        view.layer?.backgroundColor = NSColor(hex: "#F7F8FA").cgColor
+        
+        return view
+    }()
+    var collectionView: NSCollectionView {
+        get {
+            return self.collectionView_
+        }
+    }
+}
+
+// MARK: - NSCollectionViewDataSource, NSCollectionViewDelegate
+
+extension KMThumbnailView: NSCollectionViewDataSource {
+    public func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
+        if let items = self.delegate?.thumbnailView?(thumbanView: self, numberOfItemsInSection: section) {
+            return items
+        }
+        return self.numberOfSections
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
+        if let item = self.delegate?.thumbnailView?(thumbanView: self, itemForRepresentedObjectAt: indexPath) {
+            return item
+        }
+        return NSCollectionViewItem()
+    }
+}
+
+// MARK: -  NSCollectionViewDelegate
+
+extension KMThumbnailView: NSCollectionViewDelegate {
+    func collectionView(_ collectionView: NSCollectionView, shouldSelectItemsAt indexPaths: Set<IndexPath>) -> Set<IndexPath> {
+        return indexPaths
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {}
+    
+    func collectionView(_ collectionView: NSCollectionView, shouldDeselectItemsAt indexPaths: Set<IndexPath>) -> Set<IndexPath> {
+        return indexPaths
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, didDeselectItemsAt indexPaths: Set<IndexPath>) {}
+    
+    func collectionView(_ collectionView: NSCollectionView, canDragItemsAt indexPaths: Set<IndexPath>, with event: NSEvent) -> Bool {
+        return true
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, writeItemsAt indexPaths: Set<IndexPath>, to pasteboard: NSPasteboard) -> Bool {
+        let data: Data = try! NSKeyedArchiver.archivedData(withRootObject: indexPaths, requiringSecureCoding: true)
+        pasteboard.declareTypes([self.localForDraggedTypes], owner: self)
+        pasteboard.setData(data, forType: self.localForDraggedTypes)
+        
+        self.dragedIndexPaths.removeAll()
+        for indexPath in indexPaths {
+            self.dragedIndexPaths.append(indexPath)
+        }
+        return true
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forItemsAt indexes: IndexSet) {}
+    
+    func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
+        let pboard = draggingInfo.draggingPasteboard
+        if (pboard.availableType(from: [self.localForDraggedTypes]) != nil) {
+            return .move
+        }
+        
+        return NSDragOperation(rawValue: 0)
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, indexPath: IndexPath, dropOperation: NSCollectionView.DropOperation) -> Bool {
+        let pboard = draggingInfo.draggingPasteboard
+        if (pboard.availableType(from: [self.localForDraggedTypes]) != nil) {
+            self.delegate?.thumbnailView?(thumbanView: self, didDrag: self.dragedIndexPaths, indexpath: indexPath)
+            self.dragedIndexPaths.removeAll()
+            return true
+        } else if ((pboard.availableType(from: [.fileURL])) != nil) {
+            var array: [URL] = []
+            for item: NSPasteboardItem in pboard.pasteboardItems! {
+                let string: String = item.string(forType: NSPasteboard.PasteboardType.fileURL)!
+                let url = NSURL(string: string)
+                array.append(url! as URL)
+            }
+            
+            self.delegate?.thumbnailView?(thumbanView: self, didDragAddFiles: array, indexpath: indexPath)
+            return true
+        }
+        
+        return false
+    }
+}
+
+// MARK: - NSCollectionViewDelegateFlowLayout
+
+extension KMThumbnailView: NSCollectionViewDelegateFlowLayout {
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
+        if let size_ = self.delegate?.thumbnailView?(thumbanView: self, sizeForItemAt: indexPath) {
+            return size_
+        }
+        
+        return self.itemSize
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
+        if let minimumLineSpacing_ = self.delegate?.thumbnailView?(thumbanView: self, minimumLineSpacingForSectionAt: section) {
+            return minimumLineSpacing_
+        }
+        return self.minimumLineSpacing
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
+        if let minimumInteritemSpacing_ = self.delegate?.thumbnailView?(thumbanView: self, minimumInteritemSpacingForSectionAt: section) {
+            return minimumInteritemSpacing_
+        }
+        return self.minimumInteritemSpacing
+    }
+    
+    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, insetForSectionAt section: Int) -> NSEdgeInsets {
+        if let inset = self.delegate?.thumbnailView?(thumbanView: self, insetForSectionAt: section) {
+            return inset
+        }
+        return self.sectionInset
+    }
+}

+ 4 - 3
PDF Office/PDF Master/Class/Common/KMCommonDefine.swift

@@ -11,7 +11,6 @@ import Foundation
  ** 用于定义一些共用的函数、共用的通知名称、其他
  */
 
-// MARK: -
 // MARK: - 共用的函数
 
 public func KMPrint(_ items: Any..., separator: String = " ", terminator: String = "\n") {
@@ -20,10 +19,8 @@ public func KMPrint(_ items: Any..., separator: String = " ", terminator: String
 #endif
 }
 
-// MARK: -
 // MARK: - 共用的通知名称
 
-// MARK: -
 // MARK: - 共用的Block
 
 typealias KMItemClickBlock<T> = (_ item: T?, _ index: Int)->()
@@ -31,3 +28,7 @@ typealias KMCommonClickBlock = (_ index: Int, _ params: Any...)->()
 typealias KMCommonBlock = (_ params: Any...)->()
 
 typealias KMValueDidChangeBlock = (_ value: Any?, [NSKeyValueChangeKey : Any]?)->()
+
+// MARK: - 其他
+
+let kKMLocalForDraggedTypes = NSPasteboard.PasteboardType(rawValue: "KMLocalForDraggedTypes")

+ 29 - 32
PDF Office/PDF Master/Class/PDFTools/PageEdit/Controller/KMPDFEditViewController.swift

@@ -136,7 +136,7 @@ class KMPDFEditViewController: NSViewController {
     override func viewDidLoad() {
         super.viewDidLoad()
         
-        self.thumbnailView.collectionView?.backgroundColor(NSColor(hex: "#CED0D4"))
+        self.thumbnailView.collectionView.backgroundColor(NSColor(hex: "#CED0D4"))
         
         let toolBar = self.toolBar
         self.topBarBox.contentView?.addSubview(toolBar)
@@ -291,7 +291,7 @@ class KMPDFEditViewController: NSViewController {
                 
                 var indexpaths: Set<IndexPath> = []
                 indexpaths.insert(IndexPath(item: index, section: 0))
-                self.thumbnailView.collectionView?.animator().scrollToItems(at: indexpaths, scrollPosition: .top)
+                self.thumbnailView.collectionView.animator().scrollToItems(at: indexpaths, scrollPosition: .top)
             }
         }
     }
@@ -1292,7 +1292,7 @@ extension KMPDFEditViewController : NSMenuDelegate,NSMenuItemValidation {
             action == #selector(sharePageItemAction) ||
             action == #selector(extractPageItemAction) ||
             action == #selector(showPageSizeItemAction) {
-            let row = self.thumbnailView.collectionView!.selectionIndexes
+            let row = self.thumbnailView.collectionView.selectionIndexes
             if row.count > 0 {
                 if (row.count > 1 && action == #selector(replacePageItemAction)) {
                     return false
@@ -1307,10 +1307,10 @@ extension KMPDFEditViewController : NSMenuDelegate,NSMenuItemValidation {
         }
         
         if (action == #selector(cut)) {
-            return self.thumbnailView.collectionView!.selectionIndexes.count > 0
+            return self.thumbnailView.collectionView.selectionIndexes.count > 0
         }
         if (action == NSSelectorFromString("copy:")) {
-            return self.thumbnailView.collectionView!.selectionIndexes.count > 0
+            return self.thumbnailView.collectionView.selectionIndexes.count > 0
         }
         if (action == #selector(paste)) {
             return self.copysPages.count > 0
@@ -1322,7 +1322,7 @@ extension KMPDFEditViewController : NSMenuDelegate,NSMenuItemValidation {
             return self.undoRedoManager.canRedo
         }
         if (action == #selector(delete)) {
-            return self.thumbnailView.collectionView!.selectionIndexes.count > 0
+            return self.thumbnailView.collectionView.selectionIndexes.count > 0
         }
         
         return true
@@ -1331,7 +1331,7 @@ extension KMPDFEditViewController : NSMenuDelegate,NSMenuItemValidation {
     func menuNeedsUpdate(_ menu: NSMenu) {
         menu.removeAllItems()
         
-        let row = self.thumbnailView.collectionView!.selectionIndexes
+        let row = self.thumbnailView.collectionView.selectionIndexes
 //        let point = self.thumbnailView.collectionView.convert(NSEvent.mouseLocation, to: nil)
 //        let indexpaths = self.thumbnailView.collectionView.indexPathForItem(at: point)
         if (row.isEmpty) {
@@ -1515,10 +1515,10 @@ extension KMPDFEditViewController: KMSelectPopButtonDelegate {
 }
 
 // MARK: -
-// MARK: KMPDFThumbnailViewDelegate
+// MARK: KMThumbnailViewDelegate
 
-extension KMPDFEditViewController: KMPDFThumbnailViewDelegate {
-    func thumbnailView(thumbanView: KMPDFThumbnailView, didDragAddFiles files: [URL], indexpath: IndexPath) {
+extension KMPDFEditViewController: KMThumbnailViewDelegate {
+    func thumbnailView(thumbanView: KMThumbnailView, didDragAddFiles files: [URL], indexpath: IndexPath) {
         /// 处理page
 //        var insertIndex: Int = indexpath.item
 //        self.lockedFiles.removeAll()
@@ -1551,15 +1551,15 @@ extension KMPDFEditViewController: KMPDFThumbnailViewDelegate {
 //        self.showPasswordWindow(insertIndex)
     }
     
-    func thumbnailView(thumbanView: KMPDFThumbnailView, didDragPages pages: [Int], indexpath: IndexPath) {
+    func thumbnailView(thumbanView: KMThumbnailView, didDrag dragedIndexPaths: [IndexPath], indexpath: IndexPath) {
         let toIndex = max(0, indexpath.item)
         var indexs = IndexSet()
-        for page in pages {
-            indexs.insert(page)
+        for indexpath in dragedIndexPaths {
+            indexs.insert(indexpath.item)
         }
         self.dragPages(indexs, toIndex)
         
-        if (pages.count > 0) {
+        if (dragedIndexPaths.count > 0) {
             // 提醒外面文档已编辑
             if (self.documentEditedCallback != nil) {
                 self.documentEditedCallback!()
@@ -1567,21 +1567,11 @@ extension KMPDFEditViewController: KMPDFThumbnailViewDelegate {
         }
     }
     
-    // MARK: thumbanView layout
-    
-    func thumbnailView(thumbanView: KMPDFThumbnailView, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
-        return 0.01
-    }
-    
-    func thumbnailView(thumbanView: KMPDFThumbnailView, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
-        return 0.01
-    }
-    
-    func thumbnailView(thumbanView: KMPDFThumbnailView, insetForSectionAt section: Int) -> NSEdgeInsets {
+    func thumbnailView(thumbanView: KMThumbnailView, insetForSectionAt section: Int) -> NSEdgeInsets {
         return NSEdgeInsets(top: 16, left: 16, bottom: 0, right: 32)
     }
     
-    func thumbnailView(thumbanView: KMPDFThumbnailView, sizeForItemAt indexpath: IndexPath) -> NSSize {
+    func thumbnailView(thumbanView: KMThumbnailView, sizeForItemAt indexpath: IndexPath) -> NSSize {
         self.thumbnailView.thumbnailSzie = CGSize(width: 120, height: 155)
         if (!self.thumbnailView.isShowPageSize) {
             return NSMakeSize(self.itemSize.width, self.itemSize.height+26)
@@ -1589,8 +1579,15 @@ extension KMPDFEditViewController: KMPDFThumbnailViewDelegate {
         return self.itemSize
     }
     
-    func thumbnailView(thumbanView: KMPDFThumbnailView, itemForRepresentedObjectAt indexpath: IndexPath) -> NSCollectionViewItem {
-        let cellView: KMPageEditThumbnailItem = thumbanView.collectionView!.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMPageEditThumbnailItem"), for: indexpath) as! KMPageEditThumbnailItem
+    func thumbnailView(thumbanView: KMThumbnailView, numberOfItemsInSection section: Int) -> Int {
+        if let count = self.pdfDocument?.pageCount {
+            return Int(count)
+        }
+        return 0
+    }
+    
+    func thumbnailView(thumbanView: KMThumbnailView, itemForRepresentedObjectAt indexpath: IndexPath) -> NSCollectionViewItem {
+        let cellView: KMPageEditThumbnailItem = thumbanView.collectionView.makeItem(withIdentifier: KMPageEditThumbnailItem.km_identifier, for: indexpath) as! KMPageEditThumbnailItem
         cellView.isShowPageSize = self.thumbnailView.isShowPageSize
         cellView.page = (self.pdfDocument?.page(at: UInt(indexpath.item)))!
         cellView.setPage(page: (self.pdfDocument?.page(at: UInt(indexpath.item)))!)
@@ -1623,20 +1620,20 @@ extension KMPDFEditViewController: KMPDFThumbnailViewDelegate {
 
 extension KMPDFEditViewController: KMEditMenuProtocol {
     @IBAction func cut(_ sender: Any) {
-        self.cutPages(with: self.thumbnailView.collectionView!.selectionIndexes)
+        self.cutPages(with: self.thumbnailView.collectionView.selectionIndexes)
         
         self.km_becomeFirstResponder()
     }
     
     @IBAction func copy(_ sender: Any) {
-        self.copyPages(with: self.thumbnailView.collectionView!.selectionIndexes)
+        self.copyPages(with: self.thumbnailView.collectionView.selectionIndexes)
         
         self.km_becomeFirstResponder()
     }
     
     @IBAction func paste(_ sender: Any) {
         var index: Int = Int(self.pdfDocument!.pageCount-1)
-        let indexSet = self.thumbnailView.collectionView!.selectionIndexes
+        let indexSet = self.thumbnailView.collectionView.selectionIndexes
         if (indexSet.isEmpty == false) {
             index = indexSet.last!
         }
@@ -1653,7 +1650,7 @@ extension KMPDFEditViewController: KMEditMenuProtocol {
                 return
             }
             
-            let selectedIndexs = self.thumbnailView.collectionView!.selectionIndexPaths
+            let selectedIndexs = self.thumbnailView.collectionView.selectionIndexPaths
             var indexs: IndexSet = IndexSet()
             for indexPath in selectedIndexs {
                 indexs.insert(indexPath.item)

+ 22 - 56
PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPageEditThumbnailView.swift

@@ -13,53 +13,44 @@ class KMPageEditThumbnailView: KMPDFThumbnailView {
     var selectionDidChange: KMPageEditThumbnailViewSelectionDidChange!
     
     private let defaultItemSize = NSMakeSize(208, 294)
-    var itemSize: NSSize = NSMakeSize(208, 294)
     private var defaultThumbnailSzie: NSSize!
     
     var selectionIndexPaths: Set<IndexPath> {
         get {
-            return self.collectionView!.selectionIndexPaths
+            return self.collectionView.selectionIndexPaths
         }
         set {
             var indexpaths: Set<IndexPath> = []
             for indexpath in newValue {
-                if (indexpath.section >= self.collectionView!.numberOfSections) {
+                if (indexpath.section >= self.collectionView.numberOfSections) {
                     continue
                 }
-                if (indexpath.item >= self.collectionView!.numberOfItems(inSection: indexpath.section)) {
+                if (indexpath.item >= self.collectionView.numberOfItems(inSection: indexpath.section)) {
                     continue
                 }
                 
                 indexpaths.insert(indexpath)
             }
             
-            self.collectionView?.selectionIndexPaths = indexpaths
+            self.collectionView.selectionIndexPaths = indexpaths
             
             // 通知外面
             guard let callback = self.selectionDidChange else {
                 return
             }
-            callback(self.collectionView!.selectionIndexPaths)
+            callback(self.collectionView.selectionIndexPaths)
         }
     }
     
-    override init(frame frameRect: NSRect) {
-        super.init(frame: frameRect)
+    override func initDefaultValue() {
+        super.initDefaultValue()
         
-        self.initDefalutValue()
-    }
-    
-    required init?(coder: NSCoder) {
-        super.init(coder: coder)
+        self.collectionView.allowsMultipleSelection = true
+        self.register(KMPageEditThumbnailItem.self)
+        self.collectionView.registerForDraggedTypes([NSPasteboard.PasteboardType(rawValue: "localForDraggedTypes"), .fileURL,.string,.pdf])
+        self.collectionView.setDraggingSourceOperationMask([.copy, .delete], forLocal: false)
         
-        self.initDefalutValue()
-    }
-    
-    private func initDefalutValue() {
-        self.collectionView?.allowsMultipleSelection = true
-        self.collectionView?.register(KMPageEditThumbnailItem.self, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMPageEditThumbnailItem"))
-        self.collectionView?.registerForDraggedTypes([NSPasteboard.PasteboardType(rawValue: "localForDraggedTypes"), .fileURL,.string,.pdf])
-        self.collectionView?.setDraggingSourceOperationMask([.copy, .delete], forLocal: false)
+        self.itemSize = NSMakeSize(208, 294)
         
         self.defaultThumbnailSzie = self.thumbnailSzie
         self.isShowPageSize = true
@@ -99,9 +90,9 @@ class KMPageEditThumbnailView: KMPDFThumbnailView {
             self.thumbnailSzie = NSSize(width: self.defaultThumbnailSzie.width*1.5, height: self.defaultThumbnailSzie.height*1.5)
         }
         
-        let indexpaths = self.collectionView?.selectionIndexPaths
+        let indexpaths = self.collectionView.selectionIndexPaths
         self.refreshUI()
-        self.collectionView?.selectionIndexPaths = indexpaths!
+        self.collectionView.selectionIndexPaths = indexpaths
     }
     
     public func zoomIn() {
@@ -116,21 +107,13 @@ class KMPageEditThumbnailView: KMPDFThumbnailView {
             self.thumbnailSzie = NSSize(width: self.defaultThumbnailSzie.width*0.5, height: self.defaultThumbnailSzie.height*0.5)
         }
         
-        let indexpaths = self.collectionView?.selectionIndexPaths
+        let indexpaths = self.collectionView.selectionIndexPaths
         self.refreshUI()
-        self.collectionView?.selectionIndexPaths = indexpaths!
-    }
-    
-    // MARK: NSCollectionView 代理
-    
-    override func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
-        super.collectionView(collectionView, itemForRepresentedObjectAt: indexPath)
-    }
-    
-    override func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
-        super.collectionView(collectionView, layout: collectionViewLayout, sizeForItemAt: indexPath)
+        self.collectionView.selectionIndexPaths = indexpaths
     }
-    
+}
+
+extension KMPageEditThumbnailView {
     override func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
         super.collectionView(collectionView, didSelectItemsAt: indexPaths)
         
@@ -138,35 +121,18 @@ class KMPageEditThumbnailView: KMPDFThumbnailView {
             guard let callback = self.selectionDidChange else {
                 return
             }
-            callback(self.collectionView!.selectionIndexPaths)
+            callback(collectionView.selectionIndexPaths)
         }
     }
     
-    override func collectionView(_ collectionView: NSCollectionView, shouldSelectItemsAt indexPaths: Set<IndexPath>) -> Set<IndexPath> {
-        return super.collectionView(collectionView, shouldSelectItemsAt: indexPaths)
-    }
     override func collectionView(_ collectionView: NSCollectionView, didDeselectItemsAt indexPaths: Set<IndexPath>) {
         super.collectionView(collectionView, didDeselectItemsAt: indexPaths)
-        
+    
         DispatchQueue.main.async {
             guard let callback = self.selectionDidChange else {
                 return
             }
-            
-            callback(self.collectionView!.selectionIndexPaths)
+            callback(collectionView.selectionIndexPaths)
         }
-
-    }
-    
-    override func collectionView(_ collectionView: NSCollectionView, writeItemsAt indexPaths: Set<IndexPath>, to pasteboard: NSPasteboard) -> Bool {
-        super.collectionView(collectionView, writeItemsAt: indexPaths, to: pasteboard)
-    }
-
-    override func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
-        return super.collectionView(collectionView, validateDrop: draggingInfo, proposedIndexPath: proposedDropIndexPath, dropOperation: proposedDropOperation)
-    }
-
-    override func collectionView(_ collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, indexPath: IndexPath, dropOperation: NSCollectionView.DropOperation) -> Bool {
-        super.collectionView(collectionView, acceptDrop: draggingInfo, indexPath: indexPath, dropOperation: dropOperation)
     }
 }

+ 53 - 235
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMPDFThumbnailView.swift

@@ -5,40 +5,10 @@
 //  Created by lxy on 2022/12/15.
 //
 
-import Cocoa
-
-@objc protocol KMPDFThumbnailViewDelegate: NSObjectProtocol {
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, didSelectPageAtIndex index: UInt, event: NSEvent)
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, item: KMPDFThumbnailItem, rightMouseDidSelect index: UInt, event: NSEvent)
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, didDragAddFiles files: [URL], indexpath: IndexPath)
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, didDragPages pages: [Int], indexpath: IndexPath)
-    
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, minimumLineSpacingForSectionAt section: Int) -> CGFloat
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, insetForSectionAt section: Int) -> NSEdgeInsets
-    
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, sizeForItemAt indexpath: IndexPath) -> NSSize
-    @objc optional func thumbnailView(thumbanView: KMPDFThumbnailView, itemForRepresentedObjectAt indexpath: IndexPath) -> NSCollectionViewItem
-}
-
-class KMPDFThumbnailView: NSView {
-    open weak var delegate: KMPDFThumbnailViewDelegate?
-    
+class KMPDFThumbnailView: KMThumbnailView {
     var document: CPDFDocument?
     var isShowPageSize = false
     var thumbnailSzie = NSZeroSize
-    var scrollView: NSScrollView = NSScrollView()
-    
-    private var collectionView_: NSCollectionView?
-    var collectionView: NSCollectionView? {
-        get {
-            return self.collectionView_
-        }
-    }
-    
-    private let thumbnailDraggedTypes = NSPasteboard.PasteboardType(rawValue: "localForDraggedTypes")
-    
-    private var dragedIndexPaths: [IndexPath] = []
     
     //标记线
     var isNeedMarkerLine: Bool = false
@@ -47,121 +17,60 @@ class KMPDFThumbnailView: NSView {
     //注释状态
     var annotationShowState: KMAnnotationViewShowType = .none {
         didSet {
-            self.collectionView?.reloadData()
+            self.collectionView.reloadData()
         }
     }
     //悬浮
     var hoverIndex: Int = -1
     
-    required init?(coder: NSCoder) {
-        super.init(coder: coder)
-        self.initUI()
-    }
-    
-    override init(frame frameRect: NSRect) {
-        super.init(frame: frameRect)
-        self.initUI()
-    }
-    
-    private func initUI() {
+    override func initDefaultValue() {
+        super.initDefaultValue()
+        
         self.wantsLayer = true
         self.layer?.backgroundColor = NSColor(hex: "#F7F8FA").cgColor
         
         self.thumbnailSzie = CGSize(width: 120, height: 155)
-  
-        let layout = NSCollectionViewFlowLayout()
-        layout.sectionInset = NSEdgeInsetsMake(8, 15, 8, 15)
-        layout.minimumLineSpacing = 0
-        layout.minimumInteritemSpacing = 0
-        
-        self.collectionView_ = NSCollectionView()
-        self.collectionView_?.autoresizingMask = NSView.AutoresizingMask(rawValue: 18)
-        self.collectionView_?.collectionViewLayout = layout
-        self.collectionView_?.dataSource = self
-        self.collectionView_?.delegate = self
-        self.collectionView_?.register(KMPDFThumbnailItem.self, forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMPDFThumbnailItem"))
-        self.collectionView_?.registerForDraggedTypes([thumbnailDraggedTypes])
-        self.collectionView_?.isSelectable = true
-        
-        self.collectionView_?.wantsLayer = true
-        self.collectionView_?.layer?.backgroundColor = NSColor(hex: "#F7F8FA").cgColor
-        
-        self.scrollView.hasHorizontalScroller = true
-        self.scrollView.hasVerticalScroller = true
-        self.scrollView.autohidesScrollers = true
-        self.scrollView.minMagnification = 1.0
-        self.scrollView.scrollerStyle = NSScroller.Style.overlay
-        self.scrollView.documentView = self.collectionView
-        
-        self.scrollView.wantsLayer = true
-        self.scrollView.layer?.backgroundColor = NSColor.clear.cgColor
-        
-        self.scrollView.contentView.layer?.backgroundColor = NSColor(hex: "#FFFFFF").cgColor
-        self.scrollView.contentView.wantsLayer = true
-        
-        self.addSubview(self.scrollView)
-        
-        
-        markerLineView.wantsLayer = true
-        markerLineView.layer?.backgroundColor = NSColor(hex: "#1770F4").cgColor
-        markerLineView.frame = CGRectMake(0, 0, 100, 2)
-        self.collectionView?.addSubview(markerLineView)
-        markerLineView.isHidden = true
-    }
-    
-    override func setFrameSize(_ newSize: NSSize) {
-        super.setFrameSize(newSize)
-        self.scrollView.frame = self.bounds
+        self.minimumLineSpacing = 8
     }
     
-    public func reloadData(indexs: Set<IndexPath> = NSSet() as! Set<IndexPath>) {
-        if indexs.count == 0 {
-            self.collectionView?.reloadData()
-        } else {
-            var indexpaths: Set<IndexPath> = []
-            for index in indexs {
-                if (index.section >= self.collectionView!.numberOfSections) {
-                    continue
-                }
-                if (index.item >= self.collectionView!.numberOfItems(inSection: index.section)) {
-                    continue
-                }
-                
-                indexpaths.insert(index)
-            }
-            if (indexpaths.count == 0) {
-                return
-            }
-            
-            if (Thread.isMainThread) {
-                self.collectionView?.reloadItems(at: indexpaths)
-            } else {
-                DispatchQueue.main.async {
-                    self.collectionView?.reloadItems(at: indexpaths)
-                }
-            }
-        }
+    override func initSubViews() {
+        super.initSubViews()
+        
+        self.register(KMPDFThumbnailItem.self)
+        
+        self.markerLineView.wantsLayer = true
+        self.markerLineView.layer?.backgroundColor = NSColor(hex: "#1770F4").cgColor
+        self.markerLineView.frame = CGRectMake(0, 0, 100, 2)
+        self.collectionView.addSubview(markerLineView)
+        self.markerLineView.isHidden = true
     }
 }
 
-extension KMPDFThumbnailView : NSCollectionViewDataSource {
-    func numberOfSections(in collectionView: NSCollectionView) -> Int {
-        return 1
+extension KMPDFThumbnailView {
+    override func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
+        if let size_ = self.delegate?.thumbnailView?(thumbanView: self, sizeForItemAt: indexPath) {
+            return size_
+        }
+        
+        let page = self.document?.page(at: UInt(indexPath.item))
+        let height = KMPDFThumbnailItem.sizeToFit(size: self.thumbnailSzie, page: page!, isShow: self.isShowPageSize)
+        
+        return NSMakeSize(collectionView.frame.size.width - 20, CGFloat(height))
     }
     
-    func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
+    override func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int {
         if let count = self.document?.pageCount {
             return Int(count)
         }
         return 0
     }
-        
-    func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
-        if let view = self.delegate?.thumbnailView?(thumbanView: self, itemForRepresentedObjectAt: indexPath) {
-            return view
+    
+    override func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
+        if let item = self.delegate?.thumbnailView?(thumbanView: self, itemForRepresentedObjectAt: indexPath) {
+            return item
         }
-        
-        let cellView: KMPDFThumbnailItem = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "KMPDFThumbnailItem"), for: indexPath) as! KMPDFThumbnailItem
+
+        let cellView: KMPDFThumbnailItem = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: NSStringFromClass(KMPDFThumbnailItem.self)), for: indexPath) as! KMPDFThumbnailItem
         cellView.thumbnailView = self
         if let page_ = self.document?.page(at: UInt(indexPath.item)) {
             cellView.page = page_
@@ -174,23 +83,23 @@ extension KMPDFThumbnailView : NSCollectionViewDataSource {
         }
         
         cellView.mouseDownAction = { [unowned self] (view, event) in
-            self.delegate?.thumbnailView?(thumbanView: self, didSelectPageAtIndex: UInt(indexPath.item), event: event)
+            self.delegate?.thumbnailView?(thumbanView: self, didSelectItemAt: indexPath, object: event)
         }
         
         cellView.rightMouseDownAction = { [unowned self] (view, event) in
-            self.delegate?.thumbnailView?(thumbanView: self, item: view, rightMouseDidSelect: UInt(indexPath.item), event: event)
+            self.delegate?.thumbnailView?(thumbanView: self, rightMouseDidClick: indexPath, item: view, object: event)
         }
         
         cellView.hoverCallBack = { [unowned self] view, mouseEntered in
-            if let _ = self.collectionView?.item(at: hoverIndex)?.view {
-                let tempCell = self.collectionView?.item(at: hoverIndex) as? KMPDFThumbnailItem
+            if let _ = self.collectionView.item(at: hoverIndex)?.view {
+                let tempCell = self.collectionView.item(at: hoverIndex) as? KMPDFThumbnailItem
                 tempCell!.hover = false
             }
             
             if mouseEntered {
                 hoverIndex = indexPath.item
-                if let _ = self.collectionView?.item(at: hoverIndex)?.view {
-                    let tempCell = self.collectionView?.item(at: hoverIndex) as? KMPDFThumbnailItem
+                if let _ = self.collectionView.item(at: hoverIndex)?.view {
+                    let tempCell = self.collectionView.item(at: hoverIndex) as? KMPDFThumbnailItem
                     tempCell!.hover = true
                 }
             } else {
@@ -200,100 +109,20 @@ extension KMPDFThumbnailView : NSCollectionViewDataSource {
         
         return cellView
     }
-}
-
-extension KMPDFThumbnailView: NSCollectionViewDelegateFlowLayout {
-    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> NSSize {
-        if let size_ = self.delegate?.thumbnailView?(thumbanView: self, sizeForItemAt: indexPath) {
-            return size_
-        }
-        
-        let page = self.document?.page(at: UInt(indexPath.item))
-        let height = KMPDFThumbnailItem.sizeToFit(size: self.thumbnailSzie, page: page!, isShow: self.isShowPageSize)
-        
-        return NSMakeSize(collectionView.frame.size.width - 20, CGFloat(height))
-    }
-    
-    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
-        if (self.delegate != nil) {
-            let minimumLineSpacing = self.delegate!.thumbnailView?(thumbanView: self, minimumLineSpacingForSectionAt: section)
-            if (minimumLineSpacing != nil) {
-                return minimumLineSpacing!
-            }
-        }
-        
-        return 8
-    }
-    
-    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
-        if (self.delegate != nil) {
-            let minimumInteritemSpacing = self.delegate!.thumbnailView?(thumbanView: self, minimumInteritemSpacingForSectionAt: section)
-            if (minimumInteritemSpacing != nil) {
-                return minimumInteritemSpacing!
-            }
-        }
-        
-        return 0.01
-    }
-    
-    func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, insetForSectionAt section: Int) -> NSEdgeInsets {
-        let inset = self.delegate?.thumbnailView?(thumbanView: self, insetForSectionAt: section)
-        if (inset != nil) {
-            return inset!
-        }
-        return NSEdgeInsetsZero
-    }
-}
-
-extension KMPDFThumbnailView: NSCollectionViewDelegate {
-    func collectionView(_ collectionView: NSCollectionView, shouldSelectItemsAt indexPaths: Set<IndexPath>) -> Set<IndexPath> {
-        return indexPaths
-    }
-    
-    func collectionView(_ collectionView: NSCollectionView, didSelectItemsAt indexPaths: Set<IndexPath>) {
-//        let index: IndexPath = indexPaths.first!
-//        self.delegate?.thumbnailView?(thumbanView: self, didSelectPageAtIndex: UInt(index.item))
-    }
-    
-    func collectionView(_ collectionView: NSCollectionView, shouldDeselectItemsAt indexPaths: Set<IndexPath>) -> Set<IndexPath> {
-        return indexPaths
-    }
     
-    func collectionView(_ collectionView: NSCollectionView, didDeselectItemsAt indexPaths: Set<IndexPath>) {
-    }
-    
-    func collectionView(_ collectionView: NSCollectionView, canDragItemsAt indexPaths: Set<IndexPath>, with event: NSEvent) -> Bool {
-
-        return true
-    }
-
-    func collectionView(_ collectionView: NSCollectionView, writeItemsAt indexPaths: Set<IndexPath>, to pasteboard: NSPasteboard) -> Bool {
-        let data: Data = try! NSKeyedArchiver.archivedData(withRootObject: indexPaths, requiringSecureCoding: true)
-        pasteboard.declareTypes([self.thumbnailDraggedTypes], owner: self)
-        pasteboard.setData(data, forType: self.thumbnailDraggedTypes)
-        
-        self.dragedIndexPaths.removeAll()
-        for indexPath in indexPaths {
-            self.dragedIndexPaths.append(indexPath)
-        }
-        return true
-    }
-    
-    func collectionView(_ collectionView: NSCollectionView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forItemsAt indexes: IndexSet) {
-        guard let collectionView_ = self.collectionView_ else {
-            return
-        }
+    override func collectionView(_ collectionView: NSCollectionView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forItemsAt indexes: IndexSet) {
         if self.isNeedMarkerLine {
-            self.markBeginIndexes = collectionView_.selectionIndexes
+            self.markBeginIndexes = collectionView.selectionIndexes
         }
+        return super.collectionView(collectionView, draggingSession: session, willBeginAt: screenPoint, forItemsAt: indexes)
     }
     
-    func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
+    override func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
         if self.isNeedMarkerLine {
             if self.markBeginIndexes.count != 0 {
                 if !self.markBeginIndexes.contains(proposedDropIndexPath.pointee.item) {
                     //标记线
-                    var rect = self.collectionView!.frameForItem(at: proposedDropIndexPath.pointee.item)
+                    var rect = self.collectionView.frameForItem(at: proposedDropIndexPath.pointee.item)
                     rect.size.height = 2
                     self.markerLineView.frame = rect
                     self.markerLineView.isHidden = false
@@ -301,20 +130,15 @@ extension KMPDFThumbnailView: NSCollectionViewDelegate {
             }
         }
         
-        let pboard = draggingInfo.draggingPasteboard
-        if (pboard.availableType(from: [thumbnailDraggedTypes]) != nil) {
-            return .move
-        }
-
-        return NSDragOperation(rawValue: 0)
+        return super.collectionView(collectionView, validateDrop: draggingInfo, proposedIndexPath: proposedDropIndexPath, dropOperation: proposedDropOperation)
     }
     
-    func collectionView(_ collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, indexPath: IndexPath, dropOperation: NSCollectionView.DropOperation) -> Bool {
-        markerLineView.isHidden = true
+    override func collectionView(_ collectionView: NSCollectionView, acceptDrop draggingInfo: NSDraggingInfo, indexPath: IndexPath, dropOperation: NSCollectionView.DropOperation) -> Bool {
+        self.markerLineView.isHidden = true
         self.markBeginIndexes = IndexSet()
         
         let pboard = draggingInfo.draggingPasteboard
-        if (pboard.availableType(from: [NSPasteboard.PasteboardType(rawValue: "localForDraggedTypes")]) != nil) {
+        if (pboard.availableType(from: [self.localForDraggedTypes]) != nil) {
             let dragIndexPath = self.dragedIndexPaths.first
             if (dragIndexPath == nil) {
                 return false
@@ -327,19 +151,12 @@ extension KMPDFThumbnailView: NSCollectionViewDelegate {
             if (toIndex >= self.document!.pageCount) {
                 return false
             }
-            
+
             if dragIndex == toIndex {
                 return false
             }
-            
-            var dragPages: [Int] = []
-            for indexpath in dragedIndexPaths {
-                dragPages.append(indexpath.item)
-            }
-            self.dragedIndexPaths.removeAll()
-            
-            self.delegate?.thumbnailView?(thumbanView: self, didDragPages: dragPages, indexpath: indexPath)
-            return true
+
+            return super.collectionView(collectionView, acceptDrop: draggingInfo, indexPath: indexPath, dropOperation: dropOperation)
         } else if ((pboard.availableType(from: [.fileURL])) != nil) {
             //获取url
             var array: [URL] = []
@@ -353,8 +170,9 @@ extension KMPDFThumbnailView: NSCollectionViewDelegate {
             }
             
             self.delegate?.thumbnailView?(thumbanView: self, didDragAddFiles: array, indexpath: indexPath)
+            return true
         }
-
+        
         return false
     }
 }

+ 56 - 49
PDF Office/PDF Master/Class/PDFWindowController/Side/LeftSide/Thumbnail/KMThumbnailViewController.swift

@@ -73,8 +73,8 @@ class KMThumbnailViewController: NSViewController {
 //        self.doublePageBtn.isHidden = true
         
         self.thumbnailView.delegate = self
-        self.thumbnailView.collectionView?.isSelectable = true
-        self.thumbnailView.collectionView?.allowsMultipleSelection = true
+        self.thumbnailView.collectionView.isSelectable = true
+        self.thumbnailView.collectionView.allowsMultipleSelection = true
         self.thumbnailView.isShowPageSize = true
         self.thumbnailView.isNeedMarkerLine = true
 //        self.thumbnailView.collectionView.allowsEmptySelection = false
@@ -124,7 +124,7 @@ class KMThumbnailViewController: NSViewController {
             for index in selectPages {
                 data.insert(IndexPath(item: index-1, section: 0))
             }
-            self.thumbnailView.collectionView?.reloadItems(at: data)
+            self.thumbnailView.collectionView.reloadItems(at: data)
             
             self.km_resignFirstResponder()
         }
@@ -260,7 +260,7 @@ class KMThumbnailViewController: NSViewController {
                 return
             }
             /// 处理page
-            var insertIndex: Int = self!.thumbnailView.collectionView!.selectionIndexes.last!
+            var insertIndex: Int = self!.thumbnailView.collectionView.selectionIndexes.last!
             let doucument = CPDFDocument(url: panel.url)
             if ((doucument?.isLocked)!) {
                 KMPasswordInputWindow.openWindow(window: self!.view.window!, url: panel.url!) { [weak self] result, password in
@@ -297,7 +297,7 @@ class KMThumbnailViewController: NSViewController {
     }
     
     @objc private func item_insertBankPage(sender: NSMenuItem?) {
-        let insertIndex: Int = self.thumbnailView.collectionView!.selectionIndexes.last!
+        let insertIndex: Int = self.thumbnailView.collectionView.selectionIndexes.last!
         let page = self.listView?.document.page(at: UInt(insertIndex))
         let document = CPDFDocument()
         document?.insertPage((page?.bounds.size)!, at: 0)
@@ -307,9 +307,9 @@ class KMThumbnailViewController: NSViewController {
     
     @objc private func item_insertPage(sender: NSMenuItem?) {
         let windowController = KMPageEditInsertCustomPageWindowController(windowNibName: "KMPageEditInsertCustomPageWindowController")
-        let insertIndex: Int = self.thumbnailView.collectionView!.selectionIndexes.last!
+        let insertIndex: Int = self.thumbnailView.collectionView.selectionIndexes.last!
         let page = self.listView?.document.page(at: UInt(insertIndex))
-        if (self.thumbnailView.collectionView!.selectionIndexes.count > 0) {
+        if (self.thumbnailView.collectionView.selectionIndexes.count > 0) {
             windowController.selectedPageSize = page!.bounds.size
         }
         
@@ -386,11 +386,11 @@ class KMThumbnailViewController: NSViewController {
             for index in selectPages {
                 data.insert(IndexPath(item: index-1, section: 0))
             }
-            self.thumbnailView.collectionView?.deselectAll(nil)
+            self.thumbnailView.collectionView.deselectAll(nil)
             if needScroll {
-                self.thumbnailView.collectionView?.selectItems(at: data, scrollPosition: .centeredVertically)
+                self.thumbnailView.collectionView.selectItems(at: data, scrollPosition: .centeredVertically)
             } else {
-                self.thumbnailView.collectionView?.selectItems(at: data, scrollPosition: NSCollectionView.ScrollPosition())
+                self.thumbnailView.collectionView.selectItems(at: data, scrollPosition: NSCollectionView.ScrollPosition())
             }
         }
     }
@@ -442,8 +442,8 @@ class KMThumbnailViewController: NSViewController {
                 return
             }
             
-            let indexs = self.thumbnailView.collectionView!.selectionIndexes
-            let indexPaths = self.thumbnailView.collectionView!.selectionIndexPaths
+            let indexs = self.thumbnailView.collectionView.selectionIndexes
+            let indexPaths = self.thumbnailView.collectionView.selectionIndexPaths
             if indexs.count >= 0 {
                 var pageItems: [KMThumbnailPageItem] = []
                 let newDocument = self.thumbnailView.document
@@ -478,8 +478,8 @@ class KMThumbnailViewController: NSViewController {
                 return
             }
             
-            let indexs = self.thumbnailView.collectionView!.selectionIndexes
-            let indexPaths = self.thumbnailView.collectionView!.selectionIndexPaths
+            let indexs = self.thumbnailView.collectionView.selectionIndexes
+            let indexPaths = self.thumbnailView.collectionView.selectionIndexPaths
             if indexs.count >= 0 {
                 var pageItems: [KMThumbnailPageItem] = []
                 let newDocument = self.thumbnailView.document
@@ -507,7 +507,7 @@ class KMThumbnailViewController: NSViewController {
     }
     
     @IBAction func extractPageItemAction(menu:NSMenuItem) {
-        let index = (self.thumbnailView.collectionView!.selectionIndexes).first ?? -1
+        let index = (self.thumbnailView.collectionView.selectionIndexes).first ?? -1
         if Int(index) >= 0 {
             let newDocument = self.thumbnailView.document
             var page : CPDFPage = (newDocument?.page(at: UInt(index)))!
@@ -523,7 +523,7 @@ class KMThumbnailViewController: NSViewController {
             panel.beginSheetModal(for: self.view.window!) { result in
                 if result == .OK {
                     let pdfdocument = CPDFDocument()
-                    let ret = pdfdocument!.importPages((self.thumbnailView.collectionView!.selectionIndexes), from: self.thumbnailView.document, at: 0)
+                    let ret = pdfdocument!.importPages((self.thumbnailView.collectionView.selectionIndexes), from: self.thumbnailView.document, at: 0)
                     if ret {
                         let success = pdfdocument!.write(to:panel.url)
                         if success {
@@ -539,7 +539,7 @@ class KMThumbnailViewController: NSViewController {
     
     @IBAction func pageEditItemAction(menu:NSMenuItem) {
         var indexs: [Int] = []
-        for index in self.thumbnailView.collectionView!.selectionIndexes {
+        for index in self.thumbnailView.collectionView.selectionIndexes {
             indexs.append(index)
         }
         self.delegate?.gotoPageEdit?(thumbnailViewController: self, pages: indexs)
@@ -552,7 +552,7 @@ class KMThumbnailViewController: NSViewController {
                 return
             }
             
-            let indexs = self.thumbnailView.collectionView!.selectionIndexes
+            let indexs = self.thumbnailView.collectionView.selectionIndexes
             if indexs.count > 0 {
                 self.deletePageItemWithIndexs(indexs: indexs)
                 // 事件外面传递
@@ -563,7 +563,7 @@ class KMThumbnailViewController: NSViewController {
     
     @IBAction func sharePageItemAction(menu:NSMenuItem) {
         let item = menu.parent!
-        let index = (self.thumbnailView.collectionView!.selectionIndexes).first ?? -1
+        let index = (self.thumbnailView.collectionView.selectionIndexes).first ?? -1
         if Int(index) >= 0 {
             let doucument = self.thumbnailView.document
             let page = doucument?.page(at: UInt(index))
@@ -571,7 +571,7 @@ class KMThumbnailViewController: NSViewController {
             let folderPath = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.applicationSupportDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?.stringByAppendingPathComponent(filename))!
             try? FileManager.default.removeItem(atPath: folderPath)
             let pdfdocument = CPDFDocument()
-            let ret = pdfdocument!.importPages((self.thumbnailView.collectionView!.selectionIndexes), from: self.thumbnailView.document, at: 0)
+            let ret = pdfdocument!.importPages((self.thumbnailView.collectionView.selectionIndexes), from: self.thumbnailView.document, at: 0)
             let url = URL(fileURLWithPath: folderPath)
             if ret {
                 let success = pdfdocument!.write(to:url)
@@ -594,7 +594,7 @@ class KMThumbnailViewController: NSViewController {
             }
         }
         
-        let indexs = self.thumbnailView.collectionView!.selectionIndexes
+        let indexs = self.thumbnailView.collectionView.selectionIndexes
         if indexs.count >= 0 {
             self.copysPages = []
             for i in indexs {
@@ -611,7 +611,7 @@ class KMThumbnailViewController: NSViewController {
                 return
             }
             
-            let indexs = self.thumbnailView.collectionView!.selectionIndexes
+            let indexs = self.thumbnailView.collectionView.selectionIndexes
             if indexs.count >= 0 {
                 self.copysPages = []
                 for i in indexs {
@@ -634,7 +634,7 @@ class KMThumbnailViewController: NSViewController {
                 return
             }
             
-            var index = (self.thumbnailView.collectionView!.selectionIndexes).last ?? -1
+            var index = (self.thumbnailView.collectionView.selectionIndexes).last ?? -1
             if Int(index) >= 0 && self.copysPages.count > 0 {
                 var pageItems: [KMThumbnailPageItem] = []
                 for page in self.copysPages {
@@ -656,7 +656,7 @@ class KMThumbnailViewController: NSViewController {
     
     @IBAction func printItemAction(menu:NSMenuItem) {
         var indexs:[Int] = []
-        for index in self.thumbnailView.collectionView!.selectionIndexes {
+        for index in self.thumbnailView.collectionView.selectionIndexes {
             indexs.append(index)
         }
         if indexs.count > 0 {
@@ -695,51 +695,58 @@ extension KMThumbnailViewController: KMThumbnailViewControllerAction {
     }
 }
 
-//MARK: KMPDFThumbnailViewDelegate
-extension KMThumbnailViewController : KMPDFThumbnailViewDelegate {
-    func thumbnailView(thumbanView: KMPDFThumbnailView, didSelectPageAtIndex index: UInt, event: NSEvent) {
+// MARK: - KMThumbnailViewDelegate
+
+extension KMThumbnailViewController : KMThumbnailViewDelegate {
+    func thumbnailView(thumbanView: KMThumbnailView, didSelectItemAt indexpath: IndexPath, object: AnyObject?) {
+        guard let event = object as? NSEvent else {
+            return
+        }
         NSApp.mainWindow?.makeFirstResponder(self)
         //是本地触发事件
         self.isLocalEvent = true
-        
-        if thumbanView.collectionView!.selectionIndexes.count == 1 || (!event.modifierFlags.contains(NSEvent.ModifierFlags.command) &&
+
+        if thumbanView.collectionView.selectionIndexes.count == 1 || (!event.modifierFlags.contains(NSEvent.ModifierFlags.command) &&
                                                                       !event.modifierFlags.contains(NSEvent.ModifierFlags.shift)) {
-            let page : CPDFPage = self.listView.document.page(at: index)
+            let page : CPDFPage = self.listView.document.page(at: UInt(indexpath.item))
             self.listView.go(toPageIndex: Int(page.pageIndex()), animated: true)
-            self.thumbnailView.collectionView?.deselectAll(nil)
-            self.thumbnailView.collectionView?.selectionIndexes = IndexSet(integer: IndexSet.Element(index))
+            self.thumbnailView.collectionView.deselectAll(nil)
+            self.thumbnailView.collectionView.selectionIndexes = IndexSet(integer: IndexSet.Element(indexpath.item))
         }
-        
-        
+
+
         var indexs: [Int] = []
-        for index in self.thumbnailView.collectionView!.selectionIndexes {
+        for index in self.thumbnailView.collectionView.selectionIndexes {
             indexs.append(index)
         }
         self.delegate?.pageDidSelect?(controller: self, pages: indexs)
     }
-    
-    func thumbnailView(thumbanView: KMPDFThumbnailView, item: KMPDFThumbnailItem, rightMouseDidSelect index: UInt, event: NSEvent) {
-        self.addRightMenuItem(view: item, event: event)
+
+    func thumbnailView(thumbanView: KMThumbnailView, rightMouseDidClick indexpath: IndexPath, item: NSCollectionViewItem?, object: AnyObject?) {
+        guard let event = object as? NSEvent else {
+            return
+        }
+        self.addRightMenuItem(view: item as! KMPDFThumbnailItem, event: event)
     }
-    
-    func thumbnailView(thumbanView: KMPDFThumbnailView, sizeForItemAt indexpath: IndexPath) -> NSSize {
+
+    func thumbnailView(thumbanView: KMThumbnailView, sizeForItemAt indexpath: IndexPath) -> NSSize {
         if self.doublePageMode {
             return NSMakeSize(86, 147)
         } else {
             return NSMakeSize(156, 226)
         }
     }
-    
-    func thumbnailView(thumbanView: KMPDFThumbnailView, didDragPages pages: [Int], indexpath: IndexPath) {
+
+    func thumbnailView(thumbanView: KMThumbnailView, didDrag dragedIndexPaths: [IndexPath], indexpath: IndexPath) {
         let toIndex = max(0, indexpath.item)
         var indexs = IndexSet()
-        for page in pages {
-            indexs.insert(page)
+        for indexpath in dragedIndexPaths {
+            indexs.insert(indexpath.item)
         }
         self.dragPagesForDescSort(indexs, toIndex)
     }
-    
-    func thumbnailView(thumbanView: KMPDFThumbnailView, insetForSectionAt section: Int) -> NSEdgeInsets {
+
+    func thumbnailView(thumbanView: KMThumbnailView, insetForSectionAt section: Int) -> NSEdgeInsets {
         if self.doublePageMode {
             return NSEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
         } else {
@@ -762,7 +769,7 @@ extension KMThumbnailViewController : NSMenuDelegate,NSMenuItemValidation {
             action == #selector(printItemAction) ||
             action == #selector(sharePageItemAction) ||
             action == #selector(extractPageItemAction) {
-            if self.thumbnailView.collectionView!.selectionIndexes.count > 0 {
+            if self.thumbnailView.collectionView.selectionIndexes.count > 0 {
                 return true
             } else {
                 return false
@@ -788,7 +795,7 @@ extension KMThumbnailViewController : NSMenuDelegate,NSMenuItemValidation {
     
     func addRightMenuItem(view: KMPDFThumbnailItem, event: NSEvent) {
         let index = view.page.pageIndex()
-        if !self.thumbnailView.collectionView!.selectionIndexes.contains(IndexSet.Element(index)) {
+        if !self.thumbnailView.collectionView.selectionIndexes.contains(IndexSet.Element(index)) {
             var indexs: IndexSet = IndexSet()
             indexs.insert(IndexSet.Element(index))
             self.selectPages(indexs: indexs, needScroll: false)
@@ -858,7 +865,7 @@ extension KMThumbnailViewController {
         
         self.listView.layoutDocumentView()
         self.thumbnailView.reloadData()
-        self.thumbnailView.collectionView?.selectItems(at: indexPaths, scrollPosition: .centeredVertically)
+        self.thumbnailView.collectionView.selectItems(at: indexPaths, scrollPosition: .centeredVertically)
         
         self.listView.undoManager?.registerUndo(withTarget: self) { [unowned self] targetType in
             self.isLocalEvent = true