TSAIPhotoImageCell.swift 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. //
  2. // TSAIPhotoImageCell.swift
  3. // AIRingtone
  4. //
  5. // Created by 100Years on 2025/3/5.
  6. //
  7. class TSAIPhotoImageCell: TSBaseCollectionCell {
  8. var model:TSActionInfoModel?
  9. var style = TSColVVMStyple.posterHistory
  10. lazy var showImageView: UIImageView = {
  11. let showImageView = UIImageView.createImageView(imageName:"",contentMode: .scaleAspectFill)
  12. showImageView.backgroundColor = .gray
  13. return showImageView
  14. }()
  15. lazy var exampleView: UIView = {
  16. let exampleView = UIView()
  17. exampleView.backgroundColor = "#232323".uiColor.withAlphaComponent(0.3)
  18. let textLabel = UILabel.createLabel(
  19. text: "Example".localized,
  20. font: .font(size: 12),
  21. textColor: .white
  22. )
  23. exampleView.addSubview(textLabel)
  24. textLabel.snp.makeConstraints { make in
  25. make.top.edges.equalTo(UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 6))
  26. }
  27. exampleView.isHidden = true
  28. exampleView.cornerRadius = 10.0
  29. return exampleView
  30. }()
  31. lazy var generateView: TSImageGenerateView = {
  32. let generateView = TSImageGenerateView()
  33. generateView.isHidden = true
  34. generateView.refreshHandel = { [weak self] in
  35. guard let self = self else { return }
  36. guard let oldModel = model else { return }
  37. if style == .posterHistory {
  38. TSGeneratePosterOperationQueue.shared.creatOperation(uuid: oldModel.uuid).creatPoster(oldModel: oldModel, prompt: oldModel.request.prompt, promptSort: oldModel.request.promptSort)
  39. }else if style == .photoHistory {
  40. TSGeneratePhotoOperationQueue.shared.creatOperation(uuid: oldModel.uuid).creatPhoto(oldModel: oldModel, prompt: oldModel.request.prompt, promptSort: oldModel.request.promptSort)
  41. }
  42. }
  43. return generateView
  44. }()
  45. override func creatUI() {
  46. contentView.clipsToBounds = true
  47. contentView.addSubview(showImageView)
  48. showImageView.snp.makeConstraints { make in
  49. make.top.equalTo(0)
  50. make.leading.equalTo(0)
  51. make.trailing.bottom.equalTo(0)
  52. }
  53. if self.bounds.size.width == self.bounds.size.height {
  54. contentView.layer.cornerRadius = self.bounds.size.width/2
  55. }else{
  56. contentView.layer.cornerRadius = 16
  57. }
  58. contentView.addSubview(exampleView)
  59. exampleView.snp.makeConstraints { make in
  60. make.bottom.equalTo(-8)
  61. make.centerX.equalToSuperview()
  62. make.height.equalTo(20)
  63. }
  64. contentView.addSubview(generateView)
  65. generateView.snp.makeConstraints { make in
  66. make.edges.equalToSuperview()
  67. }
  68. }
  69. override func renderView(with object: Any?, component: TSCollectionViewComponent, attributes: [String : Any]?) {
  70. super.renderView(with: object, component: component, attributes: attributes)
  71. if let itemModel = object as? TSColVVMItemModel{
  72. if let model = itemModel.dataModel as? TSActionInfoModel{
  73. self.model = model
  74. style = itemModel.style
  75. generateView.style = style
  76. if itemModel.style == .posterHistory {
  77. if let rintoneOperation = TSGeneratePosterOperationQueue.shared.findOperation(uuid: model.uuid) as? TSGeneratePosterOperation {
  78. DispatchQueue.main.async {
  79. rintoneOperation.currentActionInfoModelChanged = { [weak self] actionInfoModel in
  80. guard let self = self else { return }
  81. DispatchQueue.main.async {
  82. self.updataActionInfoModelView(model: actionInfoModel)
  83. }
  84. }
  85. }
  86. }
  87. }else if itemModel.style == .photoHistory {
  88. if let rintoneOperation = TSGeneratePhotoOperationQueue.shared.findOperation(uuid: model.uuid) as? TSGeneratePhotoOperation {
  89. DispatchQueue.main.async {
  90. rintoneOperation.currentActionInfoModelChanged = { [weak self] actionInfoModel in
  91. guard let self = self else { return }
  92. DispatchQueue.main.async {
  93. self.updataActionInfoModelView(model: actionInfoModel)
  94. }
  95. }
  96. }
  97. }
  98. }
  99. updataActionInfoModelView(model: model)
  100. }
  101. }
  102. }
  103. func updataActionInfoModelView(model:TSActionInfoModel){
  104. if model.modelType == .example {
  105. model.actionStatus = .success
  106. }
  107. dePrint("updataActionInfoModelView model.actionStatus 收到 = \(model.actionStatus)")
  108. switch model.actionStatus {
  109. case .pending,.running:
  110. generateView.isHidden = false
  111. generateView.setProgress(progress: model.percent)
  112. case .success:
  113. generateView.isHidden = true
  114. showImageView.setAsyncImage(urlString: model.response.resultUrl,placeholder: kPlaceholderImage,contentMode: .scaleAspectFill)
  115. exampleView.isHidden = model.modelType == .example ? false : true
  116. case .failed:
  117. generateView.isHidden = false
  118. generateView.setFail()
  119. }
  120. }
  121. }
  122. class TSImageGenerateView:TSBaseView {
  123. var refreshHandel:(()->Void)?
  124. var style = TSColVVMStyple.posterHistory
  125. lazy var infoLabel: UILabel = {
  126. let infoLabel = UILabel.createLabel(font: .font(size: 12),textColor: .white,textAlignment: .center,numberOfLines: 0)
  127. return infoLabel
  128. }()
  129. lazy var refreshBtn: TSUIExpandedTouchButton = {
  130. let refreshBtn = TSUIExpandedTouchButton()
  131. refreshBtn.setUpButton(image: UIImage(named: "refresh_white")){[weak self] in
  132. guard let self = self else { return }
  133. refreshHandel?()
  134. }
  135. refreshBtn.isHidden = true
  136. return refreshBtn
  137. }()
  138. override func creatUI() {
  139. backgroundColor = .cardColor
  140. let bgImageView = UIImageView.createImageView(imageName: "ringPhotoBg",contentMode: .scaleAspectFill)
  141. contentView.addSubview(bgImageView)
  142. bgImageView.snp.makeConstraints { make in
  143. make.edges.equalToSuperview()
  144. }
  145. contentView.addSubview(infoLabel)
  146. infoLabel.snp.makeConstraints { make in
  147. make.centerY.equalToSuperview()//.offset(10)
  148. make.leading.equalTo(8)
  149. make.trailing.equalTo(-8)
  150. }
  151. contentView.addSubview(refreshBtn)
  152. refreshBtn.snp.makeConstraints { make in
  153. make.centerX.equalToSuperview()
  154. make.top.equalTo(infoLabel.snp.bottom).offset(8)
  155. make.width.height.equalTo(20.0)
  156. }
  157. }
  158. func setProgress(progress:Float) {
  159. refreshBtn.isHidden = true
  160. let progressInt = Int(progress*100)
  161. if style == .posterHistory {
  162. infoLabel.text = "Working on your contact poster\(progressInt)%..."
  163. }else if style == .photoHistory {
  164. infoLabel.text = "Working on your contact photo\(progressInt)%..."
  165. }
  166. infoLabel.textColor = "#E961F6".uiColor
  167. // infoLabel.applyGradient(colors: ["#E961F6".uiColor,"#7E57F4".uiColor])
  168. }
  169. func setFail(){
  170. setProgress(progress: 0.0)
  171. infoLabel.text = "Generation Failed".localized
  172. infoLabel.textColor = .white
  173. refreshBtn.isHidden = false
  174. }
  175. }