Browse Source

【2025】【缩图】拖拽时线条显示在下方

dinglingui 4 months ago
parent
commit
f9ac320a1f

+ 38 - 0
PDF Office/PDF Master/KMClass/KMNPDFPageEdit/KMNThumbnailView/KMNCustomCollectionViewLayout.swift

@@ -0,0 +1,38 @@
+//
+//  KMNCustomCollectionViewLayout.swift
+//  PDF Reader Pro
+//
+//  Created by 丁林圭 on 2024/11/9.
+//
+
+import Cocoa
+
+class KMNThumCustomCollectionViewFlowLayout: NSCollectionViewFlowLayout {
+    var lineAttributes: NSCollectionViewLayoutAttributes?
+    var lineColor: NSColor = .systemBlue
+    var lineHeight: CGFloat = 4.0
+    
+    override func layoutAttributesForElements(in rect: NSRect) -> [NSCollectionViewLayoutAttributes] {
+        var attributes = super.layoutAttributesForElements(in: rect)
+        
+        // 将指示线添加到布局属性中
+        if let lineAttributes = lineAttributes {
+            attributes.append(lineAttributes)
+        }
+        
+        return attributes
+    }
+    
+    func showLine(at indexPath: IndexPath, below rect: NSRect) {
+        let lineAttributes = NSCollectionViewLayoutAttributes(forDecorationViewOfKind: NSUserInterfaceItemIdentifier("Line").rawValue, with: indexPath)
+
+        lineAttributes.frame = NSRect(x: rect.origin.x, y: rect.origin.y, width: rect.width, height: lineHeight)
+        self.lineAttributes = lineAttributes
+        invalidateLayout()
+    }
+    
+    func hideLine() {
+        lineAttributes = nil
+        invalidateLayout()
+    }
+}

+ 1 - 1
PDF Office/PDF Master/KMClass/KMNPDFPageEdit/KMNThumbnailView/KMNPageEditViewController.swift

@@ -123,7 +123,7 @@ extension KMNPageEditViewController: ComponentGroupDelegate {
             cutMenuItemAciton()
         } else if (menuItemProperty?.identifier == ThumbnailMenuIdentifier_Paste) {
             if(menuItemProperty != nil) {
-//                pastMenuItemAciton(menuitemProperty: menuItemProperty!)
+                pastMenuItemAciton(menuitemProperty: menuItemProperty!)
             }
         } else if (menuItemProperty?.identifier == ThumbnailMenuIdentifier_Delete) {
             cutMenuItemAciton()

+ 24 - 0
PDF Office/PDF Master/KMClass/KMNPDFPageEdit/KMNThumbnailView/KMNThumDecorationView.swift

@@ -0,0 +1,24 @@
+//
+//  KMNThumDecorationView.swift
+//  PDF Reader Pro
+//
+//  Created by 丁林圭 on 2024/11/9.
+//
+
+import Cocoa
+
+class KMNThumDecorationView: NSView {
+
+    override func draw(_ dirtyRect: NSRect) {
+        super.draw(dirtyRect)
+        
+        NSColor.systemBlue.setStroke()
+        let path = NSBezierPath()
+        path.move(to: CGPoint(x: dirtyRect.origin.x, y: dirtyRect.origin.y))
+        path.line(to: CGPoint(x: dirtyRect.origin.x + dirtyRect.size.width, y: dirtyRect.origin.y))
+        path.lineWidth = 2.0
+        path.stroke()
+        
+    }
+    
+}

+ 60 - 60
PDF Office/PDF Master/KMClass/KMNPDFPageEdit/KMNThumbnailView/KMNThumbnailBaseViewController+Action.swift

@@ -563,66 +563,66 @@ extension KMNThumbnailBaseViewController {
         }
     }
     
