KMNOperationPopToolbarWindow.swift 3.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. //
  2. // KMNOperationPopToolbarWindow.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by 丁林圭 on 2025/2/6.
  6. //
  7. import Cocoa
  8. class KMNOperationPopToolbarWindow: NSWindow {
  9. static let shared = KMNOperationPopToolbarWindow()
  10. public var annotationPopMode:KMNAnnotationPopMode = KMNAnnotationPopMode(pdfAnnotations: [])
  11. convenience init() {
  12. let rect = NSRect(x: 0, y: 0, width: 400, height: 44)
  13. let styleMask: NSWindow.StyleMask = [.fullSizeContentView]
  14. self.init(contentRect: rect, styleMask: styleMask, backing: .buffered, defer: false)
  15. }
  16. override init(contentRect: NSRect, styleMask style: NSWindow.StyleMask, backing backingStoreType: NSWindow.BackingStoreType, defer flag: Bool) {
  17. super.init(contentRect: contentRect, styleMask: style, backing: backingStoreType, defer: flag)
  18. let contentViewC = KMNPopOperationViewController.shared
  19. self.contentViewController = contentViewC
  20. self.titlebarAppearsTransparent = true
  21. self.titleVisibility = .hidden
  22. self.isMovable = false
  23. self.contentView?.wantsLayer = true
  24. self.contentView?.layer?.cornerRadius = 4
  25. self.contentView?.layer?.masksToBounds = true
  26. self.backgroundColor = .clear
  27. }
  28. func show(relativeTo positioningRect: NSRect, of positioningView: CPDFListView, preferredEdge: NSRectEdge) {
  29. self.orderFront(nil)
  30. }
  31. //MARK: - Public
  32. public func updateFrame(listView:CPDFListView?,page:CPDFPage?) {
  33. let windowFram = listView?.window?.frame ?? CGRectZero
  34. let pageRect = listView?.currentSelectionRect() ?? NSRect.zero
  35. if page != nil {
  36. let positioningRect = listView?.convert(pageRect, from: page!) ?? NSRect.zero
  37. if (CGRectIntersectsRect(positioningRect, listView?.frame ?? CGRectZero)) {
  38. let view: NSView? = nil
  39. let position = listView?.convert(positioningRect, to: view) ?? NSRect.zero
  40. var positionNew = position.origin
  41. positionNew.x += windowFram.origin.x + position.width
  42. positionNew.y += windowFram.origin.y
  43. var positionRect = self.frame
  44. positionRect.origin.x = positionNew.x - positionRect.width
  45. positionRect.origin.y = positionNew.y - popOffSet - positionRect.height
  46. var listViewWindRect = listView?.convert(listView?.frame ?? CGRect.zero, to: view) ?? CGRect.zero
  47. listViewWindRect.origin.x += windowFram.origin.x
  48. listViewWindRect.origin.y += windowFram.origin.y
  49. if CGRectGetMinY(positionRect) < CGRectGetMinY(listViewWindRect) {
  50. positionRect.origin.y = positionNew.y + popOffSet + position.height
  51. }
  52. if CGRectGetMinX(positionRect) < CGRectGetMinX(listViewWindRect) {
  53. positionRect.origin.x = CGRectGetMinX(listViewWindRect)
  54. }
  55. if CGRectGetMaxX(positionRect) > CGRectGetMaxX(listViewWindRect) {
  56. positionRect.origin.x = CGRectGetMaxX(listViewWindRect) - positionRect.width
  57. }
  58. self.setFrame(positionRect, display: true)
  59. let contentViewC = KMNPopOperationViewController.shared
  60. contentViewC.updateUILanguage()
  61. }
  62. }
  63. }
  64. public func closeWindow(listView:CPDFListView?) {
  65. if self.isVisible == true {
  66. listView?.window?.removeChildWindow(self)
  67. self.orderBack(nil)
  68. }
  69. }
  70. }