Browse Source

【toolbar】新增pop弹窗

tangchao 1 year ago
parent
commit
61fcbb48d5

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

@@ -2646,6 +2646,9 @@
 		BBA2109429ACC10F00E6B346 /* signlist_add.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BBA2109329ACC10F00E6B346 /* signlist_add.pdf */; };
 		BBA2109529ACC10F00E6B346 /* signlist_add.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BBA2109329ACC10F00E6B346 /* signlist_add.pdf */; };
 		BBA2109629ACC10F00E6B346 /* signlist_add.pdf in Resources */ = {isa = PBXBuildFile; fileRef = BBA2109329ACC10F00E6B346 /* signlist_add.pdf */; };
+		BBA388132AEF9A42004FE93F /* NSWindow+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA388122AEF9A42004FE93F /* NSWindow+KMExtension.swift */; };
+		BBA388142AEF9A42004FE93F /* NSWindow+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA388122AEF9A42004FE93F /* NSWindow+KMExtension.swift */; };
+		BBA388152AEF9A42004FE93F /* NSWindow+KMExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA388122AEF9A42004FE93F /* NSWindow+KMExtension.swift */; };
 		BBA5429C29F13A140041BAD0 /* KMMemorandumPattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA5429B29F13A140041BAD0 /* KMMemorandumPattern.swift */; };
 		BBA5429D29F13A140041BAD0 /* KMMemorandumPattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA5429B29F13A140041BAD0 /* KMMemorandumPattern.swift */; };
 		BBA5429E29F13A140041BAD0 /* KMMemorandumPattern.swift in Sources */ = {isa = PBXBuildFile; fileRef = BBA5429B29F13A140041BAD0 /* KMMemorandumPattern.swift */; };
@@ -4294,6 +4297,7 @@
 		BBA19F4629AE27DA001A285A /* KMAnnotationTableRowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMAnnotationTableRowView.swift; sourceTree = "<group>"; };
 		BBA2108F29ACBFDA00E6B346 /* nosign.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = nosign.pdf; sourceTree = "<group>"; };
 		BBA2109329ACC10F00E6B346 /* signlist_add.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = signlist_add.pdf; sourceTree = "<group>"; };
+		BBA388122AEF9A42004FE93F /* NSWindow+KMExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+KMExtension.swift"; sourceTree = "<group>"; };
 		BBA5429B29F13A140041BAD0 /* KMMemorandumPattern.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMMemorandumPattern.swift; sourceTree = "<group>"; };
 		BBA5B6492A823E0200748A83 /* KMPDFEditViewController_dmg.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMPDFEditViewController_dmg.swift; sourceTree = "<group>"; };
 		BBA762D129D2D98D00844513 /* KMCommonDefine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KMCommonDefine.swift; sourceTree = "<group>"; };
@@ -6743,6 +6747,7 @@
 				BB74DA7A2AC41DE9006EDFE7 /* NSString+KMExtension.swift */,
 				BB60138F2AD3AFF000A76FB2 /* NSPopover+KMExtension.swift */,
 				BB7BC4DB2AD3FFC200D6BEE6 /* NSImage+ KMExtension.swift */,
+				BBA388122AEF9A42004FE93F /* NSWindow+KMExtension.swift */,
 			);
 			path = Category;
 			sourceTree = "<group>";
@@ -9966,6 +9971,7 @@
 				ADAFD9EE2AE616B100F084BC /* FocusAwareSecureTextField.swift in Sources */,
 				9F0CB5392986570600007028 /* KMDesignToken+BoxShadow.swift in Sources */,
 				9F0CB4B52977BC1000007028 /* KMPropertiesPanelPreviewSubVC.swift in Sources */,
+				BBA388132AEF9A42004FE93F /* NSWindow+KMExtension.swift in Sources */,
 				9F02018E2A1DDAA500C9B673 /* KMAITranslationWindowController.swift in Sources */,
 				BB88E45829404752002B3655 /* KMPDFConvert.swift in Sources */,
 				9F1FE4CC29406E4700E952CA /* CTTabContentsController.m in Sources */,
@@ -10301,6 +10307,7 @@
 				BB4BD9CD2909026500A66A65 /* KMRightSideViewController.swift in Sources */,
 				BB162E8F294FFC0C0088E9D1 /* KMWatermarkPDFView.swift in Sources */,
 				AD9527C7295295110039D2BC /* KMPrintPrinterModel.swift in Sources */,
+				BBA388142AEF9A42004FE93F /* NSWindow+KMExtension.swift in Sources */,
 				BBFE6E88293210AB00142C01 /* KMCompressCellView.swift in Sources */,
 				899700F728F4051B009AF911 /* KMAnnotationViewController.swift in Sources */,
 				9F1FE4C429406E4700E952CA /* CTPageTransition.c in Sources */,