-//    @objc public func pastMenuItemAciton(menuitemProperty:ComponentMenuitemProperty) {
-//        if IAPProductsManager.default().isAvailableAllFunction() == false {
-//            let winC = KMPurchaseCompareWindowController.sharedInstance()
-//            winC?.showWindow(nil)
-//            return
-//        }
-//        
-//        var pastIndex = 1
-//        let point = menuitemProperty.representedObject as? NSPoint
-//        
-//        if(point != nil) {
-//            let pointInCollectionView = collectionView.convert(point!, from: nil)
-//            
-//            let visibleItems = collectionView.visibleItems()
-//            let mouseX = pointInCollectionView.x
-//            let mouseY = pointInCollectionView.y
-//            
-//            // 获取当前行的所有 cell
-//            let currentRowItems = visibleItems.filter { item in
-//                if let indexPath = collectionView.indexPath(for: item),
-//                   let cellAttributes = collectionView.layoutAttributesForItem(at: indexPath) {
-//                    return cellAttributes.frame.minY <= mouseY && cellAttributes.frame.maxY >= mouseY
-//                }
-//                return false
-//            }
-//            if(mouseX < 24) { //点击区域在最左边
-//                // 找到最近右边的 cell
-//                let rightMostCell = currentRowItems.compactMap { collectionView.indexPath(for: $0) }
-//                    .filter { indexPath in
-//                        let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame
-//                        return cellRect?.minX ?? 0 > mouseX // 只选择右侧的 cell
-//                    }
-//                    .sorted { ($0.item < $1.item) } // 按 item 的顺序排列
-//                    .first // 选择第一个,即最右边的 cell
-//                pastIndex = (rightMostCell?.item ?? (Int(showDocument?.pageCount ?? 1)))
-//            } else {
-//                // 找到最近右边的 cell
-//                let leftMostCell = currentRowItems.compactMap { collectionView.indexPath(for: $0) }
-//                    .filter { indexPath in
-//                        let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame
-//                        return cellRect?.maxX ?? 0 < mouseX // 只选择左侧的 cell
-//                    }
-//                    .sorted { $0.item > $1.item } // 按 item 的逆序排列,以选择最近的左侧 cell
-//                    .first // 选择第一个,即最近的左边的 cell
-//                
-//                pastIndex = (leftMostCell?.item ?? (Int(showDocument?.pageCount ?? 1)) - 1) + 1
-//            }
-//        } else {
-//            let selectedIndexPaths = collectionView.selectionIndexPaths
-//            if(selectedIndexPaths.count > 0) {
-//                let maxmumIndexPath = selectedIndexPaths.max(by: { $0 < $1 })
-//                pastIndex = ((maxmumIndexPath?.item ?? 0) + 1)
-//            } else {
-//                pastIndex = Int(showDocument?.pageCount ?? 0)
-//            }
-//        }
-//        let copyPages = KMNThumbnailManager.manager.copyPages
-//        
-//        insertFormPages(insertPages: copyPages, pageDex: pastIndex)
-//    }
+    @objc public func pastMenuItemAciton(menuitemProperty:ComponentMenuitemProperty) {
+        if IAPProductsManager.default().isAvailableAllFunction() == false {
+            let winC = KMPurchaseCompareWindowController.sharedInstance()
+            winC?.showWindow(nil)
+            return
+        }
+        
+        var pastIndex = 1
+        let point = menuitemProperty.representedObject as? NSPoint
+        
+        if(point != nil) {
+            let pointInCollectionView = collectionView.convert(point!, from: nil)
+            
+            let visibleItems = collectionView.visibleItems()
+            let mouseX = pointInCollectionView.x
+            let mouseY = pointInCollectionView.y
+            
+            // 获取当前行的所有 cell
+            let currentRowItems = visibleItems.filter { item in
+                if let indexPath = collectionView.indexPath(for: item),
+                   let cellAttributes = collectionView.layoutAttributesForItem(at: indexPath) {
+                    return cellAttributes.frame.minY <= mouseY && cellAttributes.frame.maxY >= mouseY
+                }
+                return false
+            }
+            if(mouseX < 24) { //点击区域在最左边
+                // 找到最近右边的 cell
+                let rightMostCell = currentRowItems.compactMap { collectionView.indexPath(for: $0) }
+                    .filter { indexPath in
+                        let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame
+                        return cellRect?.minX ?? 0 > mouseX // 只选择右侧的 cell
+                    }
+                    .sorted { ($0.item < $1.item) } // 按 item 的顺序排列
+                    .first // 选择第一个,即最右边的 cell
+                pastIndex = (rightMostCell?.item ?? (Int(showDocument?.pageCount ?? 1)))
+            } else {
+                // 找到最近右边的 cell
+                let leftMostCell = currentRowItems.compactMap { collectionView.indexPath(for: $0) }
+                    .filter { indexPath in
+                        let cellRect = collectionView.layoutAttributesForItem(at: indexPath)?.frame
+                        return cellRect?.maxX ?? 0 < mouseX // 只选择左侧的 cell
+                    }
+                    .sorted { $0.item > $1.item } // 按 item 的逆序排列,以选择最近的左侧 cell
+                    .first // 选择第一个,即最近的左边的 cell
+                
+                pastIndex = (leftMostCell?.item ?? (Int(showDocument?.pageCount ?? 1)) - 1) + 1
+            }
+        } else {
+            let selectedIndexPaths = collectionView.selectionIndexPaths
+            if(selectedIndexPaths.count > 0) {
+                let maxmumIndexPath = selectedIndexPaths.max(by: { $0 < $1 })
+                pastIndex = ((maxmumIndexPath?.item ?? 0) + 1)
+            } else {
+                pastIndex = Int(showDocument?.pageCount ?? 0)
+            }
+        }
+        let copyPages = KMNThumbnailManager.manager.copyPages
+        
+        insertFormPages(insertPages: copyPages, pageDex: pastIndex)
+    }
     
     @objc public func cutMenuItemAciton() {
         if IAPProductsManager.default().isAvailableAllFunction() == false {

+ 2 - 1
PDF Office/PDF Master/KMClass/KMNPDFPageEdit/KMNThumbnailView/KMNThumbnailBaseViewController.swift

@@ -61,7 +61,8 @@ class KMNThumbnailBaseViewController: KMNBaseViewController,NSCollectionViewDele
     @IBOutlet var backViewBox: NSBox!
     @IBOutlet var scrollView: NSScrollView!
     @IBOutlet var collectionView: KMNThumbnailCollectionView!
-    
+    @IBOutlet var flowLayout: KMNThumCustomCollectionViewFlowLayout!
+
     private var currentDocument:CPDFDocument?
     private var isChangeIndexPaths = false
     

+ 2 - 1
PDF Office/PDF Master/KMClass/KMNPDFPageEdit/KMNThumbnailView/KMNThumbnailBaseViewController.xib

@@ -10,6 +10,7 @@
             <connections>
                 <outlet property="backViewBox" destination="CuB-Dn-dzz" id="dxa-1R-qFC"/>
                 <outlet property="collectionView" destination="zKK-EM-MTi" id="9vL-hb-IJk"/>
+                <outlet property="flowLayout" destination="s08-Bd-SKp" id="KYi-DU-mrx"/>
                 <outlet property="scrollView" destination="MtL-9j-REw" id="0rS-ia-yAU"/>
                 <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/>
             </connections>
@@ -35,7 +36,7 @@
                                         <collectionView id="zKK-EM-MTi" customClass="KMNThumbnailCollectionView" customModule="PDF_Reader_Pro" customModuleProvider="target">
                                             <rect key="frame" x="0.0" y="0.0" width="861" height="158"/>
                                             <autoresizingMask key="autoresizingMask" widthSizable="YES"/>
-                                            <collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="s08-Bd-SKp">
+                                            <collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="s08-Bd-SKp" customClass="KMNThumCustomCollectionViewFlowLayout" customModule="PDF_Reader_Pro" customModuleProvider="target">
                                                 <size key="itemSize" width="50" height="50"/>
                                             </collectionViewFlowLayout>
                                             <color key="primaryBackgroundColor" red="1" green="1" blue="1" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>

+ 1 - 1
PDF Office/PDF Master/KMClass/KMPDFViewController/KMMainViewController.swift

@@ -1135,7 +1135,7 @@ extension KMMainViewController: KMPDFToolbarControllerDelegate {
         if itemIdentifier == KMPDFToolbar_ViewDisplay_Identifier {
             //Display
             updatePDFDisplaySettingView()
-        } else if itemIdentifier == KMPDFToolbar_PageEdit_Identifier {            
+        } else if itemIdentifier == KMPDFToolbar_PageEdit_Identifier {
             if viewManager.isPageEditMode == true {
                 enterPageEditMode()
             } else {

+ 29 - 2
PDF Office/PDF Master/KMClass/Left/ThumnailView/KMNThumnailViewController.swift

@@ -25,6 +25,8 @@ class KMNThumnailViewController: KMNThumbnailBaseViewController {
     private var groupView: ComponentGroup? = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
 
     override func viewDidLoad() {
+        flowLayout.register(KMNThumDecorationView.self, forDecorationViewOfKind: NSUserInterfaceItemIdentifier("Line").rawValue)
+
         super.viewDidLoad()
         
         collectionView.menuClickedAction = { point in
@@ -126,10 +128,35 @@ class KMNThumnailViewController: KMNThumbnailBaseViewController {
     public override func collectionView(_ collectionView: NSCollectionView, layout collectionViewLayout: NSCollectionViewLayout, insetForSectionAt section: Int) -> NSEdgeInsets {
         return NSEdgeInsetsMake(8.0, 0, 8.0, 0)
     }
+    
+    //MARK: - NSCollectionViewDelegate
+    override func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
+        let dropTargetIndexPath = proposedDropIndexPath.pointee as IndexPath
+        let targetFrame = collectionView.frameForItem(at: dropTargetIndexPath.item)
+         flowLayout.showLine(at: dropTargetIndexPath, below: targetFrame)
+
+        return super.collectionView(collectionView, validateDrop: draggingInfo, proposedIndexPath: proposedDropIndexPath, dropOperation: proposedDropOperation)
+    }
+    
+    override func collectionView(_ collectionView: NSCollectionView,
+                        acceptDrop draggingInfo: NSDraggingInfo,
+                        indexPath: IndexPath,
+                        dropOperation: NSCollectionView.DropOperation) -> Bool {
+        flowLayout.hideLine()
+
+        return super.collectionView(collectionView, acceptDrop: draggingInfo, indexPath: indexPath, dropOperation: dropOperation)
+    }
+    
+    override func collectionView(_ collectionView: NSCollectionView,
+                        draggingSession session: NSDraggingSession,
+                        endedAt screenPoint: NSPoint,
+                        dragOperation operation: NSDragOperation) {
+        flowLayout.hideLine()
+        super.collectionView(collectionView, draggingSession: session, endedAt: screenPoint, dragOperation: operation)
+    }
         
 }
 
-
 //MARK: - ComponentSelectDelegate
 extension KMNThumnailViewController: ComponentGroupDelegate {
     func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
@@ -139,7 +166,7 @@ extension KMNThumnailViewController: ComponentGroupDelegate {
             cutMenuItemAciton()
         } else if (menuItemProperty?.identifier == ThumbnailMenuIdentifier_Paste) {
             if(menuItemProperty != nil) {
-//                pastMenuItemAciton(menuitemProperty: menuItemProperty!)
+                pastMenuItemAciton(menuitemProperty: menuItemProperty!)
             }
         } else if (menuItemProperty?.identifier == ThumbnailMenuIdentifier_Delete) {
             cutMenuItemAciton()

+ 16 - 0
PDF Office/PDF Reader Pro.xcodeproj/project.pbxproj

@@ -5761,6 +5761,12 @@
 		F3A0F86F2CCA118D00E7373F /* KMNTools.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A0F86C2CCA118D00E7373F /* KMNTools.swift */; };
 		F3A0F8712CCA16A300E7373F /* KMComponentLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BB5A9D232CB64F1D00F64C1F /* KMComponentLibrary.framework */; };
 		F3A0F8722CCA16A300E7373F /* KMComponentLibrary.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BB5A9D232CB64F1D00F64C1F /* KMComponentLibrary.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		F3A65ECD2CDF19C300F00102 /* KMNThumDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A65ECC2CDF19C300F00102 /* KMNThumDecorationView.swift */; };
+		F3A65ECE2CDF19C300F00102 /* KMNThumDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A65ECC2CDF19C300F00102 /* KMNThumDecorationView.swift */; };
+		F3A65ECF2CDF19C300F00102 /* KMNThumDecorationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A65ECC2CDF19C300F00102 /* KMNThumDecorationView.swift */; };
+		F3A65ED52CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A65ED42CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift */; };
+		F3A65ED62CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A65ED42CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift */; };
+		F3A65ED72CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A65ED42CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift */; };
 		F3A9DC81294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F3A9DC7D294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib */; };
 		F3A9DC82294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F3A9DC7D294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib */; };
 		F3A9DC83294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = F3A9DC7D294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib */; };
