KMMergeTableViewCell.swift 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. //
  2. // KMMergeTableViewCell.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lizhe on 2023/11/8.
  6. //
  7. import Cocoa
  8. typealias KMMergeTableViewCellRemoveAction = (_ view: KMMergeTableViewCell, _ fileModel: KMFileAttribute) -> Void
  9. class KMMergeTableViewCell: NSTableCellView {
  10. @IBOutlet var contentView: NSView!
  11. @IBOutlet weak var pageCountLabel: NSTextField!
  12. @IBOutlet weak var indexLabel: NSTextField!
  13. @IBOutlet weak var fileNameLabel: NSTextField!
  14. @IBOutlet weak var pageRangeLabel: NSTextField!
  15. @IBOutlet weak var sizeLabel: NSTextField!
  16. @IBOutlet weak var fileImageView: NSImageView!
  17. @IBOutlet weak var pageRangeBox: NSComboBox!
  18. @IBOutlet weak var deleteButton: NSButton!
  19. @IBOutlet weak var contentBox: KMBox!
  20. var removeAction: KMMergeTableViewCellRemoveAction?
  21. var index: Int = 1 {
  22. didSet {
  23. self.reloadData()
  24. }
  25. }
  26. var fileModel: KMFileAttribute? {
  27. didSet {
  28. self.reloadData()
  29. }
  30. }
  31. // MARK: 初始化
  32. override init(frame frameRect: NSRect) {
  33. super.init(frame: frameRect)
  34. initContentView()
  35. setup()
  36. }
  37. required init?(coder decoder: NSCoder) {
  38. super.init(coder: decoder)
  39. initContentView()
  40. setup()
  41. fatalError("init(coder:) has not been implemented")
  42. }
  43. private func initContentView() {
  44. //绑定xib
  45. let resource = NSNib(nibNamed: String(describing: self.classForCoder.self),
  46. bundle: Bundle(for: self.classForCoder.self))!
  47. resource.instantiate(withOwner: self, topLevelObjects: nil)
  48. addSubview(contentView)
  49. contentView.translatesAutoresizingMaskIntoConstraints = false
  50. NSLayoutConstraint.activate([
  51. contentView.topAnchor.constraint(equalTo: topAnchor),
  52. contentView.leftAnchor.constraint(equalTo: leftAnchor),
  53. contentView.rightAnchor.constraint(equalTo: rightAnchor),
  54. contentView.bottomAnchor.constraint(equalTo: bottomAnchor)])
  55. contentView.updateConstraintsForSubtreeIfNeeded()
  56. }
  57. func setup() {
  58. pageRangeBox.removeAllItems()
  59. pageRangeBox.delegate = self
  60. pageRangeBox.addItems(withObjectValues: [NSLocalizedString("All Pages", comment: ""),
  61. NSLocalizedString("Odd Pages Only", comment: ""),
  62. NSLocalizedString("Even Pages Only", comment: ""),
  63. NSLocalizedString("e.g. 1,3-5,10", comment: "")])
  64. pageRangeBox.placeholderString = NSLocalizedString("e.g. 1,3-5,10", comment: "")
  65. self.updateLanguage()
  66. contentBox.moveCallback = { mouseEntered, mouseBox in
  67. if mouseEntered {
  68. self.deleteButton.isHidden = false
  69. } else {
  70. self.deleteButton.isHidden = true
  71. }
  72. }
  73. }
  74. func reloadData() {
  75. guard let fileModel = fileModel else { return }
  76. indexLabel.stringValue = index.description
  77. fileImageView.image = fileModel.fileImage
  78. fileNameLabel.stringValue = fileModel.filePath.lastPathComponent
  79. pageCountLabel.stringValue = "\(fileModel.pdfDocument?.pageCount ?? 0) \(NSLocalizedString("Pages", comment: ""))"
  80. sizeLabel.stringValue = self.fileSizeString(Float(fileModel.fileSize))
  81. self.pageRangeBox.isEditable = false
  82. if fileModel.pagesType == .all {
  83. pageRangeBox.selectItem(at: 0)
  84. } else if fileModel.pagesType == .odd {
  85. pageRangeBox.selectItem(at: 1)
  86. } else if fileModel.pagesType == .even {
  87. pageRangeBox.selectItem(at: 2)
  88. } else {
  89. pageRangeBox.cell?.stringValue = fileModel.pagesString
  90. self.pageRangeBox.isEditable = true
  91. window?.makeFirstResponder(pageRangeBox)
  92. }
  93. }
  94. func updateLanguage() {
  95. pageRangeLabel.stringValue = NSLocalizedString("Page Range", comment: "")
  96. }
  97. @IBAction func removeButtonAction(_ sender: Any) {
  98. guard let callBack = removeAction else { return }
  99. guard let fileModel = fileModel else { return }
  100. callBack(self, fileModel)
  101. }
  102. @IBAction func comboBoxAction(_ sender: NSComboBoxCell) {
  103. guard let fileModel = fileModel else { return }
  104. if sender.indexOfSelectedItem >= 0 {
  105. let type = KMPageRange.init(rawValue: sender.indexOfSelectedItem) ?? .all
  106. fileModel.pagesType = type
  107. }
  108. self.pageRangeBox.isEditable = false
  109. if fileModel.pagesType == .custom {
  110. fileModel.pagesString = sender.stringValue
  111. self.pageRangeBox.isEditable = true
  112. window?.makeFirstResponder(pageRangeBox)
  113. }
  114. }
  115. }
  116. extension KMMergeTableViewCell: NSComboBoxDelegate {
  117. }
  118. extension KMMergeTableViewCell {
  119. func fileSizeString(_ fSize: Float) -> String {
  120. let fileSize = fSize / 1024
  121. let size = fileSize >= 1024 ? (fileSize < 1048576 ? fileSize/1024 : fileSize/1048576.0) : fileSize
  122. let unit = fileSize >= 1024 ? (fileSize < 1048576 ? "M" : "G") : "K"
  123. return String(format: "%0.1f %@", size, unit)
  124. }
  125. }