ProjectCreep/Assets/TBTK/Scripts/Editor/_EditorWindow.cs

210 lines
6.7 KiB
C#

//using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
namespace TBTK {
public class TBEditorWindow : EditorWindow {
protected float contentHeight=0;
protected float contentWidth=0;
protected Vector2 scrollPos;
protected GUIContent cont;
protected GUIContent[] contL;
protected int spaceX=120;
protected int spaceY=18;
protected int width=150;
protected int widthS=40;
protected int height=16;
public Color white=Color.white;
public Color grey=Color.grey;
protected void CheckColor(int value, int TH){ GUI.color=(value>TH ? GUI.color : grey); }
protected void ResetColor(){ GUI.color=white; }
protected bool CheckIsPlaying(){
if(Application.isPlaying){
EditorGUILayout.HelpBox("Cannot edit while game is playing", MessageType.Info);
return false;
}
return true;
}
protected float DrawVisualObject(float startX, float startY, VisualObject vo, string label, string tooltip){
if(vo==null) vo=new VisualObject();
TBE.Label(startX, startY, width, height, label, tooltip);
vo.obj=(GameObject)EditorGUI.ObjectField(new Rect(startX+spaceX, startY, width, height), vo.obj, typeof(GameObject), true);
//Debug.Log(vo.obj+" "+EditorGUI.ObjectField(new Rect(startX+spaceX, startY, width, height), vo.obj, typeof(GameObject), true));
TBE.Label(startX, startY+=spaceY, width, height, " - Auto Destroy:", "Check if the spawned effect should be destroyed automatically");
if(vo.obj!=null) vo.autoDestroy=EditorGUI.Toggle(new Rect(startX+spaceX, startY, width, height), vo.autoDestroy);
else TBE.Label(startX+spaceX, startY, width, height, "-");
TBE.Label(startX, startY+=spaceY, width, height, " - Effect Duration:", "How long before the spawned effect object is destroyed");
if(vo.obj!=null && vo.autoDestroy) vo.duration=EditorGUI.DelayedFloatField(new Rect(startX+spaceX, startY, widthS, height), vo.duration);
else TBE.Label(startX+spaceX, startY, widthS, height, "-");
return startY;
}
#region list
protected virtual void SelectItem(){}
protected virtual void DeleteItem(){}
protected virtual void ShiftItemUp(){}
protected virtual void ShiftItemDown(){}
protected bool minimiseList=false;
protected Rect visibleRectList;
protected Rect contentRectList;
protected Vector2 scrollPosList;
public int deleteID=-1;
public int selectID=0;
public int newSelectID;
public int newSelectDelay;
protected void Select(int ID){
if(selectID==ID) return;
newSelectID=ID;
newSelectDelay=5;
if(selectID*35<scrollPosList.y) scrollPosList.y=selectID*35;
if(selectID*35>scrollPosList.y+visibleRectList.height-40) scrollPosList.y=selectID*35-visibleRectList.height+40;
SelectItem();
}
protected Vector2 DrawList(float startX, float startY, float winWidth, float winHeight, List<EItem> list, bool drawRemove=true, bool shiftItem=true, bool clampSelectID=true){
float width=minimiseList ? 60 : 260;
if(!minimiseList && shiftItem){
if(GUI.Button(new Rect(startX+180, startY-20, 40, 18), "up")){
ShiftItemUp();
if(selectID*35<scrollPosList.y) scrollPosList.y=selectID*35;
}
if(GUI.Button(new Rect(startX+222, startY-20, 40, 18), "down")){
ShiftItemDown();
if(visibleRectList.height-35<selectID*35) scrollPosList.y=(selectID+1)*35-visibleRectList.height+5;
}
}
visibleRectList=new Rect(startX, startY, width+15, winHeight-startY-5);
contentRectList=new Rect(startX, startY, width, list.Count*35+5);
GUI.color=new Color(.8f, .8f, .8f, 1f);
GUI.Box(visibleRectList, "");
GUI.color=Color.white;
scrollPosList = GUI.BeginScrollView(visibleRectList, scrollPosList, contentRectList);
startY+=5; startX+=5;
for(int i=0; i<list.Count; i++){
TBE.DrawSprite(new Rect(startX, startY+(i*35), 30, 30), list[i].icon);
if(minimiseList){
if(selectID==i) GUI.color = new Color(0, 1f, 1f, 1f);
if(GUI.Button(new Rect(startX+35, startY+(i*35), 30, 30), "")) Select(i);
GUI.color = Color.white;
continue;
}
if(selectID==i) GUI.color = new Color(0, 1f, 1f, 1f);
if(GUI.Button(new Rect(startX+35, startY+(i*35), 150+(!drawRemove ? 60 : 0), 30), list[i].name)) Select(i);
GUI.color = Color.white;
if(!drawRemove) continue;
if(deleteID==i){
if(GUI.Button(new Rect(startX+190, startY+(i*35), 60, 15), "cancel")) deleteID=-1;
GUI.color = Color.red;
if(GUI.Button(new Rect(startX+190, startY+(i*35)+15, 60, 15), "confirm")){
if(selectID>=deleteID) Select(Mathf.Max(0, selectID-1));
DeleteItem(); deleteID=-1;
}
GUI.color = Color.white;
}
else{
if(GUI.Button(new Rect(startX+190, startY+(i*35), 60, 15), "remove")) deleteID=i;
}
}
GUI.EndScrollView();
if(clampSelectID) selectID=Mathf.Clamp(selectID, 0, list.Count-1);
return new Vector2(startX+width+10, startY);
}
#endregion
#region setup hierarchy list
protected static int GetIndexFromHierarchy(Transform objT, Transform[] objHList){
if(objT==null) return 0;
for(int i=1; i<objHList.Length; i++){ if(objT==objHList[i]) return i; }
return 0;
}
protected Transform[] objHierarchyList=new Transform[0];
protected string[] objHierarchylabel=new string[0];
protected void UpdateObjHierarchyList(Transform objT){//, SetObjListCallback callback){
List<Transform> objHList=new List<Transform>();
List<string> objNList=new List<string>();
ObjectHierarchy ObjH=GetTransformInHierarchyRecursively(objT);
objHList.Add(null); objHList.Add(objT);
objNList.Add(" - "); objNList.Add(" -"+objT.name);
for(int i=0; i<ObjH.listT.Count; i++) objHList.Add(ObjH.listT[i]);
for(int i=0; i<ObjH.listName.Count; i++){
while(objNList.Contains(ObjH.listName[i])) ObjH.listName[i]+=".";
objNList.Add(ObjH.listName[i]);
}
objHierarchyList=objHList.ToArray();
objHierarchylabel=objNList.ToArray();
}
private static ObjectHierarchy GetTransformInHierarchyRecursively(Transform transform, string label=" "){
ObjectHierarchy ObjH=new ObjectHierarchy(); label+=" ";
foreach(Transform t in transform){
ObjH.listT.Add(t); ObjH.listName.Add(label+"-"+t.name);
ObjectHierarchy tempHL=GetTransformInHierarchyRecursively(t, label);
foreach(Transform tt in tempHL.listT) ObjH.listT.Add(tt);
foreach(string ll in tempHL.listName) ObjH.listName.Add(ll);
}
return ObjH;
}
private class ObjectHierarchy{
public List<Transform> listT=new List<Transform>();
public List<string> listName=new List<string>();
}
#endregion
}
}