// // KMPDFSecToolbarController.swift // PDF Reader Pro // // Created by Niehaoyu on 2024/10/8. // import Cocoa import KMComponentLibrary @objc protocol KMPDFSecToolbarControllerDelegate: AnyObject { @objc optional func kmPDFSecToolbarControllerDidItemClicked(_ controller: KMPDFSecToolbarController, _ property: Any) } class KMPDFSecToolbarController: NSViewController { @IBOutlet var contendBox: NSBox! @IBOutlet var infoContendView: NSView! @IBOutlet var rightContendView: NSView! @IBOutlet var moreToolsBGView: NSView! @IBOutlet var moreToolsView: ComponentDropdownTool! @IBOutlet var contendLeftConst: NSLayoutConstraint! @IBOutlet var contendViewWidthConst: NSLayoutConstraint! @IBOutlet var rightContendViewWidthConst: NSLayoutConstraint! private var propertys: [Any] = [] private var propertysWidthValue: CGFloat = 0 private var lastPropertyWidth: CGFloat = 0 private var hidePropertys: [Any] = [] private var rightPropertys: [Any] = [] weak open var delegate: KMPDFSecToolbarControllerDelegate? override func viewWillLayout() { super.viewWillLayout() let contendXValue = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2 contendLeftConst.constant = max(0, contendXValue) if contendXValue <= 0 { contendViewWidthConst.constant = CGRectGetWidth(view.frame) } else { contendViewWidthConst.constant = propertysWidthValue } hidePropertys.removeAll() moreToolsBGView.isHidden = true let subviews = infoContendView.subviews for view in subviews { if CGRectGetMidX(view.frame) > CGRectGetWidth(self.view.frame) - lastPropertyWidth { moreToolsBGView.isHidden = false view.isHidden = true if view is ComponentButton { hidePropertys.append((view as! ComponentButton).properties) } else if view is ComponentDropdownTool { hidePropertys.append((view as! ComponentDropdownTool).properties) } } else { view.isHidden = false } } NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(setUpHidePropertys), object: nil) self.perform(#selector(setUpHidePropertys), with: nil, afterDelay: 0.35) } override func viewDidLoad() { super.viewDidLoad() // Do view setup here. setUpProperty() } func setUpProperty() { contendBox.fillColor = ComponentLibrary.shared.getComponentColorFromKey("colorBg/layout-middle") moreToolsBGView.wantsLayer = true moreToolsBGView.layer?.backgroundColor = contendBox.fillColor.cgColor moreToolsBGView.isHidden = true moreToolsView.properties = ComponentDropdownToolProperty(state: .normal, leftIcon: NSImage(named: "toolbar_doubleArrow_right")) moreToolsView.delegate = self } @objc func setUpHidePropertys() { var menuItemArr: [ComponentMenuitemProperty] = [] for item in hidePropertys { if item is ComponentButtonProperty { let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentButtonProperty).buttonText ?? "", identifier: (item as! ComponentButtonProperty).identifier) menuItemArr.append(menuItem) } else if item is ComponentDropdownToolProperty { let menuItem = ComponentMenuitemProperty(type: .normal, text: (item as! ComponentDropdownToolProperty).text ?? "testtest", identifier: "") if let subItems = (item as! ComponentDropdownToolProperty).menuItemArr { menuItem.subPropertys = subItems } menuItemArr.append(menuItem) } } moreToolsView.properties.menuItemArr = menuItemArr } //MARK: - reload public func reloadMainPropertys(_ arr: [Any]) { propertys.removeAll() for item in arr { propertys.append(item) } reloadMainView() } public func reloadRightPropertys(_ arr: [Any]) { rightPropertys.removeAll() for item in arr { rightPropertys.append(item) } reloadRightView() } func reloadMainView() { let subviews = infoContendView.subviews for view in subviews { view.removeFromSuperview() } var itemXvalue: CGFloat = 0 for property in propertys { if property is ComponentButtonProperty { let buttonProperty = (property as! ComponentButtonProperty) let button = ComponentButton.init() button.properties = buttonProperty if buttonProperty.onlyIcon { button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 28, 28) } else { button.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, button.properties.propertyInfo.viewWidth, 28) } button.setTarget(self, action: #selector(buttonClicked(_:))) infoContendView.addSubview(button) itemXvalue += CGRectGetWidth(button.frame) itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(button.frame) } else if property is ComponentDividerProperty { let divider = ComponentDivider.init() divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16) divider.properties = (property as! ComponentDividerProperty) infoContendView.addSubview(divider) itemXvalue += 1 itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(divider.frame) } else if property is ComponentDropdownToolProperty { let dropdownTool = ComponentDropdownTool.init() dropdownTool.properties = property as! ComponentDropdownToolProperty dropdownTool.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, dropdownTool.properties.propertyInfo.viewWidth, 28) dropdownTool.delegate = self infoContendView.addSubview(dropdownTool) itemXvalue += CGRectGetWidth(dropdownTool.frame) itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(dropdownTool.frame) } else if property is ComponentSelectProperties { let selectView = ComponentSelect.init() selectView.properties = property as! ComponentSelectProperties selectView.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-14, 144, 28) if let items = selectView.properties.menuItemArr { selectView.updateMenuItemsArr(items) } selectView.delegate = self infoContendView.addSubview(selectView) itemXvalue += CGRectGetWidth(selectView.frame) itemXvalue += 12 lastPropertyWidth = CGRectGetWidth(selectView.frame) } } itemXvalue -= 12 propertysWidthValue = itemXvalue contendViewWidthConst.constant = propertysWidthValue contendLeftConst.constant = CGRectGetWidth(view.frame)/2 - propertysWidthValue/2 } func reloadRightView() { let subviews = rightContendView.subviews for view in subviews { view.removeFromSuperview() } var itemXvalue: CGFloat = 0 for property in rightPropertys { if property is ComponentButtonProperty { let buttonProperty = (property as! ComponentButtonProperty) let button = ComponentButton.init() button.properties = buttonProperty if buttonProperty.onlyIcon { button.frame = CGRectMake(itemXvalue, 0, 28, 28) } else { button.frame = CGRectMake(itemXvalue, 0, button.properties.propertyInfo.viewWidth, 28) } button.setTarget(self, action: #selector(buttonClicked(_:))) rightContendView.addSubview(button) itemXvalue += CGRectGetWidth(button.frame) itemXvalue += 12 } else if property is ComponentDividerProperty { let divider = ComponentDivider.init() divider.frame = CGRectMake(itemXvalue, CGRectGetHeight(infoContendView.frame)/2-8, 1, 16) divider.properties = (property as! ComponentDividerProperty) rightContendView.addSubview(divider) itemXvalue += 1 itemXvalue += 12 } } itemXvalue -= 12 rightContendViewWidthConst.constant = itemXvalue } func refreshMainview() { let subviews = infoContendView.subviews for view in subviews { if view is ComponentButton { (view as! ComponentButton).reloadData() } else if view is ComponentDropdownTool { (view as! ComponentDropdownTool).reloadData() } else if view is ComponentSelect { (view as! ComponentSelect).reloadData() } } } func refreshRightview() { let subviews = rightContendView.subviews for view in subviews { if view is ComponentButton { (view as! ComponentButton).reloadData() } } } //MARK: - @objc func buttonClicked(_ sender: ComponentButton) { delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, sender.properties) } //MARK: - Mouse override func mouseDown(with event: NSEvent) { super.mouseDown(with: event) view.window?.makeFirstResponder(self) } } //MARK: - ComponentDropdownToolDelegate extension KMPDFSecToolbarController: ComponentDropdownToolDelegate { func componentDropdownToolDidClicked(_ view: ComponentDropdownTool, menuItem: ComponentMenuitemProperty?) { if let property = menuItem { property.itemSelected = false property.state = .normal delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property) } } } //MARK: - ComponentSelectDelegate extension KMPDFSecToolbarController: ComponentSelectDelegate { func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?) { if let property = menuItemProperty { property.itemSelected = false property.state = .normal delegate?.kmPDFSecToolbarControllerDidItemClicked?(self, property) } } }