// // KMBatchOCRView.swift // PDF Reader Pro // // Created by lizhe on 2025/1/8. // import Cocoa import KMComponentLibrary class KMBatchOCRView: KMBatchSettingItemView { @IBOutlet weak var titleLabel: NSTextField! @IBOutlet weak var titleContentView: NSView! @IBOutlet weak var ocrPageView: KMOCRPageView! @IBOutlet weak var applyButton: ComponentButton! @IBOutlet weak var cancelButton: ComponentButton! @IBOutlet weak var reportButton: ComponentButton! var groupView: ComponentGroup! var model: KMOCRModel = KMOCRModel() override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) // Drawing code here. } override func setup() { self.titleContentView.border(ComponentLibrary.shared.getComponentColorFromKey("colorBorder/divider"), 0.5, 0) applyButton.properties = ComponentButtonProperty(type: .primary, size: .m, showRightIcon: true, buttonText: KMLocalizedString("Apply"), keepPressState: false) applyButton.properties.propertyInfo.rightIcon_nor = NSImage(named: "arrowDown") applyButton.properties.propertyInfo.rightIcon_press = NSImage(named: "arrowDown_press") applyButton.setTarget(self, action: #selector(saveButtonClicked(_:))) applyButton.properties.buttonText = KMLocalizedString("Save as PDF") applyButton.properties.showRightIcon = true ocrPageView.type = .batch model.pageRangeType = .all model.saveAsPDF = true self.cancelButton.properties = ComponentButtonProperty(type: .primary, size: .m, state: .normal, buttonText: KMLocalizedString("Cancel"), keepPressState: false) self.cancelButton.setTarget(self, action: #selector(cancelButtonAction)) self.cancelButton.reloadData() self.cancelButton.isHidden = true reportButton.isHidden = false reportButton.properties = ComponentButtonProperty(type: .text_gray, size: .xxs, onlyIcon: true, icon: NSImage(named: "tools_report"), keepPressState: false) reportButton.toolTip = KMLocalizedString("If you have any feedback or optimization suggestions about the OCR feature, please contact us") reportButton.setTarget(self, action: #selector(reportButtonAction)) } //MARK: - GroupView func showGroupView() { var viewHeight: CGFloat = 8 var menuItemArr: [ComponentMenuitemProperty] = [] for i in ["Save as PDF", "Save as TXT"] { if i == " " { let property: ComponentMenuitemProperty = ComponentMenuitemProperty.divider() menuItemArr.append(property) viewHeight += 8 } else { let properties_Menuitem: ComponentMenuitemProperty = ComponentMenuitemProperty(multipleSelect: false, itemSelected: false, isDisabled: false, keyEquivalent: nil, text: KMLocalizedString(i)) menuItemArr.append(properties_Menuitem) viewHeight += 36 } } if groupView == nil { groupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle()) } groupView.groupDelegate = self groupView?.frame = CGRectMake(310, 0, CGRectGetWidth(applyButton.bounds), viewHeight) groupView.updateGroupInfo(menuItemArr) var point = self.convert(applyButton.frame.origin, to: nil) point.y += applyButton.bounds.size.height + 4 groupView.showWithPoint(point, relativeTo: applyButton) applyButton.properties.state = .pressed applyButton.reloadData() } func removeGroupView() { if groupView != nil { groupView.removeFromSuperview() } applyButton.properties.state = .normal applyButton.reloadData() } override func bacthProcessingNotification() { self.ocrPageView.isDisabled = self.isDisable self.applyButton.properties.isDisabled = self.isDisable self.applyButton.reloadData() self.updateCancelButtonState() } func updateCancelButtonState() { if self.isDisable { self.applyButton.isHidden = true self.cancelButton.isHidden = false } else { self.applyButton.isHidden = false self.cancelButton.isHidden = true } } } //MARK: Action extension KMBatchOCRView { @objc func saveButtonClicked(_ sender: ComponentButton) { showGroupView() } @objc func cancelButtonAction() { self.cancelAction?(self) self.updateCancelButtonState() } func reportButtonAction() { let help = KMUserFeekbackHanddler() help.showFeekbackWindow(with: KMLocalizedString("Propose a New Feature", comment: "")) } } extension KMBatchOCRView: ComponentGroupDelegate { func componentGroupDidDismiss(group: ComponentGroup?) { removeGroupView() applyButton.properties.state = .normal applyButton.reloadData() } func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) { if KMMemberInfo.shared.isLogin == false { KMLoginWindowsController.shared.showWindow(nil) return } if menuItemProperty?.text == KMLocalizedString("Save as PDF") { model.saveType = .PDF } else if menuItemProperty?.text == KMLocalizedString("Save as TXT") { model.saveType = .TXT } guard let callBack = batchExport else { return } callBack(self, model) } }