// // KMCropController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/11/20. // import Cocoa import KMComponentLibrary @objc protocol KMCropControllerDelegate: AnyObject { @objc optional func kmCropControllerDidCrop(_ controller: KMCropController, _ cropRect: CGRect, _ view: KMPageRangeSelectView) @objc optional func kmCropControllerDidCropSeparate(_ controller: KMCropController, _ view: KMPageRangeSelectView) @objc optional func kmCropControllerDidCropAuto(_ controller: KMCropController, _ view: KMPageRangeSelectView) @objc optional func kmCropControllerDidChangedSelectionOrMagnification(_ controller: KMCropController) @objc optional func kmCropControllerDidResetController(_ controller: KMCropController) @objc optional func kmCropControllerDidExitController(_ controller: KMCropController) @objc optional func kmCropControllerDidApplyController(_ controller: KMCropController) } class KMCropController: NSViewController { @IBOutlet var contendView: NSView! @IBOutlet var preInfoView: NSView! @IBOutlet var propertyInfoView: NSView! private var documentPreview: KMEditDocumentController = KMEditDocumentController.init() private var coverController: KMCropCoverController? var pdfView: CPDFListView? { get { return documentPreview.pdfView } } var pdfDocument: CPDFDocument? var selectionRect: CGRect = .zero weak open var delegate: KMCropControllerDelegate? private var groupListMenuGroup: ComponentGroup? = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle()) override func viewDidLoad() { super.viewDidLoad() // Do view setup here. setup() } func setup() { view.wantsLayer = true view.layer?.backgroundColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle").cgColor documentPreview.view.frame = preInfoView.bounds documentPreview.view.autoresizingMask = [.width, .height] documentPreview.pdfView.pdfListViewDelegate = self documentPreview.pdfView.delegate = self preInfoView.addSubview(documentPreview.view) hiddenPropertyView(false) } func reloadData() { guard let pdfDocument = pdfDocument else { return } documentPreview.pdfDocument = pdfDocument documentPreview.reloadData() documentPreview.pdfView.toolMode = .CCropToolMode documentPreview.pdfView.selectionPageIndex = 0 reloadSelectionRect() } func hiddenPropertyView(_ hidden: Bool) { } func reloadSelectionRect() { guard let pdfDocument = pdfDocument else { return } if CGRectEqualToRect(selectionRect, CGRectZero) { let page = pdfDocument.page(at: 0) let bounds = page?.bounds ?? CGRectZero selectionRect = bounds } else { } documentPreview.pdfView.selectionRect = selectionRect documentPreview.pdfView.selectionPageIndex = 0 documentPreview.pdfView.setNeedsDisplayForVisiblePages() } } //MARK: - CPDFListViewDelegate extension KMCropController: CPDFListViewDelegate { func pdfListViewChangedSelectionOrMagnification(_ pdfListView: CPDFListView!) { KMCropManager.defaultManager.cropSeparateOn = false KMCropManager.defaultManager.cropAutoOn = false KMCropManager.defaultManager.cropRect = pdfView?.selectionRect delegate?.kmCropControllerDidChangedSelectionOrMagnification?(self) } func pdfListViewDidSelectionEnd(_ pdfListView: CPDFListView!) { } func pdfListViewMenu(forEvent pdfListView: CPDFListView!, for theEvent: NSEvent!, click menu: AutoreleasingUnsafeMutablePointer!, isMoveSelectAnno: Bool) { let point = self.view.convert(theEvent.locationInWindow, from: self.view) var items: [(String, String)] = [] items.append(("Apply", PDFViewMenuIdentifier_Edit_Apply)) items.append(("Reset", PDFViewMenuIdentifier_Edit_Reset)) items.append(("Exit", PDFViewMenuIdentifier_Edit_Exit)) var viewHeight: CGFloat = 8 var menuItemArr: [ComponentMenuitemProperty] = [] for (i, value) in items { if value.count == 0 { let property: ComponentMenuitemProperty = ComponentMenuitemProperty.divider() menuItemArr.append(property) viewHeight += 8 } else { let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false, itemSelected: false, keyEquivalent: nil, text: KMLocalizedString(i), identifier: value,representedObject: point) menuItemArr.append(properties_Menuitem) if(value == PDFViewMenuIdentifier_Edit_Exit) { properties_Menuitem.keyEquivalent = "ESC" } viewHeight += 36 } } groupListMenuGroup?.pagePoint = point groupListMenuGroup?.groupDelegate = self groupListMenuGroup?.frame = CGRectMake(0, 0, 180, viewHeight) groupListMenuGroup?.updateGroupInfo(menuItemArr) groupListMenuGroup?.showWithPoint(CGPoint(x: point.x, y: point.y - viewHeight), relativeTo: nil, withWindow: pdfListView.window) } func pdfListViewIsSupportSelecton(_ theEvent: NSEvent!, mouseType: KMPDFViewMouseType) -> Bool { return true } } //MARK: - ComponentGroupDelegate extension KMCropController: ComponentGroupDelegate { func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) { if menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Apply { delegate?.kmCropControllerDidApplyController?(self) } else if (menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Exit) { delegate?.kmCropControllerDidExitController?(self) } else if (menuItemProperty?.identifier == PDFViewMenuIdentifier_Edit_Reset) { delegate?.kmCropControllerDidResetController?(self) } } } extension KMCropController: CPDFViewDelegate { func pdfViewDocumentDidLoaded(_ pdfView: CPDFView!) { DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3) { self.reloadSelectionRect() self.delegate?.kmCropControllerDidChangedSelectionOrMagnification?(self) } } } //MARK: - KMCropPropertyControllerDelegate extension KMCropController: KMCropPropertyControllerDelegate { func kmCropControllerDidCrop(_ controller: KMCropPropertyController, _ cropRect: CGRect, _ view: KMPageRangeSelectView) { delegate?.kmCropControllerDidCrop?(self, cropRect, view) } func kmCropControllerDidCropAuto(_ controller: KMCropPropertyController, _ view: KMPageRangeSelectView) { delegate?.kmCropControllerDidCropAuto?(self, view) } func kmCropControllerDidCropSeparate(_ controller: KMCropPropertyController, _ view: KMPageRangeSelectView) { delegate?.kmCropControllerDidCropSeparate?(self, view) } func kmCropControllerDidCropInfoUpdated(_ controller: KMCropPropertyController) { delegate?.kmCropControllerDidChangedSelectionOrMagnification?(self) } }