#if UNITY_EDITOR
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using LuaFramework;
|
|
|
|
|
|
namespace U3DExtends
|
|
{
|
|
public static class UIEditorHelper
|
|
{
|
|
public static void SetImageByPath(string assetPath, Image image, bool isNativeSize = true)
|
|
{
|
|
Object newImg = UnityEditor.AssetDatabase.LoadAssetAtPath(assetPath, typeof(Sprite));
|
|
Undo.RecordObject(image, "Change Image");//有了这句才可以用ctrl+z撤消此赋值操作
|
|
image.sprite = newImg as Sprite;
|
|
if (isNativeSize)
|
|
image.SetNativeSize();
|
|
EditorUtility.SetDirty(image);
|
|
}
|
|
|
|
[MenuItem("Edit/Copy Names " + Configure.ShortCut.CopyNodesName, false, 2)]
|
|
public static void CopySelectWidgetName()
|
|
{
|
|
string result = "";
|
|
foreach (var item in Selection.gameObjects)
|
|
{
|
|
string item_name = item.name;
|
|
Transform root_trans = item.transform.parent;
|
|
while (root_trans != null && root_trans.GetComponent<Canvas>() == null)
|
|
{
|
|
if (root_trans.parent != null && root_trans.parent.GetComponent<Canvas>() == null)
|
|
item_name = root_trans.name + "/" + item_name;
|
|
else
|
|
break;
|
|
root_trans = root_trans.parent;
|
|
}
|
|
result = result + "\"" + item_name + "\", ";
|
|
}
|
|
|
|
//复制到系统全局的粘贴板上
|
|
GUIUtility.systemCopyBuffer = result;
|
|
Debug.Log("Copy Nodes Name Succeed!");
|
|
Debug.Log(result);
|
|
}
|
|
[MenuItem("Edit/Copy Names With Components " + Configure.ShortCut.CopyNodesComponentName, false, 2)]
|
|
public static void CopySelectWidgetNameWithComponents()
|
|
{
|
|
string result = "";
|
|
foreach (var item in Selection.gameObjects)
|
|
{
|
|
string item_name = item.name;
|
|
Transform root_trans = item.transform.parent;
|
|
while (root_trans != null && root_trans.GetComponent<Canvas>() == null)
|
|
{
|
|
if (root_trans.parent != null && root_trans.parent.GetComponent<Canvas>() == null)
|
|
{
|
|
item_name = root_trans.name + "/" + item_name;
|
|
}
|
|
else
|
|
break;
|
|
root_trans = root_trans.parent;
|
|
}
|
|
item_name = item_name + ":obj";
|
|
if (item.GetComponent<ImageExtend>() != null)
|
|
{
|
|
item_name = item_name + ":imgex";
|
|
}
|
|
else if (item.GetComponent<Image>() != null)
|
|
{
|
|
item_name = item_name + ":img";
|
|
}
|
|
else if (item.GetComponent<RawImage>() != null)
|
|
{
|
|
item_name = item_name + ":raw";
|
|
}
|
|
|
|
if (item.GetComponent<AdaptiveText>() != null)
|
|
{
|
|
item_name = item_name + ":adtxt";
|
|
}
|
|
else if (item.GetComponent<Text>() != null)
|
|
{
|
|
item_name = item_name + ":txt";
|
|
}
|
|
|
|
if (item.GetComponent<Outline>() != null)
|
|
{
|
|
item_name = item_name + ":outline";
|
|
}
|
|
result = result + "\"" + item_name + "\", ";
|
|
}
|
|
|
|
//复制到系统全局的粘贴板上
|
|
GUIUtility.systemCopyBuffer = result;
|
|
Debug.Log("Copy Nodes Name Succeed!");
|
|
Debug.Log(result);
|
|
}
|
|
|
|
public static Transform GetRootLayout(Transform trans)
|
|
{
|
|
Transform result = null;
|
|
Canvas canvas = trans.GetComponentInParent<Canvas>();
|
|
if (canvas != null)
|
|
{
|
|
foreach (var item in canvas.transform.GetComponentsInChildren<RectTransform>())
|
|
{
|
|
if (item.GetComponent<Decorate>() == null && canvas.transform != item)
|
|
{
|
|
result = item;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
static public GameObject GetUITestRootNode()
|
|
{
|
|
GameObject testUI = GameObject.Find(Configure.UITestNodeName);
|
|
if (!testUI)
|
|
{
|
|
testUI = new GameObject(Configure.UITestNodeName, typeof(RectTransform));
|
|
RectTransform trans = testUI.GetComponent<RectTransform>();
|
|
trans.position = Configure.UITestNodePos;
|
|
trans.sizeDelta = Configure.UITestNodeSize;
|
|
var parentNode = GameObject.Find(Configure.UITestParentNodeName).GetComponent<Transform>();
|
|
Debug.Log("parentNode : "+(parentNode!=null));
|
|
trans.SetParent(parentNode);
|
|
testUI.AddComponent<ReopenLayoutOnExitGame>();
|
|
}
|
|
return testUI;
|
|
}
|
|
|
|
static public Transform GetContainerUnderMouse(Vector3 mouse_abs_pos, GameObject ignore_obj = null)
|
|
{
|
|
GameObject testUI = UIEditorHelper.GetUITestRootNode();
|
|
List<RectTransform> list = new List<RectTransform>();
|
|
Canvas[] containers = Transform.FindObjectsOfType<Canvas>();
|
|
Vector3[] corners = new Vector3[4];
|
|
foreach (var item in containers)
|
|
{
|
|
if (ignore_obj == item.gameObject || item.transform.parent != testUI.transform)
|
|
continue;
|
|
RectTransform trans = item.transform as RectTransform;
|
|
if (trans != null)
|
|
{
|
|
//获取节点的四个角的世界坐标,分别按顺序为左下左上,右上右下
|
|
trans.GetWorldCorners(corners);
|
|
if (mouse_abs_pos.x >= corners[0].x && mouse_abs_pos.y <= corners[1].y && mouse_abs_pos.x <= corners[2].x && mouse_abs_pos.y >= corners[3].y)
|
|
{
|
|
list.Add(trans);
|
|
}
|
|
}
|
|
}
|
|
if (list.Count <= 0)
|
|
return null;
|
|
list.Sort((RectTransform a, RectTransform b) => { return (a.GetSiblingIndex() == b.GetSiblingIndex()) ? 0 : ((a.GetSiblingIndex() < b.GetSiblingIndex()) ? 1 : -1); }
|
|
);
|
|
return GetRootLayout(list[0]);
|
|
}
|
|
|
|
public static GameObject CreatNewLayout(bool isNeedLayout = true)
|
|
{
|
|
GameObject testUI = UIEditorHelper.GetUITestRootNode();
|
|
|
|
string file_path = Path.Combine(Configure.ResAssetsPath, "Canvas.prefab");
|
|
file_path = FileUtil.GetProjectRelativePath(file_path);
|
|
GameObject layout_prefab = UnityEditor.AssetDatabase.LoadAssetAtPath(file_path, typeof(UnityEngine.Object)) as GameObject;
|
|
GameObject layout = GameObject.Instantiate(layout_prefab) as GameObject;
|
|
layout.transform.SetParent(testUI.transform);
|
|
Vector3 last_pos = layout.transform.localPosition;
|
|
layout.transform.localPosition = new Vector3(last_pos.x, last_pos.y, 0);
|
|
if (!isNeedLayout)
|
|
{
|
|
Transform child = layout.transform.Find("Layout");
|
|
// layout.transform.DetachChildren();
|
|
if (child!=null)
|
|
Undo.DestroyObjectImmediate(child.gameObject);
|
|
}
|
|
|
|
Selection.activeGameObject = layout;
|
|
RectTransform trans = layout.transform as RectTransform;
|
|
SceneView.lastActiveSceneView.MoveToView(trans);
|
|
return layout;
|
|
}
|
|
|
|
public static bool SelectPicForDecorate(Decorate decorate)
|
|
{
|
|
if (decorate != null)
|
|
{
|
|
string default_path = PathSaver.GetInstance().GetLastPath(PathType.OpenDecorate);
|
|
string spr_path = EditorUtility.OpenFilePanel("加载外部图片", default_path, "");
|
|
if (spr_path.Length > 0)
|
|
{
|
|
decorate.SprPath = spr_path;
|
|
PathSaver.GetInstance().SetLastPath(PathType.OpenDecorate, spr_path);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public static Decorate CreateEmptyDecorate(Transform parent)
|
|
{
|
|
string file_path = Path.Combine(Configure.ResAssetsPath, "Decorate.prefab");
|
|
file_path = FileUtil.GetProjectRelativePath(file_path);
|
|
GameObject decorate_prefab = UnityEditor.AssetDatabase.LoadAssetAtPath(file_path, typeof(UnityEngine.Object)) as GameObject;
|
|
GameObject decorate = GameObject.Instantiate(decorate_prefab) as GameObject;
|
|
decorate.transform.SetParent(parent);
|
|
RectTransform rectTrans = decorate.transform as RectTransform;
|
|
rectTrans.SetAsFirstSibling();
|
|
rectTrans.localPosition = Vector3.zero;
|
|
rectTrans.localScale = Vector3.one;
|
|
Decorate decor = rectTrans.GetComponent<Decorate>();
|
|
return decor;
|
|
}
|
|
|
|
public static void CreateDecorate()
|
|
{
|
|
if (Selection.activeTransform != null)
|
|
{
|
|
Canvas canvas = Selection.activeTransform.GetComponentInParent<Canvas>();
|
|
if (canvas != null)
|
|
{
|
|
Decorate decor = CreateEmptyDecorate(canvas.transform);
|
|
Selection.activeTransform = decor.transform;
|
|
|
|
if (Configure.OpenSelectPicDialogWhenAddDecorate)
|
|
{
|
|
bool isSucceed = UIEditorHelper.SelectPicForDecorate(decor);
|
|
if (!isSucceed)
|
|
GameObject.DestroyImmediate(decor.gameObject);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// [MenuItem("UIEditor/清空界面 " + Configure.ShortCut.ClearAllCanvas)]
|
|
public static void ClearAllCanvas()
|
|
{
|
|
bool isDeleteAll = EditorUtility.DisplayDialog("警告", "是否清空掉所有界面?", "干!", "不了");
|
|
if (isDeleteAll)
|
|
{
|
|
GameObject test = GameObject.Find(Configure.UITestNodeName);
|
|
if (test != null)
|
|
{
|
|
LayoutInfo[] allLayouts = test.transform.GetComponentsInChildren<LayoutInfo>(true);
|
|
foreach (var item in allLayouts)
|
|
{
|
|
Undo.DestroyObjectImmediate(item.gameObject);
|
|
}
|
|
// GameObject.DestroyImmediate(test);
|
|
}
|
|
}
|
|
}
|
|
|
|
public static void LoadLayoutWithFolder()
|
|
{
|
|
string default_path = PathSaver.GetInstance().GetLastPath(PathType.SaveLayout);
|
|
string select_path = EditorUtility.OpenFolderPanel("Open Layout", default_path, "");
|
|
PathSaver.GetInstance().SetLastPath(PathType.SaveLayout, select_path);
|
|
if (select_path.Length > 0)
|
|
{
|
|
string[] file_paths = Directory.GetFiles(select_path, "*.prefab");
|
|
foreach (var path in file_paths)
|
|
{
|
|
LoadLayoutByPath(path);
|
|
}
|
|
}
|
|
UILayoutTool.ResortAllLayout();
|
|
}
|
|
|
|
private static GameObject GetLoadedLayout(string layoutPath)
|
|
{
|
|
GameObject testUI = UIEditorHelper.GetUITestRootNode();
|
|
if (testUI != null)
|
|
{
|
|
LayoutInfo[] layoutInfos = testUI.GetComponentsInChildren<LayoutInfo>(true);
|
|
foreach (var item in layoutInfos)
|
|
{
|
|
if (item.LayoutPath == layoutPath)
|
|
return item.gameObject;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
//从界面的Canvas里取到真实的界面prefab
|
|
public static Transform GetRealLayout(GameObject anyObj)
|
|
{
|
|
LayoutInfo layoutInfo = anyObj.GetComponentInParent<LayoutInfo>();
|
|
Transform real_layout = null;
|
|
if (layoutInfo == null)
|
|
return real_layout;
|
|
if (layoutInfo.LayoutPath != string.Empty)
|
|
{
|
|
string just_name = System.IO.Path.GetFileNameWithoutExtension(layoutInfo.LayoutPath);
|
|
for (int i = 0; i < layoutInfo.transform.childCount; i++)
|
|
{
|
|
Transform child = layoutInfo.transform.GetChild(i);
|
|
if (child.name.StartsWith(just_name))
|
|
{
|
|
real_layout = child;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//界面是新建的,未保存过的情况下取其子节点
|
|
Canvas layout = anyObj.GetComponentInParent<Canvas>();
|
|
for (int i = 0; i < layout.transform.childCount; i++)
|
|
{
|
|
Transform child = layout.transform.GetChild(i);
|
|
if (child.GetComponent<Decorate>() != null)
|
|
continue;
|
|
|
|
real_layout = child.transform;
|
|
break;
|
|
}
|
|
}
|
|
return real_layout;
|
|
}
|
|
|
|
public static void DelayReLoadLayout(GameObject o, bool isQuiet)
|
|
{
|
|
System.Action<PlayModeStateChange> p = null;
|
|
p = new System.Action<PlayModeStateChange>((PlayModeStateChange c) => {
|
|
Debug.Log("reload !");
|
|
ReLoadLayout(o, isQuiet);
|
|
UnityEditor.EditorApplication.playModeStateChanged -= p;
|
|
});
|
|
UnityEditor.EditorApplication.playModeStateChanged += p;
|
|
}
|
|
|
|
public static void ReLoadLayout(GameObject o, bool isQuiet)
|
|
{
|
|
GameObject saveObj = o == null ? Selection.activeGameObject : (o as GameObject);
|
|
if (saveObj == null)
|
|
return;
|
|
LayoutInfo layoutInfo = saveObj.GetComponentInParent<LayoutInfo>();
|
|
if (layoutInfo != null && layoutInfo.LayoutPath != string.Empty)
|
|
{
|
|
bool is_reopen = isQuiet || EditorUtility.DisplayDialog("警告", "是否重新加载?", "来吧", "不了");
|
|
if (is_reopen)
|
|
{
|
|
string just_name = System.IO.Path.GetFileNameWithoutExtension(layoutInfo.LayoutPath);
|
|
Transform real_layout = GetRealLayout(layoutInfo.gameObject);
|
|
|
|
if (real_layout)
|
|
{
|
|
string select_path = FileUtil.GetProjectRelativePath(layoutInfo.LayoutPath);
|
|
Object prefab = AssetDatabase.LoadAssetAtPath(select_path, typeof(Object));
|
|
GameObject new_view = PrefabUtility.InstantiateAttachedAsset(prefab) as GameObject;
|
|
new_view.transform.SetParent(layoutInfo.transform);
|
|
new_view.transform.localPosition = real_layout.localPosition;
|
|
new_view.transform.localScale = Vector3.one;
|
|
new_view.name = just_name;
|
|
// PrefabUtility.DisconnectPrefabInstance(new_view);//链接中的话删里面的子节点时会报警告,所以还是一直失联的好,保存时直接覆盖pref
|
|
Undo.DestroyObjectImmediate(real_layout.gameObject);
|
|
Debug.Log("Reload Layout Succeed!");
|
|
layoutInfo.ApplyConfig(select_path);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
Debug.Log("Try to reload unsaved layout failed");
|
|
}
|
|
|
|
public static Transform LoadLayoutByPath(string select_path)
|
|
{
|
|
//Debug.Log("select_path : "+select_path);
|
|
GameObject new_layout = CreatNewLayout(false);
|
|
new_layout.transform.localPosition = new Vector3(new_layout.transform.localPosition.x, new_layout.transform.localPosition.y, 0);
|
|
LayoutInfo layoutInfo = new_layout.GetComponent<LayoutInfo>();
|
|
layoutInfo.LayoutPath = select_path;
|
|
if (!File.Exists(select_path))
|
|
{
|
|
Debug.Log("UIEditorHelper:LoadLayoutByPath cannot find layout file:"+select_path);
|
|
return null;
|
|
}
|
|
string asset_relate_path = select_path;
|
|
if (!select_path.StartsWith("Assets/"))
|
|
asset_relate_path = FileUtil.GetProjectRelativePath(select_path);
|
|
|
|
Object prefab = AssetDatabase.LoadAssetAtPath(asset_relate_path, typeof(Object));
|
|
GameObject new_view = PrefabUtility.InstantiateAttachedAsset(prefab) as GameObject;
|
|
new_view.transform.SetParent(new_layout.transform);
|
|
new_view.transform.localPosition = Vector3.zero;
|
|
new_view.transform.localScale = Vector3.one;
|
|
string just_name = System.IO.Path.GetFileNameWithoutExtension(asset_relate_path);
|
|
new_view.name = just_name;
|
|
new_layout.gameObject.name = just_name + "_Canvas";
|
|
#if !UNITY_2018_3_OR_NEWER
|
|
PrefabUtility.DisconnectPrefabInstance(new_view);//链接中的话删里面的子节点时会报警告,所以还是一直失联的好,保存时直接覆盖prefab就行了
|
|
#endif
|
|
//打开界面时,从项目临时文件夹找到对应界面的参照图配置,然后生成参照图
|
|
layoutInfo.ApplyConfig(asset_relate_path);
|
|
ReopenLayoutOnExitGame.RecordOpenLayout(select_path, new_layout.transform.localPosition);
|
|
return new_layout.transform;
|
|
}
|
|
|
|
//[MenuItem("UIEditor/加载界面 " + Configure.ShortCut.LoadUIPrefab, false, 1)]
|
|
public static void LoadLayout()
|
|
{
|
|
string default_path = PathSaver.GetInstance().GetLastPath(PathType.SaveLayout);
|
|
string select_path = EditorUtility.OpenFilePanel("Open Layout", default_path, "prefab");
|
|
PathSaver.GetInstance().SetLastPath(PathType.SaveLayout, select_path);
|
|
if (select_path.Length > 0)
|
|
{
|
|
//检查是否已打开同名界面
|
|
GameObject loaded_layout = GetLoadedLayout(select_path);
|
|
if (loaded_layout!=null)
|
|
{
|
|
bool is_reopen = EditorUtility.DisplayDialog("警告", "已打开同名界面,是否重新加载?", "来吧", "不了");
|
|
if (is_reopen)
|
|
{
|
|
//Undo.DestroyObjectImmediate(loaded_layout);
|
|
ReLoadLayout(loaded_layout, true);
|
|
}
|
|
return;
|
|
}
|
|
LoadLayoutByPath(select_path);
|
|
}
|
|
}
|
|
|
|
//[MenuItem("UIEditor/Operate/锁定")]
|
|
public static void LockWidget()
|
|
{
|
|
if (Selection.gameObjects.Length > 0)
|
|
{
|
|
Selection.gameObjects[0].hideFlags = HideFlags.NotEditable;
|
|
}
|
|
}
|
|
|
|
//[MenuItem("UIEditor/Operate/解锁")]
|
|
public static void UnLockWidget()
|
|
{
|
|
if (Selection.gameObjects.Length > 0)
|
|
{
|
|
Selection.gameObjects[0].hideFlags = HideFlags.None;
|
|
}
|
|
}
|
|
|
|
//是否支持解体
|
|
public static bool IsNodeCanDivide(GameObject obj)
|
|
{
|
|
if (obj == null)
|
|
return false;
|
|
return obj.transform != null && obj.transform.childCount > 0 && obj.GetComponent<Canvas>() == null && obj.transform.parent != null && obj.transform.parent.GetComponent<Canvas>() == null;
|
|
}
|
|
|
|
public static bool SaveTextureToPNG(Texture inputTex, string save_file_name)
|
|
{
|
|
RenderTexture temp = RenderTexture.GetTemporary(inputTex.width, inputTex.height, 0, RenderTextureFormat.ARGB32);
|
|
Graphics.Blit(inputTex, temp);
|
|
bool ret = SaveRenderTextureToPNG(temp, save_file_name);
|
|
RenderTexture.ReleaseTemporary(temp);
|
|
return ret;
|
|
|
|
}
|
|
|
|
//将RenderTexture保存成一张png图片
|
|
public static bool SaveRenderTextureToPNG(RenderTexture rt, string save_file_name)
|
|
{
|
|
RenderTexture prev = RenderTexture.active;
|
|
RenderTexture.active = rt;
|
|
Texture2D png = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false);
|
|
png.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
|
|
byte[] bytes = png.EncodeToPNG();
|
|
string directory = Path.GetDirectoryName(save_file_name);
|
|
if (!Directory.Exists(directory))
|
|
Directory.CreateDirectory(directory);
|
|
FileStream file = File.Open(save_file_name, FileMode.Create);
|
|
BinaryWriter writer = new BinaryWriter(file);
|
|
writer.Write(bytes);
|
|
file.Close();
|
|
Texture2D.DestroyImmediate(png);
|
|
png = null;
|
|
RenderTexture.active = prev;
|
|
return true;
|
|
|
|
}
|
|
|
|
public static Texture2D LoadTextureInLocal(string file_path)
|
|
{
|
|
//创建文件读取流
|
|
FileStream fileStream = new FileStream(file_path, FileMode.Open, FileAccess.Read);
|
|
fileStream.Seek(0, SeekOrigin.Begin);
|
|
//创建文件长度缓冲区
|
|
byte[] bytes = new byte[fileStream.Length];
|
|
//读取文件
|
|
fileStream.Read(bytes, 0, (int)fileStream.Length);
|
|
//释放文件读取流
|
|
fileStream.Close();
|
|
fileStream.Dispose();
|
|
fileStream = null;
|
|
|
|
//创建Texture
|
|
int width = 300;
|
|
int height = 372;
|
|
Texture2D texture = new Texture2D(width, height);
|
|
texture.LoadImage(bytes);
|
|
return texture;
|
|
}
|
|
|
|
private static Vector2 HalfVec = new Vector2(0.5f, 0.5f);
|
|
//加载外部资源为Sprite
|
|
public static Sprite LoadSpriteInLocal(string file_path)
|
|
{
|
|
if (!File.Exists(file_path))
|
|
{
|
|
Debug.Log("LoadSpriteInLocal() cannot find sprite file : " + file_path);
|
|
return null;
|
|
}
|
|
Texture2D texture = LoadTextureInLocal(file_path);
|
|
//创建Sprite
|
|
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), UIEditorHelper.HalfVec);
|
|
return sprite;
|
|
}
|
|
|
|
public static Texture GetAssetPreview(GameObject obj)
|
|
{
|
|
GameObject canvas_obj = null;
|
|
GameObject clone = GameObject.Instantiate(obj);
|
|
Transform cloneTransform = clone.transform;
|
|
bool isUINode = false;
|
|
if (cloneTransform is RectTransform)
|
|
{
|
|
//如果是UGUI节点的话就要把它们放在Canvas下了
|
|
canvas_obj = new GameObject("render canvas", typeof(Canvas));
|
|
Canvas canvas = canvas_obj.GetComponent<Canvas>();
|
|
cloneTransform.SetParent(canvas_obj.transform);
|
|
cloneTransform.localPosition = Vector3.zero;
|
|
|
|
canvas_obj.transform.position = new Vector3(-1000, -1000, -1000);
|
|
canvas_obj.layer = 21;//放在21层,摄像机也只渲染此层的,避免混入了奇怪的东西
|
|
isUINode = true;
|
|
}
|
|
else
|
|
cloneTransform.position = new Vector3(-1000, -1000, -1000);
|
|
|
|
Transform[] all = clone.GetComponentsInChildren<Transform>();
|
|
foreach (Transform trans in all)
|
|
{
|
|
trans.gameObject.layer = 21;
|
|
}
|
|
|
|
Bounds bounds = GetBounds(clone);
|
|
Vector3 Min = bounds.min;
|
|
Vector3 Max = bounds.max;
|
|
GameObject cameraObj = new GameObject("render camera");
|
|
|
|
Camera renderCamera = cameraObj.AddComponent<Camera>();
|
|
renderCamera.backgroundColor = new Color(0.8f, 0.8f, 0.8f, 1f);
|
|
renderCamera.clearFlags = CameraClearFlags.Color;
|
|
renderCamera.cameraType = CameraType.Preview;
|
|
renderCamera.cullingMask = 1 << 21;
|
|
if (isUINode)
|
|
{
|
|
cameraObj.transform.position = new Vector3((Max.x + Min.x) / 2f, (Max.y + Min.y) / 2f, cloneTransform.position.z-100);
|
|
Vector3 center = new Vector3(cloneTransform.position.x+0.01f, (Max.y + Min.y) / 2f, cloneTransform.position.z);//+0.01f是为了去掉Unity自带的摄像机旋转角度为0的打印,太烦人了
|
|
cameraObj.transform.LookAt(center);
|
|
|
|
renderCamera.orthographic = true;
|
|
float width = Max.x - Min.x;
|
|
float height = Max.y - Min.y;
|
|
float max_camera_size = width > height ? width : height;
|
|
renderCamera.orthographicSize = max_camera_size / 2;//预览图要尽量少点空白
|
|
}
|
|
else
|
|
{
|
|
cameraObj.transform.position = new Vector3((Max.x + Min.x) / 2f, (Max.y + Min.y) / 2f, Max.z + (Max.z - Min.z));
|
|
Vector3 center = new Vector3(cloneTransform.position.x+0.01f, (Max.y + Min.y) / 2f, cloneTransform.position.z);
|
|
cameraObj.transform.LookAt(center);
|
|
|
|
int angle = (int)(Mathf.Atan2((Max.y - Min.y) / 2, (Max.z - Min.z)) * 180 / 3.1415f * 2);
|
|
renderCamera.fieldOfView = angle;
|
|
}
|
|
RenderTexture texture = new RenderTexture(128, 128, 0, RenderTextureFormat.Default);
|
|
renderCamera.targetTexture = texture;
|
|
|
|
Undo.DestroyObjectImmediate(cameraObj);
|
|
Undo.PerformUndo();//不知道为什么要删掉再Undo回来后才Render得出来UI的节点,3D节点是没这个问题的,估计是Canvas创建后没那么快有效?
|
|
renderCamera.RenderDontRestore();
|
|
RenderTexture tex = new RenderTexture(128, 128, 0, RenderTextureFormat.Default);
|
|
Graphics.Blit(texture, tex);
|
|
|
|
Object.DestroyImmediate(canvas_obj);
|
|
Object.DestroyImmediate(cameraObj);
|
|
return tex;
|
|
}
|
|
|
|
public static Bounds GetBounds(GameObject obj)
|
|
{
|
|
Vector3 Min = new Vector3(99999, 99999, 99999);
|
|
Vector3 Max = new Vector3(-99999, -99999, -99999);
|
|
MeshRenderer[] renders = obj.GetComponentsInChildren<MeshRenderer>();
|
|
if (renders.Length > 0)
|
|
{
|
|
for (int i = 0; i < renders.Length; i++)
|
|
{
|
|
if (renders[i].bounds.min.x < Min.x)
|
|
Min.x = renders[i].bounds.min.x;
|
|
if (renders[i].bounds.min.y < Min.y)
|
|
Min.y = renders[i].bounds.min.y;
|
|
if (renders[i].bounds.min.z < Min.z)
|
|
Min.z = renders[i].bounds.min.z;
|
|
|
|
if (renders[i].bounds.max.x > Max.x)
|
|
Max.x = renders[i].bounds.max.x;
|
|
if (renders[i].bounds.max.y > Max.y)
|
|
Max.y = renders[i].bounds.max.y;
|
|
if (renders[i].bounds.max.z > Max.z)
|
|
Max.z = renders[i].bounds.max.z;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
RectTransform[] rectTrans = obj.GetComponentsInChildren<RectTransform>();
|
|
Vector3[] corner = new Vector3[4];
|
|
for (int i = 0; i < rectTrans.Length; i++)
|
|
{
|
|
//获取节点的四个角的世界坐标,分别按顺序为左下左上,右上右下
|
|
rectTrans[i].GetWorldCorners(corner);
|
|
if (corner[0].x < Min.x)
|
|
Min.x = corner[0].x;
|
|
if (corner[0].y < Min.y)
|
|
Min.y = corner[0].y;
|
|
if (corner[0].z < Min.z)
|
|
Min.z = corner[0].z;
|
|
|
|
if (corner[2].x > Max.x)
|
|
Max.x = corner[2].x;
|
|
if (corner[2].y > Max.y)
|
|
Max.y = corner[2].y;
|
|
if (corner[2].z > Max.z)
|
|
Max.z = corner[2].z;
|
|
}
|
|
}
|
|
|
|
Vector3 center = (Min + Max) / 2;
|
|
Vector3 size = new Vector3(Max.x - Min.x, Max.y - Min.y, Max.z - Min.z);
|
|
return new Bounds(center, size);
|
|
}
|
|
|
|
//[MenuItem("UIEditor/另存为 ")]
|
|
public static void SaveAnotherLayoutMenu()
|
|
{
|
|
if (Selection.activeGameObject == null)
|
|
{
|
|
EditorUtility.DisplayDialog("Warning", "I don't know which prefab you want to save", "Ok");
|
|
return;
|
|
}
|
|
LayoutInfo layout = Selection.activeGameObject.GetComponentInParent<LayoutInfo>();
|
|
if (layout != null)
|
|
{
|
|
GameObject editingView = layout.EditingView;
|
|
if (editingView != null)
|
|
{
|
|
UIEditorHelper.SaveAnotherLayout(layout.GetComponent<Canvas>(), editingView.transform);
|
|
}
|
|
}
|
|
// for (int i = 0; i < layout.transform.childCount; i++)
|
|
// {
|
|
// Transform child = layout.transform.GetChild(i);
|
|
// if (child.GetComponent<Decorate>() != null)
|
|
// continue;
|
|
// GameObject child_obj = child.gameObject;
|
|
// //Debug.Log("child type :" + PrefabUtility.GetPrefabType(child_obj));
|
|
|
|
// //判断选择的物体,是否为预设
|
|
// PrefabType cur_prefab_type = PrefabUtility.GetPrefabType(child_obj);
|
|
// UIEditorHelper.SaveAnotherLayout(layout, child);
|
|
// break;
|
|
// }
|
|
}
|
|
|
|
public static void SaveAnotherLayout(Canvas layout, Transform child)
|
|
{
|
|
if (child.GetComponent<Decorate>() != null)
|
|
return;
|
|
GameObject child_obj = child.gameObject;
|
|
//Debug.Log("child type :" + PrefabUtility.GetPrefabType(child_obj));
|
|
|
|
//判断选择的物体,是否为预设
|
|
PrefabType cur_prefab_type = PrefabUtility.GetPrefabType(child_obj);
|
|
//不是预设的话说明还没保存过的,弹出保存框
|
|
string default_path = PathSaver.GetInstance().GetLastPath(PathType.SaveLayout);
|
|
string save_path = EditorUtility.SaveFilePanel("Save Layout", default_path, "prefab_name", "prefab");
|
|
if (save_path == "")
|
|
return;
|
|
string full_path = save_path;
|
|
PathSaver.GetInstance().SetLastPath(PathType.SaveLayout, save_path);
|
|
save_path = FileUtil.GetProjectRelativePath(save_path);
|
|
if (save_path == "")
|
|
{
|
|
Debug.Log("wrong path to save layout, is this project path? : " + full_path);
|
|
EditorUtility.DisplayDialog("error", "wrong path to save layout, is this project path? : " + full_path, "ok");
|
|
return;
|
|
}
|
|
|
|
Object new_prefab = PrefabUtility.CreateEmptyPrefab(save_path);
|
|
PrefabUtility.ReplacePrefab(child_obj, new_prefab, ReplacePrefabOptions.ConnectToPrefab);
|
|
LayoutInfo layoutInfo = layout.GetComponent<LayoutInfo>();
|
|
if (layoutInfo != null)
|
|
layoutInfo.LayoutPath = full_path;
|
|
string just_name = System.IO.Path.GetFileNameWithoutExtension(save_path);
|
|
child_obj.name = just_name;
|
|
layout.gameObject.name = just_name + "_Canvas";
|
|
//刷新
|
|
AssetDatabase.Refresh();
|
|
if (Configure.IsShowDialogWhenSaveLayout)
|
|
EditorUtility.DisplayDialog("Tip", "Save Succeed!", "Ok");
|
|
|
|
//保存时先记录一下,如果是运行游戏时保存了,结束游戏时就要重新加载界面了,不然会重置回运行游戏前的
|
|
ReloadLayoutOnExitGame reloadCom = layout.GetComponent<ReloadLayoutOnExitGame>();
|
|
if (reloadCom)
|
|
reloadCom.SetHadSaveOnRunTime(true);
|
|
Debug.Log("Save Succeed!");
|
|
layoutInfo.SaveToConfigFile();
|
|
}
|
|
|
|
//[MenuItem("UIEditor/保存 " + Configure.ShortCut.SaveUIPrefab, false, 2)]
|
|
public static void SaveLayout(GameObject o, bool isQuiet)
|
|
{
|
|
GameObject saveObj = o == null ? Selection.activeGameObject : (o as GameObject);
|
|
if (saveObj == null)
|
|
{
|
|
EditorUtility.DisplayDialog("Warning", "I don't know which prefab you want to save", "Ok");
|
|
return;
|
|
}
|
|
Canvas layout = saveObj.GetComponentInParent<Canvas>();
|
|
if (layout == null)
|
|
{
|
|
EditorUtility.DisplayDialog("Warning", "select any layout below UITestNode/canvas to save", "Ok");
|
|
return;
|
|
}
|
|
Transform real_layout = GetRealLayout(saveObj);
|
|
if (real_layout != null)
|
|
{
|
|
GameObject child_obj = real_layout.gameObject;
|
|
//判断选择的物体,是否为预设
|
|
PrefabType cur_prefab_type = PrefabUtility.GetPrefabType(child_obj);
|
|
if (PrefabUtility.GetPrefabType(child_obj) == PrefabType.PrefabInstance || cur_prefab_type == PrefabType.DisconnectedPrefabInstance)
|
|
{
|
|
UnityEngine.Object parentObject = PrefabUtility.GetCorrespondingObjectFromSource(child_obj);
|
|
//替换预设,Note:只能用ConnectToPrefab,不然会重复加多几个同名控件的
|
|
PrefabUtility.ReplacePrefab(child_obj, parentObject, ReplacePrefabOptions.Default);
|
|
//刷新
|
|
AssetDatabase.Refresh();
|
|
if (Configure.IsShowDialogWhenSaveLayout && !isQuiet)
|
|
EditorUtility.DisplayDialog("Tip", "Save Succeed!", "Ok");
|
|
|
|
//保存时先记录一下,如果是运行游戏时保存了,结束游戏时就要重新加载界面了,不然会重置回运行游戏前的
|
|
ReloadLayoutOnExitGame reloadCom = layout.GetComponent<ReloadLayoutOnExitGame>();
|
|
if (reloadCom)
|
|
reloadCom.SetHadSaveOnRunTime(true);
|
|
Debug.Log("Save Succeed!");
|
|
LayoutInfo layoutInfo = layout.GetComponent<LayoutInfo>();
|
|
if (layoutInfo != null)
|
|
layoutInfo.SaveToConfigFile();
|
|
}
|
|
else
|
|
{
|
|
UIEditorHelper.SaveAnotherLayout(layout, real_layout);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("save failed!are you select any widget below canvas?");
|
|
}
|
|
}
|
|
|
|
static public string ObjectToGUID(UnityEngine.Object obj)
|
|
{
|
|
string path = AssetDatabase.GetAssetPath(obj);
|
|
return (!string.IsNullOrEmpty(path)) ? AssetDatabase.AssetPathToGUID(path) : null;
|
|
}
|
|
|
|
static MethodInfo s_GetInstanceIDFromGUID;
|
|
static public UnityEngine.Object GUIDToObject(string guid)
|
|
{
|
|
if (string.IsNullOrEmpty(guid)) return null;
|
|
|
|
if (s_GetInstanceIDFromGUID == null)
|
|
s_GetInstanceIDFromGUID = typeof(AssetDatabase).GetMethod("GetInstanceIDFromGUID", BindingFlags.Static | BindingFlags.NonPublic);
|
|
|
|
int id = (int)s_GetInstanceIDFromGUID.Invoke(null, new object[] { guid });
|
|
if (id != 0) return EditorUtility.InstanceIDToObject(id);
|
|
string path = AssetDatabase.GUIDToAssetPath(guid);
|
|
if (string.IsNullOrEmpty(path)) return null;
|
|
return AssetDatabase.LoadAssetAtPath(path, typeof(UnityEngine.Object));
|
|
}
|
|
|
|
static public T GUIDToObject<T>(string guid) where T : UnityEngine.Object
|
|
{
|
|
UnityEngine.Object obj = GUIDToObject(guid);
|
|
if (obj == null) return null;
|
|
|
|
System.Type objType = obj.GetType();
|
|
if (objType == typeof(T) || objType.IsSubclassOf(typeof(T))) return obj as T;
|
|
|
|
if (objType == typeof(GameObject) && typeof(T).IsSubclassOf(typeof(Component)))
|
|
{
|
|
GameObject go = obj as GameObject;
|
|
return go.GetComponent(typeof(T)) as T;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
static public void SetEnum(string name, System.Enum val)
|
|
{
|
|
EditorPrefs.SetString(name, val.ToString());
|
|
}
|
|
|
|
static public T GetEnum<T>(string name, T defaultValue)
|
|
{
|
|
string val = EditorPrefs.GetString(name, defaultValue.ToString());
|
|
string[] names = System.Enum.GetNames(typeof(T));
|
|
System.Array values = System.Enum.GetValues(typeof(T));
|
|
|
|
for (int i = 0; i < names.Length; ++i)
|
|
{
|
|
if (names[i] == val)
|
|
return (T)values.GetValue(i);
|
|
}
|
|
return defaultValue;
|
|
}
|
|
|
|
static public void DrawTiledTexture(Rect rect, Texture tex)
|
|
{
|
|
GUI.BeginGroup(rect);
|
|
{
|
|
int width = Mathf.RoundToInt(rect.width);
|
|
int height = Mathf.RoundToInt(rect.height);
|
|
|
|
for (int y = 0; y < height; y += tex.height)
|
|
{
|
|
for (int x = 0; x < width; x += tex.width)
|
|
{
|
|
GUI.DrawTexture(new Rect(x, y, tex.width, tex.height), tex);
|
|
}
|
|
}
|
|
}
|
|
GUI.EndGroup();
|
|
}
|
|
|
|
static Texture2D CreateCheckerTex(Color c0, Color c1)
|
|
{
|
|
Texture2D tex = new Texture2D(16, 16);
|
|
tex.name = "[Generated] Checker Texture";
|
|
tex.hideFlags = HideFlags.DontSave;
|
|
|
|
for (int y = 0; y < 8; ++y) for (int x = 0; x < 8; ++x) tex.SetPixel(x, y, c1);
|
|
for (int y = 8; y < 16; ++y) for (int x = 0; x < 8; ++x) tex.SetPixel(x, y, c0);
|
|
for (int y = 0; y < 8; ++y) for (int x = 8; x < 16; ++x) tex.SetPixel(x, y, c0);
|
|
for (int y = 8; y < 16; ++y) for (int x = 8; x < 16; ++x) tex.SetPixel(x, y, c1);
|
|
|
|
tex.Apply();
|
|
tex.filterMode = FilterMode.Point;
|
|
return tex;
|
|
}
|
|
|
|
static Texture2D mBackdropTex;
|
|
static public Texture2D backdropTexture
|
|
{
|
|
get
|
|
{
|
|
if (mBackdropTex == null) mBackdropTex = CreateCheckerTex(
|
|
new Color(0.1f, 0.1f, 0.1f, 0.5f),
|
|
new Color(0.2f, 0.2f, 0.2f, 0.5f));
|
|
return mBackdropTex;
|
|
}
|
|
}
|
|
|
|
static private Transform GetGoodContainer(Transform trans)
|
|
{
|
|
if (trans == null)
|
|
return null;
|
|
if (trans.GetComponent<Canvas>() != null || trans.GetComponent<Decorate>() != null)
|
|
return GetRealLayout(trans.gameObject);
|
|
return trans;
|
|
}
|
|
|
|
static public void AddImageComponent()
|
|
{
|
|
if (Selection.activeGameObject == null)
|
|
return;
|
|
Image old_img = Selection.activeGameObject.GetComponent<Image>();
|
|
if (old_img != null)
|
|
{
|
|
bool isOk = EditorUtility.DisplayDialog("警告", "该GameObject已经有Image组件了,你想替换吗?", "来吧", "算了");
|
|
if (isOk)
|
|
{
|
|
//Selection.activeGameObject.
|
|
}
|
|
}
|
|
Image img = Selection.activeGameObject.AddComponent<Image>();
|
|
img.raycastTarget = false;
|
|
}
|
|
|
|
static public void AddHorizontalLayoutComponent()
|
|
{
|
|
if (Selection.activeGameObject == null)
|
|
return;
|
|
HorizontalLayoutGroup layout = Selection.activeGameObject.AddComponent<HorizontalLayoutGroup>();
|
|
layout.childForceExpandWidth = false;
|
|
layout.childForceExpandHeight = false;
|
|
layout.childControlWidth = false;
|
|
layout.childControlHeight = false;
|
|
}
|
|
|
|
static public void AddVerticalLayoutComponent()
|
|
{
|
|
if (Selection.activeGameObject == null)
|
|
return;
|
|
VerticalLayoutGroup layout = Selection.activeGameObject.AddComponent<VerticalLayoutGroup>();
|
|
layout.childForceExpandWidth = false;
|
|
layout.childForceExpandHeight = false;
|
|
layout.childControlWidth = false;
|
|
layout.childControlHeight = false;
|
|
}
|
|
|
|
static public void AddGridLayoutGroupComponent()
|
|
{
|
|
if (Selection.activeGameObject == null)
|
|
return;
|
|
GridLayoutGroup layout = Selection.activeGameObject.AddComponent<GridLayoutGroup>();
|
|
}
|
|
|
|
static public void CreateEmptyObj()
|
|
{
|
|
if (Selection.activeGameObject == null)
|
|
return;
|
|
GameObject go = new GameObject(CommonHelper.GenerateUniqueName(Selection.activeGameObject, "GameObject"), typeof(RectTransform));
|
|
go.transform.SetParent(GetGoodContainer(Selection.activeTransform), false);
|
|
Selection.activeGameObject = go;
|
|
}
|
|
|
|
static public void CreateImageObj()
|
|
{
|
|
if (Selection.activeTransform && Selection.activeTransform.GetComponentInParent<Canvas>())
|
|
{
|
|
GameObject go = new GameObject(CommonHelper.GenerateUniqueName(Selection.activeGameObject, "Image"), typeof(Image));
|
|
go.GetComponent<Image>().raycastTarget = false;
|
|
go.transform.SetParent(GetGoodContainer(Selection.activeTransform), false);
|
|
Selection.activeGameObject = go;
|
|
}
|
|
}
|
|
|
|
static public void CreateRawImageObj()
|
|
{
|
|
if (Selection.activeTransform && Selection.activeTransform.GetComponentInParent<Canvas>())
|
|
{
|
|
GameObject go = new GameObject(CommonHelper.GenerateUniqueName(Selection.activeGameObject, "RawImage"), typeof(RawImage));
|
|
go.GetComponent<RawImage>().raycastTarget = false;
|
|
go.transform.SetParent(GetGoodContainer(Selection.activeTransform), false);
|
|
Selection.activeGameObject = go;
|
|
}
|
|
}
|
|
|
|
static public void CreateButtonObj()
|
|
{
|
|
if (Selection.activeTransform && Selection.activeTransform.GetComponentInParent<Canvas>())
|
|
{
|
|
Transform last_trans = Selection.activeTransform;
|
|
bool isOk = EditorApplication.ExecuteMenuItem("GameObject/UI/Button");
|
|
if (isOk)
|
|
{
|
|
Selection.activeGameObject.name = CommonHelper.GenerateUniqueName(Selection.activeGameObject, "Button");
|
|
Selection.activeTransform.SetParent(GetGoodContainer(last_trans), false);
|
|
}
|
|
}
|
|
}
|
|
|
|
static public void CreateTextObj()
|
|
{
|
|
if (Selection.activeTransform && Selection.activeTransform.GetComponentInParent<Canvas>())
|
|
{
|
|
GameObject go = new GameObject(CommonHelper.GenerateUniqueName(Selection.activeGameObject, "Text"), typeof(Text));
|
|
Text txt = go.GetComponent<Text>();
|
|
txt.raycastTarget = false;
|
|
txt.text = "I am a Text";
|
|
go.transform.SetParent(GetGoodContainer(Selection.activeTransform), false);
|
|
go.transform.localPosition = Vector3.zero;
|
|
Selection.activeGameObject = go;
|
|
}
|
|
}
|
|
|
|
static public void CreateAdaptiveTextObj()
|
|
{
|
|
if (Selection.activeTransform && Selection.activeTransform.GetComponentInParent<Canvas>())
|
|
{
|
|
GameObject go = new GameObject(CommonHelper.GenerateUniqueName(Selection.activeGameObject, "AdaptiveText"), typeof(AdaptiveText));
|
|
AdaptiveText txt = go.GetComponent<AdaptiveText>();
|
|
txt.raycastTarget = false;
|
|
txt.need_adaptive = true;
|
|
txt.text = "I am a Text";
|
|
go.transform.SetParent(GetGoodContainer(Selection.activeTransform), false);
|
|
go.transform.localPosition = Vector3.zero;
|
|
Selection.activeGameObject = go;
|
|
}
|
|
}
|
|
|
|
static private void InitScrollView(bool isHorizontal)
|
|
{
|
|
ScrollRect scroll = Selection.activeTransform.GetComponent<ScrollRect>();
|
|
if (scroll==null)
|
|
return;
|
|
Image img = Selection.activeTransform.GetComponent<Image>();
|
|
if (img != null)
|
|
Object.DestroyImmediate(img);
|
|
scroll.horizontal = isHorizontal;
|
|
scroll.vertical = !isHorizontal;
|
|
scroll.horizontalScrollbar = null;
|
|
scroll.verticalScrollbar = null;
|
|
Transform horizontalObj = Selection.activeTransform.Find("Scrollbar Horizontal");
|
|
if (horizontalObj != null)
|
|
GameObject.DestroyImmediate(horizontalObj.gameObject);
|
|
Transform verticalObj = Selection.activeTransform.Find("Scrollbar Vertical");
|
|
if (verticalObj != null)
|
|
GameObject.DestroyImmediate(verticalObj.gameObject);
|
|
RectTransform viewPort = Selection.activeTransform.Find("Viewport") as RectTransform;
|
|
if (viewPort != null)
|
|
{
|
|
viewPort.offsetMin = new Vector2(0, 0);
|
|
viewPort.offsetMax = new Vector2(0, 0);
|
|
}
|
|
}
|
|
|
|
static public void CreateHScrollViewObj()
|
|
{
|
|
if (Selection.activeTransform && Selection.activeTransform.GetComponentInParent<Canvas>())
|
|
{
|
|
Transform last_trans = Selection.activeTransform;
|
|
bool isOk = EditorApplication.ExecuteMenuItem("GameObject/UI/Scroll View");
|
|
if (isOk)
|
|
{
|
|
Selection.activeGameObject.name = CommonHelper.GenerateUniqueName(Selection.activeGameObject, "ScrollView");
|
|
Selection.activeTransform.SetParent(GetGoodContainer(last_trans), false);
|
|
InitScrollView(true);
|
|
}
|
|
}
|
|
}
|
|
|
|
static public void CreateVScrollViewObj()
|
|
{
|
|
if (Selection.activeTransform && Selection.activeTransform.GetComponentInParent<Canvas>())
|
|
{
|
|
Transform last_trans = Selection.activeTransform;
|
|
bool isOk = EditorApplication.ExecuteMenuItem("GameObject/UI/Scroll View");
|
|
if (isOk)
|
|
{
|
|
Selection.activeGameObject.name = CommonHelper.GenerateUniqueName(Selection.activeGameObject, "ScrollView");
|
|
Selection.activeTransform.SetParent(GetGoodContainer(last_trans), false);
|
|
InitScrollView(false);
|
|
}
|
|
}
|
|
}
|
|
|
|
static public string GenMD5String(string str)
|
|
{
|
|
System.Security.Cryptography.MD5CryptoServiceProvider md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
|
|
str = System.BitConverter.ToString(md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(str)), 4, 8);
|
|
return str.Replace("-", "");
|
|
}
|
|
|
|
public static void SaveAnotherLayoutContextMenu()
|
|
{
|
|
SaveAnotherLayoutMenu();
|
|
}
|
|
|
|
public static void SaveLayoutForMenu()
|
|
{
|
|
SaveLayout(null, false);
|
|
}
|
|
|
|
public static void CreatNewLayoutForMenu()
|
|
{
|
|
CreatNewLayout();
|
|
}
|
|
public static void ReLoadLayoutForMenu()
|
|
{
|
|
ReLoadLayout(null, false);
|
|
}
|
|
}
|
|
}
|
|
#endif
|