KMDesignTextField.swift 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. //
  2. // KMDesignTextField.swift
  3. // PDF Reader Pro
  4. //
  5. // Created by tangchao on 2023/6/7.
  6. //
  7. // 输入框 组件
  8. class KMDesignTextField: KMDesignBaseView {
  9. private var textField: KMCustomTextField?
  10. var textF: KMCustomTextField? {
  11. get {
  12. return self.textField
  13. }
  14. }
  15. private var _designSize: KMDesignSize = .medium
  16. var designSize: KMDesignSize {
  17. get {
  18. return self._designSize
  19. }
  20. }
  21. var stringValue: String? {
  22. get {
  23. return self.textField?.stringValue
  24. }
  25. set {
  26. self.textField?.stringValue = newValue ?? ""
  27. }
  28. }
  29. override var kmEnabled: Bool {
  30. get {
  31. return super.kmEnabled
  32. }
  33. set {
  34. super.kmEnabled = newValue
  35. self.textField?.kmEnabled = newValue
  36. if (newValue) {
  37. // self.window?.makeFirstResponder(self.textField)
  38. } else {
  39. self.window?.makeFirstResponder(nil)
  40. }
  41. }
  42. }
  43. weak var delegate: KMTextFieldDelegate?
  44. var kFormatter: Formatter? {
  45. set {
  46. self.textField?.textFiled.formatter = newValue
  47. }
  48. get {
  49. return self.textField?.textFiled.formatter
  50. }
  51. }
  52. var enterKeyEndEdit: Bool {
  53. set {
  54. let textFiled = self.textField?.textFiled as? KMTextField
  55. textFiled?.enterKeyEndEdit = newValue
  56. }
  57. get {
  58. let textFiled = self.textField?.textFiled as? KMTextField
  59. return textFiled?.enterKeyEndEdit ?? false
  60. }
  61. }
  62. var useToken = true
  63. convenience init(designSize: KMDesignSize = .medium) {
  64. self.init()
  65. self._designSize = designSize
  66. }
  67. override func initSubViews() {
  68. super.initSubViews()
  69. let textFiled = KMCustomTextField()
  70. self.addSubview(textFiled)
  71. self.textField = textFiled
  72. self.textField?.delegate = self
  73. }
  74. override func initDefaultValue() {
  75. super.initDefaultValue()
  76. self.textField?.backgroundView.wantsLayer = true
  77. self.textField?.hoverAction = { [unowned self] sender, action in
  78. if (!self.canHover()) {
  79. return
  80. }
  81. if (action == .enter) {
  82. self.state = .Hov
  83. } else if (action == .exit) {
  84. self.state = .Norm
  85. }
  86. }
  87. self.state = .Norm
  88. }
  89. override func layout() {
  90. super.layout()
  91. let width: CGFloat = NSWidth(self.bounds)
  92. let heigth: CGFloat = NSHeight(self.bounds)
  93. let y: CGFloat = (heigth - self.height) * 0.5
  94. self.textField?.frame = NSMakeRect(0, y, width, self.height)
  95. }
  96. override func find_bgToken(state: KMDesignTokenState) -> KMDesignTokenKey {
  97. if (state == .Norm) {
  98. return self.designSize == .medium ? "input.m.bg.norm" : "input.s.bg.norm"
  99. } else if (state == .Hov) {
  100. return self.designSize == .medium ? "input.m.bg.hov" : "input.s.bg.hov"
  101. } else if (state == .Focus) {
  102. return self.designSize == .medium ? "input.m.bg.focus" : "input.s.bg.focus"
  103. } else if (state == .Disabled) {
  104. return self.designSize == .medium ? "input.m.bg.dis" : "input.s.bg.dis"
  105. } else if (state == .Error_def) {
  106. return self.designSize == .medium ? "input.m.bg.error-def" : "input.s.bg.error-def"
  107. } else if (state == .Error_focus) {
  108. return self.designSize == .medium ? "input.m.bg.error-focus" : "input.s.bg.error-focus"
  109. }
  110. return KMDesignTokenNone
  111. }
  112. override func updateUI(state: KMDesignTokenState) {
  113. if self.useToken {
  114. super.updateUI(state: state)
  115. }
  116. self.textField?.backgroundView.layer?.backgroundColor = self.fillColor.cgColor
  117. self.textField?.backgroundView.layer?.borderWidth = self.borderWidth
  118. if self.useToken {
  119. self.textField?.backgroundView.layer?.borderColor = self.borderColor.cgColor
  120. } else {
  121. if state == .Hov {
  122. let borderColor = NSColor(hex: "68ACF8")
  123. self.textField?.backgroundView.layer?.borderColor = borderColor.cgColor
  124. } else if state == .Focus {
  125. let borderColor = NSColor(hex: "68ACF8")
  126. self.textField?.backgroundView.layer?.borderColor = borderColor.cgColor
  127. } else {
  128. if KMAppearance.isDarkMode() {
  129. // let borderColor = KMAppearance.Interactive.s0Color()
  130. let borderColor = NSColor(hex: "56585A")
  131. self.textField?.backgroundView.layer?.borderColor = borderColor.cgColor
  132. } else {
  133. let borderColor = NSColor(hex: "DFE1E5")
  134. self.textField?.backgroundView.layer?.borderColor = borderColor.cgColor
  135. }
  136. }
  137. }
  138. self.textField?.backgroundView.layer?.cornerRadius = self.borderRadius
  139. }
  140. }
  141. extension KMDesignTextField: KMTextFieldDelegate {
  142. func km_didBecomeFirstResponder(textField: AnyObject) {
  143. if (textField.isEqual(to: self.textField)) {
  144. self.state = .Focus
  145. }
  146. self.delegate?.km_didBecomeFirstResponder(textField: self)
  147. }
  148. func km_controlTextShouldBeginEditing(textField: AnyObject) -> Bool {
  149. if let should = self.delegate?.km_controlTextShouldBeginEditing(textField: self) {
  150. return should
  151. }
  152. return true
  153. }
  154. func km_controlTextDidBeginEditing(textField: AnyObject) {
  155. self.delegate?.km_controlTextDidBeginEditing(textField: self)
  156. }
  157. func km_controlTextDidChange(textField: AnyObject) {
  158. self.delegate?.km_controlTextDidChange(textField: self)
  159. }
  160. func km_controlTextShouldEndEditing(textField: AnyObject) -> Bool {
  161. if let should = self.delegate?.km_controlTextShouldEndEditing(textField: self) {
  162. return should
  163. }
  164. return true
  165. }
  166. func km_controlTextDidEndEditing(textField: AnyObject) {
  167. if (textField.isEqual(to: self.textField)) {
  168. self.state = .Norm
  169. }
  170. self.delegate?.km_controlTextDidEndEditing(textField: self)
  171. }
  172. }