KMPDFThumbnialPageView.swift 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //
  2. // KMPDFThumbnialPageView.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2022/11/24.
  6. //
  7. import Cocoa
  8. class KMPDFThumbnialPageView: NSView {
  9. private var pendingWordItem: DispatchWorkItem?
  10. var page: CPDFPage? {
  11. didSet {
  12. let path = page?.document.documentURL.path ?? ""
  13. let image = KMThumbnailCache.shared.thumbnail(for: path, id: Int(self.page?.pageIndex() ?? UInt(Int.max)))
  14. if image != nil {
  15. self.pageImageIv.image = image
  16. } else {
  17. self.pageImageIv.image = NSImage()
  18. self.performTask()
  19. }
  20. }
  21. }
  22. var pageImageIv = NSImageView()
  23. var isThumb = false
  24. override init(frame frameRect: NSRect) {
  25. super.init(frame: frameRect)
  26. self.setup();
  27. }
  28. required init?(coder: NSCoder) {
  29. super.init(coder: coder)
  30. }
  31. func setup() {
  32. self.wantsLayer = true
  33. self.layer?.backgroundColor = NSColor.white.cgColor
  34. self.shadow = NSShadow()
  35. self.layer?.shadowColor = NSColor.black.cgColor
  36. self.layer?.shadowOpacity = 0.2
  37. self.layer?.shadowRadius = 3.0
  38. self.layer?.shadowOffset = CGSize(width: 0, height: -3)
  39. pageImageIv.wantsLayer = true;
  40. self.addSubview(self.pageImageIv)
  41. self.pageImageIv.autoresizingMask = [.width, .height];
  42. self.pageImageIv.frame = self.bounds
  43. }
  44. func performTask() {
  45. pendingWordItem?.cancel()
  46. let newWorkItem = DispatchWorkItem {
  47. self.updateThumbnial()
  48. }
  49. DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3, execute:newWorkItem)
  50. pendingWordItem = newWorkItem
  51. }
  52. func updateThumbnial(needReset: Bool = true) {
  53. let path = page?.document.documentURL.path ?? ""
  54. let image = KMThumbnailCache.shared.thumbnail(for: path, id: Int(self.page?.pageIndex() ?? UInt(Int.max)))
  55. if image != nil {
  56. self.pageImageIv.image = image
  57. } else {
  58. let pageIndex = self.page?.pageIndex()
  59. self.page?.thumbnail(of: self.bounds.size, needReset: needReset, completion: { [unowned self] image in
  60. if (image != nil) {
  61. self.pageImageIv.image = image
  62. KMThumbnailCache.shared.addThumbnail(for: path, id: Int(pageIndex ?? UInt(Int.max)), image: image!)
  63. }
  64. })
  65. }
  66. }
  67. }