KMLeftSideViewController+Snapshot.swift 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. //
  2. // KMLeftSideViewController+Snapshot.swift
  3. // PDF Master
  4. //
  5. // Created by tangchao on 2024/1/12.
  6. //
  7. import Foundation
  8. // MARK: - Actions
  9. extension KMLeftSideViewController {
  10. @objc func menuItemClick_ExportPNG(_ sender: AnyObject?) {
  11. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  12. return
  13. }
  14. let image = snapshot.thumbnailWithSize(0)
  15. NSPanel.savePanel_data_success(self.view.window!, imageData: image?.pngData(), allowedTypes: ["png"]) { url in
  16. NSWorkspace.shared.selectFile(url.path, inFileViewerRootedAtPath: "")
  17. }
  18. }
  19. @objc func menuItemClick_ExportJPG(_ sender: AnyObject?) {
  20. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  21. return
  22. }
  23. let image = snapshot.thumbnailWithSize(0)
  24. NSPanel.savePanel_data_success(self.view.window!, imageData: image?.jpgData(), allowedTypes: ["jpg"]) { url in
  25. NSWorkspace.shared.selectFile(url.path, inFileViewerRootedAtPath: "")
  26. }
  27. }
  28. @objc func menuItemClick_ExportPDF(_ sender: AnyObject?) {
  29. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  30. return
  31. }
  32. if let image = snapshot.thumbnailWithSize(0) {
  33. let document = CPDFDocument()
  34. _ = document?.km_insert(image: image, at: 0)
  35. NSPanel.savePanel_pdf_success(self.view.window!, document: document) { url in
  36. NSWorkspace.shared.selectFile(url.path, inFileViewerRootedAtPath: "")
  37. }
  38. }
  39. }
  40. @objc func menuItemClick_Print(_ sender: AnyObject?) {
  41. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  42. return
  43. }
  44. if let image = snapshot.thumbnailWithSize(0) {
  45. self.delegate?.controller?(controller: self, itemClick: nil, itemKey: .print, params: image)
  46. }
  47. }
  48. @objc func menuItemClick_SelectAll(_ sender: AnyObject?) {
  49. let selected = self.snapshotListIsAllSelected()
  50. for model in self.snapshots {
  51. model.isSelected = !selected
  52. }
  53. Task { @MainActor in
  54. self.snapshotTableView.reloadData()
  55. }
  56. }
  57. @objc func deleteAllSnapshot(_ sender: AnyObject?) {
  58. for model in self.snapshots {
  59. model.windowC?.close()
  60. }
  61. }
  62. @objc func hideSnapshot(_ sender: AnyObject?) {
  63. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  64. return
  65. }
  66. if let data = snapshot.window?.isVisible, data {
  67. snapshot.miniaturize()
  68. }
  69. }
  70. @objc func showSnapshot(_ sender: AnyObject?) {
  71. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  72. return
  73. }
  74. if let data = snapshot.window?.isVisible, data {
  75. snapshot.window?.orderFront(nil)
  76. } else {
  77. snapshot.deminiaturize()
  78. }
  79. }
  80. @objc func deleteSnapshot(_ sender: AnyObject?) {
  81. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  82. return
  83. }
  84. snapshot.close()
  85. }
  86. @objc func menuItemClick_Copy(_ sender: AnyObject?) {
  87. guard let snapshot = (sender as? NSMenuItem)?.representedObject as? KMSnapshotWindowController else {
  88. return
  89. }
  90. let image = snapshot.thumbnailWithSize(0)
  91. if let tiffData = image?.tiffRepresentation {
  92. let pasteboardItem = NSPasteboardItem()
  93. pasteboardItem.setData(tiffData, forType: .tiff)
  94. let pboard = NSPasteboard.general
  95. pboard.clearContents()
  96. pboard.writeObjects([pasteboardItem])
  97. }
  98. }
  99. }
  100. extension KMLeftSideViewController {
  101. public func refreshUIOfSnapshotIfNeed(preference: Bool = false) {
  102. if self.type.methodType != .Thumbnail {
  103. return
  104. }
  105. if preference {
  106. self.reloadSnapshotSize()
  107. }
  108. Task { @MainActor in
  109. self.snapshotTableView.reloadData()
  110. }
  111. }
  112. public func reloadSnapshotDataIfNeed() {
  113. if self.type.methodType != .Thumbnail {
  114. return
  115. }
  116. Task { @MainActor in
  117. self.snapshotTableView.reloadData()
  118. }
  119. }
  120. public func reloadSnapshotSize() {
  121. let defaultSize = roundf(KMPreference.shared.thumbSnapshotSize)
  122. // var thumbnailSize = (defaultSize < TINY_SIZE + FUDGE_SIZE) ? TINY_SIZE : (defaultSize < SMALL_SIZE + FUDGE_SIZE) ? SMALL_SIZE : (defaultSize < LARGE_SIZE + FUDGE_SIZE) ? LARGE_SIZE : HUGE_SIZE
  123. var thumbnailSize = TINY_SIZE
  124. if defaultSize < TINY_SIZE + FUDGE_SIZE {
  125. } else {
  126. if defaultSize < SMALL_SIZE + FUDGE_SIZE {
  127. thumbnailSize = SMALL_SIZE
  128. } else {
  129. if defaultSize < LARGE_SIZE + FUDGE_SIZE {
  130. thumbnailSize = LARGE_SIZE
  131. } else {
  132. thumbnailSize = HUGE_SIZE
  133. }
  134. }
  135. }
  136. if (abs(thumbnailSize - Float(self.snapshotCacheSize)) > FUDGE_SIZE) {
  137. self.snapshotCacheSize = thumbnailSize.cgFloat
  138. }
  139. Task { @MainActor in
  140. self.snapshotTableView.reloadData()
  141. }
  142. }
  143. func updateSnapshotsIfNeed(for page: CPDFPage?) {
  144. if self.type.methodType != .Thumbnail {
  145. return
  146. }
  147. if page != nil {
  148. for model in self.snapshots {
  149. if let wc = model.windowC, wc.isPageVisible(page) {
  150. self.snapshotNeedsUpdate(wc)
  151. wc.redisplay()
  152. }
  153. }
  154. } else {
  155. for model in self.snapshots {
  156. model.windowC?.redisplay()
  157. }
  158. self.allSnapshotsNeedUpdate()
  159. }
  160. }
  161. func snapshotNeedsUpdate(_ dirtySnapshot: KMSnapshotWindowController) {
  162. if self.dirtySnapshots.contains(dirtySnapshot) == false {
  163. self.dirtySnapshots.append(dirtySnapshot)
  164. self.updateSnapshotsIfNeeded()
  165. }
  166. }
  167. func updateSnapshotsIfNeeded() {
  168. // if ([rightSideController.snapshotTableView window] != nil && [dirtySnapshots count] > 0 && snapshotTimer == nil)
  169. // snapshotTimer = [[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(updateSnapshot:) userInfo:NULL repeats:YES] retain];
  170. }
  171. func allSnapshotsNeedUpdate() {
  172. self.dirtySnapshots.removeAll()
  173. for model in self.snapshots {
  174. if let winC = model.windowC {
  175. self.dirtySnapshots.append(winC)
  176. }
  177. }
  178. self.updateSnapshotsIfNeeded()
  179. }
  180. }