KMCropController.swift 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. //
  2. // KMCropController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/11/20.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc protocol KMCropControllerDelegate: AnyObject {
  10. @objc optional func kmCropControllerDidCrop(_ controller: KMCropController, _ cropRect: CGRect, _ view: KMPageRangeSelectView)
  11. @objc optional func kmCropControllerDidCropSeparate(_ controller: KMCropController, _ view: KMPageRangeSelectView)
  12. @objc optional func kmCropControllerDidCropAuto(_ controller: KMCropController, _ view: KMPageRangeSelectView)
  13. @objc optional func kmCropControllerDidChangedSelectionOrMagnification(_ controller: KMCropController)
  14. @objc optional func kmCropControllerDidResetController(_ controller: KMCropController)
  15. @objc optional func kmCropControllerDidExitController(_ controller: KMCropController)
  16. @objc optional func kmCropControllerDidApplyController(_ controller: KMCropController)
  17. }
  18. class KMCropController: NSViewController {
  19. @IBOutlet var contendView: NSView!
  20. @IBOutlet var preInfoView: NSView!
  21. @IBOutlet var propertyInfoView: NSView!
  22. private var documentPreview: KMEditDocumentController = KMEditDocumentController.init()
  23. private var coverController: KMCropCoverController?
  24. var pdfView: CPDFListView? {
  25. get {
  26. return documentPreview.pdfView
  27. }
  28. }
  29. var pdfDocument: CPDFDocument?
  30. var selectionRect: CGRect = .zero
  31. weak open var delegate: KMCropControllerDelegate?
  32. private var groupListMenuGroup: ComponentGroup? = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
  33. override func viewDidLoad() {
  34. super.viewDidLoad()
  35. // Do view setup here.
  36. setup()
  37. }
  38. func setup() {
  39. view.wantsLayer = true
  40. view.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor
  41. documentPreview.view.frame = preInfoView.bounds
  42. documentPreview.view.autoresizingMask = [.width, .height]
  43. documentPreview.pdfView.pdfListViewDelegate = self
  44. documentPreview.pdfView.delegate = self
  45. preInfoView.addSubview(documentPreview.view)
  46. hiddenPropertyView(false)
  47. }
  48. func reloadData() {
  49. guard let pdfDocument = pdfDocument else {
  50. return
  51. }
  52. documentPreview.pdfDocument = pdfDocument
  53. documentPreview.reloadData()
  54. documentPreview.pdfView.toolMode = .CCropToolMode
  55. documentPreview.pdfView.selectionPageIndex = 0
  56. reloadSelectionRect()
  57. }
  58. func hiddenPropertyView(_ hidden: Bool) {
  59. }
  60. func reloadSelectionRect() {
  61. guard let pdfDocument = pdfDocument else {
  62. return
  63. }
  64. if CGRectEqualToRect(selectionRect, CGRectZero) {
  65. let page = pdfDocument.page(at: 0)
  66. let bounds = page?.bounds ?? CGRectZero
  67. selectionRect = bounds
  68. } else {
  69. }
  70. documentPreview.pdfView.selectionRect = selectionRect
  71. documentPreview.pdfView.selectionPageIndex = 0
  72. documentPreview.pdfView.setNeedsDisplayForVisiblePages()
  73. }
  74. }
  75. //MARK: - CPDFListViewDelegate
  76. extension KMCropController: CPDFListViewDelegate {
  77. func pdfListViewChangedSelectionOrMagnification(_ pdfListView: CPDFListView!) {
  78. KMCropManager.defaultManager.cropSeparateOn = false
  79. KMCropManager.defaultManager.cropAutoOn = false
  80. KMCropManager.defaultManager.cropRect = pdfView?.selectionRect
  81. delegate?.kmCropControllerDidChangedSelectionOrMagnification?(self)
  82. }
  83. func pdfListViewDidSelectionEnd(_ pdfListView: CPDFListView!) {
  84. }
  85. func pdfListViewMenu(forEvent pdfListView: CPDFListView!, for theEvent: NSEvent!, click menu: AutoreleasingUnsafeMutablePointer<NSMenu?>!, isMoveSelectAnno: Bool) {
  86. let point = self.view.convert(theEvent.locationInWindow, from: self.view)
  87. var items: [(String, String)] = []
  88. items.append(("Apply", PDFViewMenuIdentifier_Edit_Apply))
  89. items.append(("Reset", PDFViewMenuIdentifier_Edit_Reset))
  90. items.append(("Exit", PDFViewMenuIdentifier_Edit_Exit))
  91. var viewHeight: CGFloat = 8
  92. var menuItemArr: [ComponentMenuitemProperty] = []
  93. for (i, value) in items {
  94. if value.count == 0 {
  95. let property: ComponentMenuitemProperty = ComponentMenuitemProperty.divider()
  96. menuItemArr.append(property)
  97. viewHeight += 8
  98. } else {
  99. let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false,
  100. itemSelected: false,
  101. keyEquivalent: nil,
  102. text: KMLocalizedString(i),
  103. identifier: value,representedObject: point)
  104. menuItemArr.append(properties_Menuitem)
  105. if(value == PDFViewMenuIdentifier_Edit_Exit) {
  106. properties_Menuitem.keyEquivalent = "ESC"
  107. }
  108. viewHeight += 36
  109. }
  110. }
  111. groupListMenuGroup?.pagePoint = point
  112. groupListMenuGroup?.groupDelegate = self
  113. groupListMenuGroup?.frame = CGRectMake(0, 0, 180, viewHeight)
  114. groupListMenuGroup?.updateGroupInfo(menuItemArr)
  115. groupListMenuGroup?.showWithPoint(CGPoint(x: point.x, y: point.y - viewHeight), relativeTo: nil, withWindow: pdfListView.window)
  116. }
  117. func pdfListViewIsSupportSelecton(_ theEvent: NSEvent!, mouseType: KMPDFViewMouseType) -> Bool {
  118. return true
  119. }
  120. }
  121. //MARK: - ComponentGroupDelegate
  122. extension KMCropController: ComponentGroupDelegate {
  123. func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
  124. if menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Apply {
  125. delegate?.kmCropControllerDidApplyController?(self)
  126. } else if (menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Exit) {
  127. delegate?.kmCropControllerDidExitController?(self)
  128. } else if (menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Reset) {
  129. delegate?.kmCropControllerDidResetController?(self)
  130. }
  131. }
  132. }
  133. extension KMCropController: CPDFViewDelegate {
  134. func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) {
  135. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) {
  136. self.reloadSelectionRect()
  137. self.delegate?.kmCropControllerDidChangedSelectionOrMagnification?(self)
  138. }
  139. }
  140. }
  141. //MARK: - KMCropPropertyControllerDelegate
  142. extension KMCropController: KMCropPropertyControllerDelegate {
  143. func kmCropControllerDidCrop(_ controller: KMCropPropertyController, _ cropRect: CGRect, _ view: KMPageRangeSelectView) {
  144. delegate?.kmCropControllerDidCrop?(self, cropRect, view)
  145. }
  146. func kmCropControllerDidCropAuto(_ controller: KMCropPropertyController, _ view: KMPageRangeSelectView) {
  147. delegate?.kmCropControllerDidCropAuto?(self, view)
  148. }
  149. func kmCropControllerDidCropSeparate(_ controller: KMCropPropertyController, _ view: KMPageRangeSelectView) {
  150. delegate?.kmCropControllerDidCropSeparate?(self, view)
  151. }
  152. func kmCropControllerDidCropInfoUpdated(_ controller: KMCropPropertyController) {
  153. delegate?.kmCropControllerDidChangedSelectionOrMagnification?(self)
  154. }
  155. }