KMCompressSettingViewController.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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("Settings", comment: "")
  66. titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
  67. }
  68. func reloadData() {
  69. self.settingView.model = model
  70. self.updateAlert()
  71. }
  72. func showAlert(_ string: String) {
  73. let centerYOffset = CGRectGetHeight(self.view.frame) / 2 + CGFloat((46 + 12) * (toastViews.count - 1)) // 每个 Toast 间隔 30px
  74. let alertView = ComponentMessage()
  75. alertView.properties = ComponentMessageProperty(messageType: .warning, title: KMLocalizedString(string))
  76. alertView.frame = CGRectMake((CGRectGetWidth(self.view.frame) - alertView.properties.propertyInfo.viewWidth)/2,
  77. CGRectGetHeight(self.view.frame) - alertView.properties.propertyInfo.viewHeight - centerYOffset,
  78. alertView.properties.propertyInfo.viewWidth,
  79. alertView.properties.propertyInfo.viewHeight)
  80. alertView.reloadData()
  81. self.view.addSubview(alertView)
  82. // 添加到管理数组
  83. toastViews.append(alertView)
  84. // 自动移除视图
  85. DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
  86. self.removeAlert(alertView)
  87. }
  88. }
  89. private func removeAlert(_ alertView: NSView) {
  90. // 淡出动画
  91. NSAnimationContext.runAnimationGroup({ context in
  92. context.duration = 0.3
  93. alertView.animator().alphaValue = 0
  94. }, completionHandler: {
  95. // 从视图和数组中移除
  96. alertView.removeFromSuperview()
  97. if let index = self.toastViews.firstIndex(of: alertView) {
  98. self.toastViews.remove(at: index)
  99. }
  100. // 重新布局其他 Toast
  101. self.rearrangeToasts()
  102. })
  103. }
  104. private func rearrangeToasts() {
  105. for (index, toastView) in toastViews.enumerated() {
  106. let newYOffset = CGFloat(-46 * index)
  107. if let constraint = toastView.constraints.first(where: { $0.firstAttribute == .centerY }) {
  108. constraint.constant = newYOffset
  109. }
  110. }
  111. }
  112. }
  113. extension KMCompressSettingViewController {
  114. @objc func cancelButtonAction(_ sender: Any) {
  115. guard let callBack = cancelAction else { return }
  116. callBack(self)
  117. }
  118. @objc func doneButtonAction(_ sender: Any) {
  119. guard let callBack = doneAction else { return }
  120. callBack(self)
  121. }
  122. }