// // KMCustomButtonPopMenuViewController.swift // PDF Reader Pro // // Created by wanjun on 2023/10/7. // import Cocoa import Masonry @objc protocol KMCustomButtonPopMenuViewControllerDataSources: AnyObject { // pop框有多少行 func numberOfLine() -> Int // pop框某行显示的文字 func stringForLine(at index: Int) -> String? // 某行是否需要下划线 func needInsertSeperateLine(at index: Int) -> Bool // 某行是否需要选取 func needHightLightLine(at index: Int) -> Bool // 某行对应的图片 @objc optional func imageForLine(at index: Int) -> NSImage? // 某行是否可用 func itemEnable(at index: Int) -> Bool } @objc protocol KMCustomButtonPopMenuViewControllerDelegate: AnyObject { func customViewButtonPopDidSelectIndex(_ index: Int) } @objc class KMCustomButtonPopMenuViewController: NSViewController { weak var dataSources: KMCustomButtonPopMenuViewControllerDataSources? weak var delegate: KMCustomButtonPopMenuViewControllerDelegate? // override var nibName: NSNib.Name? { // return "KMCustomButtonPopMenuViewController" // } @objc override func viewDidLoad() { super.viewDidLoad() // Do view setup here. var numberOfLine = 0 if let data = self.dataSources?.numberOfLine() { numberOfLine = data } if numberOfLine < 1 { return } var referenceView: NSView? = self.view for i in 0..<numberOfLine { var image: NSImage? var title: String? if let data = self.dataSources?.imageForLine?(at: i) { image = data } if let data = self.dataSources?.stringForLine(at: i) { title = data } var v: KMPopMenuButton if let image1 = image { v = KMPopMenuButton(title: title!, image: image1, target: self, action: #selector(buttonClicked(_:))) v.imageHugsTitle = true } else { v = KMPopMenuButton(title: title!, target: self, action: #selector(buttonClicked(_:))) } v.isBordered = false v.tag = i v.setTitleColorWithColor(NSColor.labelColor, font: nil) if let data = self.dataSources?.itemEnable(at: i) { v.isEnabled = data } if let data = self.dataSources?.needInsertSeperateLine(at: i), data { let box = NSBox(frame: .zero) box.boxType = .separator self.view.addSubview(box) box.mas_makeConstraints { make in make?.top.equalTo()(referenceView?.mas_bottom)?.offset()(2) make?.left.equalTo()(self.view)?.offset()(CGFloat(21)) make?.centerX.equalTo()(self.view) } referenceView = box } else { self.view.addSubview(v) v.mas_makeConstraints { make in if let viewBool = referenceView?.isEqual(self.view), viewBool { make?.top.equalTo()(referenceView)?.offset()(CGFloat(10)) } else { make?.top.equalTo()(referenceView?.mas_bottom)?.offset()(CGFloat(2)) } make?.left.right().equalTo()(self.view) make?.height.offset()(24) } referenceView = v } if self.responds(to: Selector.init(("needHightLightLineAtIndex:"))) { if let needBool = self.dataSources?.needHightLightLine(at: i) { v.state = .on } } if i == numberOfLine - 1 { referenceView?.mas_updateConstraints({ make in make?.bottom.equalTo()(self.view)?.offset()(-10) }) } } } @objc func buttonClicked(_ sender: NSButton) { self.delegate?.customViewButtonPopDidSelectIndex(sender.tag) } }