Browse Source

【EditPDF】悬浮窗口跟随文档滑动补充

tangchao 8 months ago
parent
commit
e5a3aa7fdd

+ 72 - 0
PDF Office/PDF Master/Class/PDFTools/EditPDF/Toolbar/KMEditPDFToolbarItemView.swift

@@ -29,6 +29,32 @@ class KMEditPDFToolbarItemView: NSView {
     
     var obj: AnyObject?
     
+    private var area_: NSTrackingArea?
+    
+    private var popOver_: NSPopover?
+    var popOver: NSPopover? {
+        get {
+            return self.popOver_
+        }
+        set {
+            if self.popOver_ == nil || self.popOver_!.isEqual(to: newValue) == false {
+                self.popOver_ = newValue
+                if (newValue != nil) {
+//                    self.layer?.backgroundColor = Self.selectedBackgroundColor.cgColor
+                } else {
+//                    self.updateSelectBackground()
+                }
+            }
+        }
+    }
+    
+    deinit {
+        KMPrint("KMEditPDFToolbarItemView deinit.")
+        if let trackingArea = self.area_ {
+            self.removeTrackingArea(trackingArea)
+        }
+    }
+    
     convenience init() {
         self.init(frame: .zero)
         self.addSubview(self.contentBox_)
@@ -47,4 +73,50 @@ class KMEditPDFToolbarItemView: NSView {
         
 //        KMPrint("-------- \(boxFrame)")
     }
+    
+    override func updateTrackingAreas() {
+        super.updateTrackingAreas()
+
+        if let existingArea = self.area_ {
+            self.removeTrackingArea(existingArea)
+            self.area_ = nil
+        }
+
+        let opts: NSTrackingArea.Options = [.mouseEnteredAndExited, .mouseMoved, .activeAlways]
+        self.area_ = NSTrackingArea(rect: bounds, options: opts, owner: self, userInfo: nil)
+
+        if let trackingArea = self.area_ {
+            self.addTrackingArea(trackingArea)
+        }
+    }
+    
+    override func mouseEntered(with event: NSEvent) {
+        Self.cancelPreviousPerformRequests(withTarget: self, selector: #selector(_showPopTip), object: self)
+        self.perform(#selector(_showPopTip), with: self, afterDelay: 0.8)
+    }
+    
+    override func mouseExited(with event: NSEvent) {
+        Self.cancelPreviousPerformRequests(withTarget: self, selector: #selector(_showPopTip), object: self)
+        self._closePop()
+    }
+    
+    @objc func _showPopTip(_ sender: NSView) {
+        if (self.popOver_ != nil) {
+            return
+        }
+        let popViewController = KMToolbarItemPopViewController()
+        self.popOver = NSPopover()
+        self.popOver?.contentViewController = popViewController
+        self.popOver?.animates = false
+        self.popOver?.behavior = .semitransient
+        self.popOver?.contentSize = popViewController.view.frame.size
+        
+        popViewController.updateWithHelpTip(helpTip: self.toolTip ?? "字体方法")
+        self.popOver?.show(relativeTo: CGRectInset(self.bounds, 0, 5), of: self, preferredEdge: .minY)
+    }
+    
+    private func _closePop() {
+        self.popOver?.close()
+        self.popOver = nil
+    }
 }

+ 61 - 3
PDF Office/PDF Master/Class/PDFTools/EditPDF/Tools/KMEditPDfHanddler.swift

@@ -83,6 +83,8 @@ class KMEditPDfHanddler: NSObject {
         }
     }
     
+    private var startPoint_: NSPoint = .zero
+    
     func enterEditPDF() {
         let toolMode = self.listView?.toolMode ?? .none
         if toolMode != .editPDFToolMode { // 退出
@@ -90,8 +92,14 @@ class KMEditPDfHanddler: NSObject {
             self.listView?.setNeedsDisplayForVisiblePages()
             self.listView?.commitEditFormText()
             self.closeRightPane()
+            
+            self.hiddenPopWindow()
+            self._removeNotification()
             return
         }
+        
+        self._addNotification()
+        
         if self.rightSideLastState == .open {
             self.openRightPane()
         } else {
@@ -184,9 +192,11 @@ class KMEditPDfHanddler: NSObject {
         let area = (self.listView?.editingAreas().first as? CPDFEditArea)
         let areaBounds = (self.listView?.convert(area!.bounds, from: area!.page) as? NSRect) ?? .zero
         
+        self.startPoint_ = self.listView?.documentView().documentVisibleRect.origin ?? .zero
         win.show(relativeTo: areaBounds, of: self.viewC!.listView, preferredEdge: .maxY)
+        
         win.animator().alphaValue = 1
-        self.viewC?.view.window?.addChildWindow(win, ordered: .above)
+        self._kAddchildwindow(win)
         win.itemClick = { [weak self] itemKey, obj in
             if itemKey == .color {
                 self?.fontColorAction(color: obj as? NSColor)
@@ -262,7 +272,7 @@ class KMEditPDfHanddler: NSObject {
         let frame = NSMakeRect(x, winFrame.origin.y, 84, 44)
         winC.window?.setFrame(frame, display: true)
         winC.showWindow(nil)
-        self.viewC?.view.window?.addChildWindow(winC.window!, ordered: .above)
+        self._kAddchildwindow(winC.window!)
         winC.itemAction = { [weak self] idx, _ in
             self?.hiddenCropComfirmWindow()
             
@@ -324,7 +334,7 @@ class KMEditPDfHanddler: NSObject {
                 guideWC.window?.setFrame(winFrame, display: false)
                 guideWC.window?.minSize = winFrame.size
                 guideWC.window?.maxSize = winFrame.size
-                self.viewC?.view.window?.addChildWindow(guideWC.window!, ordered: .above)
+                self._kAddchildwindow(guideWC.window!)
                 guideWC.show()
                 DispatchQueue.main.async {
                     guideWC.interfaceThemeDidChanged(NSApp.appearance?.name ?? .aqua)
@@ -341,6 +351,13 @@ class KMEditPDfHanddler: NSObject {
 // MARK: - Private Methods
 
 extension KMEditPDfHanddler {
+    private func _kAddchildwindow(_ childW: NSWindow?) {
+        guard let win = childW else {
+            return
+        }
+        self.viewC?.view.window?.addChildWindow(win, ordered: .above)
+    }
+    
     private func _kRemoveChildWindow(_ childW: NSWindow?) {
         guard let win = childW else {
             return
@@ -350,6 +367,39 @@ extension KMEditPDfHanddler {
             self.viewC?.view.window?.removeChildWindow(win)
         }
     }
+    
+    private func _addNotification() {
+        NotificationCenter.default.addObserver(self, selector: #selector(_scrollViewDidScroll), name: NSScrollView.didLiveScrollNotification, object: self.listView?.documentView())
+    }
+    
+    private func _removeNotification() {
+        NotificationCenter.default.removeObserver(self, name: NSScrollView.didLiveScrollNotification, object: self.listView?.documentView())
+    }
+    
+    @objc private func _scrollViewDidScroll(_ noti: Notification) {
+        if let data = self.listView?.documentView().isEqual(to: noti.object), data {
+            let win = KMEditPDFPopToolBarWindow.shared
+            if win.isVisible == false {
+                return
+            }
+            guard let area = (self.listView?.editingAreas().first as? CPDFEditArea) else {
+                self.hiddenPopWindow()
+                return
+            }
+            
+            let areaBounds = (self.listView?.convert(area.bounds, from: area.page) as? NSRect) ?? .zero
+            
+            let winFrame = self.listView?.window?.frame ?? .zero
+            let view: NSView? = nil
+            var position = self.listView?.convert(areaBounds.origin, to: view) ?? .zero
+            position.x += winFrame.origin.x
+            position.y += winFrame.origin.y
+            position.y += areaBounds.size.height
+            position.y += 26
+            let wframe = NSMakeRect(position.x, position.y, win.frame.size.width, 44)
+            win.setFrame(wframe, display: true)
+        }
+    }
 }
 
 // MARK: - Action
@@ -463,6 +513,12 @@ extension KMEditPDfHanddler {
 
 //        FMTrackEventManager.defaultManager.trackEvent(event: "SubTbr_PageEdit", withProperties: ["SubTbr_Btn": "Btn_SubTbr_PageEdit_Rotate"])
         self.listView?.rotate(with: area, rotate: -90)
+        
+//        var frame = area.bounds
+//        frame.size.width += 100
+//        self.listView?.setBoundsEditArea(area, withBounds: frame)
+        // 文档拖拽、tooltip、多选场景、暗黑场景
+        
 //        if self.listView.editingAreas()!.count == 1 && (self.listView.editingAreas()!.first is CPDFEditImageArea) {
 //            self.listView.selectImageAreas = self.listView.editingAreas()!.first as? CPDFEditImageArea
 //        }
@@ -812,6 +868,8 @@ extension KMEditPDfHanddler: CPDFViewDelegate {
         
         let areas = self.listView?.editingAreas() as? [CPDFEditArea] ?? []
         if areas.isEmpty {
+            self.hiddenPopWindow()
+            
             let toolMode = self.listView?.toolMode ?? .none
             let annotationType = self.annotationType
             if toolMode == .editPDFToolMode {

+ 6 - 6
PDF Office/PDF Master/Class/PDFWindowController/PDFListView/CPDFListViewExtension/CPDFListView+Extension.m

@@ -1025,17 +1025,17 @@ CGFloat DEFAULT_SNAPSHOT_HEIGHT = 200.0;
 
 @implementation CPDFDocument (KMExtension)
 
-- (void)dealloc {
-    NSLog(@"CPDFDocument dealloc");
-}
+//- (void)dealloc {
+//    NSLog(@"CPDFDocument dealloc");
+//}
 
 @end
 
 @implementation CPDFView (KMExtension)
 
-- (void)dealloc {
-    NSLog(@"CPDFView dealloc");
-}
+//- (void)dealloc {
+//    NSLog(@"CPDFView dealloc");
+//}
 
 - (NSUndoManager *)fbUndoManager {
     @synchronized (self) {