123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- //
- // KMCompressSettingViewController.swift
- // PDF Reader Pro
- //
- // Created by lizhe on 2024/11/15.
- //
- import Cocoa
- import KMComponentLibrary
- typealias KMCompressSettingViewControllerCancelAction = (_ controller: KMCompressSettingViewController ) -> Void
- typealias KMCompressSettingViewControllerDoneAction = (_ controller: KMCompressSettingViewController) -> Void
- typealias KMCompressSettingViewControllerModelChangeAction = (_ controller: KMCompressSettingViewController, _ model: KMCompressSettingModel) -> Void
- class KMCompressSettingViewController: KMBaseViewController {
- @IBOutlet weak var doneButton: ComponentButton!
- @IBOutlet weak var cancelButton: ComponentButton!
- @IBOutlet weak var settingView: KMCompressSettingTableView!
- @IBOutlet weak var titleLabel: NSTextField!
-
- private var toastViews: [NSView] = [] // 用于管理多个 alertView
-
- var cancelAction: KMCompressSettingViewControllerCancelAction?
- var doneAction: KMCompressSettingViewControllerDoneAction?
- var modelChangeAction: KMCompressSettingViewControllerModelChangeAction?
-
- var model: KMCompressSettingModel = KMCompressSettingModel(modelsType: .standard) {
- didSet {
- self.reloadData()
- }
- }
-
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do view setup here.
-
- // 将按钮设置为第一响应者
- // if let window = view.window {
- //
- // window.makeFirstResponder(doneButton.nextResponder)
- // window.defaultButtonCell = doneButton.cell as? NSButtonCell
- //
- // window.contentMinSize = CGSizeMake(624, 513)
- // window.contentMaxSize = CGSizeMake(624, 513)
- // }
-
- self.updateUI()
-
- self.settingView.valueChangeAction = { [unowned self] view, tModel in
- if tModel.fontUnembed == false {
- if KMCompressSettingManager.shared.fetchFontCount() == 1 {
- self.showAlert("Unembed any font may result in incomplete display of text")
- }
- }
-
- let count = tModel.objectOptions.numberOfSetOptions() + tModel.userDataOptions.numberOfSetOptions() + tModel.otherDataOptions.numberOfSetOptions()
- if count < 7 {
- if KMCompressSettingManager.shared.fetchLimitAlert() == 1 {
- self.showAlert("Less than 7 items selected; compression quality may be affected")
- }
- }
-
- guard let callBack = modelChangeAction else { return }
-
- callBack(self, tModel)
- }
- }
-
- func updateUI() {
- doneButton.properties = ComponentButtonProperty(type: .primary, size: .xs, buttonText: KMLocalizedString("Compress"), keepPressState: false)
- doneButton.setTarget(self, action: #selector(doneButtonAction(_:)))
- doneButton.reloadData()
-
- cancelButton.properties = ComponentButtonProperty(type: .default_tertiary, size: .xs, buttonText: KMLocalizedString("Cancel"), keepPressState: false)
- cancelButton.setTarget(self, action: #selector(cancelButtonAction(_:)))
- cancelButton.reloadData()
-
- titleLabel.stringValue = KMLocalizedString("Advanced Compress Settings", comment: "")
- titleLabel.textColor = ComponentLibrary.shared.getComponentColorFromKey("colorText/1")
- //ComponentLibrary.shared.getFontFromKey("mac/body-s-medium")
- }
-
- func reloadData() {
- self.settingView.model = model
- }
- func showAlert(_ string: String) {
- let centerYOffset = CGRectGetHeight(self.view.frame) / 2 + CGFloat((46 + 12) * (toastViews.count - 1)) // 每个 Toast 间隔 30px
-
- let alertView = ComponentMessage()
- alertView.properties = ComponentMessageProperty(messageType: .warning, title: KMLocalizedString(string))
- alertView.frame = CGRectMake((CGRectGetWidth(self.view.frame) - alertView.properties.propertyInfo.viewWidth)/2,
- CGRectGetHeight(self.view.frame) - alertView.properties.propertyInfo.viewHeight - centerYOffset,
- alertView.properties.propertyInfo.viewWidth,
- alertView.properties.propertyInfo.viewHeight)
- alertView.reloadData()
- self.view.addSubview(alertView)
-
- // 添加到管理数组
- toastViews.append(alertView)
-
- // 自动移除视图
- DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
- self.removeAlert(alertView)
- }
- }
- private func removeAlert(_ alertView: NSView) {
- // 淡出动画
- NSAnimationContext.runAnimationGroup({ context in
- context.duration = 0.3
- alertView.animator().alphaValue = 0
- }, completionHandler: {
- // 从视图和数组中移除
- alertView.removeFromSuperview()
- if let index = self.toastViews.firstIndex(of: alertView) {
- self.toastViews.remove(at: index)
- }
- // 重新布局其他 Toast
- self.rearrangeToasts()
- })
- }
- private func rearrangeToasts() {
- for (index, toastView) in toastViews.enumerated() {
- let newYOffset = CGFloat(-46 * index)
- if let constraint = toastView.constraints.first(where: { $0.firstAttribute == .centerY }) {
- constraint.constant = newYOffset
- }
- }
- }
- }
- extension KMCompressSettingViewController {
- @objc func cancelButtonAction(_ sender: Any) {
- guard let callBack = cancelAction else { return }
-
- callBack(self)
- }
-
- @objc func doneButtonAction(_ sender: Any) {
- guard let callBack = doneAction else { return }
-
- callBack(self)
- }
- }
|