// // KMMergeTitleBar.swift // PDF Reader Pro // // Created by tangchao on 2022/11/23. // import Cocoa enum KMMergeTitleBarButtonID: Int { case add = 0 case delete = 1 case zoomOut = 2 case zoomIn = 3 case merge = 4 case cancel = 5 } typealias KMMergeTitleBarItemViewClick = (Int)->() class KMMergeTitleBarItem: NSView { lazy var leftButton = NSButton() lazy var rightButton = NSButton() var itemClick: KMMergeTitleBarItemViewClick! override init(frame frameRect: NSRect) { super.init(frame: frameRect) addSubview(leftButton) addSubview(rightButton) leftButton.isBordered = false rightButton.isBordered = false leftButton.title = "" leftButton.target = self leftButton.action = #selector(leftButtonAction) rightButton.target = self rightButton.action = #selector(rightButtonAction) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func layout() { super.layout() let width = NSWidth(self.bounds) let height = NSHeight(self.bounds) let leftSize: CGFloat = 18 leftButton.frame = NSMakeRect(0, (height-leftSize)*0.5, leftSize, leftSize) rightButton.frame = NSMakeRect(leftSize, 0, width-leftSize, height) } @objc func leftButtonAction() { guard let callback = itemClick else { return } callback(1) } @objc func rightButtonAction() { guard let callback = itemClick else { return } callback(2) } } protocol KMMergeTitleBarDelegate : NSObjectProtocol { func titleBar(titleBar: KMMergeTitleBar, itemDidClick: KMMergeTitleBarButtonID) } typealias KMMergeTitleBarItemClick = (KMMergeTitleBarButtonID)->() typealias KMMergeTitleBarPageRangeClick = (_ index: Int, _ pageString: String)->() class KMMergeTitleBar: NSView { lazy var addItem = KMMergeTitleBarItem() private lazy var deleteItem = KMMergeTitleBarItem() private lazy var vLine = NSView() private lazy var zoomOutButton = NSButton() private lazy var zoomInButton = NSButton() private lazy var pagePageComboBox = NSComboBox() private lazy var mergeButton = NSButton() private lazy var cancelButton = NSButton() private lazy var bottomLine = NSView() weak open var delegate: KMMergeTitleBarDelegate? var itemClick: KMMergeTitleBarItemClick! var pageRangeClick: KMMergeTitleBarPageRangeClick! private var myModel: KMMergeFileModel! var model: KMMergeFileModel { get { myModel } set { myModel = newValue if newValue.pageRange == .custom { if !newValue.pageRangeString.isEmpty { pagePageComboBox.stringValue = newValue.pageRangeString } pagePageComboBox.isEditable = true } else if newValue.pageRange == .all { pagePageComboBox.stringValue = NSLocalizedString("全部页面", comment: "") } else if newValue.pageRange == .oddPages { pagePageComboBox.stringValue = NSLocalizedString("奇数页面", comment: "") } else if newValue.pageRange == .evenPages { pagePageComboBox.stringValue = NSLocalizedString("偶数页面", comment: "") } } } deinit { /// 释放 } override init(frame frameRect: NSRect) { super.init(frame: frameRect) initDefaultValue() initSubViews() } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override var isFlipped: Bool { return true } func initDefaultValue() { addItem.wantsLayer = true addItem.rightButton.title = NSLocalizedString("新增文件", comment: "") addItem.itemClick = { [weak weakSelf = self] (index: Int) -> () in guard let itemClickAction = weakSelf?.itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.add) } deleteItem.wantsLayer = true deleteItem.rightButton.title = NSLocalizedString("删除", comment: "") deleteItem.itemClick = { [weak weakSelf = self] (index: Int) -> () in guard let itemClickAction = weakSelf?.itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.delete) } vLine.wantsLayer = true vLine.layer?.backgroundColor = NSColor.lightGray.cgColor zoomOutButton.wantsLayer = true zoomOutButton.isBordered = false zoomOutButton.title = "+" zoomOutButton.layer?.borderWidth = 1; zoomOutButton.layer?.borderColor = NSColor.gray.cgColor; zoomOutButton.layer?.cornerRadius = 12 zoomOutButton.target = self zoomOutButton.action = #selector(zoomOutButtonAction) zoomInButton.wantsLayer = true zoomInButton.isBordered = false zoomInButton.title = "-" zoomInButton.layer?.borderWidth = 1; zoomInButton.layer?.borderColor = NSColor.gray.cgColor; zoomInButton.layer?.cornerRadius = 12 zoomInButton.target = self zoomInButton.action = #selector(zoomInButtonAction) pagePageComboBox.stringValue = "全部页面" pagePageComboBox.placeholderString = NSLocalizedString("如1,3-5,10", comment: "") pagePageComboBox.delegate = self pagePageComboBox.isEditable = false pagePageComboBox.addItems(withObjectValues: [NSLocalizedString("全部页面", comment: ""), NSLocalizedString("奇数页面", comment: ""), NSLocalizedString("偶数页面", comment: ""), NSLocalizedString("自定义", comment: "")]) mergeButton.wantsLayer = true mergeButton.isBordered = false mergeButton.title = NSLocalizedString("合并", comment: "") mergeButton.attributedTitle = NSMutableAttributedString(string: mergeButton.title, attributes: [NSAttributedString.Key.foregroundColor : NSColor.white]) mergeButton.layer?.backgroundColor = NSColor.black.cgColor mergeButton.layer?.cornerRadius = 5 mergeButton.target = self mergeButton.action = #selector(mergeButtonAction) cancelButton.wantsLayer = true cancelButton.isBordered = false cancelButton.title = NSLocalizedString("关闭", comment: "") cancelButton.layer?.backgroundColor = NSColor.white.cgColor cancelButton.layer?.cornerRadius = 5 cancelButton.layer?.borderWidth = 1 cancelButton.layer?.borderColor = NSColor.black.cgColor cancelButton.target = self cancelButton.action = #selector(cancelButtonAction) bottomLine.wantsLayer = true bottomLine.layer?.backgroundColor = NSColor.lightGray.cgColor } func initSubViews() { addSubview(addItem) addSubview(deleteItem) addSubview(vLine) addSubview(zoomOutButton) addSubview(zoomInButton) addSubview(pagePageComboBox) addSubview(mergeButton) addSubview(cancelButton) addSubview(bottomLine) } override func layout() { super.layout() let width = NSWidth(self.bounds) let height = NSHeight(self.bounds) let space: CGFloat = 12 let centerX: CGFloat = width * 0.5 let lineH: CGFloat = 18 vLine.frame = NSMakeRect(centerX, (height-lineH)*0.5, 1, lineH); let itemH: CGFloat = 28 let itemY: CGFloat = (height-itemH) * 0.5 let deleteItemWidth: CGFloat = 60 let deleteItemX = centerX-deleteItemWidth-space deleteItem.frame = NSMakeRect(deleteItemX, itemY, deleteItemWidth, itemH) let addItemWidth: CGFloat = 80 let addItemX = deleteItemX-addItemWidth-space addItem.frame = NSMakeRect(addItemX, itemY, addItemWidth, itemH) let zoomButtonSize: CGFloat = 24 let zoomOutButtonX = centerX + space let zoomButtonY = (height-zoomButtonSize) * 0.5 zoomOutButton.frame = NSMakeRect(zoomOutButtonX, zoomButtonY, zoomButtonSize, zoomButtonSize) zoomInButton.frame = NSMakeRect(zoomOutButtonX+zoomButtonSize+space, zoomButtonY, zoomButtonSize, zoomButtonSize) let pagePageH: CGFloat = 24 let pagePageX: CGFloat = zoomInButton.frame.maxX + 30 pagePageComboBox.frame = NSMakeRect(pagePageX, (height-pagePageH) * 0.5, 160, pagePageH) let rightButtonH: CGFloat = 30 let rightButtonW: CGFloat = 60 let rightButtonY: CGFloat = (height-rightButtonH)*0.5 let rightMargin: CGFloat = 28 let cancelButtonX = width-rightMargin-rightButtonW cancelButton.frame = NSMakeRect(cancelButtonX, rightButtonY, rightButtonW, rightButtonH) mergeButton.frame = NSMakeRect(cancelButtonX-rightButtonW-12, rightButtonY, rightButtonW, rightButtonH) bottomLine.frame = NSMakeRect(0, height-1, width, 1) } /** * MARK: - User Action */ @objc func addItemAction() { guard let itemClickAction = itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.add) } @objc func deleteItemAction() { guard let itemClickAction = itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.delete) } @objc func zoomOutButtonAction() { guard let itemClickAction = itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.zoomOut) } @objc func zoomInButtonAction() { guard let itemClickAction = itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.zoomIn) } @objc func mergeButtonAction() { guard let itemClickAction = itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.merge) } @objc func cancelButtonAction() { guard let itemClickAction = itemClick else { return } itemClickAction(KMMergeTitleBarButtonID.cancel) } func setDeleteItemEnable(enable: Bool) { deleteItem.leftButton.isEnabled = enable deleteItem.rightButton.isEnabled = enable } func setZoomItemEnable(zoomIn: Bool, enable: Bool) { if zoomIn { zoomInButton.isEnabled = enable } else { zoomOutButton.isEnabled = enable } } func setPageRangeComboBoxHidden(isHidden: Bool) { pagePageComboBox.isHidden = isHidden } func setPagePageComboBoxString(string: String) { pagePageComboBox.stringValue = string } } extension KMMergeTitleBar: NSComboBoxDelegate { func comboBoxSelectionDidChange(_ notification: Notification) { if notification.object as! NSComboBox != pagePageComboBox { return } let box: NSComboBox = notification.object as! NSComboBox let index = box.indexOfSelectedItem if index < 0 { return } if index == 3 { pagePageComboBox.isEditable = true pagePageComboBox.stringValue = "如1,3-5,10" self.window?.makeFirstResponder(pagePageComboBox) } else { pagePageComboBox.isEditable = false guard let callback = pageRangeClick else { return } callback(index, "") } } func controlTextDidEndEditing(_ obj: Notification) { if obj.object as! NSComboBox != pagePageComboBox { return } let box: NSComboBox = obj.object as! NSComboBox pagePageComboBox.isEditable = false guard let callback = pageRangeClick else { return } callback(3, pagePageComboBox.stringValue) } }