You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
643 lines
21 KiB
643 lines
21 KiB
using System.Collections; |
|
using System.Collections.Generic; |
|
using UnityEngine.UI; |
|
using UnityEngine; |
|
using System; |
|
using AX.MessageSystem; |
|
|
|
/// <summary> |
|
/// 假数据 |
|
/// </summary> |
|
public class Arrie |
|
{ |
|
public string name; |
|
public Arrie(string name) |
|
{ |
|
this.name = name; |
|
} |
|
} |
|
|
|
|
|
public class HorizontalTreeSet : MonoBehaviour |
|
{ |
|
/// <summary> |
|
/// 水平结构展示 |
|
/// </summary> |
|
//public List<Arrie> SaveList = new List<Arrie>(); |
|
public GameObject Item; |
|
[HideInInspector] |
|
public Transform father; |
|
private Button AddTree; |
|
private Button deletTree; |
|
public static HorizontalTreeSet instance_; |
|
private void Awake() |
|
{ |
|
if (instance_==null) |
|
{ |
|
instance_ = this; |
|
} |
|
} |
|
|
|
private void Start() |
|
{ |
|
//假数据 |
|
//Arrie ar1 = new Arrie("一.第一个"); |
|
//SaveList.Add(ar1); |
|
//Arrie ar2 = new Arrie("二.第二个"); |
|
//SaveList.Add(ar2); |
|
//Arrie ar3 = new Arrie("三.第三个"); |
|
//SaveList.Add(ar3); |
|
//Arrie ar4 = new Arrie("四.第四个"); |
|
//SaveList.Add(ar4); |
|
//Arrie ar5 = new Arrie("五.第五个"); |
|
//SaveList.Add(ar5); |
|
//Arrie ar6 = new Arrie("六.第六个"); |
|
//SaveList.Add(ar6); |
|
//Arrie ar7 = new Arrie("七.第七个"); |
|
//SaveList.Add(ar7); |
|
//Arrie ar8 = new Arrie("八.第八个"); |
|
//SaveList.Add(ar8); |
|
//Arrie ar9 = new Arrie("九.第九个"); |
|
//SaveList.Add(ar9); |
|
//Arrie ar10 = new Arrie("十.第十个"); |
|
//SaveList.Add(ar10); |
|
//Arrie ar11 = new Arrie("十一.第十一个"); |
|
//SaveList.Add(ar11); |
|
//Arrie ar12 = new Arrie("十二.第十二个"); |
|
//SaveList.Add(ar12); |
|
|
|
//寻找物体 |
|
father = transform.Find("Group"); |
|
AddTree = transform.Find("AddTreeItem").GetComponent<Button>(); |
|
deletTree= transform.Find("DeletTreeItem").GetComponent<Button>(); |
|
AddTree.onClick.AddListener(AddTreeItem); |
|
deletTree.onClick.AddListener(deletTreeItem); |
|
CreateItem(); |
|
} |
|
/// <summary> |
|
/// 获取低图长度 |
|
/// </summary> |
|
public float GetWidth() |
|
{ |
|
return transform.Find("Image").GetComponent<RectTransform>().sizeDelta.x; |
|
} |
|
/// <summary> |
|
/// 创建一级节点 |
|
/// </summary> |
|
GameObject game; |
|
public List<TreeViewData> SaveList = null; |
|
public void CreateItem() |
|
{ |
|
//生成先销毁子物体 |
|
foreach (Transform child in father) |
|
{ |
|
Destroy(child.gameObject); |
|
} |
|
//生成数据 |
|
List<TreeViewData> datas = new List<TreeViewData>(); |
|
SaveList = new List<TreeViewData>(); |
|
NodeSet.Instance.GetAllDates(ref datas); |
|
|
|
for (int i = 0; i < datas.Count; i++) |
|
{ |
|
TreeViewData arr = datas[i] as TreeViewData; |
|
if (arr.Hierarchy == 1) |
|
{ |
|
SaveList.Add(arr); |
|
} |
|
} |
|
//生成一级目录 |
|
|
|
for (int i = 0; i < SaveList.Count; i++) |
|
{ |
|
|
|
TreeViewData arr = SaveList[i] as TreeViewData; |
|
if (arr.Hierarchy == 1) |
|
{ |
|
|
|
GameObject item = Instantiate(Item) as GameObject; |
|
item.transform.parent = father; |
|
item.transform.localScale = new Vector3(1, 1, 1); |
|
item.transform.Find("Text").GetComponent<Text>().text = BigNumber((i + 1).ToString()); |
|
if (i == 0) |
|
{ |
|
item.GetComponent<TreeOneLevel>().GetMessage(arr, true, BigNumber((i + 1).ToString())); |
|
item.GetComponent<Toggle>().isOn = true; |
|
item.transform.Find("Text").GetComponent<Text>().text = "一."+arr.Name; |
|
NodeSecondLevelControl.Instance.GenerateNodeAccordingFirstLevelID(arr.ID); |
|
} |
|
item.GetComponent<TreeOneLevel>().GetMessage(arr, false, BigNumber((i + 1).ToString())); |
|
item.GetComponent<Toggle>().group = father.GetComponent<ToggleGroup>(); |
|
CreateOperation(i, item); |
|
} |
|
} |
|
} |
|
/// <summary> |
|
/// 数字转换 |
|
/// </summary> |
|
/// <returns></returns> |
|
public string BigNumber(string Num) |
|
{ |
|
string Number = ""; |
|
int result = 0; |
|
bool text = int.TryParse(Num,out result); |
|
if (text) |
|
{ |
|
switch (Num) |
|
{ |
|
case "1": Number = "一"; break; |
|
case "2": Number = "二"; break; |
|
case "3": Number = "三"; break; |
|
case "4": Number = "四"; break; |
|
case "5": Number = "五"; break; |
|
case "6": Number = "六"; break; |
|
case "7": Number = "七"; break; |
|
case "8": Number = "八"; break; |
|
case "9": Number = "九"; break; |
|
case "10": Number = "十"; break; |
|
case "11": Number = "十一"; break; |
|
case "12": Number = "十二"; break; |
|
} |
|
} |
|
else |
|
{ |
|
switch (Num) |
|
{ |
|
case "一": Number = "1"; break; |
|
case "二": Number = "2"; break; |
|
case "三": Number = "3"; break; |
|
case "四": Number = "4"; break; |
|
case "五": Number = "5"; break; |
|
case "六": Number = "6"; break; |
|
case "七": Number = "7"; break; |
|
case "八": Number = "8"; break; |
|
case "九": Number = "9"; break; |
|
case "十": Number = "10"; break; |
|
case "十一": Number = "11"; break; |
|
case "十二": Number = "12"; break; |
|
} |
|
} |
|
|
|
return Number; |
|
} |
|
public void CreateOperation(int i,GameObject item) |
|
{ |
|
float imagewith = GetWidth();//获取空间的长度 |
|
float every = imagewith / SaveList.Count;//计算每一段的长度 |
|
|
|
//当数组长度大于4固定第一条的长度 |
|
if (SaveList.Count > 4) |
|
{ |
|
every = imagewith / 4; |
|
} |
|
else |
|
{ |
|
every = imagewith / SaveList.Count; |
|
} |
|
//特殊生成第一条数据的长度 |
|
if (i == 0) |
|
{ |
|
if (SaveList.Count > 2)//当大于二的时候正常 |
|
{ |
|
item.GetComponent<RectTransform>().sizeDelta = new Vector2(every * 2.5f, 49); |
|
float temp = item.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
item.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp * (i + 1) + (i * temp), 38); |
|
game = item; |
|
} |
|
else |
|
{ |
|
if (SaveList.Count == 1)//当等于一的时候铺面空间 |
|
{ |
|
item.GetComponent<RectTransform>().sizeDelta = new Vector2(imagewith, 49); |
|
float temp = item.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
item.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp * (i + 1) + (i * temp), 38); |
|
} |
|
else//当等于二的时候重新规定第一条在空间中的比例 |
|
{ |
|
item.GetComponent<RectTransform>().sizeDelta = new Vector2(every * 1.8f, 49); |
|
float temp = item.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
item.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp * (i + 1) + (i * temp), 38); |
|
game = item; |
|
} |
|
} |
|
} |
|
else |
|
{ |
|
item.GetComponent<RectTransform>().sizeDelta = new Vector2((imagewith - game.GetComponent<RectTransform>().sizeDelta.x) / (SaveList.Count - 1), 49); |
|
float temp = game.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
item.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp * 2 + (item.GetComponent<RectTransform>().sizeDelta.x) / 2 + item.GetComponent<RectTransform>().sizeDelta.x * (i - 1), 38); |
|
} |
|
}//生成初始计算位置 |
|
/// <summary> |
|
/// 点击一级节点计算 |
|
/// </summary> |
|
float MaxSize;//记录最大的宽度 |
|
float minSize;//记录最小的宽度 |
|
#region // 相关操作 |
|
public void CheckSize()//检查最大最小值 |
|
{ |
|
foreach (Transform child in father) |
|
{ |
|
if (child.GetComponent<RectTransform>().sizeDelta.x>400f) |
|
{ |
|
MaxSize = child.GetComponent<RectTransform>().sizeDelta.x; |
|
} |
|
else |
|
{ |
|
minSize = child.GetComponent<RectTransform>().sizeDelta.x; |
|
} |
|
} |
|
} |
|
public virtual void Operation(GameObject TreeGame) |
|
{ |
|
CheckSize(); |
|
//计算大小 |
|
TreeGame.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(MaxSize, 49); |
|
foreach (Transform child in father) |
|
{ |
|
if (!child.GetComponent<TreeOneLevel>().Max) |
|
{ |
|
child.transform.GetComponent<RectTransform>().sizeDelta = new Vector2(minSize, 49); |
|
} |
|
} |
|
//计算位置 |
|
List<GameObject> treeList = new List<GameObject>(); |
|
foreach (Transform child in father) |
|
{ |
|
treeList.Add(child.gameObject); |
|
} |
|
float sizeDeltax = 0; |
|
for (int i = 0; i < treeList.Count; i++) |
|
{ |
|
GameObject obj = treeList[i] as GameObject; |
|
|
|
float temp = obj.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
if (i == 0) |
|
{ |
|
obj.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp, 38); |
|
sizeDeltax += temp*2; |
|
} |
|
else |
|
{ |
|
|
|
obj.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(sizeDeltax+ temp, 38); |
|
sizeDeltax += temp * 2; |
|
} |
|
} |
|
} |
|
public virtual void Operation(GameObject TreeGame,GameObject game) |
|
{ |
|
} |
|
#endregion |
|
|
|
/// <summary> |
|
/// 新建一级节点 |
|
/// </summary> |
|
public int Num = 0; |
|
public void AddTreeItem() |
|
{ |
|
GameObject inputwindow = Instantiate(Resources.Load<GameObject>("Prefabs/UI/InputWindow")); |
|
inputwindow.GetComponent<InputWindowManager>().SetWindow("信息编辑", AddOKFunc, null); |
|
inputwindow.name = "TheInputWindow"; |
|
|
|
if (SaveList.Count >=12) |
|
{ |
|
MessageDispatcher.SendMessage("Operatinghints", (object)"一级节点已满"); |
|
return; |
|
} |
|
|
|
} |
|
private void AddOKFunc() |
|
{ |
|
var window = GameObject.Find("TheInputWindow"); |
|
var inputStr = window.transform.Find("InputField").GetComponent<InputField>().text; |
|
if (inputStr == "") |
|
{ |
|
MessageDispatcher.SendMessage("Operatinghints", (object)"请输入名称"); |
|
return; |
|
} |
|
DoSomething dothing = new DoSomething(this); |
|
if (dothing.CheckName(inputStr)) |
|
{ |
|
MessageDispatcher.SendMessage("Operatinghints", (object)"已经有此名字"); |
|
return; |
|
} |
|
|
|
TreeViewData data = new TreeViewData(); |
|
data.Name = inputStr; |
|
data.ID = NodeSet.Instance.GetNextID(); |
|
data.ParentID = 0; |
|
data.Hierarchy =1; |
|
|
|
Destroy(window.gameObject); |
|
|
|
if (father.childCount == 0) |
|
{ |
|
Num++; |
|
} |
|
else |
|
{ |
|
Num = int.Parse(father.transform.GetChild(father.childCount - 1).GetComponent<TreeOneLevel>().ShowNum) + 1; |
|
} |
|
GameObject item = Instantiate(Item) as GameObject; |
|
item.transform.parent = father; |
|
item.transform.localScale = new Vector3(1, 1, 1); |
|
item.GetComponent<TreeOneLevel>().GetMessage(data, false, BigNumber(Num.ToString())); |
|
item.GetComponent<TreeOneLevel>().SetNumber(BigNumber(Num.ToString())); |
|
item.GetComponent<Toggle>().group = father.GetComponent<ToggleGroup>(); |
|
dothing.Operation(item); |
|
NodeSet.Instance.ADDXml(inputStr, data); |
|
} |
|
|
|
/// <summary> |
|
/// 删除一级节点 |
|
/// </summary> |
|
public void deletTreeItem() |
|
{ |
|
DoSomething dothing = new DoSomething(this); |
|
GameObject obj = dothing.CheckToggle(); |
|
if (obj != null) |
|
{ |
|
SaveList.Remove(obj.GetComponent<TreeOneLevel>().arrie); |
|
int Index = obj.transform.GetSiblingIndex(); |
|
Destroy(obj); |
|
GameObject NewToggle= SetToggle(Index); |
|
if (NewToggle != null) |
|
{ |
|
NewToggle.GetComponent<Toggle>().isOn = true; |
|
|
|
dothing.Operation(NewToggle, obj); |
|
SetNumber(obj); |
|
NewToggle.GetComponent<TreeOneLevel>().DeleteSetNumber(); |
|
} |
|
} |
|
|
|
} |
|
public GameObject SetToggle(int Index)//前面有物体返回前面,没有则返回后面的物体 |
|
{ |
|
foreach (Transform child in father) |
|
{ |
|
if (child.GetSiblingIndex()+1==Index) |
|
{ |
|
return child.gameObject; |
|
} |
|
if (child.GetSiblingIndex() - 1 == Index) |
|
{ |
|
return child.gameObject; |
|
} |
|
} |
|
return null; |
|
} |
|
|
|
public void SetNumber(GameObject NewToggle)//重新排序名号 |
|
{ |
|
DoSomething dothing = new DoSomething(this); |
|
List<GameObject> List = dothing.ReturnList(); |
|
for (int i = 0; i < List.Count; i++) |
|
{ |
|
GameObject obj = List[i] as GameObject; |
|
if (int.Parse(BigNumber(obj.GetComponent<TreeOneLevel>().ShowNum)) > int.Parse(BigNumber(NewToggle.GetComponent<TreeOneLevel>().ShowNum))) |
|
{ |
|
int Num = int.Parse(BigNumber(obj.GetComponent<TreeOneLevel>().ShowNum)); |
|
obj.GetComponent<TreeOneLevel>().SetNumber(BigNumber((Num - 1).ToString())); |
|
} |
|
} |
|
} |
|
|
|
|
|
/// <summary> |
|
/// 获取选中的ID |
|
/// </summary> |
|
/// <returns></returns> |
|
public int GetID() |
|
{ |
|
DoSomething dothing = new DoSomething(this); |
|
return dothing.GetCurID(); |
|
} |
|
|
|
public GameObject GetChoseToggle(int i)//用于切换下一个节点 |
|
{ |
|
foreach (Transform child in father) |
|
{ |
|
if (child.GetComponent<Toggle>().isOn) |
|
{ |
|
int num = child.GetSiblingIndex(); |
|
GameObject obj = father.GetChild(num + i).gameObject ; |
|
if (obj != null) |
|
{ |
|
obj.GetComponent<Toggle>().isOn = true; |
|
} |
|
return obj; |
|
} |
|
} |
|
return null; |
|
} |
|
} |
|
public class DoSomething : HorizontalTreeSet |
|
{ |
|
/// <summary> |
|
/// 检查勾选物体 添加节点 |
|
/// </summary> |
|
/// <returns></returns> |
|
HorizontalTreeSet horizontal; |
|
public DoSomething(HorizontalTreeSet horizontal) |
|
{ |
|
this.horizontal = horizontal; |
|
} |
|
//获取选中的物体 |
|
public GameObject CheckToggle() |
|
{ |
|
foreach (Transform child in horizontal.father) |
|
{ |
|
if (child.GetComponent<Toggle>().isOn) |
|
{ |
|
return child.gameObject; |
|
} |
|
} |
|
return null; |
|
} |
|
//获取物体数组 |
|
public List<GameObject> ReturnList() |
|
{ |
|
List<GameObject> List = new List<GameObject>(); |
|
foreach (Transform child in horizontal.father) |
|
{ |
|
List.Add(child.gameObject); |
|
} |
|
return List; |
|
} |
|
//检查有没有相同名称 |
|
public bool CheckName(string Name) |
|
{ |
|
for (int i = 0; i < horizontal.SaveList.Count; i++) |
|
{ |
|
TreeViewData data = horizontal.SaveList[i] as TreeViewData; |
|
if (data.Name.Equals(Name)) |
|
{ |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
//返回选中的ID |
|
public int GetCurID() |
|
{ |
|
GameObject obj = CheckToggle(); |
|
if (obj) |
|
{ |
|
return obj.GetComponent<TreeOneLevel>().arrie.ID; |
|
} |
|
return -1; |
|
} |
|
|
|
public override void Operation(GameObject TreeGame)//用于添加排序 |
|
{ |
|
horizontal.CheckSize(); |
|
//计算位置 |
|
List<GameObject> treeList = new List<GameObject>(); |
|
foreach (Transform child in horizontal.father) |
|
{ |
|
treeList.Add(child.gameObject); |
|
} |
|
//当数组长度大于4固定第一条的长度 |
|
float imagewith = horizontal.GetWidth();//获取空间的长度 |
|
//float every = imagewith / SaveList.Count;//计算每一段的长度 |
|
float every; |
|
//当数组长度大于4固定第一条的长度 |
|
if (horizontal.SaveList.Count > 4) |
|
{ |
|
every = imagewith / 4; |
|
} |
|
else |
|
{ |
|
every = imagewith / horizontal.SaveList.Count; |
|
} |
|
if (treeList.Count == 1) |
|
{ |
|
TreeGame.GetComponent<RectTransform>().sizeDelta = new Vector2(imagewith, 49); |
|
float temp = TreeGame.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
TreeGame.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp, 38); |
|
TreeGame.GetComponent<Toggle>().isOn = true; |
|
return; |
|
} |
|
else if (treeList.Count == 2) |
|
{ |
|
CheckToggle().GetComponent<RectTransform>().sizeDelta = new Vector2(every * 1.8f, 49); |
|
float temp = TreeGame.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
} |
|
else |
|
{ |
|
CheckToggle().GetComponent<RectTransform>().sizeDelta = new Vector2(every * 2.5f, 49); |
|
} |
|
treeList.Clear(); |
|
foreach (Transform child in horizontal.father) |
|
{ |
|
treeList.Add(child.gameObject); |
|
} |
|
for (int i = 0; i < treeList.Count; i++) |
|
{ |
|
GameObject item = treeList[i] as GameObject; |
|
if (item != CheckToggle()) |
|
{ |
|
item.GetComponent<RectTransform>().sizeDelta = new Vector2((imagewith - CheckToggle().GetComponent<RectTransform>().sizeDelta.x) / (treeList.Count - 1), 49); |
|
} |
|
} |
|
float sizeDeltax = 0; |
|
for (int i = 0; i < treeList.Count; i++) |
|
{ |
|
GameObject obj = treeList[i] as GameObject; |
|
|
|
float temp = obj.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
if (i == 0) |
|
{ |
|
obj.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp, 38); |
|
sizeDeltax += temp * 2; |
|
} |
|
else |
|
{ |
|
|
|
obj.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(sizeDeltax + temp, 38); |
|
sizeDeltax += temp * 2; |
|
} |
|
} |
|
} |
|
|
|
public override void Operation(GameObject TreeGame,GameObject game) //重载用于删除排序 |
|
{ |
|
horizontal.CheckSize(); |
|
//计算位置 |
|
List<GameObject> treeList = new List<GameObject>(); |
|
foreach (Transform child in horizontal.father) |
|
{ |
|
treeList.Add(child.gameObject); |
|
} |
|
treeList.Remove(game); |
|
//当数组长度大于4固定第一条的长度 |
|
float imagewith = horizontal.GetWidth();//获取空间的长度 |
|
//float every = imagewith / SaveList.Count;//计算每一段的长度 |
|
float every; |
|
//当数组长度大于4固定第一条的长度 |
|
if (treeList.Count > 4) |
|
{ |
|
every = imagewith / 4; |
|
} |
|
else |
|
{ |
|
every = imagewith / treeList.Count; |
|
} |
|
|
|
treeList.Clear(); |
|
foreach (Transform child in horizontal.father) |
|
{ |
|
treeList.Add(child.gameObject); |
|
} |
|
treeList.Remove(game); |
|
|
|
if (treeList.Count == 1) |
|
{ |
|
TreeGame.GetComponent<RectTransform>().sizeDelta = new Vector2(imagewith, 49); |
|
float temp = TreeGame.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
TreeGame.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp, 38); |
|
TreeGame.GetComponent<Toggle>().isOn = true; |
|
return; |
|
} |
|
else if (treeList.Count == 2) |
|
{ |
|
TreeGame.GetComponent<RectTransform>().sizeDelta = new Vector2(every * 1.8f, 49); |
|
float temp = TreeGame.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
} |
|
else |
|
{ |
|
TreeGame.GetComponent<RectTransform>().sizeDelta = new Vector2(every * 2.5f, 49); |
|
} |
|
|
|
|
|
for (int i = 0; i < treeList.Count; i++) |
|
{ |
|
GameObject item = treeList[i] as GameObject; |
|
if (item != TreeGame) |
|
{ |
|
item.GetComponent<RectTransform>().sizeDelta = new Vector2((imagewith - TreeGame.GetComponent<RectTransform>().sizeDelta.x) / (treeList.Count - 1), 49); |
|
} |
|
} |
|
|
|
float sizeDeltax = 0; |
|
for (int i = 0; i < treeList.Count; i++) |
|
{ |
|
GameObject obj = treeList[i] as GameObject; |
|
|
|
float temp = obj.GetComponent<RectTransform>().sizeDelta.x / 2; |
|
if (i == 0) |
|
{ |
|
obj.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(temp, 38); |
|
sizeDeltax += temp * 2; |
|
} |
|
else |
|
{ |
|
|
|
obj.transform.GetComponent<RectTransform>().anchoredPosition = new Vector2(sizeDeltax + temp, 38); |
|
sizeDeltax += temp * 2; |
|
} |
|
} |
|
} |
|
}
|
|
|