TSAIListHistoryCell.swift 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. //
  2. // TSAIListHistoryCell.swift
  3. // TSLiveWallpaper
  4. //
  5. // Created by 100Years on 2025/6/10.
  6. //
  7. import RealmSwift
  8. class TSAIListHistoryCell: TSBaseCollectionCell {
  9. var buttonTapped:((String)->Void)?
  10. var operation:TSGenerateBasePhotoOperation?
  11. var dataModel:TSActionInfoModel = TSActionInfoModel(){
  12. didSet {
  13. self.updataActionInfoModelView(model: dataModel)
  14. if let operation = TSGenerateBasePhotoOperationQueue.shared.findOperation(uuid: dataModel.uuid) as? TSGenerateBasePhotoOperation {
  15. DispatchQueue.main.async {
  16. operation.currentActionInfoModelChanged = { [weak self] actionInfoModel in
  17. guard let self = self else { return }
  18. DispatchQueue.main.async {
  19. // print("actionInfoModel.toJSONString()=\(actionInfoModel.toJSONString())")
  20. self.updataActionInfoModelView(model: actionInfoModel)
  21. }
  22. }
  23. self.operation = operation
  24. }
  25. }else{
  26. self.operation?.currentActionInfoModelChanged = nil
  27. self.operation = nil
  28. }
  29. }
  30. }
  31. lazy var videoPlayerVC: TSAIListVideoPlayerVC = TSAIListVideoPlayerVC(videoURL: URL(string: "www.baidu.com")!)
  32. lazy var generateView: TSGennerateCellView = {
  33. let generateView = TSGennerateCellView()
  34. generateView.isHidden = true
  35. generateView.refreshHandel = { [weak self] in
  36. guard let self = self else { return }
  37. if dataModel.upImageURLExpired { //任务已经过期了
  38. buttonTapped?("delete_task_expired")
  39. }else if dataModel.response.sensitiveError { //敏感内容
  40. buttonTapped?("delete_task_sensitive")
  41. }else{
  42. // if kJudgeVipFreeType(vipFreeNumType: .picToPic){ return }
  43. if kShowGenerateBusyView(view: WindowHelper.getCurrentWindow()!) { return }
  44. let generatePTPOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: dataModel.uuid)
  45. generatePTPOperation.isSaveProcessToDB = true
  46. generatePTPOperation.creatImage(oldModel: dataModel){ complete in }
  47. generateView.setProgress(progress: 0)
  48. }
  49. }
  50. generateView.longPressHandel = { [weak self] in
  51. guard let self = self else { return }
  52. buttonTapped?("delete")
  53. }
  54. return generateView
  55. }()
  56. lazy var textLabel: UILabel = {
  57. let textLabel = UILabel.createLabel(
  58. text: "Example".localized,
  59. font: .font(size: 12),
  60. textColor: .white
  61. )
  62. return textLabel
  63. }()
  64. lazy var exampleView: UIView = {
  65. let exampleView = UIView()
  66. exampleView.backgroundColor = "#232323".uiColor.withAlphaComponent(0.3)
  67. exampleView.addSubview(textLabel)
  68. textLabel.snp.makeConstraints { make in
  69. make.top.edges.equalTo(UIEdgeInsets(top: 4, left: 6, bottom: 4, right: 6))
  70. }
  71. exampleView.isHidden = true
  72. return exampleView
  73. }()
  74. lazy var showImageView: UIImageView = {
  75. let showImageView = UIImageView.createImageView(imageName:"",contentMode: .scaleAspectFill)
  76. showImageView.backgroundColor = .gray
  77. return showImageView
  78. }()
  79. lazy var hiddenImageView: UIImageView = {
  80. let hiddenImageView = UIImageView.createImageView(imageName:"",contentMode: .scaleAspectFill)
  81. hiddenImageView.backgroundColor = .gray
  82. hiddenImageView.isHidden = true
  83. return hiddenImageView
  84. }()
  85. lazy var videoIconImageView: UIImageView = {
  86. let videoIconImageView = UIImageView.createImageView(image:.videoIcon,contentMode: .scaleToFill,autoMirrored:false)
  87. videoIconImageView.isHidden = true
  88. return videoIconImageView
  89. }()
  90. lazy var blurEffect: UIVisualEffectView = {
  91. let blurEffect = createBlurEffectView(style: .dark)
  92. blurEffect.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(clickUnlockVip)))
  93. let bgView = UIView()
  94. blurEffect.contentView.addSubview(bgView)
  95. bgView.snp.makeConstraints { make in
  96. make.center.equalToSuperview()
  97. }
  98. let vipImageView = UIImageView.createImageView(image: .vipColorIcon)
  99. bgView.addSubview(vipImageView)
  100. let textLabel = UILabel.createLabel(text: "Unlock Result".localized,font: .font(size: 12),textColor: .themeColor)
  101. bgView.addSubview(textLabel)
  102. vipImageView.snp.makeConstraints { make in
  103. make.leading.top.bottom.equalToSuperview()
  104. make.height.width.equalTo(20)
  105. }
  106. textLabel.snp.makeConstraints { make in
  107. make.centerY.equalToSuperview()
  108. make.trailing.equalToSuperview()
  109. make.leading.equalTo(vipImageView.snp.trailing).offset(6)
  110. }
  111. return blurEffect
  112. }()
  113. @objc func clickUnlockVip(_ gestureRecognizer: UILongPressGestureRecognizer) {
  114. buttonTapped?("unlockVip")
  115. }
  116. @objc func handleLongPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
  117. // 确保只在手势开始时触发一次
  118. guard gestureRecognizer.state == .began else { return }
  119. buttonTapped?("delete")
  120. }
  121. override func creatUI() {
  122. let longPressRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
  123. longPressRecognizer.minimumPressDuration = 0.5 // 设置最小长按时间(秒)
  124. contentView.addGestureRecognizer(longPressRecognizer)
  125. contentView.layer.borderWidth = 3
  126. contentView.layer.borderColor = "#DFD7C0".uiCGColor
  127. contentView.addSubview(hiddenImageView)
  128. hiddenImageView.snp.makeConstraints { make in
  129. make.top.equalTo(0)
  130. make.leading.equalTo(0)
  131. make.trailing.bottom.equalTo(0)
  132. }
  133. contentView.addSubview(showImageView)
  134. showImageView.snp.makeConstraints { make in
  135. make.top.equalTo(0)
  136. make.leading.equalTo(0)
  137. make.trailing.bottom.equalTo(0)
  138. }
  139. contentView.addSubview(exampleView)
  140. exampleView.snp.makeConstraints { make in
  141. make.top.equalTo(8)
  142. make.leading.equalTo(8)
  143. make.height.equalTo(20)
  144. }
  145. contentView.addSubview(blurEffect)
  146. blurEffect.snp.makeConstraints { make in
  147. make.edges.equalToSuperview()
  148. }
  149. contentView.addSubview(videoIconImageView)
  150. videoIconImageView.snp.makeConstraints { make in
  151. make.top.equalTo(8)
  152. make.leading.equalTo(8)
  153. make.width.height.equalTo(20)
  154. }
  155. contentView.addSubview(generateView)
  156. generateView.snp.makeConstraints { make in
  157. make.edges.equalToSuperview()
  158. }
  159. }
  160. }
  161. extension TSAIListHistoryCell {
  162. func updataActionInfoModelView(model:TSActionInfoModel){
  163. if model.modelType == .example {
  164. model.actionStatus = .success
  165. }
  166. showImageView.image = nil
  167. //dePrint("updataActionInfoModelView model.actionStatus 收到 = \(model.actionStatus)")
  168. switch model.actionStatus {
  169. case .pending,.running:
  170. generateView.isHidden = false
  171. generateView.setProgress(progress: model.percent)
  172. case .success:
  173. generateView.isHidden = true
  174. videoIconImageView.isHidden = true
  175. if model.modelType == .example {
  176. textLabel.text = "Example".localized
  177. exampleView.isHidden = false
  178. showImageView.image = UIImage(named: model.response.resultUrl)
  179. setVideoHidden()
  180. }else{
  181. exampleView.isHidden = true
  182. videoIconImageView.isHidden = !model.isVideo
  183. if dataModel.isVideo {
  184. videoIconImageView.isHidden = false
  185. setVideoURL()
  186. }else {
  187. setVideoHidden()
  188. showImageView.setAsyncImage(urlString: model.response.resultUrl,contentMode: .scaleAspectFill,backgroundColor: .white.withAlphaComponent(0.1))
  189. hiddenImageView.setAsyncImage(urlString: model.request.imageUrl,contentMode: .scaleAspectFill)
  190. }
  191. }
  192. case .failed:
  193. generateView.isHidden = false
  194. if model.upImageURLExpired { //任务已经过期了
  195. generateView.setTaskExpired()
  196. }else{
  197. generateView.setFailText(text: model.response.codeErrorMsg, refresh: !model.response.sensitiveError)
  198. }
  199. }
  200. }
  201. }
  202. extension TSAIListHistoryCell {
  203. func setVideoHidden(){
  204. blurEffect.isHidden = true
  205. videoPlayerVC.view.removeFromSuperview()
  206. }
  207. func setVideoURL(){
  208. blurEffect.isHidden = kPurchaseBusiness.isVip
  209. self.videoPlayerVC.view.removeFromSuperview()
  210. self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: dataModel.response.videoURL)
  211. self.videoPlayerVC.viewFrame = self.contentView.bounds
  212. self.videoPlayerVC.view.frame = self.contentView.bounds
  213. self.showImageView.insertSubview(self.videoPlayerVC.view, at: 0)
  214. self.videoPlayerVC.runloppPlay()
  215. self.videoPlayerVC.view.isUserInteractionEnabled = false
  216. }
  217. }