KMSubscribeWaterMarkWindowController.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328
  1. //
  2. // KMSubscribeWaterMarkWindowController.swift
  3. // PDF Reader Pro
  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. case save
  41. case searchReplace
  42. case adsWeb
  43. case openTab
  44. case imageToPDF
  45. case batch
  46. case pdfEdit
  47. case print
  48. case ocr
  49. case fileCompare
  50. case watermark
  51. case background
  52. case headerfooter
  53. case bates
  54. case redact
  55. case digitalSign
  56. case form
  57. case share
  58. case measure
  59. case themeColor
  60. case invalid
  61. func isConvertType() -> Bool {
  62. if (self == .toWord || self == .toExcel || self == .toPPT || self == .toRTF || self == .toCSV || self == .toHTML || self == .toText || self == .toImage) {
  63. return true
  64. }
  65. return false
  66. }
  67. }
  68. typealias KMSubscribeWaterMarkWindowControllerCloseAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  69. typealias KMSubscribeWaterMarkWindowControllerWatermarkExportAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  70. typealias KMSubscribeWaterMarkWindowControllerSubscribeAction = (_ controller: KMSubscribeWaterMarkWindowController) -> Void
  71. var tempType: KMSubscribeWaterMarkType = .none
  72. var tempLimit: Bool = false
  73. var tempContinue: Bool = false
  74. class KMSubscribeWaterMarkWindowController: NSWindowController {
  75. @IBOutlet weak var waterMarkView: KMSubscribeWaterMarkView!
  76. @IBOutlet weak var waterViewHeightConstrain: NSLayoutConstraint!
  77. var closeAction: KMSubscribeWaterMarkWindowControllerCloseAction?
  78. var subscribeAction: KMSubscribeWaterMarkWindowControllerSubscribeAction?
  79. var watermarkExportAction: KMSubscribeWaterMarkWindowControllerWatermarkExportAction?
  80. var isContinue: Bool?
  81. var isAI: Bool?
  82. var isLimit: Bool?
  83. var type: KMSubscribeWaterMarkType? {
  84. didSet {
  85. self.waterMarkView?.type = type
  86. }
  87. }
  88. deinit {
  89. KMPrint("KMSubscribeWaterMarkWindowController 释放")
  90. }
  91. override func windowDidLoad() {
  92. super.windowDidLoad()
  93. self.waterMarkView.subscribeLabel.stringValue = ""
  94. self.setup()
  95. self.reloadData()
  96. // Implement this method to handle any initialization after your window controller's window has been loaded from its nib file.
  97. }
  98. override func awakeFromNib() {
  99. super.awakeFromNib()
  100. // self.waterMarkView.subscribeLabel.stringValue = ""
  101. }
  102. //MARK: 打开文件
  103. @objc static func show(window: NSWindow, isContinue: Bool = false, limit: Bool = false, type: KMSubscribeWaterMarkType = .none, subscribeDidClick: (()->Void)? = nil, completion: @escaping (_ isSubscribeSuccess: Bool, _ isWaterMarkExport: Bool, _ isClose: Bool) -> Void) -> KMSubscribeWaterMarkWindowController {
  104. #if VERSION_DMG
  105. if type != .save && !KMLightMemberManager.manager.isLogin() {
  106. KMLoginWindowController.show(window: window)
  107. return KMSubscribeWaterMarkWindowController()
  108. }
  109. #endif
  110. tempLimit = limit
  111. tempType = type
  112. tempContinue = isContinue
  113. var isAI = false
  114. if type == .aiCorrect ||
  115. type == .aiRewrite ||
  116. type == .aiTranslate {
  117. isAI = true
  118. } else {
  119. isAI = false
  120. }
  121. if isAI && KMLightMemberManager.manager.purchaseState != .subscription {
  122. if KMLightMemberManager.manager.isLogin() {
  123. KMComparativeTableViewController.show(window: NSApp.mainWindow!, .equity)
  124. } else {
  125. let controller = KMLoginWindowController.show(window: NSApp.mainWindow!,.equity)
  126. if isAI {
  127. let alert = NSAlert()
  128. alert.messageText = NSLocalizedString("Please Login or Sign up to proceed to the next step.", comment: "")
  129. alert.informativeText = NSLocalizedString("On upgrading your account, you can enjoy all AI features in PDF Reader Pro.", comment: "")
  130. alert.addButton(withTitle: NSLocalizedString("OK", comment: ""))
  131. alert.beginSheetModal(for: (controller?.window)!) { result in
  132. }
  133. }
  134. }
  135. return KMSubscribeWaterMarkWindowController.init()
  136. } else {
  137. let subscribeWaterMarkWindowController: KMSubscribeWaterMarkWindowController = KMSubscribeWaterMarkWindowController.init(windowNibName: "KMSubscribeWaterMarkWindowController")
  138. subscribeWaterMarkWindowController.isContinue = isContinue
  139. subscribeWaterMarkWindowController.isAI = isAI
  140. subscribeWaterMarkWindowController.isLimit = limit
  141. window.beginSheet(subscribeWaterMarkWindowController.window!)
  142. subscribeWaterMarkWindowController.window?.center()
  143. subscribeWaterMarkWindowController.type = type
  144. subscribeWaterMarkWindowController.reloadData()
  145. subscribeWaterMarkWindowController.closeAction = { controller in
  146. completion(false, false, true)
  147. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  148. controller.window?.close()
  149. subscribeWaterMarkController = nil
  150. subscribeWaterMarkMainWindow = nil
  151. }
  152. subscribeWaterMarkWindowController.watermarkExportAction = { controller in
  153. completion(false, true, false)
  154. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  155. controller.window?.close()
  156. subscribeWaterMarkController = nil
  157. subscribeWaterMarkMainWindow = nil
  158. }
  159. subscribeWaterMarkWindowController.subscribeAction = { controller in
  160. if let callback = subscribeDidClick {
  161. callback()
  162. }
  163. subscribeWaterMarkMainWindow?.endSheet(controller.window!)
  164. controller.window?.close()
  165. subscribeWaterMarkController = nil
  166. if KMLightMemberManager.manager.isLogin() ||
  167. type == .save ||
  168. ((type.isConvertType() || type == .merge) && !limit) {
  169. _ = KMComparativeTableViewController.show(window: subscribeWaterMarkMainWindow ?? NSWindow(), .equity, inputType: type)
  170. } else {
  171. _ = KMLoginWindowController.show(window: subscribeWaterMarkMainWindow ?? NSWindow())
  172. }
  173. subscribeWaterMarkMainWindow = nil
  174. }
  175. subscribeWaterMarkController = subscribeWaterMarkWindowController
  176. subscribeWaterMarkMainWindow = window
  177. return subscribeWaterMarkWindowController
  178. }
  179. }
  180. func setup() {
  181. self.window?.contentView?.backgroundColor(NSColor.km_init(hex: "#FFFFFF"))
  182. self.waterMarkView.waterExportButton.title = ""
  183. self.waterMarkView.subscribeLabel.stringValue = ""
  184. self.waterMarkView.closeAction = { [weak self] view in
  185. guard let callBack = self?.closeAction else { return }
  186. callBack((self!))
  187. }
  188. self.waterMarkView.waterMarkExportAction = { [weak self] view in
  189. self?.trackEvent(eventName: "PUW_Sub_SaveWatermark")
  190. guard let callBack = self?.watermarkExportAction else { return }
  191. callBack((self!))
  192. }
  193. self.waterMarkView.subscribeAction = { [weak self] view in
  194. guard let callBack = self?.subscribeAction else { return }
  195. callBack((self!))
  196. }
  197. }
  198. func closeWindow() {
  199. if subscribeWaterMarkMainWindow != nil {
  200. subscribeWaterMarkMainWindow?.endSheet((subscribeWaterMarkController?.window)!)
  201. }
  202. if subscribeWaterMarkController != nil {
  203. subscribeWaterMarkController?.window?.close()
  204. }
  205. subscribeWaterMarkController = nil
  206. subscribeWaterMarkMainWindow = nil
  207. }
  208. func reloadData() {
  209. if KMSubscribeWaterMarkWindowController.canShowSubscripBenefits() {
  210. self.waterViewHeightConstrain.constant = 462
  211. } else {
  212. self.waterViewHeightConstrain.constant = 563
  213. }
  214. self.waterMarkView.type = tempType
  215. self.waterMarkView.updateConstraints()
  216. self.updateLanguage()
  217. }
  218. func updateLanguage() {
  219. if self.waterMarkView != nil {
  220. if tempContinue {
  221. self.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
  222. } else {
  223. if tempType == .merge {
  224. if (tempLimit) {
  225. self.waterMarkView.waterExportButton.title = NSLocalizedString("Exceed Times Limit", comment: "")
  226. self.waterMarkView.isSecondEnable = false
  227. self.waterMarkView.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
  228. } else {
  229. self.waterMarkView.isSecondEnable = true
  230. self.waterMarkView.waterExportButton.title = NSLocalizedString("Delete Files from List", comment: "")
  231. }
  232. } else if tempType.isConvertType() {
  233. if (tempLimit) {
  234. self.waterMarkView.waterExportButton.title = NSLocalizedString("Exceed Times Limit", comment: "")
  235. self.waterMarkView.isSecondEnable = false
  236. self.waterMarkView.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
  237. } else {
  238. self.waterMarkView.isSecondEnable = true
  239. // if KMLightMemberManager.manager.isLogin() {
  240. self.waterMarkView.waterExportButton.title = NSLocalizedString("Convert First 10 Pages", comment: "")
  241. // } else {
  242. // subscribeWaterMarkWindowController.waterMarkView.waterExportButton.title = NSLocalizedString("Later", comment: "")
  243. // }
  244. }
  245. } else if (type == .save) {
  246. self.waterMarkView.subscribeLabel.stringValue = NSLocalizedString("Upgrade Now", comment: "")
  247. self.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
  248. } else {
  249. self.waterMarkView.waterExportButton.title = NSLocalizedString("Save with Watermark", comment: "")
  250. }
  251. }
  252. }
  253. }
  254. static func isSampleController() -> KMSubscribeWaterMarkWindowController {
  255. for window in NSApp.windows {
  256. let controller = window.windowController
  257. if controller is KMSubscribeWaterMarkWindowController {
  258. return controller as! KMSubscribeWaterMarkWindowController
  259. }
  260. }
  261. return KMSubscribeWaterMarkWindowController()
  262. }
  263. static func canShowSubscripBenefits() -> Bool {
  264. #if VERSION_DMG
  265. return KMLightMemberManager.manager.isLogin() || tempType == .save || ((tempType.isConvertType() || tempType == .merge) && tempLimit)
  266. #else
  267. return KMLightMemberManager.manager.isLogin() || tempType == .save || ((tempType.isConvertType() || tempType == .merge) && !tempLimit)
  268. #endif
  269. }
  270. }
  271. // MARK: - Analytics (埋点)
  272. extension KMSubscribeWaterMarkWindowController {
  273. func trackEvent(eventName: String) -> Void {
  274. KMAnalytics.trackEvent(eventName: eventName, parameters: [
  275. KMAnalytics.Parameter.categoryKey : KMAnalytics.Category.puw,
  276. KMAnalytics.Parameter.labelKey : KMAnalytics.Label.sub_PUW], platform: .AppCenter, appTarget: .all)
  277. }
  278. func trackEvent(type: KMSubscribeWaterMarkType) -> Void {
  279. KMTools.trackEvent(type: type)
  280. }
  281. }