KMUserListItemView.swift 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. //
  2. // KMUserListItemView.swift
  3. // PDF Reader Pro Edition
  4. //
  5. // Created by tangchao on 2024/7/11.
  6. //
  7. import Cocoa
  8. class KMUserListItemView: NSView, NibLoadable {
  9. @IBOutlet weak var box: NSBox!
  10. @IBOutlet weak var scrollView: NSScrollView!
  11. @IBOutlet weak var tableView: NSTableView!
  12. @IBOutlet weak var boxTopConst: NSLayoutConstraint!
  13. @IBOutlet weak var tipBox: NSBox!
  14. @IBOutlet weak var tipIv: NSImageView!
  15. @IBOutlet weak var tipLabel: NSTextField!
  16. var validateDropCallback: ((_ info: NSDraggingInfo, _ row: Int, _ dropOperation: NSTableView.DropOperation)->NSDragOperation)?
  17. var acceptDropCallback: ((_ info: NSDraggingInfo, _ row: Int, _ dropOperation: NSTableView.DropOperation)->Bool)?
  18. var datas: [KMUserFbListModel] = [] {
  19. didSet {
  20. self.wantsLayer = true
  21. self.layer?.borderWidth = 1
  22. if self.datas.isEmpty {
  23. self.layer?.backgroundColor = .clear
  24. self.layer?.borderColor = .clear
  25. self.layer?.cornerRadius = 0
  26. } else {
  27. self.layer?.backgroundColor = NSColor(white: 0, alpha: 0.05).cgColor
  28. self.layer?.borderColor = NSColor(white: 0, alpha: 0.05).cgColor
  29. self.layer?.cornerRadius = 4
  30. }
  31. self.tableView.reloadData()
  32. }
  33. }
  34. var itemClick: ((_ idx: Int, _ param: Any?)->Void)?
  35. override func awakeFromNib() {
  36. super.awakeFromNib()
  37. self.box.borderWidth = 0
  38. self.tableView.delegate = self
  39. self.tableView.dataSource = self
  40. self.tableView.rowHeight = 24
  41. self.tableView.register(.init(nibNamed: "KMUserListItemCellView", bundle: nil), forIdentifier: .init("KMUserListItemCellView"))
  42. // self.tableView.enclosingScrollView.
  43. self.tableView.enclosingScrollView?.wantsLayer = true
  44. self.tableView.enclosingScrollView?.borderType = .noBorder
  45. // self.tableView.enclosingScrollView?.layer?.cornerRadius = 5
  46. // self.tableView.enclosingScrollView?.layer?.masksToBounds = true
  47. self.tableView.enclosingScrollView?.drawsBackground = false
  48. self.tableView.enclosingScrollView?.backgroundColor = .clear
  49. self.tableView.enclosingScrollView?.layer?.backgroundColor = .clear
  50. self.tableView.backgroundColor = .clear
  51. self.tableView.registerForDraggedTypes([.fileURL])
  52. self.tipBox.borderWidth = 0
  53. self.tipBox.cornerRadius = 0
  54. // self.tipBox.fillColor = NSColor.km_init(hex: "#FEE4EC")
  55. self.tipIv.image = NSImage(named: "KMImageNameUserFbFileSizeTipIcon")
  56. self.tipBox.isHidden = true
  57. }
  58. func showTip(tip: String) {
  59. self.tipLabel.stringValue = tip
  60. self.boxTopConst.animator().constant = 30
  61. DispatchQueue.main.async {
  62. self.tipBox.isHidden = false
  63. }
  64. DispatchQueue.main.asyncAfter(deadline: .now()+2) {
  65. self.hiddenTip()
  66. }
  67. }
  68. func hiddenTip() {
  69. self.boxTopConst.animator().constant = 0
  70. DispatchQueue.main.async {
  71. self.tipBox.isHidden = true
  72. }
  73. }
  74. }
  75. extension KMUserListItemView: NSTableViewDelegate, NSTableViewDataSource {
  76. func numberOfRows(in tableView: NSTableView) -> Int {
  77. return self.datas.count
  78. }
  79. func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
  80. var cell = tableView.makeView(withIdentifier: .init("KMUserListItemCellView"), owner: self)
  81. if cell == nil {
  82. cell = KMUserListItemCellView.createFromNib()
  83. // cell?.wantsLayer = true
  84. // cell?.layer?.backgroundColor = NSColor.red.cgColor
  85. }
  86. let cellView = cell as? KMUserListItemCellView
  87. let model = self.datas[row]
  88. cellView?.fileNameLabel.stringValue = model.fileName ?? ""
  89. cellView?.fileSizeLabel.stringValue = model.fileSizeString ?? ""
  90. cellView?.button.image = NSImage(named: "KMImageNameUserFbDeleteIcon")
  91. cellView?.box.fillColor = .clear
  92. cellView?.itemClick = { [weak self] idx in
  93. if idx == 1 { // remove
  94. self?.itemClick?(row, nil)
  95. }
  96. }
  97. return cell
  98. }
  99. func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {
  100. if let block = self.validateDropCallback {
  101. return block(info, row, dropOperation)
  102. }
  103. return .generic
  104. }
  105. func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
  106. if let block = self.acceptDropCallback {
  107. return block(info, row, dropOperation)
  108. }
  109. let pborad = info.draggingPasteboard
  110. guard let _ = pborad.availableType(from: [.fileURL]) else {
  111. return false
  112. }
  113. guard let items = pborad.pasteboardItems else {
  114. return false
  115. }
  116. var fileNames: [String] = []
  117. for item in items {
  118. let string = item.propertyList(forType: .fileURL) as? String ?? ""
  119. fileNames.append(string)
  120. }
  121. return true
  122. }
  123. }