KMBookmarkOutlineView.swift 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. //
  2. // KMBookemarkOutlineView.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by lizhe on 2024/3/4.
  6. //
  7. import Cocoa
  8. private let kLabelIdentifier = NSUserInterfaceItemIdentifier("Label")
  9. private let kFileIdentifier = NSUserInterfaceItemIdentifier("File")
  10. private let kPageIdentifier = NSUserInterfaceItemIdentifier("Page")
  11. private let kSeparatorIdentifier = NSUserInterfaceItemIdentifier("Separator")
  12. typealias KMBookmarkOutlineViewDoubleClickAction = (_ view: KMBookmarkOutlineView) -> Void
  13. class KMBookmarkOutlineView: KMBaseXibView {
  14. @IBOutlet weak var outlineView: NSOutlineView!
  15. var doubleClickAction: KMBookmarkOutlineViewDoubleClickAction?
  16. var data: KMRootBookmark? {
  17. didSet {
  18. self.reloadData()
  19. }
  20. }
  21. override func draw(_ dirtyRect: NSRect) {
  22. super.draw(dirtyRect)
  23. // Drawing code here.
  24. }
  25. override func setup() {
  26. outlineView.delegate = self
  27. outlineView.dataSource = self
  28. outlineView.registerForDraggedTypes([kPasteboardTypeBookmarkRows, .fileURL, .string])
  29. outlineView.doubleAction = #selector(doubleClickBookmark)
  30. }
  31. override func reloadData() {
  32. guard let data = data else { return }
  33. self.outlineView.reloadData()
  34. }
  35. }
  36. //MARK: Action
  37. extension KMBookmarkOutlineView {
  38. @objc func doubleClickBookmark() {
  39. print("doubleClickBookmark")
  40. self.doubleClickAction?(self)
  41. }
  42. }
  43. // MARK: - NSOutlineViewDataSource
  44. extension KMBookmarkOutlineView: NSOutlineViewDataSource {
  45. func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {
  46. let bookmark = item as? KMBookmark ?? data
  47. guard let bookmark = bookmark else { return 0}
  48. return bookmark.bookmarkType == .folder ? bookmark.children.count : 0
  49. }
  50. func outlineView(_ outlineView: NSOutlineView, isItemExpandable item: Any) -> Bool {
  51. let bookmark = item as! KMBookmark
  52. return bookmark.bookmarkType == .folder
  53. }
  54. func outlineView(_ outlineView: NSOutlineView, child index: Int, ofItem item: Any?) -> Any {
  55. let bookmark = (item as? KMBookmark) ?? data
  56. return bookmark?.objectOfChidren(index: index) as Any
  57. }
  58. }
  59. extension KMBookmarkOutlineView: NSOutlineViewDelegate {
  60. // MARK: - NSOutlineViewDelegate
  61. func outlineView(_ outlineView: NSOutlineView, viewFor tableColumn: NSTableColumn?, item: Any) -> NSView? {
  62. guard let column = tableColumn else { return nil }
  63. guard let item = item as? KMBookmark else { return nil }
  64. let identifier = column.identifier
  65. var cell: NSTableCellView = NSTableCellView()
  66. if item.bookmarkType == .separator {
  67. cell = KMBookmarkOutlineSeparatorCellView()
  68. } else {
  69. switch identifier {
  70. case kLabelIdentifier: do {
  71. cell = KMBookmarkOutlineTitleCellView()
  72. let cell = cell as! KMBookmarkOutlineTitleCellView
  73. cell.titleLabel.stringValue = item.label
  74. cell.iconImageView.image = item.icon
  75. }
  76. case kPageIdentifier: do {
  77. cell = KMBookmarkOutlinePageCellView()
  78. let cell = cell as! KMBookmarkOutlinePageCellView
  79. cell.titleLabel.stringValue = item.pageIndex.description
  80. }
  81. case kFileIdentifier: do {
  82. cell = KMBookmarkOutlineFileCellView()
  83. let cell = cell as! KMBookmarkOutlineFileCellView
  84. var stringValue = ""
  85. if item.bookmarkType == .folder ||
  86. item.bookmarkType == .session {
  87. let count = item.children.count
  88. stringValue = count == 1 ? NSLocalizedString("1 item", comment: "Bookmark folder description") : String.localizedStringWithFormat(NSLocalizedString("%ld items", comment: "Bookmark folder description"), count)
  89. } else {
  90. stringValue = item.fileURL?.path ?? ""
  91. }
  92. cell.titleLabel.stringValue = stringValue
  93. }
  94. default:
  95. break
  96. }
  97. }
  98. return cell
  99. }
  100. func outlineView(_ outlineView: NSOutlineView, rowViewForItem item: Any) -> NSTableRowView? {
  101. // 创建一个自定义的行视图
  102. let rowView = KMBookmarkOutlineRowView()
  103. guard let item = item as? KMBookmark else { return rowView }
  104. // 根据需要设置行视图的背景颜色
  105. if item.bookmarkType == .separator{
  106. rowView.hiddenLineView(isHidden: false)
  107. } else {
  108. rowView.hiddenLineView()
  109. }
  110. return rowView
  111. }
  112. }