@@ -11153,6 +11160,7 @@
 				9F1FE50729406E4700E952CA /* CTTabStripDragController.m in Sources */,
 				BB146FEC299DC0D100784A6A /* GTLRDuration.m in Sources */,
 				9FCFEC762AC56ECE00EAD2CB /* CPDFListStampAnnotation.swift in Sources */,
+				BBA388152AEF9A42004FE93F /* NSWindow+KMExtension.swift in Sources */,
 				9FD0D2A92AD4EFB000DA3FF8 /* KMSavePanelAccessoryController.swift in Sources */,
 				9F1FE4D129406E4700E952CA /* CTTabController.m in Sources */,
 				9F8539E029470A0700DF644E /* KMTabStripView.swift in Sources */,

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

@@ -350,8 +350,8 @@
             filePath = "PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "372"
-            endingLineNumber = "372"
+            startingLineNumber = "374"
+            endingLineNumber = "374"
             landmarkName = "scanOCRModelSelect(sender:)"
             landmarkType = "7">
          </BreakpointContent>

+ 47 - 0
PDF Office/PDF Master/Class/Common/Category/NSWindow+KMExtension.swift

@@ -0,0 +1,47 @@
+//
+//  NSWindow+KMExtension.swift
+//  PDF Master
+//
+//  Created by tangchao on 2023/10/30.
+//
+
+import Foundation
+
+private var _KMWindowPopOverKey = "KMWindowPopOverKey"
+private var _KMWindowPopOverSourcesRectKey = "KMWindowPopOverSourcesRectKey"
+extension NSWindow {
+    func setPopover(_ popover: NSPopover?) {
+        objc_setAssociatedObject(self, &_KMWindowPopOverKey, popover, .OBJC_ASSOCIATION_RETAIN)
+    }
+    
+    func popover() -> NSPopover? {
+        return objc_getAssociatedObject(self, &_KMWindowPopOverKey) as? NSPopover
+    }
+    
+    func setSourcesRect(_ sourcesRect: NSRect) {
+        objc_setAssociatedObject(self, &_KMWindowPopOverSourcesRectKey, NSValue(rect: sourcesRect), .OBJC_ASSOCIATION_RETAIN)
+    }
+    
+    func sourcesRect() -> NSRect {
+        if let data = objc_getAssociatedObject(self, &_KMWindowPopOverSourcesRectKey) as? NSValue {
+            return data.rectValue
+        }
+        return NSZeroRect
+    }
+    
+    open override func mouseMoved(with event: NSEvent) {
+        super.mouseMoved(with: event)
+        
+        let point = event.locationInWindow
+        if let data = event.window?.isKind(of: NSClassFromString("_NSPopoverWindow")!), data {
+            if (CGRectContainsPoint(self.sourcesRect(), point)) {
+                if self.popover() != nil {
+                    NotificationCenter.default.post(name: Notification.Name("KMPopOverClosedByWindowNotification"), object: self.popover()!)
+                    self.popover()?.close()
+                    self.setPopover(nil)
+                    self.setSourcesRect(CGRectNull)
+                }
+            }
+        }
+    }
+}

+ 2 - 0
PDF Office/PDF Master/Class/PDFTools/PageEdit/View/KMPDFEditToolbar.swift

