// // KMMergeCollectionViewItem.swift // PDF Reader Pro // // Created by tangchao on 2022/11/23. // import Cocoa import PDFKit typealias KMMergeCollectionViewItemDoubleClick = (_ viewItem: AnyObject)->() typealias KMMergeCollectionViewItemPageRangeClick = (_ viewItem: AnyObject)->() class KMMergeCollectionViewItem: NSCollectionViewItem { lazy var iconImageView = NSImageView() lazy var backgroundView = NSView() lazy var selectedView = NSView() lazy var pageView = KMPDFThumbnialPageView() private var expandButton = NSButton() private var pageRangeButton = NSButton() lazy var nameLabel = NSTextField(labelWithString: "") var doubleClick: KMMergeCollectionViewItemDoubleClick! var pageRangeClick: KMMergeCollectionViewItemPageRangeClick! private var myModel: KMMergeFileModel! var model: KMMergeFileModel { get { myModel } set { myModel = newValue pageView.page = newValue.page; nameLabel.stringValue = model.documentURL.lastPathComponent.components(separatedBy: ".").first! if newValue.pageRange == .custom { pageRangeButton.title = model.pageRangeString } else { pageRangeButton.title = (newValue.pageRange).rawValue } } } override func viewDidLoad() { super.viewDidLoad() view.addSubview(backgroundView) view.addSubview(selectedView) view.addSubview(pageView) view.addSubview(expandButton) view.addSubview(pageRangeButton) view.addSubview(nameLabel) selectedView.wantsLayer = true selectedView.layer?.backgroundColor = NSColor.white.cgColor selectedView.layer?.borderWidth = 1 selectedView.layer?.borderColor = NSColor.white.cgColor selectedView.layer?.cornerRadius = 8 nameLabel.alignment = .center nameLabel.lineBreakMode = .byTruncatingTail expandButton.wantsLayer = true expandButton.isBordered = false expandButton.title = NSLocalizedString("Expand", comment: "") expandButton.layer?.backgroundColor = NSColor.white.cgColor; expandButton.target = self expandButton.action = #selector(expandButtonAction) pageRangeButton.wantsLayer = true pageRangeButton.isBordered = false pageRangeButton.layer?.backgroundColor = NSColor.lightGray.cgColor pageRangeButton.target = self pageRangeButton.action = #selector(pageRangeButtonAction) let clickGestureRecongnizer = NSClickGestureRecognizer() clickGestureRecongnizer.numberOfClicksRequired = 2 // view.addGestureRecognizer(clickGestureRecongnizer) clickGestureRecongnizer.target = self clickGestureRecongnizer.action = #selector(clickGestureRecongnizerAction) } override func viewDidLayout() { super.viewDidLayout() let width = NSWidth(view.bounds) let height = NSHeight(view.bounds) iconImageView.frame = view.bounds backgroundView.frame = view.bounds let flodSize: CGFloat = 28 expandButton.frame = NSMakeRect(width-flodSize-10, height-flodSize-10, flodSize, flodSize) pageRangeButton.frame = NSMakeRect(15, 10+20+10, width-30, 28) selectedView.frame = NSMakeRect(15, 20, width-30, height-20) nameLabel.frame = NSMakeRect(0, 0, width, 20) let border: CGFloat = 10 var bounds: NSRect = NSZeroRect if (myModel != nil) { bounds = myModel.page.bounds } if (bounds.size.width == 0) { return } if (bounds.size.height == 0) { return } var pageSelectionSize = CGSize(width: self.view.frame.size.width-30, height: self.view.frame.size.height-40) // pageSelectionSize.height -= 40 var size = NSMakeSize(pageSelectionSize.width - 2 * border, pageSelectionSize.height - 2 * border) let minScale = min(size.width/bounds.size.width, size.height/bounds.size.height) size.width = bounds.size.width * minScale size.height = bounds.size.height * minScale let pageViewX = (pageSelectionSize.width-size.width) * 0.5 + 15 let pageViewY = (pageSelectionSize.height-size.height) * 0.5 + 20 pageView.frame = NSMakeRect(pageViewX, pageViewY, size.width, size.height) } override var isSelected: Bool { get { super.isSelected } set { super.isSelected = newValue backgroundView.wantsLayer = true if newValue { // backgroundView.layer?.backgroundColor = NSColor.blue.cgColor selectedView.layer?.borderColor = NSColor.blue.cgColor } else { // backgroundView.layer?.backgroundColor = NSColor.clear.cgColor selectedView.layer?.borderColor = NSColor.white.cgColor } } } override func mouseDown(with event: NSEvent) { if event.clickCount == 2 { guard let callback = doubleClick else { return } callback(self) } else { super.mouseDown(with: event) } } @objc func clickGestureRecongnizerAction() { } @objc func expandButtonAction() { guard let callback = doubleClick else { return } callback(self) } @objc func pageRangeButtonAction() { guard let callback = pageRangeClick else { return } callback(self) } }