KMLeftSideViewController+Snapshot.swift 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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. func snapshot_initSubViews() {
  100. self.snapshotNormalZoomInButton.target = self
  101. self.snapshotNormalZoomInButton.tag = 2
  102. self.snapshotNormalZoomInButton.action = #selector(thumbnailSizeScaling)
  103. self.snapshotNormalZoomOutButton.target = self
  104. self.snapshotNormalZoomOutButton.tag = 3
  105. self.snapshotNormalZoomOutButton.action = #selector(thumbnailSizeScaling)
  106. self.snapshotNormalMoreButton.target = self
  107. self.snapshotNormalMoreButton.tag = 300
  108. self.snapshotNormalMoreButton.action = #selector(leftSideViewMoreButtonAction)
  109. self.snapshotSearchZoomInButton.target = self
  110. self.snapshotSearchZoomInButton.tag = 2
  111. self.snapshotSearchZoomInButton.action = #selector(thumbnailSizeScaling)
  112. self.snapshotSearchZoomOutButton.target = self
  113. self.snapshotSearchZoomOutButton.tag = 3
  114. self.snapshotSearchZoomOutButton.action = #selector(thumbnailSizeScaling)
  115. self.snapshotDoneButton.target = self
  116. self.snapshotDoneButton.tag = 312
  117. self.snapshotDoneButton.action = #selector(leftSideViewDoneButtonAction)
  118. self.snapshotTableView.delegate = self
  119. self.snapshotTableView.dataSource = self
  120. self.snapshotTableView.menu = NSMenu()
  121. self.snapshotTableView.menu?.delegate = self
  122. self.snapshotTableView.doubleAction = #selector(toggleSelectedSnapshots)
  123. self.snapshotTableView.target = self
  124. self.snapshotTableView.botaDelegate = self
  125. self.snapshotTableView.setDraggingSourceOperationMask(.every, forLocal: false)
  126. self.snapshotSearchField.changeCallBack = { [weak self] changeContent in
  127. var editContent = ""
  128. if changeContent != nil {
  129. editContent = changeContent!
  130. }
  131. self?.searchFieldChangeAction(editContent)
  132. }
  133. }
  134. func snapshot_initDefalutValue() {
  135. self.snapshotNormalView.wantsLayer = true
  136. self.snapshotNormalView.layer?.backgroundColor = KMAppearance.Layout.l0Color().cgColor
  137. self.snapshotLabel.stringValue = KMLocalizedString("Snapshots", nil)
  138. self.snapshotLabel.textColor = KMAppearance.Layout.h0Color()
  139. self.snapshotNormalSearchButton.toolTip = KMLocalizedString("Search", nil)
  140. self.snapshotSearchField.backgroundColor = KMAppearance.Layout.l_1Color()
  141. self.snapshotSearchField.wantsLayer = true
  142. self.snapshotSearchField.layer?.backgroundColor = KMAppearance.Layout.l_1Color().cgColor
  143. self.snapshotSearchField.layer?.borderWidth = 1.0
  144. self.snapshotSearchField.layer?.borderColor = KMAppearance.Interactive.a0Color().cgColor
  145. self.snapshotDoneButton.toolTip = KMLocalizedString("Done", nil)
  146. self.snapshotDoneButton.wantsLayer = true
  147. self.snapshotDoneButton.layer?.backgroundColor = KMAppearance.Interactive.a0Color().cgColor
  148. self.snapshotDoneButton.layer?.cornerRadius = 4.0
  149. self.snapshotDoneButton.title = KMLocalizedString("Done", nil)
  150. self.snapshotDoneButton.setTitleColor(KMAppearance.Layout.w0Color())
  151. self.snapshotDoneButton.isHidden = true
  152. self.snapshotSearchField.isHidden = true
  153. self.snapshotSearchZoomOutButton.isHidden = true
  154. self.snapshotSearchZoomInButton.isHidden = true
  155. self.snapshotNormalZoomInButton.toolTip = KMLocalizedString("Zoom In", nil)
  156. self.snapshotSearchZoomInButton.toolTip = KMLocalizedString("Zoom In", nil)
  157. self.snapshotNormalZoomOutButton.toolTip = KMLocalizedString("Zoom Out", nil)
  158. self.snapshotSearchZoomOutButton.toolTip = KMLocalizedString("Zoom Out", nil)
  159. self.snapshotTableView.backgroundColor = KMAppearance.Layout.l0Color()
  160. // self.snapshotTableView.backgroundColor = .clear
  161. }
  162. func updataLeftSideSnapView() {
  163. if (snapshots.count < 1) {
  164. self.snapshotNormalSearchButton.isEnabled = false
  165. self.snapshotNormalZoomOutButton.isEnabled = false
  166. self.snapshotNormalZoomInButton.isEnabled = false
  167. self.snapshotNormalMoreButton.isEnabled = false
  168. self.leftSideEmptyVC.deleteSnapBtn.isEnabled = false
  169. self.leftSideEmptyVC.exportSnapBtn.isEnabled = false
  170. self.leftSideEmptyVC.printSnapBtn.isEnabled = false
  171. self.snapshotTableView.usesAlternatingRowBackgroundColors = false
  172. let view = self.snapshotTableView.enclosingScrollView!
  173. let emptyVcSize = self.leftSideEmptyVC.emptySnapView.frame.size
  174. self.leftSideEmptyVC.emptySnapView.frame = NSMakeRect((view.frame.size.width-emptyVcSize.width)/2.0,(view.frame.size.height-emptyVcSize.height)/2.0, emptyVcSize.width, emptyVcSize.height);
  175. self.leftSideEmptyVC.emptySnapView.autoresizingMask = [.minXMargin, .maxXMargin, .minYMargin, .maxYMargin]
  176. self.snapshotTableView.enclosingScrollView?.documentView?.addSubview(self.leftSideEmptyVC.emptySnapView)
  177. } else {
  178. self.snapshotNormalSearchButton.isEnabled = true
  179. self.snapshotNormalZoomOutButton.isEnabled = true
  180. self.snapshotNormalZoomInButton.isEnabled = true
  181. self.snapshotNormalMoreButton.isEnabled = true
  182. self.leftSideEmptyVC.emptySnapView.removeFromSuperview()
  183. self.leftSideEmptyVC.deleteSnapBtn.isEnabled = true
  184. self.leftSideEmptyVC.exportSnapBtn.isEnabled = true
  185. self.leftSideEmptyVC.printSnapBtn.isEnabled = true
  186. }
  187. }
  188. @IBAction func snapshotNormalSearchButtonAction(_ sender: NSButton) {
  189. self.snapshotSearchField.isHidden = false
  190. self.snapshotSearchZoomInButton.isHidden = true
  191. self.snapshotNormalSearchButton.isHidden = true
  192. self.snapshotDoneButton.isHidden = false
  193. self.snapshotLabel.isHidden = true
  194. self.snapshotNormalZoomOutButton.isHidden = true
  195. self.snapshotNormalZoomInButton.isHidden = true
  196. self.snapshotSearchField.becomeFirstResponder()
  197. }
  198. }
  199. extension KMLeftSideViewController {
  200. public func refreshUIOfSnapshotIfNeed(preference: Bool = false) {
  201. if self.type.methodType != .Thumbnail {
  202. return
  203. }
  204. if preference {
  205. self.reloadSnapshotSize()
  206. }
  207. Task { @MainActor in
  208. self.snapshotTableView.reloadData()
  209. }
  210. }
  211. public func reloadSnapshotDataIfNeed() {
  212. if self.type.methodType != .Thumbnail {
  213. return
  214. }
  215. Task { @MainActor in
  216. self.snapshotTableView.reloadData()
  217. }
  218. }
  219. public func reloadSnapshotSize() {
  220. let defaultSize = roundf(KMPreference.shared.thumbSnapshotSize)
  221. // 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
  222. var thumbnailSize = TINY_SIZE
  223. if defaultSize < TINY_SIZE + FUDGE_SIZE {
  224. } else {
  225. if defaultSize < SMALL_SIZE + FUDGE_SIZE {
  226. thumbnailSize = SMALL_SIZE
  227. } else {
  228. if defaultSize < LARGE_SIZE + FUDGE_SIZE {
  229. thumbnailSize = LARGE_SIZE
  230. } else {
  231. thumbnailSize = HUGE_SIZE
  232. }
  233. }
  234. }
  235. if (abs(thumbnailSize - Float(self.snapshotCacheSize)) > FUDGE_SIZE) {
  236. self.snapshotCacheSize = thumbnailSize.cgFloat
  237. }
  238. Task { @MainActor in
  239. self.snapshotTableView.reloadData()
  240. }
  241. }
  242. func updateSnapshotsIfNeed(for page: CPDFPage?) {
  243. if self.type.methodType != .Thumbnail {
  244. return
  245. }
  246. if page != nil {
  247. for model in self.snapshots {
  248. if let wc = model.windowC, wc.isPageVisible(page) {
  249. self.snapshotNeedsUpdate(wc)
  250. wc.redisplay()
  251. }
  252. }
  253. } else {
  254. for model in self.snapshots {
  255. model.windowC?.redisplay()
  256. }
  257. self.allSnapshotsNeedUpdate()
  258. }
  259. }
  260. func snapshotNeedsUpdate(_ dirtySnapshot: KMSnapshotWindowController) {
  261. if self.dirtySnapshots.contains(dirtySnapshot) == false {
  262. self.dirtySnapshots.append(dirtySnapshot)
  263. self.updateSnapshotsIfNeeded()
  264. }
  265. }
  266. func updateSnapshotsIfNeeded() {
  267. // if ([rightSideController.snapshotTableView window] != nil && [dirtySnapshots count] > 0 && snapshotTimer == nil)
  268. // snapshotTimer = [[NSTimer scheduledTimerWithTimeInterval:0.03 target:self selector:@selector(updateSnapshot:) userInfo:NULL repeats:YES] retain];
  269. }
  270. func allSnapshotsNeedUpdate() {
  271. self.dirtySnapshots.removeAll()
  272. for model in self.snapshots {
  273. if let winC = model.windowC {
  274. self.dirtySnapshots.append(winC)
  275. }
  276. }
  277. self.updateSnapshotsIfNeeded()
  278. }
  279. }