123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369 |
- //
- // ComponentSelect.swift
- // KMComponentLibrary
- //
- // Created by Niehaoyu on 2024/9/3.
- //
- import Cocoa
- import AppKit
- @objc public protocol ComponentSelectDelegate: AnyObject {
-
- @objc optional func componentSelectDidSelect(view: ComponentSelect?, menuItemProperty: ComponentMenuitemProperty?)
- }
- public class ComponentSelect: ComponentBaseXibView {
- @IBOutlet var contendBox: NSBox!
- @IBOutlet var leftIconImage: NSImageView!
- @IBOutlet var rightIconImage: NSImageView!
- @IBOutlet var inputField: ComponentTextField!
- @IBOutlet var errorTipLabel: NSTextField!
-
- @IBOutlet var contendBoxBottomConst: NSLayoutConstraint!
- @IBOutlet var leftIconWidthConst: NSLayoutConstraint!
- @IBOutlet var fieldLeftConst: NSLayoutConstraint!
-
- // MARK: Private Property
- private var _properties : ComponentSelectProperties = ComponentSelectProperties()
-
- private var isGroupViewShow: Bool = false
-
- private var groupView: ComponentGroup!
-
- private var menuitemPropertys: [ComponentMenuitemProperty] = []
- private var selItemProperty: ComponentMenuitemProperty? = ComponentMenuitemProperty()
-
- weak open var delegate: ComponentSelectDelegate?
- // MARK: 初始化
- deinit {
- NotificationCenter.default.removeObserver(self)
-
- }
-
- public required init?(coder decoder: NSCoder) {
- super.init(coder: decoder)
-
- }
-
- override init(frame frameRect: NSRect) {
- super.init(frame: frameRect)
- }
-
- public override func awakeFromNib() {
- super.awakeFromNib()
-
- self.inputField.componentDelegate = self
- self.inputField.focusRingType = .none
-
- NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidBeginEditingNotification(_:)), name: NSControl.textDidBeginEditingNotification, object: inputField)
- NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChangeNotification(_:)), name: NSControl.textDidChangeNotification, object: inputField)
- NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidEndEditingNotification(_:)), name: NSControl.textDidEndEditingNotification, object: inputField)
-
-
- }
-
- //Setter
- public var properties : ComponentSelectProperties {
- get {
- return _properties
- }
- set {
- _properties = newValue
-
- ComponentLibrary.shared.configSelectComponent(properties: _properties)
-
- self.reloadData()
-
- self.window?.makeFirstResponder(nil)
-
- }
- }
-
- //MARK: - Public
- public func reloadData() {
-
- self.setupUI()
-
- self.refreshUI()
- }
-
- public func updateMenuItemsArr(_ propertys: [ComponentMenuitemProperty]) {
- self.menuitemPropertys = propertys
-
- }
-
- public func selectItemAtIndex(_ index: Int) {
- if index >= 0 && index < menuitemPropertys.count {
- let chooseIndex: Int = index
- let chooseProperty = menuitemPropertys[chooseIndex]
- self.inputField.stringValue = chooseProperty.text
- self.properties.state = .normal
- self.refreshUI()
- self.selItemProperty = chooseProperty
- }
- }
-
- public func indexOfSelect() -> NSInteger {
- if let selProperty = selItemProperty {
- if let index = menuitemPropertys.firstIndex(of: selProperty) {
- return index
- }
- }
- return -1
- }
-
- //MARK: - SetupUI
- func setupUI() {
- if self.properties.showLeftIcon == true {
- self.leftIconImage.isHidden = false
- self.leftIconWidthConst.constant = self.properties.propertyInfo.leftIconWidth ?? 16
-
- self.fieldLeftConst.constant = self.leftIconWidthConst.constant + 12
- } else {
- self.leftIconImage.isHidden = true
- self.fieldLeftConst.constant = 8
- }
-
- if self.properties.isError == true {
- self.contendBoxBottomConst.constant = 18
- self.errorTipLabel.isHidden = false
- } else {
- self.contendBoxBottomConst.constant = 0
- self.errorTipLabel.isHidden = true
- }
-
- if self.properties.isDisabled == false {
- self.inputField.isEditable = true
- if self.properties.creatable == false {
- self.inputField.isEditable = false
- }
- } else {
- self.inputField.isEditable = false
- }
- self.inputField.font = self.properties.propertyInfo.textFont
- self.inputField.stringValue = properties.text ?? ""
-
- if let chooseProperty = self.selItemProperty {
- self.inputField.stringValue = chooseProperty.text
- }
-
- }
-
- func refreshUI() {
-
- self.contendBox.cornerRadius = self.properties.propertyInfo.cornerRadius
- self.contendBox.borderWidth = self.properties.propertyInfo.borderWidth
-
- var fillColor: NSColor?
- var borderColor: NSColor?
- if self.properties.state == .normal {
- fillColor = self.properties.propertyInfo.color_nor
- borderColor = self.properties.propertyInfo.borderColor_nor
-
- } else if self.properties.state == .hover {
- fillColor = self.properties.propertyInfo.color_hov
- if self.properties.isError == true {
- fillColor = self.properties.propertyInfo.color_error_hov
- }
- borderColor = self.properties.propertyInfo.borderColor_hov
-
- } else if self.properties.state == .pressed {
- fillColor = self.properties.propertyInfo.color_active
- borderColor = self.properties.propertyInfo.borderColor_active
-
- }
-
- var textColor: NSColor = properties.propertyInfo.textColor
- if self.properties.isDisabled == true {
- fillColor = self.properties.propertyInfo.color_dis
- borderColor = self.properties.propertyInfo.borderColor_dis
- textColor = properties.propertyInfo.textColor_dis
- }
-
- if self.properties.isError == true {
- borderColor = self.properties.propertyInfo.borderColor_error
- }
-
- if let color = fillColor {
- self.contendBox.fillColor = color
- }
-
- if let color = borderColor {
- self.contendBox.borderColor = color
- }
-
- if let placeholder = properties.placeholder {
- self.inputField.placeholderString = placeholder
- }
- self.inputField.textColor = textColor
-
- self.rightIconImage.image = ComponentLibrary.shared.image(forResource: "suffix")
- if properties.isDisabled {
- rightIconImage.image = ComponentLibrary.shared.image(forResource: "suffix_dis")
- }
-
- self.errorTipLabel.textColor = self.properties.propertyInfo.errorTipTextColor
-
- self.errorTipLabel.font = self.properties.propertyInfo.errorTipTextFont
- if let errorText = properties.errorText {
- self.errorTipLabel.stringValue = errorText
- }
-
- }
-
- func showGroupView() {
- if (groupView?.superview) != nil {
- return
- }
-
- var viewHeight: CGFloat = 8.0
- for item in self.menuitemPropertys {
- item.state = .normal
- item.itemSelected = false
- if item == selItemProperty {
- item.itemSelected = true
- }
- if item.type == .normal {
- viewHeight += 36
- } else if item.type == .divider {
- viewHeight += 8
- }
- }
-
- if groupView == nil {
- groupView = ComponentGroup.createFromNib(in: ComponentLibrary.shared.componentBundle())
- }
- groupView?.frame = CGRectMake(310, 0, 260, viewHeight)
- groupView?.reloadData()
- groupView.groupDelegate = self
- groupView?.showWithPoint(self.frame.origin, inView: self)
- groupView?.updateGroupInfo(menuitemPropertys)
- self.isGroupViewShow = true
- }
-
- func hideGroupView() {
- self.groupView?.removeGroupView()
-
- self.isGroupViewShow = false
- }
-
- //MARK: - TextNotification
- @objc func textFieldDidBeginEditingNotification(_ notification: Notification) {
-
- }
-
- @objc func textFieldDidChangeNotification(_ notification: Notification) {
- self.selItemProperty = nil
-
- }
-
- @objc func textFieldDidEndEditingNotification(_ notification: Notification) {
-
- }
-
- //MARK: - MouseEvent
- public override func mouseEntered(with event: NSEvent) {
- super.mouseEntered(with: event)
-
- if self.properties.isDisabled == false &&
- self.inputField.isResponder == false &&
- self.isGroupViewShow == false {
- self.properties.state = .hover
- }
- self.refreshUI()
- }
-
- public override func mouseMoved(with event: NSEvent) {
- super.mouseMoved(with: event)
-
- }
-
- public override func mouseExited(with event: NSEvent) {
- super.mouseExited(with: event)
-
- if self.properties.isDisabled == false &&
- self.inputField.isResponder == false &&
- self.isGroupViewShow == false {
- self.properties.state = .normal
- }
-
- self.refreshUI()
- }
-
- public override func mouseDown(with event: NSEvent) {
- super.mouseDown(with: event)
-
- }
-
- public override func mouseUp(with event: NSEvent) {
- super.mouseUp(with: event)
-
- if self.properties.isDisabled == false {
- let point = convert(event.locationInWindow, from: nil)
- if CGRectContainsPoint(self.rightIconImage.frame, point) {
- self.properties.state = .pressed
-
- self.showGroupView()
-
- }
-
- }
-
- if self.properties.isDisabled == false &&
- self.inputField.isResponder == false &&
- self.isGroupViewShow == false {
- self.properties.state = .normal
-
- }
- self.refreshUI()
- }
- }
- extension ComponentSelect: ComponentTextFieldDelegate {
-
- func componentTextFieldDidResponderChanged(textField: NSTextField) {
- if self.properties.isDisabled == false {
- if self.inputField.isResponder {
- self.properties.state = .pressed
-
- self.showGroupView()
- } else {
- self.properties.state = .normal
- }
- }
- self.refreshUI()
-
-
- }
- }
- extension ComponentSelect: ComponentGroupDelegate {
- public func componentGroupDidDismiss(group: ComponentGroup?) {
- self.properties.state = .normal
- self.isGroupViewShow = false
-
- self.window?.makeFirstResponder(nil)
-
- self.refreshUI()
- }
-
- public func componentGroupDidSelect(group: ComponentGroup?, menuItemProperty: ComponentMenuitemProperty?) {
- self.inputField.stringValue = menuItemProperty?.text ?? ""
-
- self.properties.state = .normal
-
- self.refreshUI()
-
- self.selItemProperty = menuItemProperty
-
- self.delegate?.componentSelectDidSelect?(view: self, menuItemProperty: menuItemProperty)
-
- self.window?.makeFirstResponder(nil)
- }
- }
|