214 lines
9.3 KiB
C#
Raw Normal View History

2025-09-08 14:51:28 +08:00
using SuperTreeView;
using System.Collections.Generic;
using System.Xml.Serialization;
using UnityEngine;
using UnityEngine.UI;
using ZXKFramework;
2025-09-08 17:37:12 +08:00
namespace DongWuYiXue.DaoNiaoShu
2025-09-08 14:51:28 +08:00
{
public class TData_R
{
public List<TData_1> data_1s = new();
}
public class TData_1
{
public List<TData_2> data_2s = new();
public string name;
public string data;
}
public class TData_2
{
public string name;
public string data;
}
public class TreeViewPanel : UIBase
{
public override string GroupName => "TreeViewPanel";
public override string Name => "TreeViewPanel";
public TreeView mTreeView;
int mCurSelectedItemId = 0;
UIDynamicMover uIDynamicMover;
public ScrollRect scrollRect;
//Action<string> onclick;
bool isDestroy;
public override void Init(IUIManager uictrl)
{
base.Init(uictrl);
scrollRect = transform.FindFirst<ScrollRect>("TreeScrollView");
mTreeView = transform.FindFirst<TreeView>("TreeView");
uIDynamicMover = transform.FindFirst<UIDynamicMover>("arrBtn");
mTreeView.OnItemCustomEvent = OnItemCustomEvent;
mTreeView.OnItemExpandBegin = OnItemExpandBegin;
mTreeView.OnItemCollapseBegin = OnItemCollapseBegin;
}
public void BuildButton(TData_R data_R)
{
//onclick = callBack;
mTreeView.InitView();
foreach (var item1 in data_R.data_1s)
{
TreeViewItem t1 = mTreeView.AppendItem("ItemPrefab1");
t1.GetComponent<ItemPrefab1>().SetItemInfo(item1.name, item1.data);
foreach (var item2 in item1.data_2s)
{
TreeViewItem t2 = t1.ChildTree.AppendItem("ItemPrefab2");
t2.GetComponent<ItemPrefab2>().SetItemInfo(item2.name, item2.data);
}
}
mTreeView.CollapseAllItem();
}
private void OnItemCollapseBegin(TreeViewItem item)
{
ItemPrefab1 st = item.GetComponent<ItemPrefab1>();
st.SetExpandStatus(false);
}
private void OnItemExpandBegin(TreeViewItem item)
{
ItemPrefab1 st = item.GetComponent<ItemPrefab1>();
st.SetExpandStatus(true);
}
private void OnItemCustomEvent(TreeViewItem item, SuperTreeView.CustomEvent @event, object arg3)
{
if (GetModel<Main.GameModel>().modeType == ModeType.KaoHe) return;
if (@event == SuperTreeView.CustomEvent.ItemClicked)
{
Debug.Log(arg3);
OnItemSelect(item);
Game.Instance.uiManager.ShowUI<LoadingPanel>();
GameManager.Instance.fsm.PlayClip("<22><><EFBFBD><EFBFBD>");
GameManager.Instance.sceneDataHandler.LoadSceneDataFromJson(GetModel<Main.GameModel>().mainData.folder + "/SaveData/" + (string)arg3 + ".json", () =>
{
GameManager.Instance.fsm.ChangeState((string)arg3);
Game.Instance.uiManager.CloseUI<LoadingPanel>();
});
}
}
private void OnItemSelect(TreeViewItem item)
{
ItemPrefab2 st = item.GetComponent<ItemPrefab2>();
if (mCurSelectedItemId > 0)
{
if (item.ItemId == mCurSelectedItemId)
{
return;
}
TreeViewItem curSelectedItem = mTreeView.GetTreeItemById(mCurSelectedItemId);
if (curSelectedItem != null)
{
curSelectedItem.GetComponent<ItemPrefab2>().IsSelected = false;
}
mCurSelectedItemId = 0;
}
st.IsSelected = true;
mCurSelectedItemId = item.ItemId;
}
public void Locate(string name1, string name2)
{
mTreeView.CollapseAllItem();
ItemPrefab1[] itemPrefab1s = mTreeView.GetComponentsInChildren<ItemPrefab1>();
ItemPrefab1 itemPrefab1 = null;
for (int i = 0; i < itemPrefab1s.Length; i++)
{
if (itemPrefab1s[i].TextName.text == name1)
{
Nevigate(itemPrefab1s[i].GetComponent<RectTransform>());
itemPrefab1s[i].GetComponent<TreeViewItem>().Expand();
itemPrefab1s[i].IsSelected = true;
itemPrefab1 = itemPrefab1s[i];
}
}
if (itemPrefab1 != null)
{
ItemPrefab2[] itemPrefab2s = itemPrefab1.GetComponentsInChildren<ItemPrefab2>();
for (int i = 0; i < itemPrefab2s.Length; i++)
{
if (itemPrefab2s[i].TextName.text == name2)
{
OnItemSelect(itemPrefab2s[i].GetComponent<TreeViewItem>());
}
}
}
//Nevigate(itemPrefab1s[i].GetComponent<RectTransform>());
}
public void Nevigate(RectTransform item)
{
// InverseTransformPoint: Transforms position from world space to local space, <20><>TransformPoint<6E><74><EFBFBD><EFBFBD><EFBFBD>
// <20><EFBFBD><E2B2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD> item<65><6D>viewport<72><74>localPositionת<6E><D7AA><EFBFBD><EFBFBD>ͬһ<CDAC><D2BB><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5>£<EFBFBD><C2A3><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>IJ<EFBFBD>ֵ
// <20><>ͼ1
Vector3 itemCurrentLocalPostion = scrollRect.GetComponent<RectTransform>().InverseTransformPoint(ConvertLocalPosToWorldPos(item));
Vector3 itemTargetLocalPos = scrollRect.GetComponent<RectTransform>().InverseTransformPoint(ConvertLocalPosToWorldPos(scrollRect.viewport));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>ľ<EFBFBD><C4BE><EFBFBD>
Vector3 diff = itemTargetLocalPos - itemCurrentLocalPostion;
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>item<65><6D><EFBFBD><EFBFBD>viewport<72><74><EFBFBD><EFBFBD>ʱ verticalNormalizedPosition = 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ horizontalNormalizedPosition = 0<><30><EFBFBD><EFBFBD>ͼ2
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>ľ<EFBFBD><C4BE><EFBFBD>ռ<EFBFBD>ıȣ<C4B1><C8A3><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6>ľ<EFBFBD><C4BE><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>ȵİٷֱȣ<D6B1><C8A3><EFBFBD>ͼ3
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> viewport <20><>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ʾһ<CABE><D2BB>item<65>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD><EFBFBD>dz<EFBFBD><C7B3><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD>
// <20><><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>verticalNormalizedPosition = 0<><30><EFBFBD><EFBFBD>һ<EFBFBD><D2BB> item <20><><EFBFBD><EFBFBD> viewport<72><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>һ<EFBFBD>ξ<EFBFBD><CEBE><EFBFBD><EFBFBD>ģ<EFBFBD>
// <20><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ȥ<EFBFBD><C8A5><EFBFBD>ξ<EFBFBD><CEBE>룬diff.y - offset<65><74><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD> newNormalizedPosition<6F><6E><EFBFBD><EFBFBD>ͼ4
var newNormalizedPosition = new Vector2(
diff.x / (scrollRect.content.GetComponent<RectTransform>().rect.width - scrollRect.viewport.rect.width),
diff.y / (scrollRect.content.GetComponent<RectTransform>().rect.height - scrollRect.viewport.rect.height)
);
// <20><>ʱ normalizedPosition - <20><>Ҫ<EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD>ռ<EFBFBD><D5BC>newNormalizedPosition<6F><6E><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>յ<EFBFBD>λ<EFBFBD><CEBB>normalizedPosition
newNormalizedPosition = scrollRect.GetComponent<ScrollRect>().normalizedPosition - newNormalizedPosition;
newNormalizedPosition.x = Mathf.Clamp01(newNormalizedPosition.x);
newNormalizedPosition.y = Mathf.Clamp01(newNormalizedPosition.y);
// Ҳ<><D2B2><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD> horizontalNormalizedPosition<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD> verticalNormalizedPosition
// <20><><EFBFBD><EFBFBD> normalizedPosition <20><><EFBFBD><EFBFBD>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD> horizontalNormalizedPosition<6F><6E> verticalNormalizedPosition
// normalizedPosition.x == horizontalNormalizedPosition
// normalizedPosition.y == verticalNormalizedPosition
// normalizedPosition == new Vector2(horizontalNormalizedPosition, verticalNormalizedPosition)
scrollRect.GetComponent<ScrollRect>().normalizedPosition = newNormalizedPosition;
// <20><><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>type1,scrollview<65><77><EFBFBD><EFBFBD>ʾtype1<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>type2<65><32>scrollview<65><77><EFBFBD><EFBFBD>ʾtype2<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>Ҫ<EFBFBD>ڸ<EFBFBD>
// normalizedPosition <20><>ֵǰ<D6B5>ȸ<EFBFBD>ֵ (0, 0)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1> normalizedPosition <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD> type <20>е<EFBFBD>
// normalizedPosition<6F><6E><EFBFBD><EFBFBD><EFBFBD>³<EFBFBD>bug
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Pivot<6F><74>ֵ<EFBFBD><D6B5>Ӱ<EFBFBD>죬Pivot<6F><74><EFBFBD><EFBFBD>(0.5<EFBFBD><EFBFBD>0.5)ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(0.5, 0.5)<29>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD> target.parent.TransformPoint(localPosition)
private Vector3 ConvertLocalPosToWorldPos(RectTransform target)
{
var pivotOffset = new Vector3(
(0.5f - target.pivot.x) * target.rect.size.x,
(0.5f - target.pivot.y) * target.rect.size.y,
0f);
var localPosition = target.localPosition + pivotOffset;
// TransformPoint: Transforms position from local space to world space
return target.parent.TransformPoint(localPosition);
}
public void LockAllBtn()
{
//ItemPrefab1[] itemPrefab1s = mTreeView.GetComponentsInChildren<ItemPrefab1>(true);
//for (int i = 0; i < itemPrefab1s.Length; i++)
//{
// itemPrefab1s[i].LockClick();
//}
ItemPrefab2[] itemPrefab2s = mTreeView.GetComponentsInChildren<ItemPrefab2>(true);
for (int i = 0; i < itemPrefab2s.Length; i++)
{
itemPrefab2s[i].LockClick();
}
}
public void UnLockAllBtn()
{
if (mTreeView == null) return;
ItemPrefab2[] itemPrefab2s = mTreeView.GetComponentsInChildren<ItemPrefab2>(true);
for (int i = 0; i < itemPrefab2s.Length; i++)
{
itemPrefab2s[i].UnlockClick();
}
}
private void OnDestroy()
{
isDestroy = true;
}
}
}