@@ -420,6 +420,7 @@ extension KMPDFEditToolbar: KMToolbarViewDelegate {
             item?.titleName = NSLocalizedString("Page Range", comment: "")
             item?.boxImagePosition = .imageExpandLeft
             item?.btnAction = #selector(pageRangeMenuAction)
+            item?.needExpandAction = true
             
 //            let view = NSView()
 //            item?.addSubview(view)
@@ -530,6 +531,7 @@ extension KMPDFEditToolbar: KMToolbarViewDelegate {
             item?.toolTip = NSLocalizedString("Split and save selected PDF pages as a new separate document", comment: "")
             item?.titleName = NSLocalizedString("Split", comment: "")
             item?.boxImagePosition = .imageExpandLeft
+            item?.needExpandAction = true
             item?.btnAction = #selector(splitMenuAction)
             
             let menuItem = NSMenuItem.init(title: "Split", action: #selector(splitMenuAction), target: self)

+ 20 - 11
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMCustomButtonPopMenuViewController.swift

@@ -31,14 +31,19 @@ import Masonry
 
     weak var dataSources: KMCustomButtonPopMenuViewControllerDataSources?
     weak var delegate: KMCustomButtonPopMenuViewControllerDelegate?
+    
+//    override var nibName: NSNib.Name? {
+//        return "KMCustomButtonPopMenuViewController"
+//    }
 
     @objc override func viewDidLoad() {
         super.viewDidLoad()
         // Do view setup here.
         
         var numberOfLine = 0
-        if self.responds(to: Selector.init(("numberOfLine"))) {
-            numberOfLine = self.dataSources!.numberOfLine()
+        
+        if let data = self.dataSources?.numberOfLine() {
+            numberOfLine = data
         }
         if numberOfLine < 1 {
             return
@@ -50,13 +55,19 @@ import Masonry
             var image: NSImage?
             var title: String?
             
-            if self.responds(to: Selector.init(("imageForLineAtIndex:"))) {
-                image = self.dataSources?.imageForLine(at: i)
-                title = self.dataSources?.stringForLine(at: i)
+//            if self.responds(to: Selector.init(("imageForLineAtIndex:"))) {
+//                image = self.dataSources?.imageForLine(at: i)
+//                title = self.dataSources?.stringForLine(at: i)
+//            }
+            if let data = self.dataSources?.imageForLine(at: i) {
+                image = data
             }
-            if self.responds(to: Selector.init(("stringForLineAtIndex:"))) {
-                title = self.dataSources?.stringForLine(at: i)
+            if let data = self.dataSources?.stringForLine(at: i) {
+                title = data
             }
+//            if self.responds(to: Selector.init(("stringForLineAtIndex:"))) {
+//                title = self.dataSources?.stringForLine(at: i)
+//            }
 
             var v: KMPopMenuButton
             if let image1 = image {
@@ -75,7 +86,7 @@ import Masonry
             self.view.addSubview(v)
             
             v.mas_makeConstraints { make in
-                if let viewBool = referenceView?.isEqual(self.view) {
+                if let viewBool = referenceView?.isEqual(self.view), viewBool  {
                     make?.top.equalTo()(referenceView)?.offset()(CGFloat(10))
                 } else {
                     make?.top.equalTo()(referenceView?.mas_bottom)?.offset()(CGFloat(2))
@@ -115,8 +126,6 @@ import Masonry
     }
     
     @objc func buttonClicked(_ sender: NSButton) {
-        if self.responds(to: Selector.init(("customViewButtonPopDidSelectIndex:"))) {
-            self.delegate!.customViewButtonPopDidSelectIndex(sender.tag)
-        }
+        self.delegate?.customViewButtonPopDidSelectIndex(sender.tag)
     }
 }

+ 3 - 3
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMCustomButtonPopMenuViewController.xib

@@ -1,12 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21507" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21701"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21507"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
-        <customObject id="-2" userLabel="File's Owner" customClass="KMCustomButtonPopMenuViewController">
+        <customObject id="-2" userLabel="File's Owner" customClass="KMCustomButtonPopMenuViewController" customModule="PDF_Master" customModuleProvider="target">
             <connections>
                 <outlet property="view" destination="c22-O7-iKe" id="JxB-w3-Tzc"/>
             </connections>

+ 74 - 2
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarItemView.swift

@@ -207,7 +207,7 @@ extension KMToolbarItemView {
             return self._popOver
         }
         set {
-            if self._popOver?.isEqual(to: newValue) == false {
+            if self._popOver == nil || self._popOver!.isEqual(to: newValue) == false {
                 self._popOver = newValue
                 if (newValue != nil) {
                     self.layer?.backgroundColor = self.selectedBackgroundColor.cgColor
@@ -326,7 +326,7 @@ extension KMToolbarItemView {
         }
         if (self.needExpandAction) {
             self.needExpandButton.image = NSImage(named: "KMImageNameUXIconBtnTriDownSel")
-//            [self showPop:self];
+            self._showPop(self)
         }else if (self.isShowCustomToolTip) {
             self.perform(#selector(_showHUDHint), with: nil, afterDelay: 0.1)
         }
@@ -388,6 +388,27 @@ extension KMToolbarItemView {
         }
     }
     
+    private func _showPop(_ sender: NSView) {
+        let menuViewController = KMCustomButtonPopMenuViewController()
+        menuViewController.delegate = self
+        menuViewController.dataSources = self
+        self.popOver = NSPopover()
+        self.popOver?.delegate = self
+        self.popOver?.contentViewController = menuViewController
+        self.popOver?.animates = false
+        self.popOver?.behavior = .semitransient
+        self.popOver?.contentSize = menuViewController.view.frame.size
+        
+        var sourcesRect = sender.bounds
+        sourcesRect.size = sender.convert(sourcesRect.size, to: nil)
+        sourcesRect.origin.y -= 20
+        sourcesRect.size.height += 20
+        self.window?.setPopover(self.popOver)
+        self.window?.setSourcesRect(sourcesRect)
+        
+        self.popOver?.show(relativeTo: CGRectInset(self.bounds, 0, 5), of: self, preferredEdge: .maxY)
+    }
+    
     private func _closePop() {
         self.popOver?.close()
         self.popOver = nil
@@ -567,3 +588,54 @@ extension KMToolbarItemView {
         }
     }
 }
+
+extension KMToolbarItemView: NSPopoverDelegate {
+    
+}
+
+extension KMToolbarItemView: KMCustomButtonPopMenuViewControllerDelegate, KMCustomButtonPopMenuViewControllerDataSources {
+    func customViewButtonPopDidSelectIndex(_ index: Int) {
+        self._closePop()
+        
+//        if (self.itemIdentifier == KMToolbarPageEditPageRangeItemIdentifier) {
+            if let items = self.menuFormRepresentation?.submenu?.items {
+                let item = items[index]
+                item.target?.perform(item.action, with: item)
+            }
+//        }
+    }
+    
+    func numberOfLine() -> Int {
+//        if (self.itemIdentifier == KMToolbarPageEditPageRangeItemIdentifier) {
+            if let items = self.menuFormRepresentation?.submenu?.items {
+                return items.count
+            }
+//        }
+        return 0
+    }
+    
+    func stringForLine(at index: Int) -> String? {
+//        if (self.itemIdentifier == KMToolbarPageEditPageRangeItemIdentifier) {
+            if let items = self.menuFormRepresentation?.submenu?.items {
+                return items[index].title
+            }
+//        }
+        return nil
+    }
+    
+    func needInsertSeperateLine(at index: Int) -> Bool {
+        return false
+    }
+    
+    func needHightLightLine(at index: Int) -> Bool {
+        return false
+    }
+    
+    func imageForLine(at index: Int) -> NSImage? {
+        return nil
+    }
+    
+    func itemEnable(at index: Int) -> Bool {
+        return true
+    }
+}

+ 7 - 0
PDF Office/PDF Master/Class/PDFWindowController/Toolbar/KMToolbarViewController.swift

@@ -280,6 +280,8 @@ class KMToolbarViewController: NSViewController, NSTextFieldDelegate {
     @objc private func _watermarkAction(sender: NSMenuItem) {
         if let data = self._currentItemView {
             self.delegate?.toolbarViewController?(self, menuItemDidClick: data, index: sender.tag, info: nil)
+        } else {
+            self.delegate?.toolbarViewController?(self, menuItemDidClick: self.toolbarItemFindItemIdentifiers(value: KMToolbarToolWatermarkItemIdentifier), index: sender.tag, info: nil)
         }
     }
     
@@ -1441,6 +1443,7 @@ extension KMToolbarViewController {
             item?.toolTip = NSLocalizedString("Add PDF Bates numbering to your legal, medical, or business documents", comment: "")
             item?.titleName = NSLocalizedString("Bates Number", comment: "")
             item?.boxImagePosition = .imageExpandLeft
+            item?.needExpandAction = true
             item?.btnAction = #selector(batesMenuAction)
             
             let menuItem = NSMenuItem.init(title: "Bates Number", action: #selector(batesMenuAction), target: self)
@@ -1459,6 +1462,7 @@ extension KMToolbarViewController {
             item?.toolTip = NSLocalizedString("Insert header, footer, and page numbers to PDF", comment: "")
             item?.titleName = NSLocalizedString("Header & Footer", comment: "")
             item?.boxImagePosition = .imageExpandLeft
+            item?.needExpandAction = true
             item?.btnAction = #selector(headerfooterMenuAction)
             
             let menuItem = NSMenuItem.init(title: "Header & Footer", action: #selector(headerfooterMenuAction), target: self)
@@ -1477,6 +1481,7 @@ extension KMToolbarViewController {
             item?.toolTip = NSLocalizedString("Insert PDF page background by color or image", comment: "")
             item?.titleName = NSLocalizedString("Backgroud", comment: "")
             item?.boxImagePosition = .imageExpandLeft
+            item?.needExpandAction = true
             item?.btnAction = #selector(backgroundMenuAction)
             
             let menuItem = NSMenuItem.init(title: "Backgroud", action: #selector(backgroundMenuAction), target: self)
@@ -1495,6 +1500,7 @@ extension KMToolbarViewController {
             item?.toolTip = NSLocalizedString("Watermark", comment: "")
             item?.titleName = NSLocalizedString("Watermark", comment: "")
             item?.boxImagePosition = .imageExpandLeft
+            item?.needExpandAction = true
             item?.btnAction = #selector(watermarkMenuAction)
             
             let menuItem = NSMenuItem.init(title: "Watermark", action: #selector(watermarkMenuAction), target: self)
@@ -1520,6 +1526,7 @@ extension KMToolbarViewController {
             item?.toolTip = NSLocalizedString("Batch encrypting PDF documents", comment: "")
             item?.titleName = NSLocalizedString("Security", comment: "")
             item?.boxImagePosition = .imageExpandLeft
+            item?.needExpandAction = true
             item?.btnAction = #selector(secureMenuAction)
             
             let menuItem = NSMenuItem.init(title: "Security", action: #selector(secureMenuAction), target: self)