199 lines
6.7 KiB
C#
199 lines
6.7 KiB
C#
using UnityEngine;
|
||
using UnityEngine.UI;
|
||
using QFramework;
|
||
using TMPro;
|
||
using System.Collections.Generic;
|
||
using System;
|
||
|
||
namespace QFramework.Example
|
||
{
|
||
public class UIKnowledgeData : UIPanelData
|
||
{
|
||
public XMLTool.Knowledge knowledge;
|
||
}
|
||
public partial class UIKnowledge : UIPanel
|
||
{
|
||
ResLoader loader;
|
||
|
||
Dictionary<string, Sprite> sprites = new Dictionary<string, Sprite>();
|
||
IAction curAction;
|
||
|
||
protected override void OnInit(IUIData uiData = null)
|
||
{
|
||
mData = uiData as UIKnowledgeData ?? new UIKnowledgeData();
|
||
// please add init code here
|
||
loader = ResLoader.Allocate();
|
||
CloseBtn.onClick.AddListener(() =>
|
||
{
|
||
Hide();
|
||
});
|
||
}
|
||
|
||
protected override void OnOpen(IUIData uiData = null)
|
||
{
|
||
if (Global.Instance.curModule.knowledge != null && Global.Instance.curModule.knowledge.items != null)
|
||
{
|
||
LeftContent.RemoveAllChildren();
|
||
string bg = Global.Instance.curModule.knowledge.bgImage;
|
||
LoadBgImage(bg, () =>
|
||
{
|
||
SetRightContentPos("");
|
||
RefreshComponents(Global.Instance.curModule.knowledge.components, GlobalComs);
|
||
});
|
||
foreach (var item in Global.Instance.curModule.knowledge.items)
|
||
{
|
||
ItemFactory(item);
|
||
}
|
||
}
|
||
}
|
||
|
||
public void ItemFactory(XMLTool.Knowledge.Item itemData, Transform parent = null)
|
||
{
|
||
Transform content = parent == null ? LeftContent : parent;
|
||
GameObject leftObj = GameObject.Instantiate(LeftItem.gameObject, content);
|
||
Transform subContent = leftObj.transform.Find("SubContent");
|
||
Toggle toggle = leftObj.transform.Find("Toggle").GetComponent<Toggle>();
|
||
TextMeshProUGUI label = toggle.transform.Find("Name").GetComponent<TextMeshProUGUI>();
|
||
label.text = itemData.title;
|
||
|
||
toggle.onValueChanged.AddListener(isOn =>
|
||
{
|
||
if (isOn)
|
||
{
|
||
LoadBgImage(itemData.bgImage, () =>
|
||
{
|
||
SetRightContentPos(itemData.setPos);
|
||
});
|
||
ItemComs.RemoveAllChildren();
|
||
RefreshComponents(itemData.components, ItemComs);
|
||
}
|
||
|
||
if (subContent.childCount > 0)
|
||
{
|
||
subContent.gameObject.SetActive(isOn);
|
||
if (isOn)
|
||
{
|
||
subContent.GetChild(0).GetComponentInChildren<Toggle>().isOn = true;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
label.color = isOn == true ? Color.black : Color.white;
|
||
}
|
||
});
|
||
if (itemData.subs != null && itemData.subs.Count > 0)
|
||
{
|
||
foreach (var sub in itemData.subs)
|
||
{
|
||
ItemFactory(sub, subContent);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
toggle.group = LeftContent.GetComponent<ToggleGroup>();
|
||
}
|
||
}
|
||
/// <summary>
|
||
/// ˢ<>µ<EFBFBD>ǰҳ<C7B0><D2B3><EFBFBD>ĹҼ<C4B9>
|
||
/// </summary>
|
||
public void RefreshComponents(List<XMLTool.Knowledge.Item.Component> coms, Transform content)
|
||
{
|
||
if (coms != null && coms.Count > 0)
|
||
{
|
||
foreach (var ComData in coms)
|
||
{
|
||
switch (ComData.type)
|
||
{
|
||
case "Button":
|
||
GameObject btn = GameObject.Instantiate(BtnPrefab.gameObject, content);
|
||
btn.GetComponent<RectTransform>().sizeDelta = Utility.GetVector2FromStrArray(ComData.size);
|
||
btn.transform.localPosition = Utility.GetVector2FromStrArray(ComData.pos);
|
||
btn.GetComponent<Button>().onClick.AddListener(() =>
|
||
{
|
||
if (curAction != null)
|
||
{
|
||
curAction.Deinit();
|
||
curAction = null;
|
||
}
|
||
curAction = ActionHelper.GetActionAndSub(ComData.action);
|
||
curAction.StartGlobal(() =>
|
||
{
|
||
curAction = null;
|
||
});
|
||
});
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
public void LoadBgImage(string bg, Action callback = null)
|
||
{
|
||
if (string.IsNullOrEmpty(bg) == false)
|
||
{
|
||
if (sprites.ContainsKey(bg))
|
||
{
|
||
RightContent.sprite = sprites[bg];
|
||
RightContent.SetNativeSize();
|
||
callback?.Invoke();
|
||
}
|
||
else
|
||
{
|
||
var localImageUrl = Global.imagePath + bg;
|
||
loader.Add2Load(localImageUrl.ToNetImageResName(), (success, res) =>
|
||
{
|
||
if (success)
|
||
{
|
||
Sprite sprite = Utility.GetSprite(res.Asset.As<Texture2D>());
|
||
if (sprites.ContainsKey(bg) == false)
|
||
{
|
||
sprites.Add(bg, sprite);
|
||
}
|
||
}
|
||
|
||
});
|
||
TypeEventSystem.Global.Send<OnLoadingShow>();
|
||
loader.LoadAsync(() =>
|
||
{
|
||
callback?.Invoke();
|
||
RightContent.sprite = sprites[bg];
|
||
RightContent.SetNativeSize();
|
||
TypeEventSystem.Global.Send<OnLoadingHide>();
|
||
});
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
callback?.Invoke();
|
||
}
|
||
|
||
}
|
||
public void SetRightContentPos(string setPos)
|
||
{
|
||
Vector2 pos = default;
|
||
if (string.IsNullOrEmpty(setPos) == false)
|
||
{
|
||
pos = Utility.GetVector2FromStrArray(setPos);
|
||
}
|
||
RightContent.rectTransform.anchoredPosition = pos;
|
||
}
|
||
|
||
|
||
protected override void OnShow()
|
||
{
|
||
}
|
||
|
||
protected override void OnHide()
|
||
{
|
||
}
|
||
|
||
protected override void OnClose()
|
||
{
|
||
sprites.Clear();
|
||
loader.ReleaseAllRes();
|
||
}
|
||
}
|
||
}
|