using System;
using System.Collections.Generic;
using System.Linq;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
///
/// 公会申请列表界面
///
public class GuildApplyListWin : UIBase
{
[SerializeField] Transform noApply;
[SerializeField] Transform bgImage;
[SerializeField] ScrollerController scroller;
[SerializeField] Toggle lowOfficialToggle;
[SerializeField] Toggle joinFreeToggle;
[SerializeField] Toggle sortToggle;
[SerializeField] Dropdown dropdown;
[SerializeField] ButtonEx rejectAllButton;
[SerializeField] TextEx countText;
GuildManager manager { get { return GuildManager.Instance; } }
protected override void InitComponent()
{
lowOfficialToggle.AddListener((bool value) =>
{
if (!PlayerDatas.Instance.fairyData.HasFairy)
return;
int lv = GetLvByIndex(dropdown.value);
manager.SendChangeFamilyJoin(joinFreeToggle.isOn ? 0 : 1, value ? lv : 0);
});
joinFreeToggle.AddListener((bool value) =>
{
if (!PlayerDatas.Instance.fairyData.HasFairy)
return;
int lv = GetLvByIndex(dropdown.value);
manager.SendChangeFamilyJoin(value ? 0 : 1, PlayerDatas.Instance.fairyData.fairy.JoinLVMin);
});
sortToggle.AddListener((bool value) =>
{
manager.isPowerSort = value;
Display();
});
dropdown.SetListener(OnDropdownValueChanged);
rejectAllButton.SetListener(() =>
{
manager.SendJoinFamilyReply(0, false);
});
}
protected override void OnPreOpen()
{
scroller.lockType = EnhanceLockType.KeepVertical;
manager.OnRefreshApplyList += OnRefreshApplyList;
PlayerDatas.Instance.fairyData.OnRefreshFairyInfo += OnRefreshFairyInfo;
GuildManager.Instance.EnterOrQuitGuildEvent += OnEnterOrQuitGuildEvent;
scroller.OnRefreshCell += OnRefreshCell;
Display();
}
protected override void OnPreClose()
{
manager.OnRefreshApplyList -= OnRefreshApplyList;
PlayerDatas.Instance.fairyData.OnRefreshFairyInfo -= OnRefreshFairyInfo;
GuildManager.Instance.EnterOrQuitGuildEvent -= OnEnterOrQuitGuildEvent;
scroller.OnRefreshCell -= OnRefreshCell;
}
private void OnEnterOrQuitGuildEvent(bool isEnter)
{
DelayCloseWindow().Forget();
}
private void OnRefreshFairyInfo()
{
if (!PlayerDatas.Instance.fairyData.HasFairy || !PlayerDatas.Instance.fairyData.IsCanFunc(LimitFunc.CanCall))
{
DelayCloseWindow().Forget();
return;
}
Display();
}
private void OnRefreshApplyList()
{
Display();
}
List list;
private void OnRefreshCell(ScrollerDataType type, CellView cell)
{
var _cell = cell.GetComponent();
_cell?.Display(cell.index, list);
}
List optionKeys;
List optionValues;
private int GetLvByIndex(int index)
{
if (!PlayerDatas.Instance.fairyData.HasFairy)
return 0;
if (index < 0 || index >= optionKeys.Count)
return 0;
int lv = optionKeys[index];
return lv;
}
private void OnDropdownValueChanged(int index)
{
int lv = GetLvByIndex(index);
if (PlayerDatas.Instance.fairyData.fairy.JoinLVMin == lv)
return;
if (lowOfficialToggle.isOn)
{
manager.SendChangeFamilyJoin(PlayerDatas.Instance.fairyData.fairy.JoinReview, lv);
}
}
private void CreateScroller()
{
scroller.Refresh();
if (!manager.isPowerSort)
{
list = new List(manager.GetApplyList());
}
else
{
list = new List(manager.GetApplyList().OrderByDescending(x => x.FightPower));
}
bool isNullOrEmpty = list.IsNullOrEmpty();
bgImage.SetActive(!isNullOrEmpty);
noApply.SetActive(isNullOrEmpty);
if (!isNullOrEmpty)
{
for (int i = 0; i < list.Count; i++)
{
scroller.AddCell(ScrollerDataType.Header, i);
}
}
scroller.Restart();
}
private void CreateDropdown()
{
if (!manager.TryGetApplyOptions(out optionKeys, out optionValues))
return;
dropdown.ClearOptions();
dropdown.AddOptions(optionValues);
int joinLVMin = PlayerDatas.Instance.fairyData.fairy.JoinLVMin;
int index = optionKeys.IndexOf(joinLVMin);
dropdown.value = index < 0 ? 0 : index;
}
private void CreateToggle()
{
lowOfficialToggle.SetIsOnWithoutNotify(PlayerDatas.Instance.fairyData.fairy.JoinLVMin > 0);
joinFreeToggle.SetIsOnWithoutNotify(PlayerDatas.Instance.fairyData.fairy.JoinReview == 0);
sortToggle.SetIsOnWithoutNotify(manager.isPowerSort);
}
private void Display()
{
if (!PlayerDatas.Instance.fairyData.HasFairy)
return;
CreateToggle();
CreateDropdown();
CreateScroller();
List list = manager.GetApplyList();
countText.text = Language.Get("GuildApplyList05", list != null ? list.Count : 0, manager.requestPlayerCount);
}
}