KMCompressSettingViewController.swift 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // KMCompressSettingViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lizhe on 2024/11/15.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. typealias KMCompressSettingViewControllerCancelAction = (_ controller: KMCompressSettingViewController ) -> Void
  10. typealias KMCompressSettingViewControllerDoneAction = (_ controller: KMCompressSettingViewController) -> Void
  11. typealias KMCompressSettingViewControllerModelChangeAction = (_ controller: KMCompressSettingViewController, _ model: KMCompressSettingModel) -> Void
  12. class KMCompressSettingViewController: KMNBaseViewController {
  13. @IBOutlet weak var doneButton: ComponentButton!
  14. @IBOutlet weak var cancelButton: ComponentButton!
  15. @IBOutlet weak var settingView: KMCompressSettingTableView!
  16. @IBOutlet weak var titleLabel: NSTextField!
  17. private var toastViews: [NSView] = [] // 用于管理多个 alertView
  18. var cancelAction: KMCompressSettingViewControllerCancelAction?
  19. var doneAction: KMCompressSettingViewControllerDoneAction?
  20. var modelChangeAction: KMCompressSettingViewControllerModelChangeAction?
  21. var model: KMCompressSettingModel = KMCompressSettingModel(modelsType: .standard) {
  22. didSet {
  23. self.reloadData()
  24. }
  25. }
  26. override func viewDidLoad() {
  27. super.viewDidLoad()
  28. // Do view setup here.
  29. // 将按钮设置为第一响应者
  30. // if let window = view.window {
  31. //
  32. // window.makeFirstResponder(doneButton.nextResponder)
  33. // window.defaultButtonCell = doneButton.cell as? NSButtonCell
  34. //
  35. // window.contentMinSize = CGSizeMake(624, 513)
  36. // window.contentMaxSize = CGSizeMake(624, 513)
  37. // }
  38. self.updateUI()
  39. self.settingView.valueChangeAction = { [unowned self] view, tModel in
  40. self.updateAlert()
  41. guard let callBack = modelChangeAction else { return }
  42. callBack(self, tModel)
  43. }
  44. }
  45. func updateAlert() {
  46. if self.model.fontUnembed == true {
  47. if KMCompressSettingManager.shared.fetchFontCount() == 1 {
  48. self.showAlert("Unembed any font may result in incomplete display of text")
  49. }
  50. }
  51. let count = self.model.objectOptions.numberOfSetOptions() + self.model.userDataOptions.numberOfSetOptions() + self.model.otherDataOptions.numberOfSetOptions()
  52. if count < 7 {
  53. if KMCompressSettingManager.shared.fetchLimitAlert() == 1 {
  54. self.showAlert("Less than 7 items selected; compression quality may be affected")
  55. }
  56. }
  57. }
  58. func updateUI() {
  59. doneButton.properties = ComponentButtonProperty(type: .primary, size: .xs, buttonText: KMLocalizedString("Compress"), keepPressState: false)
  60. doneButton.setTarget(self, action: #selector(doneButtonAction(_:)))
  61. doneButton.reloadData()
  62. cancelButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .xs, buttonText: KMLocalizedString("Cancel"), keepPressState: false)
  63. cancelButton.setTarget(self, action: #selector(cancelButtonAction(_:)))
  64. cancelButton.reloadData()
  65. titleLabel.stringValue = KMLocalizedString("Advanced Compress Settings", comment: "")
  66. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
  67. //ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
  68. }
  69. func reloadData() {
  70. self.settingView.model = model
  71. self.updateAlert()
  72. }
  73. func showAlert(_ string: String) {
  74. let centerYOffset = CGRectGetHeight(self.view.frame) / 2 + CGFloat((46 + 12) * (toastViews.count - 1)) // 每个 Toast 间隔 30px
  75. let alertView = ComponentMessage()
  76. alertView.properties = ComponentMessageProperty(messageType: .warning, title: KMLocalizedString(string))
  77. alertView.frame = CGRectMake((CGRectGetWidth(self.view.frame) - alertView.properties.propertyInfo.viewWidth)/2,
  78. CGRectGetHeight(self.view.frame) - alertView.properties.propertyInfo.viewHeight - centerYOffset,
  79. alertView.properties.propertyInfo.viewWidth,
  80. alertView.properties.propertyInfo.viewHeight)
  81. alertView.reloadData()
  82. self.view.addSubview(alertView)
  83. // 添加到管理数组
  84. toastViews.append(alertView)
  85. // 自动移除视图
  86. DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
  87. self.removeAlert(alertView)
  88. }
  89. }
  90. private func removeAlert(_ alertView: NSView) {
  91. // 淡出动画
  92. NSAnimationContext.runAnimationGroup({ context in
  93. context.duration = 0.3
  94. alertView.animator().alphaValue = 0
  95. }, completionHandler: {
  96. // 从视图和数组中移除
  97. alertView.removeFromSuperview()
  98. if let index = self.toastViews.firstIndex(of: alertView) {
  99. self.toastViews.remove(at: index)
  100. }
  101. // 重新布局其他 Toast
  102. self.rearrangeToasts()
  103. })
  104. }
  105. private func rearrangeToasts() {
  106. for (index, toastView) in toastViews.enumerated() {
  107. let newYOffset = CGFloat(-46 * index)
  108. if let constraint = toastView.constraints.first(where: { $0.firstAttribute == .centerY }) {
  109. constraint.constant = newYOffset
  110. }
  111. }
  112. }
  113. }
  114. extension KMCompressSettingViewController {
  115. @objc func cancelButtonAction(_ sender: Any) {
  116. guard let callBack = cancelAction else { return }
  117. callBack(self)
  118. }
  119. @objc func doneButtonAction(_ sender: Any) {
  120. guard let callBack = doneAction else { return }
  121. callBack(self)
  122. }
  123. }