KMBatchOperateCompressSettingViewController.swift 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //
  2. // KMBatchOperateCompressSettingViewController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lizhe on 2024/11/15.
  6. //
  7. import Cocoa
  8. typealias KMBatchOperateCompressSettingViewCancelAction = (_ controller: KMBatchOperateCompressSettingViewController ) -> Void
  9. typealias KMBatchOperateCompressSettingViewDoneAction = (_ controller: KMBatchOperateCompressSettingViewController ) -> Void
  10. class KMBatchOperateCompressSettingViewController: KMBaseViewController {
  11. @IBOutlet weak var doneButton: KMButton!
  12. @IBOutlet weak var cancelButton: KMButton!
  13. @IBOutlet weak var settingView: KMCompressSettingTableView!
  14. private var toastViews: [NSView] = [] // 用于管理多个 alertView
  15. var cancelAction: KMBatchOperateCompressSettingViewCancelAction?
  16. var doneAction: KMBatchOperateCompressSettingViewDoneAction?
  17. var model: KMCompressSettingModel = KMCompressSettingModel(modelsType: .standard) {
  18. didSet {
  19. self.reloadData()
  20. }
  21. }
  22. override func viewDidLoad() {
  23. super.viewDidLoad()
  24. // Do view setup here.
  25. // 将按钮设置为第一响应者
  26. if let window = view.window {
  27. window.makeFirstResponder(doneButton.nextResponder)
  28. window.defaultButtonCell = doneButton.cell as? NSButtonCell
  29. window.contentMinSize = CGSizeMake(624, 513)
  30. window.contentMaxSize = CGSizeMake(624, 513)
  31. }
  32. // self.showAlert("Unembed any font may result in incomplete display of text")
  33. //
  34. // // 自动移除视图
  35. // DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
  36. // self.showAlert("Less than 7 items selected; compression quality may be affected")
  37. // }
  38. }
  39. func reloadData() {
  40. self.settingView.model = model
  41. }
  42. func showAlert(_ string: String) {
  43. // 创建 alertView
  44. let alertView = KMBatchOperateCompressSettingAlertView()
  45. alertView.titleString = string
  46. alertView.translatesAutoresizingMaskIntoConstraints = false
  47. self.view.addSubview(alertView)
  48. // 添加到管理数组
  49. toastViews.append(alertView)
  50. // 设置约束
  51. let centerYOffset = CGFloat((46 + 12) * (toastViews.count - 1) + 68) // 每个 Toast 间隔 30px
  52. NSLayoutConstraint.activate([
  53. alertView.widthAnchor.constraint(lessThanOrEqualTo: self.view.widthAnchor, multiplier: 0.8),
  54. alertView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
  55. alertView.centerYAnchor.constraint(equalTo: self.view.topAnchor, constant: centerYOffset),
  56. ])
  57. // 自动移除视图
  58. DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
  59. self.removeAlert(alertView)
  60. }
  61. }
  62. private func removeAlert(_ alertView: NSView) {
  63. // 淡出动画
  64. NSAnimationContext.runAnimationGroup({ context in
  65. context.duration = 0.3
  66. alertView.animator().alphaValue = 0
  67. }, completionHandler: {
  68. // 从视图和数组中移除
  69. alertView.removeFromSuperview()
  70. if let index = self.toastViews.firstIndex(of: alertView) {
  71. self.toastViews.remove(at: index)
  72. }
  73. // 重新布局其他 Toast
  74. self.rearrangeToasts()
  75. })
  76. }
  77. private func rearrangeToasts() {
  78. for (index, toastView) in toastViews.enumerated() {
  79. let newYOffset = CGFloat(-46 * index)
  80. if let constraint = toastView.constraints.first(where: { $0.firstAttribute == .centerY }) {
  81. constraint.constant = newYOffset
  82. }
  83. }
  84. }
  85. }
  86. extension KMBatchOperateCompressSettingViewController {
  87. @IBAction func cancelButtonAction(_ sender: Any) {
  88. guard let callBack = cancelAction else { return }
  89. callBack(self)
  90. }
  91. @IBAction func doneButtonAction(_ sender: Any) {
  92. guard let callBack = doneAction else { return }
  93. callBack(self)
  94. }
  95. }