// // KMSubscribeWaterMarkWindowController.swift // PDF Master // // Created by lizhe on 2023/6/12. // import Cocoa var subscribeWaterMarkController: KMSubscribeWaterMarkWindowController? var subscribeWaterMarkMainWindow: NSWindow? @objc enum KMSubscribeWaterMarkType: Int { case none = 0 case stamp = 1 case link case sign case editText case editImage case insert case extract case replace case split case delete case rotate case copy case toWord case toExcel case toPPT case toRTF case toCSV case toHTML case toText case toImage case compress case merge case setPassword case removePassword case crop case aiTranslate case aiRewrite case aiCorrect } typealias KMSubscribeWaterMarkWindowControllerCloseAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void typealias KMSubscribeWaterMarkWindowControllerWatermarkExportAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void typealias KMSubscribeWaterMarkWindowControllerSubscribeAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void typealias KMSubscribeWaterMarkWindowControllerRestoreAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void class KMSubscribeWaterMarkWindowController: NSWindowController { @IBOutlet weak var waterMarkView: KMSubscribeWaterMarkView! @IBOutlet weak var waterViewHeightConstrain: NSLayoutConstraint! var closeAction: KMSubscribeWaterMarkWindowControllerCloseAction? var subscribeAction: KMSubscribeWaterMarkWindowControllerSubscribeAction? var watermarkExportAction: KMSubscribeWaterMarkWindowControllerWatermarkExportAction? var restoreAction: KMSubscribeWaterMarkWindowControllerRestoreAction? var isContinue: Bool? var isAI: Bool? deinit { KMPrint("KMSubscribeWaterMarkWindowController 释放") } override func windowDidLoad() { super.windowDidLoad() self.setup() self.reloadData() // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file. } override func awakeFromNib() { super.awakeFromNib() if let data = self.isAI, data { self.waterMarkView.waterExportButton.isHidden = true self.waterMarkView.subTrailingConst.constant = 60 self.waterMarkView.subWidthConst.constant = 280 self.waterMarkView.preferentialImageTrailingConst.constant = 92 } else { self.waterMarkView.waterExportButton.isHidden = false self.waterMarkView.subTrailingConst.constant = 0 self.waterMarkView.subWidthConst.constant = 192 self.waterMarkView.preferentialImageTrailingConst.constant = 32 } } //MARK: 打开文件 static func show(window: NSWindow, isContinue: Bool = false, isAI: Bool = false, type: KMSubscribeWaterMarkType = .none, completion: @escaping (_ isSubscribeSuccess: Bool, _ isWaterMarkExport: Bool, _ isClose: Bool) -> Void) -> KMSubscribeWaterMarkWindowController { let subscribeWaterMarkWindowController: KMSubscribeWaterMarkWindowController = KMSubscribeWaterMarkWindowController.init(windowNibName: "KMSubscribeWaterMarkWindowController") subscribeWaterMarkWindowController.isContinue = isContinue subscribeWaterMarkWindowController.isAI = isAI window.beginSheet(subscribeWaterMarkWindowController.window!) subscribeWaterMarkWindowController.window?.center() if isContinue { subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Continue", comment: "") } else { subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("带水印保存", comment: "") } subscribeWaterMarkWindowController.closeAction = { controller in completion(false, false, true) subscribeWaterMarkMainWindow?.endSheet(controller.window!) controller.window?.close() subscribeWaterMarkController = nil subscribeWaterMarkMainWindow = nil } subscribeWaterMarkWindowController.watermarkExportAction = { controller in completion(false, true, false) subscribeWaterMarkMainWindow?.endSheet(controller.window!) controller.window?.close() subscribeWaterMarkController = nil subscribeWaterMarkMainWindow = nil } subscribeWaterMarkWindowController.subscribeAction = { controller in // 数据埋点 controller.trackEvent(type: type) controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2)) KMPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in if isSuccess { subscribeWaterMarkMainWindow?.endSheet(controller.window!) controller.window?.close() subscribeWaterMarkController = nil subscribeWaterMarkMainWindow = nil DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { if NSApp.mainWindow != nil { let controller = KMSubscribeSuccessWindowController.show(window: NSApp.mainWindow!) controller.closeAction = { controller in controller.closeWindow() completion(true, false, false) } } } } else { KMComparativeTableViewController.purchasefailed(state: .failed) completion(false, false, false) } controller.waterMarkView.endLoading() } } subscribeWaterMarkWindowController.restoreAction = { controller in controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2)) KMPurchaseManager.manager.restorePurchases { isSuccess in if isSuccess { subscribeWaterMarkMainWindow?.endSheet(controller.window!) controller.window?.close() subscribeWaterMarkController = nil subscribeWaterMarkMainWindow = nil DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) { if NSApp.mainWindow != nil { let controller = KMSubscribeSuccessWindowController.show(window: NSApp.mainWindow!) controller.closeAction = { controller in controller.closeWindow() completion(true, false, false) } } } } else { KMComparativeTableViewController.purchasefailed(state: .restoreFailed) completion(false, false, false) } controller.waterMarkView.endLoading() } } subscribeWaterMarkController = subscribeWaterMarkWindowController subscribeWaterMarkMainWindow = window return subscribeWaterMarkWindowController } func setup() { self.window?.contentView?.backgroundColor(NSColor(hex: "#FFFFFF")) self.waterMarkView.waterExportButton.title = "" self.waterMarkView.closeAction = { [weak self] view in guard let callBack = self?.closeAction else { return } callBack((self!)) } self.waterMarkView.waterMarkExportAction = { [weak self] view in self?.trackEvent(eventName: "PUW_Sub_SaveWatermark") guard let callBack = self?.watermarkExportAction else { return } callBack((self!)) } self.waterMarkView.subscribeAction = { [weak self] view in self?.trackEvent(eventName: "PUW_Sub_Subscribe") guard let callBack = self?.subscribeAction else { return } callBack((self!)) } self.waterMarkView.restoreAction = { [weak self] view in guard let callBack = self?.restoreAction else { return } callBack((self!)) } } func closeWindow() { if subscribeWaterMarkMainWindow != nil { subscribeWaterMarkMainWindow?.endSheet((subscribeWaterMarkController?.window)!) } if subscribeWaterMarkController != nil { subscribeWaterMarkController?.window?.close() } subscribeWaterMarkController = nil subscribeWaterMarkMainWindow = nil } func reloadData() { #if VERSION_FREE self.waterViewHeightConstrain.constant = 511 #endif #if VERSION_DMG self.waterViewHeightConstrain.constant = 511 - 80 #endif } static func isSampleController() -> KMSubscribeWaterMarkWindowController { for window in NSApp.windows { let controller = window.windowController if controller is KMSubscribeWaterMarkWindowController { return controller as! KMSubscribeWaterMarkWindowController } } return KMSubscribeWaterMarkWindowController() } } // MARK: - Analytics (埋点) extension KMSubscribeWaterMarkWindowController { func trackEvent(eventName: String) -> Void { KMAnalytics.trackEvent(eventName: eventName, parameters: [ KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.puw, KMAnalytics.Parameter.labelKey : KMAnalytics.Label.sub_PUW], platform: .AppCenter, appTarget: .dmg) } func trackEvent(type: KMSubscribeWaterMarkType) -> Void { if (type == .stamp) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Stamp", parameters: nil, appTarget: .dmg) } else if (type == .link) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Link", parameters: nil, appTarget: .dmg) } else if (type == .sign) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Sign", parameters: nil, appTarget: .dmg) } else if (type == .editText) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_EditText", parameters: nil, appTarget: .dmg) } else if (type == .editImage) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_EditImage", parameters: nil, appTarget: .dmg) } else if (type == .insert) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Insert", parameters: nil, appTarget: .dmg) } else if (type == .extract) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Extract", parameters: nil, appTarget: .dmg) } else if (type == .replace) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Replace", parameters: nil, appTarget: .dmg) } else if (type == .split) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Split", parameters: nil, appTarget: .dmg) } else if (type == .delete) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Delete", parameters: nil, appTarget: .dmg) } else if (type == .rotate) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Rotate", parameters: nil, appTarget: .dmg) } else if (type == .copy) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Copy", parameters: nil, appTarget: .dmg) } else if (type == .toWord) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToWord", parameters: nil, appTarget: .dmg) } else if (type == .toExcel) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToExcel", parameters: nil, appTarget: .dmg) } else if (type == .toPPT) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToPPT", parameters: nil, appTarget: .dmg) } else if (type == .toRTF) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToRTF", parameters: nil, appTarget: .dmg) } else if (type == .toCSV) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToCSV", parameters: nil, appTarget: .dmg) } else if (type == .toHTML) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToHTML", parameters: nil, appTarget: .dmg) } else if (type == .toText) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToText", parameters: nil, appTarget: .dmg) } else if (type == .toImage) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToImage", parameters: nil, appTarget: .dmg) } else if (type == .compress) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Compress", parameters: nil, appTarget: .dmg) } else if (type == .merge) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Merge", parameters: nil, appTarget: .dmg) } else if (type == .setPassword) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_SetPassword", parameters: nil, appTarget: .dmg) } else if (type == .removePassword) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_RemovePassword", parameters: nil, appTarget: .dmg) } else if (type == .crop) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Crop", parameters: nil, appTarget: .dmg) } else if (type == .aiTranslate) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AITranslate", parameters: nil, appTarget: .dmg) } else if (type == .aiRewrite) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AIRewrite", parameters: nil, appTarget: .dmg) } else if (type == .aiCorrect) { KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AICorrect", parameters: nil, appTarget: .dmg) } } }