GiftBoxSelectorView.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using ET;
  5. using FairyGUI;
  6. using UI.Bag;
  7. using UI.CommonGame;
  8. using UnityEngine;
  9. namespace GFGGame
  10. {
  11. public class GiftBoxSelectorView : BaseWindow
  12. {
  13. private UI_GiftBoxSelectorUI _ui;
  14. private int _itemId;
  15. private int _count; //物品数量
  16. private int _selCount; //选择的数量
  17. private Dictionary<int, int> _selDic; //选择礼包内的物品<物品id,数量>
  18. private List<LongPressGesture> _listLongPress = new List<LongPressGesture>();
  19. public override void Dispose()
  20. {
  21. if (_selDic != null)
  22. {
  23. _selDic.Clear();
  24. _selDic = null;
  25. }
  26. for (int i = 0; i < _listLongPress.Count; i++)
  27. {
  28. _listLongPress[i].Dispose();
  29. }
  30. _listLongPress.Clear();
  31. if (_ui != null)
  32. {
  33. _ui.Dispose();
  34. _ui = null;
  35. }
  36. base.Dispose();
  37. }
  38. protected override void OnInit()
  39. {
  40. base.OnInit();
  41. packageName = UI_GiftBoxSelectorUI.PACKAGE_NAME;
  42. _ui = UI_GiftBoxSelectorUI.Create();
  43. this.viewCom = _ui.target;
  44. this.viewCom.Center();
  45. this.modal = true;
  46. _selDic = new Dictionary<int, int>();
  47. _ui.m_btnCancel.onClick.Add(OnBtnCancelClick);
  48. _ui.m_list.itemRenderer = ListItemRender;
  49. _ui.m_btnSub.onClick.Add(OnBtnSubClick);
  50. }
  51. protected override void AddEventListener()
  52. {
  53. base.AddEventListener();
  54. }
  55. protected override void OnShown()
  56. {
  57. base.OnShown();
  58. _itemId = (int)this.viewData;
  59. _count = (int)ItemDataManager.GetItemNum(_itemId);
  60. _selDic.Clear();
  61. _selCount = 0;
  62. UpdateView();
  63. UpdateList();
  64. SetSelAllNum();
  65. }
  66. protected override void OnHide()
  67. {
  68. if (_ui.m_list.numItems > 0)
  69. {
  70. _ui.m_list.ScrollToView(0);
  71. }
  72. _ui.m_list.numItems = 0;
  73. _selDic.Clear();
  74. _selCount = 0;
  75. base.OnHide();
  76. }
  77. protected override void RemoveEventListener()
  78. {
  79. base.RemoveEventListener();
  80. }
  81. private void UpdateView()
  82. {
  83. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId);
  84. _ui.m_loaIcon.url = ResPathUtil.GetIconPath(itemCfg);
  85. _ui.m_txtName.text = itemCfg.name;
  86. _ui.m_txtTotalNum.text = $"已拥有:{_count}";
  87. _ui.m_txtItemDes.text = string.IsNullOrEmpty(itemCfg.desc) ? "暂无描述" : itemCfg.desc;
  88. }
  89. private void UpdateList()
  90. {
  91. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId);
  92. _ui.m_list.numItems = itemCfg.itemsArr.Length;
  93. _ui.m_list.visible = true;
  94. }
  95. private void ListItemRender(int index, GObject obj)
  96. {
  97. ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId);
  98. UI_ListSelectorItem uiItemChild = UI_ListSelectorItem.Proxy(obj);
  99. int[] itemChildArr = itemCfg.itemsArr[index];
  100. ItemCfg itemCfgChild = ItemCfgArray.Instance.GetCfg(itemChildArr[0]);
  101. uiItemChild.m_loaIcon.url = ResPathUtil.GetIconPath(itemCfgChild);
  102. uiItemChild.m_loaIcon.onClick.Add(OnListSelectorItemClick);
  103. uiItemChild.m_txtNum.text = itemChildArr[1].ToString();
  104. uiItemChild.m_txtSelNum.text = "0";
  105. uiItemChild.m_txtSelNum.onChanged.Add(OnChangedTxtSelNum);
  106. uiItemChild.m_btnAdd.onClick.Add(OnBtnAddClick);
  107. uiItemChild.m_btnReduce.onClick.Add(OnChildBtnReduceClick);
  108. if (uiItemChild.target.data == null)
  109. {
  110. LongPressGesture longPressGesture = new LongPressGesture(uiItemChild.m_btnAdd);
  111. longPressGesture.trigger = 0.3f;
  112. longPressGesture.interval = 0.1f;
  113. longPressGesture.once = false;
  114. longPressGesture.onAction.Add(OnLongPress);
  115. _listLongPress.Add(longPressGesture);
  116. LongPressGesture longPressGesture2 = new LongPressGesture(uiItemChild.m_btnReduce);
  117. longPressGesture2.trigger = 0.3f;
  118. longPressGesture2.interval = 0.1f;
  119. longPressGesture2.once = false;
  120. longPressGesture2.onAction.Add(OnLongPressReduce);
  121. _listLongPress.Add(longPressGesture2);
  122. }
  123. uiItemChild.target.data = itemCfgChild;
  124. UI_ListSelectorItem.ProxyEnd();
  125. }
  126. private void OnBtnAddClick(EventContext context)
  127. {
  128. GObject sender = context.sender as GObject;
  129. GObject obj = sender.parent;
  130. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  131. ItemCfg itemCfg = obj.data as ItemCfg;
  132. UpdateSel(listItem, itemCfg);
  133. }
  134. private void OnLongPress(EventContext context)
  135. {
  136. LongPressGesture gesture = (LongPressGesture)context.sender;
  137. var host = gesture.host;
  138. GObject obj = host.parent;
  139. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  140. ItemCfg itemCfg = obj.data as ItemCfg;
  141. UpdateSel(listItem, itemCfg);
  142. }
  143. private void UpdateSel(UI_ListSelectorItem listItem, ItemCfg itemCfg)
  144. {
  145. if (_selCount == _count)
  146. {
  147. return;
  148. }
  149. if (listItem.m_txtSelNum.text == _count.ToString())
  150. {
  151. return;
  152. }
  153. if (_selDic.TryGetValue(itemCfg.id, out int num))
  154. {
  155. if (num == _count)
  156. {
  157. return;
  158. }
  159. _selCount += 1;
  160. _selDic[itemCfg.id] = num + 1;
  161. listItem.m_txtSelNum.text = Convert.ToString(Convert.ToInt32(listItem.m_txtSelNum.text) + 1);
  162. }
  163. else
  164. {
  165. _selDic.Add(itemCfg.id, 1);
  166. _selCount += 1;
  167. listItem.m_txtSelNum.text = Convert.ToString(1);
  168. }
  169. SetSelAllNum();
  170. }
  171. private void OnChildBtnReduceClick(EventContext context)
  172. {
  173. GObject sender = context.sender as GObject;
  174. GObject obj = sender.parent;
  175. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  176. ItemCfg itemCfg = obj.data as ItemCfg;
  177. UpdateReduceSel(listItem, itemCfg);
  178. }
  179. private void OnLongPressReduce(EventContext context)
  180. {
  181. LongPressGesture gesture = (LongPressGesture)context.sender;
  182. var host = gesture.host;
  183. GObject obj = host.parent;
  184. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  185. ItemCfg itemCfg = obj.data as ItemCfg;
  186. UpdateReduceSel(listItem, itemCfg);
  187. }
  188. private void UpdateReduceSel(UI_ListSelectorItem listItem, ItemCfg itemCfg)
  189. {
  190. if (_selCount == 0)
  191. {
  192. return;
  193. }
  194. if (listItem.m_txtSelNum.text == "0")
  195. {
  196. return;
  197. }
  198. if (_selDic.TryGetValue(itemCfg.id, out int num))
  199. {
  200. if (num == 0)
  201. {
  202. return;
  203. }
  204. _selCount -= 1;
  205. _selDic[itemCfg.id] = num - 1;
  206. listItem.m_txtSelNum.text = Convert.ToString(Convert.ToInt32(listItem.m_txtSelNum.text) - 1);
  207. }
  208. else
  209. {
  210. _selCount -= 1;
  211. _selDic.Add(itemCfg.id, 0);
  212. listItem.m_txtSelNum.text = Convert.ToString(0);
  213. }
  214. SetSelAllNum();
  215. }
  216. //监控输入
  217. private void OnChangedTxtSelNum(EventContext context)
  218. {
  219. GObject sender = context.sender as GObject;
  220. GObject obj = sender.parent;
  221. UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj);
  222. ItemCfg itemCfg = obj.data as ItemCfg;
  223. UpdateSelNumSel(listItem, itemCfg);
  224. }
  225. private void UpdateSelNumSel(UI_ListSelectorItem listItem, ItemCfg itemCfg)
  226. {
  227. if (string.IsNullOrEmpty(listItem.m_txtSelNum.text))
  228. {
  229. listItem.m_txtSelNum.text = "0";
  230. }
  231. var txtSelNum = Convert.ToInt32(listItem.m_txtSelNum.text);
  232. if (txtSelNum < 0)
  233. {
  234. if (_selDic.TryGetValue(itemCfg.id, out int numx))
  235. {
  236. listItem.m_txtSelNum.text = numx.ToString();
  237. }
  238. return;
  239. }
  240. _selDic.TryGetValue(itemCfg.id, out var snumx);
  241. var snum = _selCount - snumx + txtSelNum;
  242. if (snum > _count)
  243. {
  244. _selDic.TryGetValue(itemCfg.id, out var numx);
  245. listItem.m_txtSelNum.text = numx.ToString();
  246. return;
  247. }
  248. if (_selDic.TryGetValue(itemCfg.id, out int num))
  249. {
  250. _selDic[itemCfg.id] = txtSelNum;
  251. _selCount = _selDic.Values.Sum();
  252. }
  253. else
  254. {
  255. _selDic[itemCfg.id] = txtSelNum;
  256. _selCount = _selDic.Values.Sum();
  257. }
  258. SetSelAllNum();
  259. }
  260. private void SetSelAllNum()
  261. {
  262. _ui.m_txtSelRewardStr.text = $"已选奖励:{_selCount}/{_count}";
  263. }
  264. //弹出物品详细描述框
  265. private void OnListSelectorItemClick(EventContext context)
  266. {
  267. GObject sender = context.sender as GObject;
  268. GObject obj = sender.parent;
  269. ItemCfg itemCfg = obj.data as ItemCfg;
  270. GoodsItemTipsController.ShowItemTips(itemCfg.id);
  271. }
  272. private void OnBtnCancelClick()
  273. {
  274. this.Hide();
  275. }
  276. //确认按钮
  277. private void OnBtnSubClick()
  278. {
  279. List<GiftBoxSelChildItemProto> reqItemList = new List<GiftBoxSelChildItemProto>();
  280. if (_selDic.Keys.Count > 0)
  281. {
  282. foreach (var itemKv in _selDic)
  283. {
  284. reqItemList.Add(new GiftBoxSelChildItemProto
  285. {
  286. ChildItemId = itemKv.Key,
  287. ChildItemCount = itemKv.Value
  288. });
  289. }
  290. ItemProxy.ReqUseGiftBoxSelItem(_itemId, reqItemList).Coroutine();
  291. this.Hide();
  292. }
  293. else
  294. {
  295. PromptController.Instance.ShowFloatTextPrompt("请先选择");
  296. }
  297. }
  298. }
  299. }