GiftBoxSelectorView.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using ET;
  6. using FairyGUI;
  7. using UI.Bag;
  8. using UI.CommonGame;
  9. using UnityEngine;
  10. namespace GFGGame
  11. {
  12. public class GiftBoxSelectorView : BaseWindow
  13. {
  14. private UI_GiftBoxSelectorUI _ui;
  15. private int _itemId;
  16. private int _count; //物品数量
  17. private int _selCount; //选择的数量
  18. private Dictionary<int, int> _selDic; //选择礼包内的物品<物品id,数量>
  19. private List<LongPressGesture> _listLongPress = new List<LongPressGesture>();
  20. private GameObject _gameObject1;
  21. private GameObject _gameObject2;
  22. private GoWrapper _wrapper1;
  23. private GoWrapper _wrapper2;
  24. public override void Dispose()
  25. {
  26. if (_selDic != null)
  27. {
  28. _selDic.Clear();
  29. _selDic = null;
  30. }
  31. for (int i = 0; i < _listLongPress.Count; i++)
  32. {
  33. _listLongPress[i].Dispose();
  34. }
  35. _listLongPress.Clear();
  36. if (_ui != null)
  37. {
  38. _ui.Dispose();
  39. _ui = null;
  40. }
  41. base.Dispose();
  42. }
  43. protected override void OnInit()
  44. {
  45. base.OnInit();
  46. packageName = UI_GiftBoxSelectorUI.PACKAGE_NAME;
  47. _ui = UI_GiftBoxSelectorUI.Create();
  48. this.viewCom = _ui.target;
  49. this.viewCom.Center();
  50. this.modal = true;
  51. _selDic = new Dictionary<int, int>();
  52. _ui.m_btnCancel.onClick.Add(OnBtnCancelClick);
  53. _ui.m_list.itemRenderer = ListItemRender;
  54. _ui.m_btnSub.onClick.Add(OnBtnSubClick);
  55. }
  56. protected override void AddEventListener()
  57. {
  58. base.AddEventListener();
  59. }
  60. protected override void OnShown()
  61. {
  62. base.OnShown();
  63. _itemId = (int)this.viewData;
  64. _count = (int)ItemDataManager.GetItemNum(_itemId);
  65. _selDic.Clear();
  66. _selCount = 0;
  67. Debug.Log("OnShown 测试 GiftBoxSelectorView");
  68. UpdateView();
  69. UpdateList();
  70. SetSelAllNum();
  71. AddEffect();
  72. }
  73. protected override void OnHide()
  74. {
  75. if (_ui.m_list.numItems > 0)
  76. {
  77. _ui.m_list.ScrollToView(0);
  78. }
  79. _ui.m_list.numItems = 0;
  80. _selDic.Clear();
  81. _selCount = 0;
  82. SceneController.DestroyObjectFromView(_gameObject1, _wrapper1);
  83. SceneController.DestroyObjectFromView(_gameObject2, _wrapper2);
  84. base.OnHide();
  85. }
  86. private void AddEffect()
  87. {
  88. //边框左上角特效
  89. string resPath1 = ResPathUtil.GetViewEffectPath("ui_Activity", "Com_window_L_up");
  90. SceneController.AddObjectToView(null, null, _ui.m_holderLeftTop, resPath1,
  91. out _gameObject1, out _wrapper1);
  92. //边框右下角特效
  93. string resPath2 = ResPathUtil.GetViewEffectPath("ui_Activity", "Com_window_R_Down");
  94. SceneController.AddObjectToView(null, null, _ui.m_holderRightDowm, resPath2,
  95. out _gameObject2, out _wrapper2);
  96. }
  97. protected override void RemoveEventListener()
  98. {
  99. base.RemoveEventListener();
  100. }
  101. private void UpdateView()
  102. {
  103. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId);
  104. _ui.m_loaIcon.url = ResPathUtil.GetIconPath(itemCfg);
  105. _ui.m_txtName.text = itemCfg.name;
  106. _ui.m_txtTotalNum.text = $"已拥有:{_count}";
  107. _ui.m_txtItemDes.text = string.IsNullOrEmpty(itemCfg.desc) ? "暂无描述" : itemCfg.desc;
  108. }
  109. private void UpdateList()
  110. {
  111. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId);
  112. _ui.m_list.numItems = itemCfg.itemsArr.Length;
  113. _ui.m_list.visible = true;
  114. }
  115. private void ListItemRender(int index, GObject obj)
  116. {
  117. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId);
  118. UI_ListSelectorItem uiItemChild = UI_ListSelectorItem.Proxy(obj);
  119. int[] itemChildArr = itemCfg.itemsArr[index];
  120. ItemCfg itemCfgChild = ItemCfgArray.Instance.GetCfg(itemChildArr[0]);
  121. uiItemChild.m_loaIcon.url = ResPathUtil.GetIconPath(itemCfgChild);
  122. uiItemChild.m_loaIcon.onClick.Add(OnListSelectorItemClick);
  123. uiItemChild.m_txtNum.text = itemChildArr[1].ToString();
  124. uiItemChild.m_txtSelNum.text = "0";
  125. uiItemChild.m_txtSelNum.onFocusOut.Add(OnChangedTxtSelNum);
  126. uiItemChild.m_btnAdd.onClick.Add(OnBtnAddClick);
  127. uiItemChild.m_btnReduce.onClick.Add(OnChildBtnReduceClick);
  128. uiItemChild.m_txtSelNum.onTouchBegin.Add(OnTextInputOpen);
  129. if (uiItemChild.target.data == null)
  130. {
  131. LongPressGesture longPressGesture = new LongPressGesture(uiItemChild.m_btnAdd);
  132. longPressGesture.trigger = 0.3f;
  133. longPressGesture.interval = 0.1f;
  134. longPressGesture.once = false;
  135. longPressGesture.onAction.Add(OnLongPress);
  136. _listLongPress.Add(longPressGesture);
  137. LongPressGesture longPressGesture2 = new LongPressGesture(uiItemChild.m_btnReduce);
  138. longPressGesture2.trigger = 0.3f;
  139. longPressGesture2.interval = 0.1f;
  140. longPressGesture2.once = false;
  141. longPressGesture2.onAction.Add(OnLongPressReduce);
  142. _listLongPress.Add(longPressGesture2);
  143. }
  144. uiItemChild.target.data = itemCfgChild;
  145. UI_ListSelectorItem.ProxyEnd();
  146. }
  147. private void OnBtnAddClick(EventContext context)
  148. {
  149. GObject sender = context.sender as GObject;
  150. GObject obj = sender.parent;
  151. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  152. ItemCfg itemCfg = obj.data as ItemCfg;
  153. UpdateSel(listItem, itemCfg);
  154. }
  155. private void OnLongPress(EventContext context)
  156. {
  157. LongPressGesture gesture = (LongPressGesture)context.sender;
  158. var host = gesture.host;
  159. GObject obj = host.parent;
  160. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  161. ItemCfg itemCfg = obj.data as ItemCfg;
  162. UpdateSel(listItem, itemCfg);
  163. }
  164. private void UpdateSel(UI_ListSelectorItem listItem, ItemCfg itemCfg)
  165. {
  166. if (_selCount == _count)
  167. {
  168. return;
  169. }
  170. if (listItem.m_txtSelNum.text == _count.ToString())
  171. {
  172. return;
  173. }
  174. if (_selDic.TryGetValue(itemCfg.id, out int num))
  175. {
  176. if (num == _count)
  177. {
  178. return;
  179. }
  180. _selCount += 1;
  181. _selDic[itemCfg.id] = num + 1;
  182. listItem.m_txtSelNum.text = Convert.ToString(Convert.ToInt32(listItem.m_txtSelNum.text) + 1);
  183. }
  184. else
  185. {
  186. _selDic.Add(itemCfg.id, 1);
  187. _selCount += 1;
  188. listItem.m_txtSelNum.text = Convert.ToString(1);
  189. }
  190. SetSelAllNum();
  191. }
  192. private void OnChildBtnReduceClick(EventContext context)
  193. {
  194. GObject sender = context.sender as GObject;
  195. GObject obj = sender.parent;
  196. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  197. ItemCfg itemCfg = obj.data as ItemCfg;
  198. UpdateReduceSel(listItem, itemCfg);
  199. }
  200. private void OnTextInputOpen(EventContext context)
  201. {
  202. Debug.Log("OnTextInputOpen打开输入框触发");
  203. GObject sender = context.sender as GObject;
  204. GObject obj = sender.parent;
  205. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  206. // 当触摸输入框时执行的逻辑
  207. if (listItem.m_txtSelNum.text == "0")
  208. {
  209. Debug.Log("OnTextInputOpen打开输入框触发--txtSelNum为0");
  210. // 将文本设置为空字符串
  211. listItem.m_txtSelNum.text = " ";
  212. // 延迟 0.2 秒后恢复文本
  213. Timers.inst.Add(0.2f, 1, (obj) => { listItem.m_txtSelNum.text = " "; });
  214. }
  215. }
  216. private void OnLongPressReduce(EventContext context)
  217. {
  218. LongPressGesture gesture = (LongPressGesture)context.sender;
  219. var host = gesture.host;
  220. GObject obj = host.parent;
  221. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  222. ItemCfg itemCfg = obj.data as ItemCfg;
  223. UpdateReduceSel(listItem, itemCfg);
  224. }
  225. private void UpdateReduceSel(UI_ListSelectorItem listItem, ItemCfg itemCfg)
  226. {
  227. if (_selCount == 0)
  228. {
  229. return;
  230. }
  231. if (listItem.m_txtSelNum.text == "0")
  232. {
  233. return;
  234. }
  235. if (_selDic.TryGetValue(itemCfg.id, out int num))
  236. {
  237. if (num == 0)
  238. {
  239. return;
  240. }
  241. _selCount -= 1;
  242. _selDic[itemCfg.id] = num - 1;
  243. listItem.m_txtSelNum.text = Convert.ToString(Convert.ToInt32(listItem.m_txtSelNum.text) - 1);
  244. }
  245. else
  246. {
  247. _selCount -= 1;
  248. _selDic.Add(itemCfg.id, 0);
  249. listItem.m_txtSelNum.text = Convert.ToString(0);
  250. }
  251. SetSelAllNum();
  252. }
  253. //监控输入
  254. private void OnChangedTxtSelNum(EventContext context)
  255. {
  256. GObject sender = context.sender as GObject;
  257. GObject obj = sender.parent;
  258. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  259. ItemCfg itemCfg = obj.data as ItemCfg;
  260. UpdateSelNumSel(listItem, itemCfg);
  261. }
  262. private void UpdateSelNumSel(UI_ListSelectorItem listItem, ItemCfg itemCfg)
  263. {
  264. bool isNumeric = int.TryParse(listItem.m_txtSelNum.text, out var result);
  265. if (!isNumeric)
  266. {
  267. listItem.m_txtSelNum.text = "0";
  268. }
  269. var txtSelNum = Convert.ToInt32(listItem.m_txtSelNum.text);
  270. if (txtSelNum < 0)
  271. {
  272. if (_selDic.TryGetValue(itemCfg.id, out int numx))
  273. {
  274. listItem.m_txtSelNum.text = numx.ToString();
  275. }
  276. return;
  277. }
  278. _selDic.TryGetValue(itemCfg.id, out var snumx);
  279. var snum = _selCount - snumx + txtSelNum;
  280. //输入的数量大于剩余闲置的量,就设置成最大闲置的量
  281. if (snum > _count)
  282. {
  283. //其他选择的量
  284. var otherNum = _selDic.Where(a => a.Key != itemCfg.id).Select(a => a.Value).Sum();
  285. //物品总量-其他物品选择的量=当前物品最大可以选择的量
  286. var curSelTotalCount = _count - otherNum;
  287. listItem.m_txtSelNum.text = curSelTotalCount.ToString();
  288. _selDic[itemCfg.id] = curSelTotalCount;
  289. _selCount = _selDic.Values.Sum();
  290. }
  291. else
  292. {
  293. if (_selDic.TryGetValue(itemCfg.id, out int num))
  294. {
  295. _selDic[itemCfg.id] = txtSelNum;
  296. _selCount = _selDic.Values.Sum();
  297. }
  298. else
  299. {
  300. _selDic[itemCfg.id] = txtSelNum;
  301. _selCount = _selDic.Values.Sum();
  302. }
  303. }
  304. SetSelAllNum();
  305. }
  306. private void SetSelAllNum()
  307. {
  308. _ui.m_txtSelRewardStr.text = $"已选奖励:{_selCount}/{_count}";
  309. }
  310. //弹出物品详细描述框
  311. private void OnListSelectorItemClick(EventContext context)
  312. {
  313. GObject sender = context.sender as GObject;
  314. GObject obj = sender.parent;
  315. ItemCfg itemCfg = obj.data as ItemCfg;
  316. GoodsItemTipsController.ShowItemTips(itemCfg.id);
  317. }
  318. private void OnBtnCancelClick()
  319. {
  320. this.Hide();
  321. }
  322. //确认按钮
  323. private void OnBtnSubClick()
  324. {
  325. List<GiftBoxSelChildItemProto> reqItemList = new List<GiftBoxSelChildItemProto>();
  326. _selDic = _selDic.Where(pair => pair.Value != 0).ToDictionary(pair => pair.Key, pair => pair.Value);
  327. if (_selDic.Keys.Count > 0)
  328. {
  329. foreach (var itemKv in _selDic)
  330. {
  331. if (itemKv.Value != 0)
  332. {
  333. reqItemList.Add(new GiftBoxSelChildItemProto
  334. {
  335. ChildItemId = itemKv.Key,
  336. ChildItemCount = itemKv.Value
  337. });
  338. }
  339. }
  340. ItemProxy.ReqUseGiftBoxSelItem(_itemId, reqItemList).Coroutine();
  341. this.Hide();
  342. }
  343. else
  344. {
  345. PromptController.Instance.ShowFloatTextPrompt("请先选择");
  346. }
  347. }
  348. }
  349. }