using System; using System.Collections.Generic; using System.Linq; using System.Threading; using ET; using FairyGUI; using UI.Bag; using UI.CommonGame; using UnityEngine; namespace GFGGame { public class GiftBoxSelectorView : BaseWindow { private UI_GiftBoxSelectorUI _ui; private int _itemId; private int _count; //物品数量 private int _selCount; //选择的数量 private Dictionary _selDic; //选择礼包内的物品<物品id,数量> private List _listLongPress = new List(); private GameObject _gameObject1; private GameObject _gameObject2; private GoWrapper _wrapper1; private GoWrapper _wrapper2; public override void Dispose() { if (_selDic != null) { _selDic.Clear(); _selDic = null; } for (int i = 0; i < _listLongPress.Count; i++) { _listLongPress[i].Dispose(); } _listLongPress.Clear(); if (_ui != null) { _ui.Dispose(); _ui = null; } base.Dispose(); } protected override void OnInit() { base.OnInit(); packageName = UI_GiftBoxSelectorUI.PACKAGE_NAME; _ui = UI_GiftBoxSelectorUI.Create(); this.viewCom = _ui.target; this.viewCom.Center(); this.modal = true; _selDic = new Dictionary(); _ui.m_btnCancel.onClick.Add(OnBtnCancelClick); _ui.m_list.itemRenderer = ListItemRender; _ui.m_btnSub.onClick.Add(OnBtnSubClick); } protected override void AddEventListener() { base.AddEventListener(); } protected override void OnShown() { base.OnShown(); _itemId = (int)this.viewData; _count = (int)ItemDataManager.GetItemNum(_itemId); _selDic.Clear(); _selCount = 0; UpdateView(); UpdateList(); SetSelAllNum(); AddEffect(); } protected override void OnHide() { if (_ui.m_list.numItems > 0) { _ui.m_list.ScrollToView(0); } _ui.m_list.numItems = 0; _selDic.Clear(); _selCount = 0; SceneController.DestroyObjectFromView(_gameObject1, _wrapper1); SceneController.DestroyObjectFromView(_gameObject2, _wrapper2); base.OnHide(); } private void AddEffect() { //边框左上角特效 string resPath1 = ResPathUtil.GetViewEffectPath("ui_Activity", "Com_window_L_up"); SceneController.AddObjectToView(null, null, _ui.m_holderLeftTop, resPath1, out _gameObject1, out _wrapper1); //边框右下角特效 string resPath2 = ResPathUtil.GetViewEffectPath("ui_Activity", "Com_window_R_Down"); SceneController.AddObjectToView(null, null, _ui.m_holderRightDowm, resPath2, out _gameObject2, out _wrapper2); } protected override void RemoveEventListener() { base.RemoveEventListener(); } private void UpdateView() { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId); _ui.m_loaIcon.url = ResPathUtil.GetIconPath(itemCfg); _ui.m_txtName.text = itemCfg.name; _ui.m_txtTotalNum.text = $"已拥有:{_count}"; _ui.m_txtItemDes.text = string.IsNullOrEmpty(itemCfg.desc) ? "暂无描述" : itemCfg.desc; } private void UpdateList() { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId); _ui.m_list.numItems = itemCfg.itemsArr.Length; _ui.m_list.visible = true; } private void ListItemRender(int index, GObject obj) { ItemCfg itemCfg = ItemCfgArray.Instance.GetCfg(_itemId); UI_ListSelectorItem uiItemChild = UI_ListSelectorItem.Proxy(obj); int[] itemChildArr = itemCfg.itemsArr[index]; ItemCfg itemCfgChild = ItemCfgArray.Instance.GetCfg(itemChildArr[0]); uiItemChild.m_loaIcon.url = ResPathUtil.GetIconPath(itemCfgChild); uiItemChild.m_loaIcon.onClick.Add(OnListSelectorItemClick); uiItemChild.m_txtNum.text = itemChildArr[1].ToString(); uiItemChild.m_txtSelNum.text = "0"; uiItemChild.m_txtSelNum.onFocusOut.Add(OnChangedTxtSelNum); uiItemChild.m_btnAdd.onClick.Add(OnBtnAddClick); uiItemChild.m_btnReduce.onClick.Add(OnChildBtnReduceClick); uiItemChild.m_txtSelNum.onTouchBegin.Add(OnTextInputOpen); if (uiItemChild.target.data == null) { LongPressGesture longPressGesture = new LongPressGesture(uiItemChild.m_btnAdd); longPressGesture.trigger = 0.3f; longPressGesture.interval = 0.1f; longPressGesture.once = false; longPressGesture.onAction.Add(OnLongPress); _listLongPress.Add(longPressGesture); LongPressGesture longPressGesture2 = new LongPressGesture(uiItemChild.m_btnReduce); longPressGesture2.trigger = 0.3f; longPressGesture2.interval = 0.1f; longPressGesture2.once = false; longPressGesture2.onAction.Add(OnLongPressReduce); _listLongPress.Add(longPressGesture2); } uiItemChild.target.data = itemCfgChild; UI_ListSelectorItem.ProxyEnd(); } private void OnBtnAddClick(EventContext context) { GObject sender = context.sender as GObject; GObject obj = sender.parent; UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj); ItemCfg itemCfg = obj.data as ItemCfg; UpdateSel(listItem, itemCfg); } private void OnLongPress(EventContext context) { LongPressGesture gesture = (LongPressGesture)context.sender; var host = gesture.host; GObject obj = host.parent; UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj); ItemCfg itemCfg = obj.data as ItemCfg; UpdateSel(listItem, itemCfg); } private void UpdateSel(UI_ListSelectorItem listItem, ItemCfg itemCfg) { if (_selCount == _count) { return; } if (listItem.m_txtSelNum.text == _count.ToString()) { return; } if (_selDic.TryGetValue(itemCfg.id, out int num)) { if (num == _count) { return; } _selCount += 1; _selDic[itemCfg.id] = num + 1; listItem.m_txtSelNum.text = Convert.ToString(Convert.ToInt32(listItem.m_txtSelNum.text) + 1); } else { _selDic.Add(itemCfg.id, 1); _selCount += 1; listItem.m_txtSelNum.text = Convert.ToString(1); } SetSelAllNum(); } private void OnChildBtnReduceClick(EventContext context) { GObject sender = context.sender as GObject; GObject obj = sender.parent; UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj); ItemCfg itemCfg = obj.data as ItemCfg; UpdateReduceSel(listItem, itemCfg); } private void OnTextInputOpen(EventContext context) { GObject sender = context.sender as GObject; GObject obj = sender.parent; UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj); // 当触摸输入框时执行的逻辑 if (listItem.m_txtSelNum.text == "0") { // 将文本设置为空字符串 listItem.m_txtSelNum.text = " "; // 延迟 0.2 秒后恢复文本 Timers.inst.Add(0.2f, 1, (obj) => { listItem.m_txtSelNum.text = " "; }); } } private void OnLongPressReduce(EventContext context) { LongPressGesture gesture = (LongPressGesture)context.sender; var host = gesture.host; GObject obj = host.parent; UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj); ItemCfg itemCfg = obj.data as ItemCfg; UpdateReduceSel(listItem, itemCfg); } private void UpdateReduceSel(UI_ListSelectorItem listItem, ItemCfg itemCfg) { if (_selCount == 0) { return; } if (listItem.m_txtSelNum.text == "0") { return; } if (_selDic.TryGetValue(itemCfg.id, out int num)) { if (num == 0) { return; } _selCount -= 1; _selDic[itemCfg.id] = num - 1; listItem.m_txtSelNum.text = Convert.ToString(Convert.ToInt32(listItem.m_txtSelNum.text) - 1); } else { _selCount -= 1; _selDic.Add(itemCfg.id, 0); listItem.m_txtSelNum.text = Convert.ToString(0); } SetSelAllNum(); } //监控输入 private void OnChangedTxtSelNum(EventContext context) { GObject sender = context.sender as GObject; GObject obj = sender.parent; UI_ListSelectorItem listItem = UI_ListSelectorItem.Proxy(obj); ItemCfg itemCfg = obj.data as ItemCfg; UpdateSelNumSel(listItem, itemCfg); } private void UpdateSelNumSel(UI_ListSelectorItem listItem, ItemCfg itemCfg) { bool isNumeric = int.TryParse(listItem.m_txtSelNum.text, out var result); if (!isNumeric) { listItem.m_txtSelNum.text = "0"; } var txtSelNum = Convert.ToInt32(listItem.m_txtSelNum.text); if (txtSelNum < 0) { if (_selDic.TryGetValue(itemCfg.id, out int numx)) { listItem.m_txtSelNum.text = numx.ToString(); } return; } _selDic.TryGetValue(itemCfg.id, out var snumx); var snum = _selCount - snumx + txtSelNum; //输入的数量大于剩余闲置的量,就设置成最大闲置的量 if (snum > _count) { //其他选择的量 var otherNum = _selDic.Where(a => a.Key != itemCfg.id).Select(a => a.Value).Sum(); //物品总量-其他物品选择的量=当前物品最大可以选择的量 var curSelTotalCount = _count - otherNum; listItem.m_txtSelNum.text = curSelTotalCount.ToString(); _selDic[itemCfg.id] = curSelTotalCount; _selCount = _selDic.Values.Sum(); } else { if (_selDic.TryGetValue(itemCfg.id, out int num)) { _selDic[itemCfg.id] = txtSelNum; _selCount = _selDic.Values.Sum(); } else { _selDic[itemCfg.id] = txtSelNum; _selCount = _selDic.Values.Sum(); } } SetSelAllNum(); } private void SetSelAllNum() { _ui.m_txtSelRewardStr.text = $"已选奖励:{_selCount}/{_count}"; } //弹出物品详细描述框 private void OnListSelectorItemClick(EventContext context) { GObject sender = context.sender as GObject; GObject obj = sender.parent; ItemCfg itemCfg = obj.data as ItemCfg; GoodsItemTipsController.ShowItemTips(itemCfg.id); } private void OnBtnCancelClick() { this.Hide(); } //确认按钮 private void OnBtnSubClick() { List reqItemList = new List(); _selDic = _selDic.Where(pair => pair.Value != 0).ToDictionary(pair => pair.Key, pair => pair.Value); if (_selDic.Keys.Count > 0) { foreach (var itemKv in _selDic) { if (itemKv.Value != 0) { reqItemList.Add(new GiftBoxSelChildItemProto { ChildItemId = itemKv.Key, ChildItemCount = itemKv.Value }); } } ItemProxy.ReqUseGiftBoxSelItem(_itemId, reqItemList).Coroutine(); this.Hide(); } else { PromptController.Instance.ShowFloatTextPrompt("请先选择"); } } } }