@@ -8265,6 +8271,8 @@
 		F3A0F8572CC940DD00E7373F /* KMNPDFInsertBlankWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNPDFInsertBlankWindowController.swift; sourceTree = "<group>"; };
 		F3A0F8582CC940DD00E7373F /* KMNPDFInsertBlankWindowController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KMNPDFInsertBlankWindowController.xib; sourceTree = "<group>"; };
 		F3A0F86C2CCA118D00E7373F /* KMNTools.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNTools.swift; sourceTree = "<group>"; };
+		F3A65ECC2CDF19C300F00102 /* KMNThumDecorationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMNThumDecorationView.swift; sourceTree = "<group>"; };
+		F3A65ED42CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KMNCustomCollectionViewLayout.swift; sourceTree = "<group>"; };
 		F3A9DC7D294309D80074E5D2 /* CPDFListEditAnnotationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CPDFListEditAnnotationViewController.xib; sourceTree = "<group>"; };
 		F3B7DF992948565000333201 /* CPDFListHoverAnnotationViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CPDFListHoverAnnotationViewController.xib; sourceTree = "<group>"; };
 		F3B7DFA32949C8E300333201 /* CPDFListView.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = CPDFListView.xcassets; sourceTree = "<group>"; };
@@ -15387,6 +15395,8 @@
 		F39603EA2CC64374003C6F71 /* KMNThumbnailView */ = {
 			isa = PBXGroup;
 			children = (
+				F3A65ECC2CDF19C300F00102 /* KMNThumDecorationView.swift */,
+				F3A65ED42CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift */,
 				F3D5D2B22CCE31AC00D4F1D5 /* KMNThumbnailCollectionView.swift */,
 				F337CC1A2CC6456D00D46AF4 /* KMNThumbnailBaseViewController.swift */,
 				F337CC1B2CC6456D00D46AF4 /* KMNThumbnailBaseViewController.xib */,
@@ -18161,6 +18171,7 @@
 				BB2F9AAF2AFCAE1F00F9DD93 /* KMProfileTitleCellView.swift in Sources */,
 				AD58F41F2B1DC29100299EE0 /* KMPrintViewModel.swift in Sources */,
 				656C1E2E2CD0745200295F82 /* KMConvertPageRangeSettingItemView.swift in Sources */,
+				F3A65ECD2CDF19C300F00102 /* KMNThumDecorationView.swift in Sources */,
 				AD53AF8F2BF1BC9200DCFFFC /* KMLoadingView.swift in Sources */,
 				BBFE6E87293210AB00142C01 /* KMCompressCellView.swift in Sources */,
 				BB146FE1299DC0D100784A6A /* GTLRDriveQuery.m in Sources */,
@@ -18620,6 +18631,7 @@
 				AD1FE8292BD7C98300AA4A9B /* KMMaskView.m in Sources */,
 				651559222CCA6E3100C0F0D9 /* KMConvertPPTsWindowController.swift in Sources */,
 				BBB7B48D2A0384E100B58A5A /* NSCollectionViewItem+KMExtension.swift in Sources */,
+				F3A65ED52CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift in Sources */,
 				F3732323292DFFFE0013862C /* CPDFListView+Extension.m in Sources */,
 				BB4EEF4C2976544F003A3537 /* KMRedactAligementView.swift in Sources */,
 				BBEDC22B2B98407000970C54 /* CPDFAction+KMExtension.swift in Sources */,
@@ -19094,6 +19106,7 @@
 				9F1FE4B529406E4700E952CA /* CTBrowser.m in Sources */,
 				BB6719E62AD28527003D44D5 /* CPDFLineAnnotation+PDFListView.swift in Sources */,
 				9FDD0FAB29534FCC000C4DAD /* KMAliasLight.swift in Sources */,
+				F3A65ED62CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift in Sources */,
 				BB716D612CDDB710009787ED /* KMHFTemplateController.swift in Sources */,
 				ADC63E402A49816900854E02 /* KMSubscribeSuccessView.swift in Sources */,
 				BBF38A63294F53FD0086D025 /* KMWatermarkFileView.swift in Sources */,
@@ -19581,6 +19594,7 @@
 				AD7D5CC32B9566D0006562CD /* KMBookmarkOutlineView.swift in Sources */,
 				BBFA1CCE2B609E890053AD4A /* KMScreenShotMaskWindowController.swift in Sources */,
 				9F5664882988B16F00020985 /* KMTextfieldVC.swift in Sources */,
+				F3A65ECE2CDF19C300F00102 /* KMNThumDecorationView.swift in Sources */,
 				652E95432C6913C20061FA40 /* KMLineAndBorderItemView.swift in Sources */,
 				89D2D2FC294C806000BFF5FE /* KMPDFThumbnailItem.swift in Sources */,
 				BBBE68152CC7C02800358B31 /* KMPDFViewManager.swift in Sources */,
@@ -20563,6 +20577,7 @@
 				9F0CB4F7298655D500007028 /* KMDesignToken+Fill.swift in Sources */,
 				BBE7889E2CBD2463008086E2 /* DropdownDemoVC.swift in Sources */,
 				BB14703D299DC0D200784A6A /* OIDErrorUtilities.m in Sources */,
+				F3A65ECF2CDF19C300F00102 /* KMNThumDecorationView.swift in Sources */,
 				ADD56F592BB3F48300E87ED9 /* KMFreeTextStylesViewController.m in Sources */,
 				BBFE6E772930E53000142C01 /* KMMergePopoverViewController.swift in Sources */,
 				ADF6B8782A48155E0090CB78 /* KMComparativeViewCollectionItem.swift in Sources */,
@@ -21253,6 +21268,7 @@
 				653647BB2CDCA5DE00CDB13E /* KMBatchOperateSplitViewController.swift in Sources */,
 				BB276A5A2B038D1100AB5578 /* KMOCRPDFWindowController.swift in Sources */,
 				BBE788F52CBD2464008086E2 /* TreeVC.swift in Sources */,
+				F3A65ED72CDF1C1E00F00102 /* KMNCustomCollectionViewLayout.swift in Sources */,
 				9F0ACC062C883464009574D5 /* KMEmbeddedPaymentPopWC.swift in Sources */,
 				AD1FE8312BD7C98300AA4A9B /* KMBookletParameterModel.m in Sources */,
 				AD9527D92952ED970039D2BC /* KMPrintPresenter_C.swift in Sources */,