LNSkillFieldSelectionEditView.swift 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. //
  2. // LNSkillFieldSelectionEditView.swift
  3. // Gami
  4. //
  5. // Created by OneeChan on 2026/1/20.
  6. //
  7. import Foundation
  8. import UIKit
  9. import SnapKit
  10. class LNSkillFieldSelectionEditView: LNSkillFieldBaseEditView {
  11. private let curValueLabel = UILabel()
  12. override init(frame: CGRect) {
  13. super.init(frame: frame)
  14. setupViews()
  15. }
  16. override func update(_ field: LNSkillEditField) {
  17. super.update(field)
  18. if case .singleSelection = field.type,
  19. let text = field.value as? String {
  20. curValueLabel.text = field.constants.first(where: { $0.key == text })?.value
  21. } else if case .multiSelection = field.type,
  22. let texts = field.value as? [String] {
  23. let values: [String] = field.constants.compactMap {
  24. if texts.contains($0.key) {
  25. $0.value
  26. } else {
  27. nil
  28. }
  29. }
  30. curValueLabel.text = values.joined(separator: ",")
  31. }
  32. if curValueLabel.text?.isEmpty != false {
  33. curValueLabel.attributedText = .init(string: .init(key: "B00094"), attributes: [
  34. .font: UIFont.body_m,
  35. .foregroundColor: UIColor.text_3
  36. ])
  37. }
  38. }
  39. required init(coder: NSCoder) {
  40. fatalError("init(coder:) has not been implemented")
  41. }
  42. }
  43. extension LNSkillFieldSelectionEditView {
  44. private func setupViews() {
  45. container.backgroundColor = .fill_2
  46. container.layer.cornerRadius = 19
  47. container.onTap { [weak self] in
  48. guard let self else { return }
  49. guard let field else { return }
  50. guard !field.constants.isEmpty else {
  51. showToast(.init(key: "B00098"))
  52. return
  53. }
  54. switch field.type {
  55. // case .date:
  56. // let panel = LNDatePickerPanel()
  57. // if let numLimit = field.validate.numLimit {
  58. // panel.datePicker.minimumDate = Date(timeIntervalSince1970: Double(numLimit.min / 1_000))
  59. // panel.datePicker.maximumDate = Date(timeIntervalSince1970: Double(numLimit.max / 1_000))
  60. // }
  61. // panel.handler = { [weak self] date in
  62. // guard let self else { return }
  63. // curValueLabel.text = date.formattedFullDate("-")
  64. // field.value.value = date.formattedFullDate("-", normal: true)
  65. // }
  66. // panel.popup()
  67. case .singleSelection:
  68. let panel = LNSingleSelectionPanel()
  69. panel.setTitles(field.fieldName, desc: field.fieldDesc)
  70. let curSelect: String? = if let cur = field.value as? String {
  71. field.constants.first(where: { $0.key == cur })?.value
  72. } else {
  73. nil
  74. }
  75. panel.update(field.constants.map({ $0.value }), curSelect: curSelect)
  76. panel.handler = { [weak self] index in
  77. guard let self else { return }
  78. curValueLabel.attributedText = nil
  79. curValueLabel.text = field.constants[index].value
  80. field.value = field.constants[index].key
  81. needReview = field.fieldCode != LNSkillEditStaticFieldCode.fieldUnit.rawValue
  82. delegate?.onSkillFieldBaseEditViewInputChanged(view: self)
  83. }
  84. panel.popup()
  85. case .multiSelection:
  86. let panel = LNMultiSelectionPanel()
  87. panel.setTitles(field.fieldName, desc: field.fieldDesc)
  88. let curSelect: [String] = if let cur = field.value as? [String] {
  89. field.constants.filter({
  90. cur.contains($0.key)
  91. }).map({ $0.value })
  92. } else {
  93. []
  94. }
  95. panel.update(field.constants.map({ $0.value }), curSelected: curSelect)
  96. if let size = field.validate.size {
  97. panel.setLimie(min: size.min, max: size.max)
  98. }
  99. panel.handler = { [weak self] indexs in
  100. guard let self else { return }
  101. var texts: [String] = []
  102. var keys: [String] = []
  103. for index in indexs {
  104. texts.append(field.constants[index].value)
  105. keys.append(field.constants[index].key)
  106. }
  107. curValueLabel.attributedText = nil
  108. curValueLabel.text = texts.joined(separator: ",")
  109. field.value = keys
  110. needReview = true
  111. delegate?.onSkillFieldBaseEditViewInputChanged(view: self)
  112. }
  113. panel.popup()
  114. default: break
  115. }
  116. }
  117. container.snp.makeConstraints { make in
  118. make.height.equalTo(38)
  119. }
  120. let arrow = UIImageView.arrowImageView(size: 15)
  121. arrow.tintColor = .text_3
  122. container.addSubview(arrow)
  123. arrow.snp.makeConstraints { make in
  124. make.centerY.equalToSuperview()
  125. make.trailing.equalToSuperview().offset(-16)
  126. }
  127. curValueLabel.font = .heading_h4
  128. curValueLabel.textColor = .text_5
  129. container.addSubview(curValueLabel)
  130. curValueLabel.snp.makeConstraints { make in
  131. make.leading.equalToSuperview().offset(16)
  132. make.centerY.equalToSuperview()
  133. }
  134. }
  135. }