using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using RayNeo.Native;
using RayNeo.Tool;
using System;
///
/// 晶格操作按钮
///
public class LatticeBrain : MonoBehaviour
{
private static LatticeBrain m_brain;
public static LatticeBrain Brain
{
get
{
if (m_brain == null)
{
m_brain = FindObjectOfType();
if (m_brain == null)
{
m_brain = new GameObject("LatticeBrain").AddComponent();
m_brain.transform.parent = null;
}
}
return m_brain;
}
}
public Action OnDoubleTap;
private Dictionary levelInButtons = new Dictionary();
//private
private LatticeSelectInfo m_curInteractionInfo;
///
/// 聚焦该层级.
///
///
public static void FocusLevel(int level)
{
if (Brain.levelInButtons.TryGetValue(level, out LatticeSelectInfo info))
{
Brain.m_curInteractionInfo = info;
}
}
public static void RegButton(LatticeButton btn)
{
LatticeSelectInfo lsi;
if (!Brain.levelInButtons.TryGetValue(btn.level, out lsi))
{
lsi = Brain.levelInButtons[btn.level] = new LatticeSelectInfo();
}
lsi.AddButton(btn);
}
public static void CleanLevel(int level)
{
if (Brain.levelInButtons.TryGetValue(level, out LatticeSelectInfo lsi))
{
Brain.levelInButtons.Remove(level);
}
}
public static void RemoveButton(LatticeButton btn)
{
if (Brain.levelInButtons.TryGetValue(btn.level, out LatticeSelectInfo lsi))
{
lsi.RemoveButton(btn);
if (!lsi.HasBtn)
{
Brain.levelInButtons.Remove(btn.level);
}
}
}
public static void SelectButton(LatticeButton btn, bool focusLevel = false)
{
foreach (var item in Brain.levelInButtons)
{
if (item.Key == btn.level)
{
item.Value.SelectButton(btn);
if (focusLevel)
{
Brain.m_curInteractionInfo = item.Value;
}
break;
}
}
}
private void Awake()
{
TouchEventCtrl.Instance.OnDoubleTap += OnDoubleTapCall;
TouchEventCtrl.Instance.OnSimpleTap += OnSimpleTap;
TouchEventCtrl.Instance.OnSwipeLeftEnd += OnSwipeLeftEnd;
TouchEventCtrl.Instance.OnSwipeRightEnd += OnSwipeRightEnd;
}
private void OnDisable()
{
m_brain = null;
}
private void OnDestroy()
{
TouchEventCtrl.Instance.OnDoubleTap -= OnDoubleTapCall;
TouchEventCtrl.Instance.OnSimpleTap -= OnSimpleTap;
TouchEventCtrl.Instance.OnSwipeLeftEnd -= OnSwipeLeftEnd;
TouchEventCtrl.Instance.OnSwipeRightEnd -= OnSwipeRightEnd;
}
private void OnSwipeLeftEnd()
{
if (m_curInteractionInfo == null)
{
return;
}
m_curInteractionInfo.SelectPreview();
}
private void OnSwipeRightEnd()
{
if (m_curInteractionInfo == null)
{
return;
}
m_curInteractionInfo.SelectNext();
}
private void OnDoubleTapCall()
{
if (m_curInteractionInfo == null)
{
return;
}
OnDoubleTap?.Invoke();
}
private void OnSimpleTap()
{
if (m_curInteractionInfo == null)
{
return;
}
m_curInteractionInfo.OnBtnClick();
}
private class SameLevelBtnCompair : IComparer
{
public int Compare(LatticeButton x, LatticeButton y)
{
return x.order - y.order;
}
}
private class LatticeSelectInfo
{
private bool m_btnSelected = false;//有没有按钮选择着
public LatticeButton mono;//有可能被销毁了.
public List btns = new List();
private SameLevelBtnCompair m_compair = new SameLevelBtnCompair();
public bool HasBtn { get { return btns.Count > 0; } }
public void AddButton(LatticeButton btn)
{
for (int i = 0; i < btns.Count; i++)
{
if (btns[i] == btn)
{
return;//重复
}
}
btns.Add(btn);
btns.Sort(m_compair);
}
public void RemoveButton(LatticeButton lb)
{
if (!btns.Contains(lb))
{
return;
}
if (mono == lb)
{
//相等
m_btnSelected = false;
}
btns.Remove(lb);
lb.MonoUnFocus();
}
public void SelectButton(LatticeButton lb)
{
if (!btns.Contains(lb))
{
return;
}
if(mono == lb)
{
return;
}
lb.MonoFocus();
if (!m_btnSelected)
{
//之前没有选中的。
mono = lb;
m_btnSelected = true;
return;
}
if (mono != null)
{
mono.MonoUnFocus();//上一个按钮取消聚焦。
}
mono = lb;
}
public void SelectNext()
{
if (!OnBtnModifyCheck())
{
return;
}
for (int i = 0; i < btns.Count; i++)
{
if (btns[i] == mono)
{
if (i == (btns.Count - 1))
{
SelectButton(btns[0]);
}
else
{
SelectButton(btns[i + 1]);
}
break;
}
}
}
public void SelectPreview()
{
if (!OnBtnModifyCheck())
{
return;
}
for (int i = 0; i < btns.Count; i++)
{
if (btns[i] == mono)
{
if (i == 0)
{
SelectButton(btns[btns.Count - 1]);
}
else
{
SelectButton(btns[i - 1]);
}
break;
}
}
}
private bool OnBtnModifyCheck()
{
if (btns.Count <= 0)
{
return false;
}
if (mono == null || !btns.Contains(mono))
{
SelectButton(btns[0]);
return false;
}
if (btns.Count == 1 && btns.Contains(mono))
{
//只有一个
return false;
}
return true;
}
public void OnBtnClick()
{
if (mono != null)
{
mono.onClick?.Invoke();
}
}
}
}