// // KMNOperationPopToolbarWindow.swift // PDF Reader Pro // // Created by 丁林圭 on 2025/2/6. // import Cocoa class KMNOperationPopToolbarWindow: NSWindow { static let shared = KMNOperationPopToolbarWindow() public var annotationPopMode:KMNAnnotationPopMode = KMNAnnotationPopMode(pdfAnnotations: []) convenience init() { let rect = NSRect(x: 0, y: 0, width: 400, height: 44) let styleMask: NSWindow.StyleMask = [.fullSizeContentView] self.init(contentRect: rect, styleMask: styleMask, backing: .buffered, defer: false) } override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) { super.init(contentRect: contentRect, styleMask: style, backing: backingStoreType, defer: flag) let contentViewC = KMNPopOperationViewController.shared self.contentViewController = contentViewC self.titlebarAppearsTransparent = true self.titleVisibility = .hidden self.isMovable = false self.contentView?.wantsLayer = true self.contentView?.layer?.cornerRadius = 4 self.contentView?.layer?.masksToBounds = true self.backgroundColor = .clear } func show(relativeTo positioningRect: NSRect, of positioningView: CPDFListView, preferredEdge: NSRectEdge) { self.orderFront(nil) } //MARK: - Public public func updateFrame(listView:CPDFListView?,page:CPDFPage?) { let windowFram = listView?.window?.frame ?? CGRectZero let pageRect = listView?.currentSelectionRect() ?? NSRect.zero if page != nil { let positioningRect = listView?.convert(pageRect, from: page!) ?? NSRect.zero if (CGRectIntersectsRect(positioningRect, listView?.frame ?? CGRectZero)) { let view: NSView? = nil let position = listView?.convert(positioningRect, to: view) ?? NSRect.zero var positionNew = position.origin positionNew.x += windowFram.origin.x + position.width positionNew.y += windowFram.origin.y var positionRect = self.frame positionRect.origin.x = positionNew.x - positionRect.width positionRect.origin.y = positionNew.y - popOffSet - positionRect.height var listViewWindRect = listView?.convert(listView?.frame ?? CGRect.zero, to: view) ?? CGRect.zero listViewWindRect.origin.x += windowFram.origin.x listViewWindRect.origin.y += windowFram.origin.y if CGRectGetMinY(positionRect) < CGRectGetMinY(listViewWindRect) { positionRect.origin.y = positionNew.y + popOffSet + position.height } if CGRectGetMinX(positionRect) < CGRectGetMinX(listViewWindRect) { positionRect.origin.x = CGRectGetMinX(listViewWindRect) } if CGRectGetMaxX(positionRect) > CGRectGetMaxX(listViewWindRect) { positionRect.origin.x = CGRectGetMaxX(listViewWindRect) - positionRect.width } self.setFrame(positionRect, display: true) let contentViewC = KMNPopOperationViewController.shared contentViewC.updateUILanguage() } } } public func closeWindow(listView:CPDFListView?) { if self.isVisible == true { listView?.window?.removeChildWindow(self) self.orderBack(nil) } } }