123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355 |
- //
- // KMPDFSideBarController.swift
- // PDF Reader Pro
- //
- // Created by Niehaoyu on 2024/10/22.
- //
- import Cocoa
- import KMComponentLibrary
- @objc protocol KMPDFSideBarControllerDelegate: AnyObject {
-
- //BOTA模式刷新回调
- @objc optional func kmPDFSideBarControllerDidSidebarTypeUpdated(_ view: KMPDFSideBarController)
-
- @objc optional func kmPDFSideBarControllerDidGotoPage(_ view: KMPDFSideBarController, _ pageIndex: Int)
- }
- class KMPDFSideBarController: NSViewController {
-
- @IBOutlet var contendBox: NSBox!
- @IBOutlet var rightDivider: ComponentDivider!
- @IBOutlet weak var searchItem: ComponentSideBarItem!
- @IBOutlet weak var thumbnailItem: ComponentSideBarItem!
- @IBOutlet weak var outlineItem: ComponentSideBarItem!
- @IBOutlet weak var bookmarkItem: ComponentSideBarItem!
- @IBOutlet weak var annotationItem: ComponentSideBarItem!
- @IBOutlet var aiToolItem: ComponentSideBarItem!
-
- @IBOutlet weak var pageTurnerView: ComponentSidebarPageTurner!
-
- weak open var delegate: KMPDFSideBarControllerDelegate?
- var pdfViewManager: KMPDFViewManager?
-
- var pdfView: CPDFListView?
-
- let searchProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_search"))
- let thumbnailProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_thumbnails"))
- let outlineProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_outline"))
- let bookmarkProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_bookmark"))
- let annotationProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: ComponentLibrary.shared.image(forResource: "Sidebar_annotation"))
- let aiToolProperty: ComponentSideBarItemProperty = ComponentSideBarItemProperty(state: .normal, icon: NSImage(named: "toolbar_ai"))
- let firstPageProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "first_vertical"), righticon: nil, text: KMLocalizedString("First Page"))
- let lastPageProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "last_vertical"), righticon: nil, text: KMLocalizedString("Last Page"))
- let previouseProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "arrow_left"), righticon: nil, text: KMLocalizedString("Previous Page"))
- let nextProperty = ComponentMenuitemProperty(lefticon: NSImage(named: "arrow_right"), righticon: nil, text: KMLocalizedString("Next Page"))
-
- private var groupView: ComponentGroup!
-
- var firstPage_show: Bool = false {
- didSet {
- UserDefaults.standard.setValue(firstPage_show, forKey: "sidebar_firstPage_show_key")
- UserDefaults.standard.synchronize()
- }
- }
-
- var lastPage_show: Bool = false {
- didSet {
- UserDefaults.standard.setValue(lastPage_show, forKey: "sidebar_lastPage_show_key")
- UserDefaults.standard.synchronize()
- }
- }
-
- var previous_show: Bool = false {
- didSet {
- UserDefaults.standard.setValue(previous_show, forKey: "sidebar_previous_show_key")
- UserDefaults.standard.synchronize()
- }
- }
-
- var next_show: Bool = false {
- didSet {
- UserDefaults.standard.setValue(next_show, forKey: "sidebar_next_show_key")
- UserDefaults.standard.synchronize()
- }
- }
-
- override func viewDidLoad() {
- super.viewDidLoad()
- // Do view setup here.
-
- contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle")
-
- setupProperty()
-
- setUpPageTurnerData()
-
- reloadData()
- }
-
- func setupProperty() {
-
- firstPage_show = UserDefaults.standard.bool(forKey: "sidebar_firstPage_show_key")
- lastPage_show = UserDefaults.standard.bool(forKey: "sidebar_lastPage_show_key")
- previous_show = UserDefaults.standard.bool(forKey: "sidebar_previous_show_key")
- next_show = UserDefaults.standard.bool(forKey: "sidebar_next_show_key")
-
- rightDivider.properties = ComponentDividerProperty(type: .vertical)
-
- searchItem.properties = searchProperty
- thumbnailItem.properties = thumbnailProperty
- outlineItem.properties = outlineProperty
- bookmarkItem.properties = bookmarkProperty
- annotationItem.properties = annotationProperty
- aiToolItem.properties = aiToolProperty
- aiToolItem.properties.propertyInfo.cornerRadius = ComponentLibrary.shared.getComponentValueFromKey("radius/xs") as? CGFloat ?? 4
- aiToolItem.properties.propertyInfo.color_active = ComponentLibrary.shared.getComponentColorFromKey("colorAi/purple-light")
-
- searchItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
- thumbnailItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
- outlineItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
- bookmarkItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
- annotationItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
- aiToolItem.setTarget(self, action: #selector(sidebarItemClicked(_ :)))
-
- }
-
-
- //MARK: - reloadData
- func reloadData() {
- reloadBOTAData()
-
- reloadPageTurnerData()
- }
-
- //MARK: - BOTA
- func reloadBOTAData() {
- searchProperty.state = .normal
- thumbnailProperty.state = .normal
- outlineProperty.state = .normal
- bookmarkProperty.state = .normal
- annotationProperty.state = .normal
- aiToolProperty.state = .normal
-
- if pdfViewManager?.pdfSideBarType == .search {
- searchProperty.state = .pressed
- } else if pdfViewManager?.pdfSideBarType == .thumbnail {
- thumbnailProperty.state = .pressed
- } else if pdfViewManager?.pdfSideBarType == .outline {
- outlineProperty.state = .pressed
- } else if pdfViewManager?.pdfSideBarType == .bookmark {
- bookmarkProperty.state = .pressed
- } else if pdfViewManager?.pdfSideBarType == .annotation {
- annotationProperty.state = .pressed
- } else if pdfViewManager?.pdfSideBarType == .aiTools {
- aiToolProperty.state = .pressed
- }
- searchItem.reloadData()
- thumbnailItem.reloadData()
- outlineItem.reloadData()
- bookmarkItem.reloadData()
- annotationItem.reloadData()
- aiToolItem.reloadData()
- }
-
- //MARK: - PageTurner
- func setUpPageTurnerData() {
- var count = 1
- if let pdfView = self.pdfView {
- count = Int(pdfView.document.pageCount)
- }
- let turnerProperty: ComponentSidebarPageTurnerProperty = ComponentSidebarPageTurnerProperty(currentIndex: 1, totalCount: count)
- turnerProperty.firstPage_show = self.firstPage_show
- turnerProperty.lastPage_show = self.lastPage_show
- turnerProperty.previous_show = self.previous_show
- turnerProperty.next_show = next_show
-
- pageTurnerView.properties = turnerProperty
- pageTurnerView.delegate = self
-
- }
-
- func reloadPageTurnerData() {
- guard let pdfview = self.pdfView else {
- return
- }
- let curIndex = Int(pdfview.currentPageIndex) + 1
- pageTurnerView.properties.currentIndex = curIndex
- pageTurnerView.properties.totalCount = Int(pdfview.document.pageCount)
- pageTurnerView.reloadData()
- }
-
- public func beginEditing() {
- pageTurnerView.beginEditing()
- }
-
- //MARK: - PageTurner Menu
- func showPageTurnMenuWithPoint(_ point: CGPoint) {
- if (groupView?.superview) != nil {
- return
- }
-
- var items: [ComponentMenuitemProperty] = []
-
- items.append(firstPageProperty)
- items.append(lastPageProperty)
- items.append(previouseProperty)
- items.append(nextProperty)
-
- firstPageProperty.righticon = firstPage_show ? NSImage(named: "tick_Green") : nil
- lastPageProperty.righticon = lastPage_show ? NSImage(named: "tick_Green") : nil
- previouseProperty.righticon = previous_show ? NSImage(named: "tick_Green") : nil
- nextProperty.righticon = next_show ? NSImage(named: "tick_Green") : nil
-
- var viewHeight: CGFloat = 8.0
- for item in items {
- item.state = .normal
- item.itemSelected = false
-
- if item.type == .normal {
- viewHeight += 36
- } else if item.type == .divider {
- viewHeight += 8
- }
- }
-
- if groupView == nil {
- groupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
- }
- groupView.clickedAutoHide = false
- groupView?.frame = CGRectMake(0, 0, 160, viewHeight)
- groupView?.reloadData()
- groupView.groupDelegate = self
- groupView.showWithPoint(point, relativeTo: nil)
- groupView?.updateGroupInfo(items)
-
- }
-
- func hideGroupView() {
- groupView?.removeGroupView()
-
- }
-
- //MARK: - Action
- @objc func sidebarItemClicked(_ sender: ComponentSideBarItem) {
- if sender == searchItem {
- if pdfViewManager?.pdfSideBarType == .search {
- pdfViewManager?.pdfSideBarType = .none
- } else {
- pdfViewManager?.pdfSideBarType = .search
- }
- } else if sender == thumbnailItem {
- if pdfViewManager?.pdfSideBarType == .thumbnail {
- pdfViewManager?.pdfSideBarType = .none
- } else {
- pdfViewManager?.pdfSideBarType = .thumbnail
- }
- } else if sender == outlineItem {
- if pdfViewManager?.pdfSideBarType == .outline {
- pdfViewManager?.pdfSideBarType = .none
- } else {
- pdfViewManager?.pdfSideBarType = .outline
- }
- } else if sender == bookmarkItem {
- if pdfViewManager?.pdfSideBarType == .bookmark {
- pdfViewManager?.pdfSideBarType = .none
- } else {
- pdfViewManager?.pdfSideBarType = .bookmark
- }
- } else if sender == annotationItem {
- if pdfViewManager?.pdfSideBarType == .annotation {
- pdfViewManager?.pdfSideBarType = .none
- } else {
- pdfViewManager?.pdfSideBarType = .annotation
- }
- } else if sender == aiToolItem {
- if pdfViewManager?.pdfSideBarType == .aiTools {
- pdfViewManager?.pdfSideBarType = .none
- } else {
- pdfViewManager?.pdfSideBarType = .aiTools
- }
- }
-
- reloadData()
-
- delegate?.kmPDFSideBarControllerDidSidebarTypeUpdated?(self)
- }
-
- //MARK: - MouseEvent
- override func mouseDown(with event: NSEvent) {
- super.mouseDown(with: event)
-
- view.window?.makeFirstResponder(self)
-
- }
-
- override func rightMouseUp(with event: NSEvent) {
- super.rightMouseUp(with: event)
-
- let point = self.view.convert(event.locationInWindow, from: nil)
-
- showPageTurnMenuWithPoint(point)
-
- }
- }
- //MARK: - ComponentSidebarDelegate
- extension KMPDFSideBarController: ComponentSidebarDelegate {
- func componentSidebarPageTurnerDidValueChanged(pageTurner: ComponentSidebarPageTurner) {
- delegate?.kmPDFSideBarControllerDidGotoPage?(self, pageTurner.properties.currentIndex-1)
-
- }
-
- func componentSidebarPageTurnerDidPreviousButtonClicked(pageTurner: ComponentSidebarPageTurner) {
-
- }
-
- func componentSidebarPageTurnerDidNextButtonClicked(pageTurner: ComponentSidebarPageTurner) {
-
- }
-
- }
- //MARK: - ComponentGroupDelegate
- extension KMPDFSideBarController: ComponentGroupDelegate {
- func componentGroupDidDismiss(group: ComponentGroup?) {
-
- }
-
- func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
- if menuItemProperty == firstPageProperty {
- firstPage_show = !firstPage_show
-
- firstPageProperty.righticon = firstPage_show ? NSImage(named: "tick_Green") : nil
-
- } else if menuItemProperty == lastPageProperty {
- lastPage_show = !lastPage_show
-
- lastPageProperty.righticon = lastPage_show ? NSImage(named: "tick_Green") : nil
-
- } else if menuItemProperty == previouseProperty {
- previous_show = !previous_show
-
- previouseProperty.righticon = previous_show ? NSImage(named: "tick_Green") : nil
-
- } else if menuItemProperty == nextProperty {
- next_show = !next_show
-
- nextProperty.righticon = next_show ? NSImage(named: "tick_Green") : nil
- }
-
- firstPageProperty.itemSelected = false
- lastPageProperty.itemSelected = false
- previouseProperty.itemSelected = false
- nextProperty.itemSelected = false
-
- group?.reloadData()
-
- setUpPageTurnerData()
- }
- }
|