TSAIListPhotoGeneratorVC.swift 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. //
  2. // TSAIPhotoGeneratorVC.swift
  3. // TSLiveWallpaper
  4. //
  5. // Created by 100Years on 2025/6/11.
  6. //
  7. import Kingfisher
  8. class TSAIListPhotoGeneratorModel {
  9. var upLoadImage:UIImage
  10. var generatorStyle:TSGeneratorImageStyle
  11. var expandEdge:UIEdgeInsets
  12. var expandViewSizes:(CGSize,CGSize)?
  13. var additionalPrompt:String//追加的提示词
  14. //预测宝宝
  15. var upLoadImages:[UIImage]?
  16. init(upLoadImage: UIImage,
  17. generatorStyle: TSGeneratorImageStyle,
  18. expandEdge:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),
  19. expandViewSizes:(CGSize,CGSize)? = nil,
  20. additionalPrompt:String = "",
  21. upLoadImages:[UIImage]? = nil
  22. ) {
  23. self.upLoadImage = upLoadImage
  24. self.generatorStyle = generatorStyle
  25. self.expandEdge = expandEdge
  26. self.expandViewSizes = expandViewSizes
  27. self.additionalPrompt = additionalPrompt
  28. self.upLoadImages = upLoadImages
  29. }
  30. var prompt:String = ""
  31. var inputText:String = ""
  32. var upLoadImageUrl:String?
  33. var model:String = "" //决定生图的模型
  34. }
  35. class TSAIListPhotoGeneratorVC: TSAIPhotoDetailsVC {
  36. var generatorModel:TSAIListPhotoGeneratorModel
  37. init(generatorModel:TSAIListPhotoGeneratorModel,infoModel:TSActionInfoModel? = nil,complete:@escaping ((TSActionInfoModel)->Void)) {
  38. self.complete = complete
  39. self.generatorModel = generatorModel
  40. // self.viewModel = TSAIListPhotoGeneratorBaseVM(generatorModel: generatorModel)
  41. super.init()
  42. self.infoModel = infoModel
  43. }
  44. @MainActor required init?(coder: NSCoder) {
  45. fatalError("init(coder:) has not been implemented")
  46. }
  47. var complete:((TSActionInfoModel)->Void)
  48. var backstageBlock:(()->Void)?
  49. var progressState = TSProgressState.none
  50. var uuidString:String = UUID().uuidString
  51. var operation:TSGenerateBaseOperation?
  52. var isSavePhotoMark:Bool = false
  53. var isNeedSavePhoto:Bool {
  54. if isSavePhotoMark == false,let _ = infoModel {
  55. return true
  56. }
  57. return false
  58. }
  59. // var viewModel: TSAIListPhotoGeneratorBaseVM!
  60. lazy var generateInView : TSGeneratorView = {
  61. let generateInView = TSGeneratorView()
  62. generateInView.isUploadImage = false
  63. generateInView.animationView.setText(time: String(format: "~ %d mins".localized, 2), info: "Lots of people are processing images right now, so this might take a bit.".localized)
  64. generateInView.clickErrorBlock = { [weak self] style in
  65. guard let self = self else { return }
  66. switch style {
  67. case .netWorkError:
  68. clickRegenerateBtn()
  69. default:
  70. self.dismiss(animated: false, completion: nil)
  71. break
  72. }
  73. }
  74. generateInView.clickBackstageBlock = { [weak self] in
  75. guard let self = self else { return }
  76. clickBackstageBtn()
  77. }
  78. generateInView.clickCloseBlock = { [weak self] in
  79. guard let self = self else { return }
  80. closePage()
  81. }
  82. return generateInView
  83. }()
  84. override func createView() {
  85. super.createView()
  86. navRightBtn.isHidden = true
  87. view.addSubview(generateInView)
  88. generateInView.snp.makeConstraints { make in
  89. make.edges.equalToSuperview()
  90. }
  91. }
  92. @objc func clickBackstageBtn() {
  93. self.operation?.backstageGeneration()
  94. NotificationCenter.default.post(name: .kAIPhotoDataChanged, object: nil)
  95. backstageBlock?()
  96. self.dismiss(animated: true, completion: nil)
  97. }
  98. func closePage() {
  99. if progressState.isResult {
  100. if isNeedSavePhoto{
  101. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  102. message: "You haven't saved the photo yet. Are you sure to quit?".localized,
  103. messageColor: .white,
  104. messageFont: .systemFont(ofSize: 16),
  105. cancelTitle: "Quit".localized,
  106. cancelColor: .white,
  107. confirmTitle: "Save".localized,
  108. confirmColor: .themeColor,
  109. cancelAction: { [weak self] in
  110. guard let self = self else { return }
  111. print("用户点击了Leave")
  112. if let model = infoModel{
  113. TSRMShared.aiListDB.deleteListModel(id: model.id)
  114. NotificationCenter.default.post(name: .kAIPhotoDataChanged, object: nil)
  115. }
  116. cancelDidmiss()
  117. },
  118. confirmAction: { [weak self] in
  119. guard let self = self else { return }
  120. print("用户点击了Stay")
  121. clickSaveBtn()
  122. }
  123. ))
  124. }else{
  125. cancelDidmiss()
  126. }
  127. }else{
  128. TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
  129. message: "As you leave, your task will be interrupted and no result.".localized,
  130. messageColor: .white,
  131. messageFont: .systemFont(ofSize: 16),
  132. cancelTitle: "Leave".localized,
  133. cancelColor: .white,
  134. confirmTitle: "Wait".localized,
  135. confirmColor: .themeColor,
  136. cancelAction: { [weak self] in
  137. guard let self = self else { return }
  138. print("用户点击了Leave")
  139. cancelDidmiss()
  140. },
  141. confirmAction: {
  142. print("用户点击了Stay")
  143. }
  144. ))
  145. }
  146. }
  147. func cancelDidmiss(){
  148. // viewModel.cancelAllRequest()
  149. operation?.cancel()
  150. self.dismiss(animated: true, completion: nil)
  151. }
  152. //重新生成
  153. @objc func clickRegenerateBtn(){
  154. //判断 vip
  155. if kJudgeVip(externalBool: true , vc: self){ return }
  156. // viewModel.uploadAndCreatImage()
  157. generatorOperation()
  158. }
  159. override func dealThings() {
  160. self.uuidString = UUID().uuidString
  161. // viewModel.uploadAndCreatImage()
  162. // viewModel.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  163. // guard let self = self else { return }
  164. // self.upDateView(state: state, model: model)
  165. // }.store(in: &cancellable)
  166. generatorOperation()
  167. }
  168. func generatorOperation() {
  169. if let model = self.infoModel{
  170. if model.actionStatus == .failed{
  171. generatorCreatRing(oldModel: model)
  172. }else if model.response.resultUrl.count > 0 {
  173. upDateView(state: .success(model), model: model)
  174. return
  175. }
  176. }else{
  177. generatorNew()
  178. }
  179. }
  180. }
  181. extension TSAIListPhotoGeneratorVC{
  182. func generatorNew() {
  183. let operation:TSGenerateBasePhotoOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: self.uuidString)
  184. self.operation = operation
  185. operation.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  186. guard let self = self else { return }
  187. self.upDateView(state: state, model: model)
  188. }.store(in: &cancellable)
  189. operation.uploadImage(generateStyleModel: self.generatorModel) { [weak self] actionInfoModel in
  190. guard let self = self else { return }
  191. guard let oldModel = actionInfoModel else {return}
  192. generatorCreatRing(oldModel: oldModel)
  193. }
  194. }
  195. func generatorCreatRing(oldModel:TSActionInfoModel) {
  196. let operation:TSGenerateBasePhotoOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: self.uuidString)
  197. self.operation = operation
  198. operation.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
  199. guard let self = self else { return }
  200. self.upDateView(state: state, model: model)
  201. }.store(in: &cancellable)
  202. operation.creatImage(oldModel: oldModel){ [weak self] success in
  203. guard let self = self else { return }
  204. if success {
  205. generateInView.setBackgroundGenerateBtnHidden(false)
  206. }
  207. }
  208. }
  209. }
  210. extension TSAIListPhotoGeneratorVC {
  211. func getSuccessImage()->UIImage?{
  212. if let image = panComparisonView.newImageView.image {
  213. return image.pngImage
  214. }
  215. return nil
  216. }
  217. }
  218. extension TSAIListPhotoGeneratorVC {
  219. func upDateView(state:TSProgressState,model:TSActionInfoModel?){
  220. progressState = state
  221. switch state {
  222. case .failed(let errorStr,let code):
  223. showError(text: errorStr,code:code)
  224. case .success:
  225. if let model = model {
  226. showSuccess(model: model)
  227. }else{
  228. showError(text: "")
  229. }
  230. case .progressString(let string):
  231. showProgress(text: string)
  232. default:
  233. showLoading()
  234. }
  235. }
  236. func showProgress(text:String) {
  237. generateInView.updateShowProgress(text: text)
  238. // setVideoHidden()
  239. }
  240. func showLoading(){
  241. generateInView.updateShowLoading(text: "Processing".localized + " " + kPercentlocalized(0))
  242. }
  243. func showError(text:String,code:Int = 0){
  244. generateInView.updateShowError(text: text,code: code)
  245. }
  246. func showSuccess(model:TSActionInfoModel){
  247. generateInView.updateShowSuccess()
  248. infoModel = model
  249. // if viewModel.generatorModel.generatorStyle == .futureBaby {
  250. // rotatingPictureBtn.isHidden = false
  251. // }else{
  252. // switchOriginalPictureBtn.isHidden = false
  253. // }
  254. if let model = infoModel {
  255. complete(model)
  256. }
  257. // setVideoURL()
  258. // setExpandAreaImage()
  259. }
  260. }
  261. extension TSAIListPhotoGeneratorVC {
  262. func setVideoHidden(){
  263. // if viewModel.generatorModel.generatorStyle == .photoLive {
  264. // videoPlayerVC.removeFromParent()
  265. // videoPlayerVC.view.removeFromSuperview()
  266. // }
  267. }
  268. func setVideoURL(){
  269. // if viewModel.generatorModel.generatorStyle == .photoLive {
  270. // if let model = infoModel {
  271. // switchOriginalPictureBtn.isHidden = true
  272. // self.videoPlayerVC = TSAIListVideoPlayerVC(videoURL: model.videoURL)
  273. // self.addChild(self.videoPlayerVC)
  274. // self.videoPlayerVC.view.frame = self.netWorkImageView.bounds
  275. // self.netWorkImageView.addSubview(self.videoPlayerVC.view)
  276. // self.videoPlayerVC.setControlsBottom(bottem: -20)
  277. // }
  278. // }
  279. }
  280. }
  281. extension TSAIListPhotoGeneratorVC {
  282. func setExpandAreaImage(){
  283. // if viewModel.generatorModel.generatorStyle == .photoExpand {
  284. // netWorkImageView.image = nil
  285. // expandAreaView.bgImageView.setAsyncImage(urlString: infoModel?.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
  286. // expandAreaView.showImageView.image = self.viewModel.generatorModel.upLoadImage
  287. // }
  288. }
  289. }