KMPDFSideBarController.swift 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. //
  2. // KMPDFSideBarController.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by Niehaoyu on 2024/10/22.
  6. //
  7. import Cocoa
  8. import KMComponentLibrary
  9. @objc protocol KMPDFSideBarControllerDelegate: AnyObject {
  10. //BOTA模式刷新回调
  11. @objc optional func kmPDFSideBarControllerDidSidebarTypeUpdated(_ view: KMPDFSideBarController)
  12. @objc optional func kmPDFSideBarControllerDidGotoPage(_ view: KMPDFSideBarController, _ pageIndex: Int)
  13. }
  14. class KMPDFSideBarController: NSViewController {
  15. @IBOutlet var contendBox: NSBox!
  16. @IBOutlet var rightDivider: ComponentDivider!
  17. @IBOutlet weak var searchItem: ComponentSideBarItem!
  18. @IBOutlet weak var thumbnailItem: ComponentSideBarItem!
  19. @IBOutlet weak var outlineItem: ComponentSideBarItem!
  20. @IBOutlet weak var bookmarkItem: ComponentSideBarItem!
  21. @IBOutlet weak var annotationItem: ComponentSideBarItem!
  22. @IBOutlet weak var pageTurnerView: ComponentSidebarPageTurner!
  23. weak open var delegate: KMPDFSideBarControllerDelegate?
  24. var pdfViewManager: KMPDFViewManager?
  25. var pdfView: CPDFListView?
  26. let searchProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_search"))
  27. let thumbnailProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_thumbnails"))
  28. let outlineProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_outline"))
  29. let bookmarkProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_bookmark"))
  30. let annotationProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_annotation"))
  31. let firstPageProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "first_vertical"), righticon: nil, text: KMLocalizedString("First Page"))
  32. let lastPageProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "last_vertical"), righticon: nil, text: KMLocalizedString("Last Page"))
  33. let previouseProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "arrow_left"), righticon: nil, text: KMLocalizedString("Previous Page"))
  34. let nextProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "arrow_right"), righticon: nil, text: KMLocalizedString("Next Page"))
  35. private var groupView: ComponentGroup!
  36. var firstPage_show: Bool = false
  37. var lastPage_show: Bool = false
  38. var previous_show: Bool = false
  39. var next_show: Bool = false
  40. override func viewDidLoad() {
  41. super.viewDidLoad()
  42. // Do view setup here.
  43. contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle")
  44. setupProperty()
  45. setUpPageTurnerData()
  46. reloadData()
  47. }
  48. func setupProperty() {
  49. rightDivider.properties = ComponentDividerProperty(type: .vertical)
  50. searchItem.properties = searchProperty
  51. thumbnailItem.properties = thumbnailProperty
  52. outlineItem.properties = outlineProperty
  53. bookmarkItem.properties = bookmarkProperty
  54. annotationItem.properties = annotationProperty
  55. searchItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
  56. thumbnailItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
  57. outlineItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
  58. bookmarkItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
  59. annotationItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
  60. }
  61. //MARK: - reloadData
  62. func reloadData() {
  63. reloadBOTAData()
  64. reloadPageTurnerData()
  65. }
  66. //MARK: - BOTA
  67. func reloadBOTAData() {
  68. searchProperty.state = .normal
  69. thumbnailProperty.state = .normal
  70. outlineProperty.state = .normal
  71. bookmarkProperty.state = .normal
  72. annotationProperty.state = .normal
  73. if pdfViewManager?.pdfSideBarType == .search {
  74. searchProperty.state = .pressed
  75. } else if pdfViewManager?.pdfSideBarType == .thumbnail {
  76. thumbnailProperty.state = .pressed
  77. } else if pdfViewManager?.pdfSideBarType == .outline {
  78. outlineProperty.state = .pressed
  79. } else if pdfViewManager?.pdfSideBarType == .bookmark {
  80. bookmarkProperty.state = .pressed
  81. } else if pdfViewManager?.pdfSideBarType == .annotation {
  82. annotationProperty.state = .pressed
  83. }
  84. searchItem.reloadData()
  85. thumbnailItem.reloadData()
  86. outlineItem.reloadData()
  87. bookmarkItem.reloadData()
  88. annotationItem.reloadData()
  89. }
  90. //MARK: - PageTurner
  91. func setUpPageTurnerData() {
  92. var count = 1
  93. if let pdfView = self.pdfView {
  94. count = Int(pdfView.document.pageCount)
  95. }
  96. let turnerProperty: ComponentSidebarPageTurnerProperty = ComponentSidebarPageTurnerProperty(currentIndex: 1, totalCount: count)
  97. turnerProperty.firstPage_show = self.firstPage_show
  98. turnerProperty.lastPage_show = self.lastPage_show
  99. turnerProperty.previous_show = self.previous_show
  100. turnerProperty.next_show = next_show
  101. pageTurnerView.properties = turnerProperty
  102. pageTurnerView.delegate = self
  103. }
  104. func reloadPageTurnerData() {
  105. guard let pdfview = self.pdfView else {
  106. return
  107. }
  108. let curIndex = Int(pdfview.currentPageIndex) + 1
  109. pageTurnerView.properties.currentIndex = curIndex
  110. pageTurnerView.properties.totalCount = Int(pdfview.document.pageCount)
  111. pageTurnerView.reloadData()
  112. }
  113. //MARK: - PageTurner Menu
  114. func showPageTurnMenuWithPoint(_ point: CGPoint) {
  115. if (groupView?.superview) != nil {
  116. return
  117. }
  118. var items: [ComponentMenuitemProperty] = []
  119. if firstPage_show == false {
  120. items.append(firstPageProperty)
  121. }
  122. if lastPage_show == false {
  123. items.append(lastPageProperty)
  124. }
  125. if previous_show == false {
  126. items.append(previouseProperty)
  127. }
  128. if next_show == false {
  129. items.append(nextProperty)
  130. }
  131. var viewHeight: CGFloat = 8.0
  132. for item in items {
  133. item.state = .normal
  134. item.itemSelected = false
  135. if item.type == .normal {
  136. viewHeight += 36
  137. } else if item.type == .divider {
  138. viewHeight += 8
  139. }
  140. }
  141. if groupView == nil {
  142. groupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
  143. }
  144. groupView.clickedAutoHide = false
  145. groupView?.frame = CGRectMake(0, 0, 160, viewHeight)
  146. groupView?.reloadData()
  147. groupView.groupDelegate = self
  148. groupView.showWithPoint(point, relativeTo: self.contendBox)
  149. groupView?.updateGroupInfo(items)
  150. }
  151. func hideGroupView() {
  152. groupView?.removeGroupView()
  153. }
  154. //MARK: - Action
  155. @objc func sidebarItemClicked(_ sender: ComponentSideBarItem) {
  156. if sender == searchItem {
  157. if pdfViewManager?.pdfSideBarType == .search {
  158. pdfViewManager?.pdfSideBarType = .none
  159. } else {
  160. pdfViewManager?.pdfSideBarType = .search
  161. }
  162. } else if sender == thumbnailItem {
  163. if pdfViewManager?.pdfSideBarType == .thumbnail {
  164. pdfViewManager?.pdfSideBarType = .none
  165. } else {
  166. pdfViewManager?.pdfSideBarType = .thumbnail
  167. }
  168. } else if sender == outlineItem {
  169. if pdfViewManager?.pdfSideBarType == .outline {
  170. pdfViewManager?.pdfSideBarType = .none
  171. } else {
  172. pdfViewManager?.pdfSideBarType = .outline
  173. }
  174. } else if sender == bookmarkItem {
  175. if pdfViewManager?.pdfSideBarType == .bookmark {
  176. pdfViewManager?.pdfSideBarType = .none
  177. } else {
  178. pdfViewManager?.pdfSideBarType = .bookmark
  179. }
  180. } else if sender == annotationItem {
  181. if pdfViewManager?.pdfSideBarType == .annotation {
  182. pdfViewManager?.pdfSideBarType = .none
  183. } else {
  184. pdfViewManager?.pdfSideBarType = .annotation
  185. }
  186. }
  187. reloadData()
  188. delegate?.kmPDFSideBarControllerDidSidebarTypeUpdated?(self)
  189. }
  190. //MARK: - MouseEvent
  191. override func mouseDown(with event: NSEvent) {
  192. super.mouseDown(with: event)
  193. view.window?.makeFirstResponder(self)
  194. }
  195. override func rightMouseUp(with event: NSEvent) {
  196. super.rightMouseUp(with: event)
  197. let point = self.view.convert(event.locationInWindow, from: nil)
  198. showPageTurnMenuWithPoint(point)
  199. }
  200. }
  201. //MARK: - ComponentSidebarDelegate
  202. extension KMPDFSideBarController: ComponentSidebarDelegate {
  203. func componentSidebarPageTurnerDidValueChanged(pageTurner: ComponentSidebarPageTurner) {
  204. delegate?.kmPDFSideBarControllerDidGotoPage?(self, pageTurner.properties.currentIndex-1)
  205. }
  206. func componentSidebarPageTurnerDidPreviousButtonClicked(pageTurner: ComponentSidebarPageTurner) {
  207. }
  208. func componentSidebarPageTurnerDidNextButtonClicked(pageTurner: ComponentSidebarPageTurner) {
  209. }
  210. }
  211. //MARK: - ComponentGroupDelegate
  212. extension KMPDFSideBarController: ComponentGroupDelegate {
  213. func componentGroupDidDismiss(group: ComponentGroup?) {
  214. }
  215. func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
  216. if menuItemProperty == firstPageProperty {
  217. firstPage_show = !firstPage_show
  218. firstPageProperty.righticon = firstPage_show ? NSImage(named: "tick_Green") : nil
  219. } else if menuItemProperty == lastPageProperty {
  220. lastPage_show = !lastPage_show
  221. lastPageProperty.righticon = lastPage_show ? NSImage(named: "tick_Green") : nil
  222. } else if menuItemProperty == previouseProperty {
  223. previous_show = !previous_show
  224. previouseProperty.righticon = previous_show ? NSImage(named: "tick_Green") : nil
  225. } else if menuItemProperty == nextProperty {
  226. next_show = !next_show
  227. nextProperty.righticon = next_show ? NSImage(named: "tick_Green") : nil
  228. }
  229. group?.reloadData()
  230. setUpPageTurnerData()
  231. }
  232. }