KMSubscribeWaterMarkWindowController.swift 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  1. //
  2. // KMSubscribeWaterMarkWindowController.swift
  3. // PDF Master
  4. //
  5. // Created by lizhe on 2023/6/12.
  6. //
  7. import Cocoa
  8. var subscribeWaterMarkController: KMSubscribeWaterMarkWindowController?
  9. var subscribeWaterMarkMainWindow: NSWindow?
  10. @objc enum KMSubscribeWaterMarkType: Int {
  11. case none = 0
  12. case stamp = 1
  13. case link
  14. case sign
  15. case editText
  16. case editImage
  17. case insert
  18. case extract
  19. case replace
  20. case split
  21. case delete
  22. case rotate
  23. case copy
  24. case toWord
  25. case toExcel
  26. case toPPT
  27. case toRTF
  28. case toCSV
  29. case toHTML
  30. case toText
  31. case toImage
  32. case compress
  33. case merge
  34. case setPassword
  35. case removePassword
  36. case crop
  37. case aiTranslate
  38. case aiRewrite
  39. case aiCorrect
  40. }
  41. typealias KMSubscribeWaterMarkWindowControllerCloseAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  42. typealias KMSubscribeWaterMarkWindowControllerWatermarkExportAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  43. typealias KMSubscribeWaterMarkWindowControllerSubscribeAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  44. typealias KMSubscribeWaterMarkWindowControllerRestoreAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  45. class KMSubscribeWaterMarkWindowController: NSWindowController {
  46. @IBOutlet weak var waterMarkView: KMSubscribeWaterMarkView!
  47. @IBOutlet weak var waterViewHeightConstrain: NSLayoutConstraint!
  48. var closeAction: KMSubscribeWaterMarkWindowControllerCloseAction?
  49. var subscribeAction: KMSubscribeWaterMarkWindowControllerSubscribeAction?
  50. var watermarkExportAction: KMSubscribeWaterMarkWindowControllerWatermarkExportAction?
  51. var restoreAction: KMSubscribeWaterMarkWindowControllerRestoreAction?
  52. var isContinue: Bool?
  53. var isAI: Bool?
  54. deinit {
  55. KMPrint("KMSubscribeWaterMarkWindowController 释放")
  56. }
  57. override func windowDidLoad() {
  58. super.windowDidLoad()
  59. self.setup()
  60. self.reloadData()
  61. // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
  62. }
  63. override func awakeFromNib() {
  64. super.awakeFromNib()
  65. if let data = self.isAI, data {
  66. self.waterMarkView.waterExportButton.isHidden = true
  67. self.waterMarkView.subTrailingConst.constant = 60
  68. self.waterMarkView.subWidthConst.constant = 280
  69. self.waterMarkView.preferentialImageTrailingConst.constant = 92
  70. } else {
  71. self.waterMarkView.waterExportButton.isHidden = false
  72. self.waterMarkView.subTrailingConst.constant = 0
  73. self.waterMarkView.subWidthConst.constant = 192
  74. self.waterMarkView.preferentialImageTrailingConst.constant = 32
  75. }
  76. }
  77. //MARK: 打开文件
  78. static func show(window: NSWindow, isContinue: Bool = false, isAI: Bool = false, type: KMSubscribeWaterMarkType = .none, completion: @escaping (_ isSubscribeSuccess: Bool, _ isWaterMarkExport: Bool, _ isClose: Bool) -> Void) -> KMSubscribeWaterMarkWindowController {
  79. let subscribeWaterMarkWindowController: KMSubscribeWaterMarkWindowController = KMSubscribeWaterMarkWindowController.init(windowNibName: "KMSubscribeWaterMarkWindowController")
  80. subscribeWaterMarkWindowController.isContinue = isContinue
  81. subscribeWaterMarkWindowController.isAI = isAI
  82. window.beginSheet(subscribeWaterMarkWindowController.window!)
  83. subscribeWaterMarkWindowController.window?.center()
  84. if isContinue {
  85. subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Continue", comment: "")
  86. } else {
  87. subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("带水印保存", comment: "")
  88. }
  89. subscribeWaterMarkWindowController.closeAction = { controller in
  90. completion(false, false, true)
  91. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  92. controller.window?.close()
  93. subscribeWaterMarkController = nil
  94. subscribeWaterMarkMainWindow = nil
  95. }
  96. subscribeWaterMarkWindowController.watermarkExportAction = { controller in
  97. completion(false, true, false)
  98. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  99. controller.window?.close()
  100. subscribeWaterMarkController = nil
  101. subscribeWaterMarkMainWindow = nil
  102. }
  103. subscribeWaterMarkWindowController.subscribeAction = { controller in
  104. // 数据埋点
  105. controller.trackEvent(type: type)
  106. controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2))
  107. KMPurchaseManager.manager.purchaseProduct(productIdentifier: PRODUCT_1) { isSuccess, error in
  108. if isSuccess {
  109. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  110. controller.window?.close()
  111. subscribeWaterMarkController = nil
  112. subscribeWaterMarkMainWindow = nil
  113. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
  114. if NSApp.mainWindow != nil {
  115. let controller = KMSubscribeSuccessWindowController.show(window: NSApp.mainWindow!)
  116. controller.closeAction = { controller in
  117. controller.closeWindow()
  118. completion(true, false, false)
  119. }
  120. }
  121. }
  122. } else {
  123. KMComparativeTableViewController.purchasefailed(state: .failed)
  124. completion(false, false, false)
  125. }
  126. controller.waterMarkView.endLoading()
  127. }
  128. }
  129. subscribeWaterMarkWindowController.restoreAction = { controller in
  130. controller.waterMarkView.beginLoading(backgroundColor: NSColor.black.withAlphaComponent(0.2))
  131. KMPurchaseManager.manager.restorePurchases { isSuccess in
  132. if isSuccess {
  133. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  134. controller.window?.close()
  135. subscribeWaterMarkController = nil
  136. subscribeWaterMarkMainWindow = nil
  137. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
  138. if NSApp.mainWindow != nil {
  139. let controller = KMSubscribeSuccessWindowController.show(window: NSApp.mainWindow!)
  140. controller.closeAction = { controller in
  141. controller.closeWindow()
  142. completion(true, false, false)
  143. }
  144. }
  145. }
  146. } else {
  147. KMComparativeTableViewController.purchasefailed(state: .restoreFailed)
  148. completion(false, false, false)
  149. }
  150. controller.waterMarkView.endLoading()
  151. }
  152. }
  153. subscribeWaterMarkController = subscribeWaterMarkWindowController
  154. subscribeWaterMarkMainWindow = window
  155. return subscribeWaterMarkWindowController
  156. }
  157. func setup() {
  158. self.window?.contentView?.backgroundColor(NSColor(hex: "#FFFFFF"))
  159. self.waterMarkView.waterExportButton.title = ""
  160. self.waterMarkView.closeAction = { [weak self] view in
  161. guard let callBack = self?.closeAction else { return }
  162. callBack((self!))
  163. }
  164. self.waterMarkView.waterMarkExportAction = { [weak self] view in
  165. self?.trackEvent(eventName: "PUW_Sub_SaveWatermark")
  166. guard let callBack = self?.watermarkExportAction else { return }
  167. callBack((self!))
  168. }
  169. self.waterMarkView.subscribeAction = { [weak self] view in
  170. self?.trackEvent(eventName: "PUW_Sub_Subscribe")
  171. guard let callBack = self?.subscribeAction else { return }
  172. callBack((self!))
  173. }
  174. self.waterMarkView.restoreAction = { [weak self] view in
  175. guard let callBack = self?.restoreAction else { return }
  176. callBack((self!))
  177. }
  178. }
  179. func closeWindow() {
  180. if subscribeWaterMarkMainWindow != nil {
  181. subscribeWaterMarkMainWindow?.endSheet((subscribeWaterMarkController?.window)!)
  182. }
  183. if subscribeWaterMarkController != nil {
  184. subscribeWaterMarkController?.window?.close()
  185. }
  186. subscribeWaterMarkController = nil
  187. subscribeWaterMarkMainWindow = nil
  188. }
  189. func reloadData() {
  190. #if VERSION_FREE
  191. self.waterViewHeightConstrain.constant = 511
  192. #endif
  193. #if VERSION_DMG
  194. self.waterViewHeightConstrain.constant = 511 - 80
  195. #endif
  196. }
  197. static func isSampleController() -> KMSubscribeWaterMarkWindowController {
  198. for window in NSApp.windows {
  199. let controller = window.windowController
  200. if controller is KMSubscribeWaterMarkWindowController {
  201. return controller as! KMSubscribeWaterMarkWindowController
  202. }
  203. }
  204. return KMSubscribeWaterMarkWindowController()
  205. }
  206. }
  207. // MARK: - Analytics (埋点)
  208. extension KMSubscribeWaterMarkWindowController {
  209. func trackEvent(eventName: String) -> Void {
  210. KMAnalytics.trackEvent(eventName: eventName, parameters: [
  211. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.puw,
  212. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.sub_PUW], platform: .AppCenter, appTarget: .dmg)
  213. }
  214. func trackEvent(type: KMSubscribeWaterMarkType) -> Void {
  215. if (type == .stamp) {
  216. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Stamp", parameters: nil, appTarget: .dmg)
  217. } else if (type == .link) {
  218. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Link", parameters: nil, appTarget: .dmg)
  219. } else if (type == .sign) {
  220. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Sign", parameters: nil, appTarget: .dmg)
  221. } else if (type == .editText) {
  222. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_EditText", parameters: nil, appTarget: .dmg)
  223. } else if (type == .editImage) {
  224. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_EditImage", parameters: nil, appTarget: .dmg)
  225. } else if (type == .insert) {
  226. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Insert", parameters: nil, appTarget: .dmg)
  227. } else if (type == .extract) {
  228. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Extract", parameters: nil, appTarget: .dmg)
  229. } else if (type == .replace) {
  230. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Replace", parameters: nil, appTarget: .dmg)
  231. } else if (type == .split) {
  232. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Split", parameters: nil, appTarget: .dmg)
  233. } else if (type == .delete) {
  234. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Delete", parameters: nil, appTarget: .dmg)
  235. } else if (type == .rotate) {
  236. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Rotate", parameters: nil, appTarget: .dmg)
  237. } else if (type == .copy) {
  238. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Copy", parameters: nil, appTarget: .dmg)
  239. } else if (type == .toWord) {
  240. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToWord", parameters: nil, appTarget: .dmg)
  241. } else if (type == .toExcel) {
  242. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToExcel", parameters: nil, appTarget: .dmg)
  243. } else if (type == .toPPT) {
  244. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToPPT", parameters: nil, appTarget: .dmg)
  245. } else if (type == .toRTF) {
  246. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToRTF", parameters: nil, appTarget: .dmg)
  247. } else if (type == .toCSV) {
  248. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToCSV", parameters: nil, appTarget: .dmg)
  249. } else if (type == .toHTML) {
  250. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToHTML", parameters: nil, appTarget: .dmg)
  251. } else if (type == .toText) {
  252. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToText", parameters: nil, appTarget: .dmg)
  253. } else if (type == .toImage) {
  254. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_ToImage", parameters: nil, appTarget: .dmg)
  255. } else if (type == .compress) {
  256. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Compress", parameters: nil, appTarget: .dmg)
  257. } else if (type == .merge) {
  258. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Merge", parameters: nil, appTarget: .dmg)
  259. } else if (type == .setPassword) {
  260. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_SetPassword", parameters: nil, appTarget: .dmg)
  261. } else if (type == .removePassword) {
  262. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_RemovePassword", parameters: nil, appTarget: .dmg)
  263. } else if (type == .crop) {
  264. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_Crop", parameters: nil, appTarget: .dmg)
  265. } else if (type == .aiTranslate) {
  266. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AITranslate", parameters: nil, appTarget: .dmg)
  267. } else if (type == .aiRewrite) {
  268. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AIRewrite", parameters: nil, appTarget: .dmg)
  269. } else if (type == .aiCorrect) {
  270. KMAnalytics.trackEvent(eventName: "PDFMaster_Subscribe_AICorrect", parameters: nil, appTarget: .dmg)
  271. }
  272. }
  273. }