2025-09-08 17:37:12 +08:00

214 lines
9.3 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using SuperTreeView;
using System.Collections.Generic;
using System.Xml.Serialization;
using UnityEngine;
using UnityEngine.UI;
using ZXKFramework;
namespace DongWuYiXue.DaoNiaoShu
{
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;
}
}
}