2026-04-08 19:32:52 +08:00

568 lines
25 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;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using ZXKFramework;
using static UnityEditor.Progress;
namespace YiLiao.XinFeiTingZhen
{
public class TreeViewPanel : UIBase
{
public override string GroupName => "TreeViewPanel";
public override string Name => "TreeViewPanel";
public TreeView mTreeView;
int mCurSelectedItemId = 0;
public ScrollRect scrollRect;
// ================= 新增:缓存映射变量 =================
// Key: 数据ID (如 "DiYiXinYin"), Value: 对应的 TreeViewItem
private Dictionary<string, TreeViewItem> m_dataNodeMap = new Dictionary<string, TreeViewItem>();
// Key: 子节点, Value: 父节点 (用于向上回溯)
private Dictionary<TreeViewItem, TreeViewItem> m_parentMap = new Dictionary<TreeViewItem, TreeViewItem>();
// 虚拟根节点引用,作为回溯的终点
private TreeViewItem m_virtualRootInstance;
// =====================================================
public override void Init(IUIManager uictrl)
{
base.Init(uictrl);
scrollRect = transform.FindFirst<ScrollRect>("TreeScrollView");
mTreeView = transform.FindFirst<TreeView>("TreeView");
mTreeView.OnTreeListAddOneItem = OnTreeListAddOneItem;
mTreeView.OnItemExpandBegin = OnItemExpandBegin;
mTreeView.OnItemCollapseBegin = OnItemCollapseBegin;
mTreeView.OnItemCustomEvent = OnItemCustomEvent;
mTreeView.OnTreeListRepositionFinish = OnTreeListRepositionFinish;
mTreeView.InitView();
BuildTreeAutomatically();
mTreeView.CollapseAllItem();
}
void BuildTreeAutomatically()
{
var datas1 = new List<string[]>
{
// --- 胸部体表标志 ---
new[] { "胸部体表标志", "胸骨柄", "XiongGuBing" },
new[] { "胸部体表标志", "胸骨上切迹", "XiongGuShangQieJi" },
new[] { "胸部体表标志", "胸骨角", "XiongGuJiao" },
new[] { "胸部体表标志", "剑突", "JianTu" },
new[] { "胸部体表标志", "1-7肋骨", "LeiGu1_7" },
new[] { "胸部体表标志", "11-12肋骨", "LeiGu11_12" },
new[] { "胸部体表标志", "肋间隙", "LeiJianXi" },
new[] { "胸部体表标志", "肩胛骨", "JianJiaGu" },
new[] { "胸部体表标志", "肩胛下角", "JianJiaXiaJiao" },
// --- 垂直线标志 ---
new[] { "垂直线标志", "前正中线", "QianZhengZhongXian" },
new[] { "垂直线标志", "(左、右)锁骨中线", "SuoGuZhongXian" },
new[] { "垂直线标志", "(左、右)胸骨线", "XiongGuXian" },
new[] { "垂直线标志", "(左、右)胸骨旁线", "XiongGuPangXian" },
new[] { "垂直线标志", "(左、右)腋前线", "YeQianXian" },
new[] { "垂直线标志", "(左、右)腋后线", "YeHouXian" },
new[] { "垂直线标志", "(左、右)腋中线", "YeZhongXian" },
new[] { "垂直线标志", "(左、右)肩胛线", "JianJiaXian" },
new[] { "垂直线标志", "后正中线", "HouZhengZhongXian" },
// --- 解剖区域 ---
new[] { "解剖区域", "(左、右)肩胛上区", "JianJiaShangQu" },
new[] { "解剖区域", "(左、右)肩胛下区", "JianJiaXiaQu" },
new[] { "解剖区域", "(左、右)肩胛间区", "JianJiaQuJian" },
// --- 动画 ---
new[] { "肺功能动画", "FeiGongNengDongHua" },
new[] { "心功能动画", "XinGongNengDongHua" },
// --- 肺部听诊 ---
new[] { "肺部听诊", "正常呼吸音", "气管呼吸音", "QiGuanHuXiYin" },
new[] { "肺部听诊", "正常呼吸音", "支气管呼吸音", "ZhiQiGuanHuXiYin" },
new[] { "肺部听诊", "正常呼吸音", "支气管肺泡呼吸音", "ZhiQiGuanFeiPaoHuXiYin" },
new[] { "肺部听诊", "正常呼吸音", "肺泡呼吸音", "FeiPaoHuXiYin" },
new[] { "肺部听诊", "异常呼吸音", "异常肺泡呼吸音", "肺泡呼吸音减弱或消失", "FeiPaoHuXiYinJianRuoHuoXiaoShi" },
new[] { "肺部听诊", "异常呼吸音", "异常肺泡呼吸音", "肺泡呼吸音增强", "FeiPaoHuXiYinZengQiang" },
new[] { "肺部听诊", "异常呼吸音", "异常肺泡呼吸音", "呼吸音延长", "HuXiYinYanChang" },
new[] { "肺部听诊", "异常呼吸音", "异常肺泡呼吸音", "断续性呼吸音", "DuanXuXingHuXiYin" },
new[] { "肺部听诊", "异常呼吸音", "异常肺泡呼吸音", "粗糙性呼吸音", "CuCaoXingHuXiYin" },
new[] { "肺部听诊", "异常呼吸音", "异常支气管呼吸音", "YiChangZhiQiGuanHuXiYin" },
new[] { "肺部听诊", "异常呼吸音", "异常支气管肺泡呼吸音", "YiChangZhiQiGuanFeiPaoHuXiYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "粗湿啰音(大水泡音)", "CuShiLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "中湿啰音(中水泡音)", "ZhongShiLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "细湿啰音(小水泡音)", "XiShiLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "Velcro啰音", "VelcroLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "捻发音", "NianFaYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "高调干啰音(哨笛音)", "GaoDiaoGanLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "低调干啰音(鼾音)", "DiDiaoGanLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "胸膜摩擦音", "XiongMoMoCaYin" },
// --- 心脏听诊 ---
new[] { "心脏听诊", "心脏瓣膜听诊区", "二尖瓣区(心尖区)", "ErJianBanQu" },
new[] { "心脏听诊", "心脏瓣膜听诊区", "肺动脉瓣区", "FeiDongMaiBanQu" },
new[] { "心脏听诊", "心脏瓣膜听诊区", "主动脉瓣区", "ZhuDongMaiBanQu" },
new[] { "心脏听诊", "心脏瓣膜听诊区", "主动脉瓣第二听诊区", "ZhuDongMaiBanDiErTingZhenQu" },
new[] { "心脏听诊", "心脏瓣膜听诊区", "三尖瓣区", "SanJianBanQu" },
new[] { "心脏听诊", "心率", "XinLv" },
new[] { "心脏听诊", "心音", "第一心音", "DiYiXinYin" },
new[] { "心脏听诊", "心音", "第二心音", "DiErXinYin" },
new[] { "心脏听诊", "心音", "第三心音", "DiSanXinYin" },
new[] { "心脏听诊", "心音", "第四心音", "DiSiXinYin" },
new[] { "心脏听诊", "心音", "第一心音增强", "DiYiXinYinZengQiang" },
new[] { "心脏听诊", "心音", "第一心音减弱", "DiYiXinYinJianRuo" },
new[] { "心脏听诊", "心音", "第一心音强弱不等", "DiYiXinYinQiangRuoBuDeng" },
//new[] { "心脏听诊", "心音", "第二心音增强", "DiErXinYinZengQiang" },
new[] { "心脏听诊", "心音", "第二心音减弱", "DiErXinYinJianRuo" },
new[] { "心脏听诊", "心音", "第一心音分裂", "DiYiXinYinFenLie" },
new[] { "心脏听诊", "心音", "第二心音通常分裂", "DiErXinYinTongChangFenLie" },
new[] { "心脏听诊", "心音", "第二心音固定分裂", "DiErXinYinGuDingFenLie" },
new[] { "心脏听诊", "心音", "第二心音反常分裂", "DiErXinYinFanChangFenLie" },
new[] { "心脏听诊", "额外心音", "舒张期额外心音", "舒张早期奔马律", "ShuZhangZaoQiBenMaLv" },
new[] { "心脏听诊", "额外心音", "舒张期额外心音", "舒张晚期奔马律", "ShuZhangWanQiBenMaLv" },
new[] { "心脏听诊", "额外心音", "舒张期额外心音", "开瓣音", "KaiBanYin" },
new[] { "心脏听诊", "额外心音", "收缩期额外心音", "收缩中、晚期喀喇音", "ShouSuoZhongWanQiKaLaYin" },
new[] { "心脏听诊", "心脏杂音", "收缩期杂音", "二尖瓣区", "ErJianBanQu2" },
new[] { "心脏听诊", "心脏杂音", "收缩期杂音", "主动脉瓣区", "ZhuDongMaiBanQu2" },
new[] { "心脏听诊", "心脏杂音", "收缩期杂音", "肺动脉瓣区", "FeiDongMaiBanQu2" },
new[] { "心脏听诊", "心脏杂音", "收缩期杂音", "三尖瓣区", "SanJianBanQu2" },
new[] { "心脏听诊", "心脏杂音", "舒张期杂音", "二尖瓣区", "ErJianBanQu3" },
new[] { "心脏听诊", "心脏杂音", "舒张期杂音", "主动脉瓣区", "ZhuDongMaiBanQu3" },
new[] { "心脏听诊", "心脏杂音", "舒张期杂音", "肺动脉瓣区", "FeiDongMaiBanQu3" },
new[] { "心脏听诊", "心脏杂音", "舒张期杂音", "三尖瓣区", "SanJianBanQu3" },
new[] { "心脏听诊", "心脏杂音", "连续性杂音", "LianXuXingZaYin" },
new[] { "心脏听诊", "心脏杂音", "心包摩擦音", "XinBaoMoCaYin" }
};
var datas2 = new List<string[]>
{
// --- 胸部体表标志 ---
new[] { "胸部体表标志", "胸骨柄", "XiongGuBing" },
new[] { "胸部体表标志", "胸骨上切迹", "XiongGuShangQieJi" },
new[] { "胸部体表标志", "胸骨角", "XiongGuJiao" },
new[] { "胸部体表标志", "剑突", "JianTu" },
new[] { "胸部体表标志", "浮肋", "FuLei" },
new[] { "胸部体表标志", "肩胛骨、肩胛下角", "JianJiaGuJianJiaXiaJiao" },
// --- 垂直线标志 ---
new[] { "垂直线标志", "前正中线", "QianZhengZhongXian" },
new[] { "垂直线标志", "(左、右)锁骨中线", "SuoGuZhongXian" },
new[] { "垂直线标志", "(左、右)胸骨线", "XiongGuXian" },
new[] { "垂直线标志", "(左、右)胸骨旁线", "XiongGuPangXian" },
new[] { "垂直线标志", "(左、右)腋中线", "YeZhongXian" },
new[] { "垂直线标志", "(左、右)肩胛线", "JianJiaXian" },
// --- 解剖区域 ---
new[] { "解剖区域", "(左、右)肩胛上区", "JianJiaShangQu" },
new[] { "解剖区域", "(左、右)肩胛下区", "JianJiaXiaQu" },
new[] { "解剖区域", "(左、右)肩胛间区", "JianJiaQuJian" },
// --- 肺部听诊 ---
new[] { "肺部听诊", "正常呼吸音", "支气管呼吸音", "ZhiQiGuanHuXiYin" },
new[] { "肺部听诊", "正常呼吸音", "支气管肺泡呼吸音", "ZhiQiGuanFeiPaoHuXiYin" },
new[] { "肺部听诊", "正常呼吸音", "肺泡呼吸音", "FeiPaoHuXiYin" },
new[] { "肺部听诊", "异常呼吸音", "异常肺泡呼吸音", "肺泡呼吸音减弱或消失", "FeiPaoHuXiYinJianRuoHuoXiaoShi" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "干啰音", "GanLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "低调干啰音(鼾音)", "DiDiaoGanLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "湿啰音", "ShiLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "啰音", "干啰音&湿啰音", "GanLuoYin_ShiLuoYin" },
new[] { "肺部听诊", "异常呼吸音", "胸膜摩擦音", "XiongMoMoCaYin" },
// --- 心脏听诊 ---
new[] { "心脏听诊", "心脏瓣膜听诊区", "二尖瓣区(心尖区)", "ErJianBanQu" },
new[] { "心脏听诊", "额外心音", "舒张期额外心音", "舒张早期奔马律", "ShuZhangZaoQiBenMaLv" },
new[] { "心脏听诊", "心脏杂音", "连续性杂音", "LianXuXingZaYin" },
new[] { "心脏听诊", "心脏杂音", "心包摩擦音", "XinBaoMoCaYin" }
};
var datas = new List<String[]>();
if(MVC.GetModel<Main.GameModel>().modeType == ModeType.ShiXun)
{
datas = datas1;
}
if (MVC.GetModel<Main.GameModel>().modeType == ModeType.KaoHe)
{
datas = datas2;
}
// 【重要】初始化虚拟根节点并保存引用
m_virtualRootInstance = new TreeViewItem();
// 缓存结构Key=父节点对象, Value=该父节点下的子节点字典 (名称->节点对象)
var nodeCache = new Dictionary<TreeViewItem, Dictionary<string, TreeViewItem>>();
nodeCache[m_virtualRootInstance] = new Dictionary<string, TreeViewItem>();
// 【重要】清空旧的映射数据
m_dataNodeMap.Clear();
m_parentMap.Clear();
foreach (var row in datas)
{
if (row.Length == 0) continue;
TreeViewItem currentParent = m_virtualRootInstance;
int nodeCount = row.Length - 1;
for (int i = 0; i < nodeCount; i++)
{
string nodeName = row[i];
bool isLastNodeInRow = (i == nodeCount - 1);
string payload = isLastNodeInRow ? row[row.Length - 1] : null;
if (!nodeCache.ContainsKey(currentParent))
{
nodeCache[currentParent] = new Dictionary<string, TreeViewItem>();
}
var childrenMap = nodeCache[currentParent];
TreeViewItem newNode;
if (childrenMap.TryGetValue(nodeName, out newNode))
{
// 节点已存在,复用
// 注意:如果数据结构可能变化,这里可能需要更新 payload但通常静态数据无需处理
}
else
{
// 创建新节点
if (currentParent == m_virtualRootInstance)
{
newNode = mTreeView.AppendItem("ItemPrefab1");
}
else
{
newNode = currentParent.ChildTree.AppendItem("ItemPrefab1");
}
// 【核心修改 1】记录父子关系 (用于后续回溯展开)
// 即使父节点是虚拟根,也记录下来,方便判断边界
if (!m_parentMap.ContainsKey(newNode))
{
m_parentMap[newNode] = currentParent;
}
var script = newNode.GetComponent<ItemScript2>();
if (script != null)
{
if (!string.IsNullOrEmpty(payload))
{
script.SetItemInfo("", nodeName, payload);
// 【核心修改 2】记录数据ID到节点的映射
if (!m_dataNodeMap.ContainsKey(payload))
{
m_dataNodeMap.Add(payload, newNode);
}
else
{
Debug.LogWarning($"[TreeViewPanel] 发现重复的数据ID: {payload},将覆盖旧节点引用。");
m_dataNodeMap[payload] = newNode;
}
}
else
{
script.SetItemInfo("", nodeName);
}
}
childrenMap[nodeName] = newNode;
nodeCache[newNode] = new Dictionary<string, TreeViewItem>();
}
currentParent = newNode;
}
}
//Debug.Log($"TreeView 构建完成!共处理 {datas.Count} 条数据,索引了 {m_dataNodeMap.Count} 个可检索节点。");
}
// ================= 新增:自动展开方法 =================
/// <summary>
/// 根据数据ID自动查找并展开树节点
/// </summary>
/// <param name="targetDataId">数据ID例如 "DiYiXinYin"</param>
public void Expand(string targetDataId)
{
mTreeView.CollapseAllItem();
if (string.IsNullOrEmpty(targetDataId))
{
Debug.LogWarning("[TreeViewPanel] Expand failed: targetDataId is null or empty.");
return;
}
if (!m_dataNodeMap.TryGetValue(targetDataId, out TreeViewItem targetItem))
{
Debug.LogWarning($"[TreeViewPanel] 未找到数据ID为 '{targetDataId}' 的节点。请检查 ID 是否正确或树是否已构建。");
return;
}
//Debug.Log($"[TreeViewPanel] 找到目标节点: {targetDataId},开始自动展开路径...");
List<TreeViewItem> nodesToExpand = new List<TreeViewItem>();
TreeViewItem curr = targetItem;
// 1. 向上回溯收集所有需要展开的父节点
while (m_parentMap.ContainsKey(curr))
{
TreeViewItem parent = m_parentMap[curr];
// 如果遇到虚拟根节点,停止回溯(虚拟根不需要也不应该被调用 Expand
if (parent == m_virtualRootInstance)
{
break;
}
nodesToExpand.Add(parent);
curr = parent;
}
// 2. 反转列表,确保从最外层父节点开始展开 (Root -> ... -> Parent)
nodesToExpand.Reverse();
// 3. 依次展开父节点
foreach (var node in nodesToExpand)
{
if (!node.IsExpand)
{
node.Expand();
}
}
// 4. 展开目标节点本身(如果它有子节点)
if (!targetItem.IsExpand && targetItem.ChildItemCount > 0)
{
targetItem.Expand();
}
ItemScript2 st = targetItem.GetComponent<ItemScript2>();
if (mCurSelectedItemId > 0)
{
if (targetItem.ItemId != mCurSelectedItemId)
{
TreeViewItem curSelectedItem = mTreeView.GetTreeItemById(mCurSelectedItemId);
if (curSelectedItem != null)
{
curSelectedItem.GetComponent<ItemScript2>().IsSelected = false;
}
mCurSelectedItemId = 0;
}
}
st.IsSelected = true;
mCurSelectedItemId = targetItem.ItemId;
//Debug.Log($"[TreeViewPanel] 成功展开路径至节点: {targetDataId}");
// 5. 滚动到目标节点视野
// 建议延迟一帧执行,确保 UI 布局已经根据 Expand 操作刷新完毕
// 如果 ZXKFramework 没有 CoroutineUtils可以使用 StartCoroutine(IENextFrame())
if (targetItem.CachedRectTransform != null)
{
// 尝试直接调用,如果位置不准,请改为协程下一帧调用
Nevigate(targetItem.CachedRectTransform);
}
}
// =====================================================
void OnTreeListAddOneItem(TreeList treeList)
{
int count = treeList.ItemCount;
TreeViewItem parentTreeItem = treeList.ParentTreeItem;
if (count > 0 && parentTreeItem != null)
{
ItemScript2 st = parentTreeItem.GetComponent<ItemScript2>();
st.SetExpandBtnVisible(true);
st.SetExpandStatus(parentTreeItem.IsExpand);
}
}
void OnItemExpandBegin(TreeViewItem item)
{
ItemScript2 st = item.GetComponent<ItemScript2>();
st.SetExpandStatus(true);
}
void OnItemCollapseBegin(TreeViewItem item)
{
ItemScript2 st = item.GetComponent<ItemScript2>();
st.SetExpandStatus(false);
}
void OnItemCustomEvent(TreeViewItem item, CustomEvent customEvent, System.Object param)
{
if (MVC.GetModel<Main.GameModel>().modeType == ModeType.KaoHe) return;
if (customEvent == CustomEvent.ItemClicked)
{
ItemScript2 st = item.GetComponent<ItemScript2>();
if (mCurSelectedItemId > 0)
{
if (item.ItemId == mCurSelectedItemId)
{
return;
}
TreeViewItem curSelectedItem = mTreeView.GetTreeItemById(mCurSelectedItemId);
if (curSelectedItem != null)
{
curSelectedItem.GetComponent<ItemScript2>().IsSelected = false;
}
mCurSelectedItemId = 0;
}
st.IsSelected = true;
mCurSelectedItemId = item.ItemId;
// 确保 param 是 string 类型
string sceneName = param as string;
if (!string.IsNullOrEmpty(sceneName))
{
GameManager.Instance.fsm.PlayClip("跳步");
GameManager.Instance.sceneDataHandler.LoadSceneDataFromJson(
GetModel<Main.GameModel>().mainData.folder + "/SaveData/" + sceneName + ".json",
() =>
{
GameManager.Instance.fsm.ChangeState(sceneName);
});
}
}
}
void OnTreeListRepositionFinish(TreeList treeList)
{
int count = treeList.ItemCount;
if (count == 0)
{
return;
}
//draw the line linked from item to item
TreeViewItem item0 = treeList.GetItemByIndex(0);
ItemScript2 itemScript0 = item0.GetComponent<ItemScript2>();
float topY = item0.transform.localPosition.y - item0.CachedRectTransform.rect.height / 2;
RectTransform rt0 = itemScript0.mLineVertical.GetComponent<RectTransform>();
RectTransform lineRf = rt0;
for (int i = 1; i < count; ++i)
{
TreeViewItem item = treeList.GetItemByIndex(i);
ItemScript2 itemScript = item.GetComponent<ItemScript2>();
float centerY = item.transform.localPosition.y - item.CachedRectTransform.rect.height / 2;
float dist = topY - centerY;
topY = centerY;
RectTransform rt = itemScript.mLineVertical.GetComponent<RectTransform>();
//set the line length
SetRectTransformHeight(lineRf, dist);
lineRf = rt;
}
SetRectTransformHeight(lineRf, 0);
//draw the line linked from item to item' childTree
for (int i = 0; i < count; ++i)
{
TreeViewItem item = treeList.GetItemByIndex(i);
ItemScript2 itemScript = item.GetComponent<ItemScript2>();
RectTransform rt2 = itemScript.mLineVertical_2.GetComponent<RectTransform>();
if (item.ChildItemCount > 0 && item.IsCollapseEnd == false)
{
//get the childTree's first item
TreeViewItem childItem0 = item.ChildTree.GetItemByIndex(0);
ItemScript2 childItemScript0 = childItem0.GetComponent<ItemScript2>();
Vector3 pos0 = item.transform.InverseTransformPoint(childItemScript0.mExpandBtn.transform.position);
float dist2 = rt2.localPosition.y - pos0.y;
//set the line length
SetRectTransformHeight(rt2, dist2);
}
else
{
SetRectTransformHeight(rt2, 0);
}
}
}
void SetRectTransformHeight(RectTransform rt, float height)
{
Vector2 size = rt.sizeDelta;
size.y = height;
rt.sizeDelta = size;
}
public void Nevigate(RectTransform item)
{
if (scrollRect == null || item == null) return;
Vector3 itemCurrentLocalPostion = scrollRect.GetComponent<RectTransform>().InverseTransformPoint(ConvertLocalPosToWorldPos(item));
Vector3 itemTargetLocalPos = scrollRect.GetComponent<RectTransform>().InverseTransformPoint(ConvertLocalPosToWorldPos(scrollRect.viewport));
Vector3 diff = itemTargetLocalPos - itemCurrentLocalPostion;
var contentRect = scrollRect.content.GetComponent<RectTransform>();
var viewportRect = scrollRect.viewport.rect;
float contentHeight = contentRect.rect.height;
float viewportHeight = viewportRect.height;
if (contentHeight <= viewportHeight) return; // 内容不够长,无需滚动
var newNormalizedPosition = new Vector2(
diff.x / (contentRect.rect.width - viewportRect.width),
diff.y / (contentHeight - viewportHeight)
);
newNormalizedPosition = scrollRect.GetComponent<ScrollRect>().normalizedPosition - newNormalizedPosition;
newNormalizedPosition.x = Mathf.Clamp01(newNormalizedPosition.x);
newNormalizedPosition.y = Mathf.Clamp01(newNormalizedPosition.y);
scrollRect.GetComponent<ScrollRect>().normalizedPosition = newNormalizedPosition;
}
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;
return target.parent.TransformPoint(localPosition);
}
public void LockAllBtn()
{
if (mTreeView == null) return;
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();
}
}
}
}