Exemplo n.º 1
0
    /// <summary>
    /// Draw an editor field for the Unity Delegate.
    /// </summary>

    static public bool Field(Object undoObject, EventDelegate del, bool removeButton, bool minimalistic)
    {
        if (del == null)
        {
            return(false);
        }
        bool prev = GUI.changed;

        GUI.changed = false;
        bool          retVal = false;
        MonoBehaviour target = del.target;
        bool          remove = false;

        if (removeButton && (del.target != null || del.isValid))
        {
            if (!minimalistic)
            {
                UGUIEditorTools.SetLabelWidth(82f);
            }

            if (del.target == null && del.isValid)
            {
                EditorGUILayout.LabelField("Notify", del.ToString());
            }
            else
            {
                target = EditorGUILayout.ObjectField("Notify", del.target, typeof(MonoBehaviour), true) as MonoBehaviour;
            }

            GUILayout.Space(-18f);
            GUILayout.BeginHorizontal();
            GUILayout.Space(70f);

            if (GUILayout.Button("", "ToggleMixed", GUILayout.Width(20f), GUILayout.Height(16f)))
            {
                target = null;
                remove = true;
            }
            GUILayout.EndHorizontal();
        }
        else
        {
            target = EditorGUILayout.ObjectField("Notify", del.target, typeof(MonoBehaviour), true) as MonoBehaviour;
        }

        if (remove)
        {
            UGUIEditorTools.RegisterUndo("Delegate Selection", undoObject);
            del.Clear();
            EditorUtility.SetDirty(undoObject);
        }
        else if (del.target != target)
        {
            UGUIEditorTools.RegisterUndo("Delegate Selection", undoObject);
            del.target = target;
            EditorUtility.SetDirty(undoObject);
        }

        if (del.target != null && del.target.gameObject != null)
        {
            GameObject   go   = del.target.gameObject;
            List <Entry> list = GetMethods(go);

            int      index  = 0;
            string[] names  = PropertyReferenceDrawer.GetNames(list, del.ToString(), out index);
            int      choice = 0;

            GUILayout.BeginHorizontal();
            choice = EditorGUILayout.Popup("Method", index, names);
            UGUIEditorTools.DrawPadding();
            GUILayout.EndHorizontal();

            if (choice > 0 && choice != index)
            {
                Entry entry = list[choice - 1];
                UGUIEditorTools.RegisterUndo("Delegate Selection", undoObject);
                del.target     = entry.target as MonoBehaviour;
                del.methodName = entry.name;
                EditorUtility.SetDirty(undoObject);
                retVal = true;
            }

            GUI.changed = false;
            EventDelegate.Parameter[] ps = del.parameters;

            if (ps != null)
            {
                for (int i = 0; i < ps.Length; ++i)
                {
                    EventDelegate.Parameter param = ps[i];
                    Object obj = EditorGUILayout.ObjectField("   Arg " + i, param.obj, typeof(Object), true);

                    if (GUI.changed)
                    {
                        GUI.changed = false;
                        param.obj   = obj;
                        EditorUtility.SetDirty(undoObject);
                    }

                    if (obj == null)
                    {
                        continue;
                    }

                    GameObject  selGO = null;
                    System.Type type  = obj.GetType();
                    if (type == typeof(GameObject))
                    {
                        selGO = obj as GameObject;
                    }
                    else if (type.IsSubclassOf(typeof(Component)))
                    {
                        selGO = (obj as Component).gameObject;
                    }

                    if (selGO != null)
                    {
                        // Parameters must be exact -- they can't be converted like property bindings
                        PropertyReferenceDrawer.filter     = param.expectedType;
                        PropertyReferenceDrawer.canConvert = false;
                        List <PropertyReferenceDrawer.Entry> ents = PropertyReferenceDrawer.GetProperties(selGO, true, false);

                        int      selection;
                        string[] props = GetNames(ents, GetFuncName(param.obj, param.field), out selection);

                        GUILayout.BeginHorizontal();
                        int newSel = EditorGUILayout.Popup(" ", selection, props);
                        UGUIEditorTools.DrawPadding();
                        GUILayout.EndHorizontal();

                        if (GUI.changed)
                        {
                            GUI.changed = false;

                            if (newSel == 0)
                            {
                                param.obj   = selGO;
                                param.field = null;
                            }
                            else
                            {
                                param.obj   = ents[newSel - 1].target;
                                param.field = ents[newSel - 1].name;
                            }
                            EditorUtility.SetDirty(undoObject);
                        }
                    }
                    else if (!string.IsNullOrEmpty(param.field))
                    {
                        param.field = null;
                        EditorUtility.SetDirty(undoObject);
                    }

                    PropertyReferenceDrawer.filter     = typeof(void);
                    PropertyReferenceDrawer.canConvert = true;
                }
            }
        }
        else
        {
            retVal = GUI.changed;
        }
        GUI.changed = prev;
        return(retVal);
    }
Exemplo n.º 2
0
    /// <summary>
    /// Draw the inspector widget.
    /// </summary>

    public override void OnInspectorGUI()
    {
        UGUIEditorTools.SetLabelWidth(80f);
        mAtlas = target as UGUIAtlas;

        Sprite sprite = (mAtlas != null) ? mAtlas.GetSprite(UGUISettings.selectedSprite) : null;

        GUILayout.Space(6f);

        if (mAtlas.replacement != null)
        {
            mType        = AtlasType.Reference;
            mReplacement = mAtlas.replacement;
        }

        GUILayout.BeginHorizontal();
        AtlasType after = (AtlasType)EditorGUILayout.EnumPopup("Atlas Type", mType);

        UGUIEditorTools.DrawPadding();
        GUILayout.EndHorizontal();

        if (mType != after)
        {
            if (after == AtlasType.Normal)
            {
                mType = AtlasType.Normal;
                OnSelectAtlas(null);
            }
            else
            {
                mType = AtlasType.Reference;
            }
        }

        if (mType == AtlasType.Reference)
        {
            ComponentSelector.Draw <UGUIAtlas>(mAtlas.replacement, OnSelectAtlas, true);

            GUILayout.Space(6f);
            EditorGUILayout.HelpBox("You can have one atlas simply point to " +
                                    "another one. This is useful if you want to be " +
                                    "able to quickly replace the contents of one " +
                                    "atlas with another one, for example for " +
                                    "swapping an SD atlas with an HD one, or " +
                                    "replacing an English atlas with a Chinese " +
                                    "one. All the sprites referencing this atlas " +
                                    "will update their references to the new one.", MessageType.Info);

            if (mReplacement != mAtlas && mAtlas.replacement != mReplacement)
            {
                UGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
                mAtlas.replacement = mReplacement;
                UGUITools.SetDirty(mAtlas);
            }
            return;
        }

        GUILayout.Space(6f);
//		Material mat = EditorGUILayout.ObjectField("Material", mAtlas.spriteMaterial, typeof(Material), false) as Material;
//
//		if (mAtlas.spriteMaterial != mat)
//		{
//			UGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
//			mAtlas.spriteMaterial = mat;
//
//			// Ensure that this atlas has valid import settings
//			if (mAtlas.texture != null) UGUIEditorTools.ImportTexture(mAtlas.texture, false, false, !mAtlas.premultipliedAlpha);
//
//			mAtlas.MarkAsChanged();
//		}
//
//		if (mat != null)
//		{
//			TextAsset ta = EditorGUILayout.ObjectField("TP Import", null, typeof(TextAsset), false) as TextAsset;
//
//			if (ta != null)
//			{
//				// Ensure that this atlas has valid import settings
//				if (mAtlas.texture != null) UGUIEditorTools.ImportTexture(mAtlas.texture, false, false, !mAtlas.premultipliedAlpha);
//
//				UGUIEditorTools.RegisterUndo("Import Sprites", mAtlas);
//				NGUIJson.LoadSpriteData(mAtlas, ta);
//				if (sprite != null) sprite = mAtlas.GetSprite(sprite.name);
//				mAtlas.MarkAsChanged();
//			}
//
//			float pixelSize = EditorGUILayout.FloatField("Pixel Size", mAtlas.pixelSize, GUILayout.Width(120f));
//
//			if (pixelSize != mAtlas.pixelSize)
//			{
//				UGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
//				mAtlas.pixelSize = pixelSize;
//			}
//		}

//		if (mAtlas.mainTexture != null)
        {
            Color blueColor  = new Color(0f, 0.7f, 1f, 1f);
            Color greenColor = new Color(0.4f, 1f, 0f, 1f);

            if (sprite == null && mAtlas.spriteList.Count > 0)
            {
                string spriteName = UGUISettings.selectedSprite;
                if (!string.IsNullOrEmpty(spriteName))
                {
                    sprite = mAtlas.GetSprite(spriteName);
                }
                if (sprite == null)
                {
                    sprite = mAtlas.spriteList[0];
                }
            }

            if (sprite != null)
            {
                if (sprite == null)
                {
                    return;
                }

//				Texture2D tex = mAtlas.mainTexture as Texture2D;

//				if (tex != null)
                {
                    if (!UGUIEditorTools.DrawHeader("Sprite Details"))
                    {
                        return;
                    }

                    UGUIEditorTools.BeginContents();

                    GUILayout.Space(3f);
                    UGUIEditorTools.DrawAdvancedSpriteField(mAtlas, sprite.name, SelectSprite, true);
                    GUILayout.Space(6f);

                    GUI.changed = false;

                    GUI.backgroundColor = greenColor;
                    UGUIEditorTools.IntVector sizeA = UGUIEditorTools.IntPair("Dimensions", "X", "Y", (int)sprite.textureRect.x, (int)sprite.textureRect.y);
                    UGUIEditorTools.IntVector sizeB = UGUIEditorTools.IntPair(null, "Width", "Height", (int)sprite.textureRect.width, (int)sprite.textureRect.height);

                    EditorGUILayout.Separator();
                    GUI.backgroundColor = blueColor;
                    UGUIEditorTools.IntVector borderA = UGUIEditorTools.IntPair("Border", "Left", "Right", (int)sprite.border.x, (int)sprite.border.y);
                    UGUIEditorTools.IntVector borderB = UGUIEditorTools.IntPair(null, "Bottom", "Top", (int)sprite.border.y, (int)sprite.border.z);

                    EditorGUILayout.Separator();
                    GUI.backgroundColor = Color.white;
                    UGUIEditorTools.IntVector padA = UGUIEditorTools.IntPair("Padding", "Left", "Right", (int)sprite.rect.xMin, (int)sprite.rect.xMax);
                    UGUIEditorTools.IntVector padB = UGUIEditorTools.IntPair(null, "Bottom", "Top", (int)sprite.rect.yMax, (int)sprite.rect.yMin);

                    if (GUI.changed)
                    {
//						UGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
//
//						sprite.rect.x = sizeA.x;
//						sprite.rect.y = sizeA.y;
//						sprite.rect.width = sizeB.x;
//						sprite.rect.height = sizeB.y;
//
//						sprite.paddingLeft = padA.x;
//						sprite.paddingRight = padA.y;
//						sprite.paddingBottom = padB.x;
//						sprite.paddingTop = padB.y;
//
//						sprite.borderLeft = borderA.x;
//						sprite.borderRight = borderA.y;
//						sprite.borderBottom = borderB.x;
//						sprite.borderTop = borderB.y;
//
//						MarkSpriteAsDirty();
                    }

                    GUILayout.Space(3f);

                    GUILayout.BeginHorizontal();

//					if (GUILayout.Button("Duplicate"))
//					{
//						UGUIAtlasMaker.SpriteEntry se = UGUIAtlasMaker.DuplicateSprite(mAtlas, sprite.name);
//						if (se != null) UGUISettings.selectedSprite = se.name;
//					}

//					if (GUILayout.Button("Save As..."))
//					{
//						#if UNITY_3_5
//						string path = EditorUtility.SaveFilePanel("Save As",
//						UGUISettings.currentPath, sprite.name + ".png", "png");
//						#else
//						string path = EditorUtility.SaveFilePanelInProject("Save As",
//							sprite.name + ".png", "png",
//							"Extract sprite into which file?", UGUISettings.currentPath);
//						#endif
//
//						if (!string.IsNullOrEmpty(path))
//						{
//							UGUISettings.currentPath = System.IO.Path.GetDirectoryName(path);
//							UGUIAtlasMaker.SpriteEntry se = UGUIAtlasMaker.ExtractSprite(mAtlas, sprite.name);
//
//							if (se != null)
//							{
//								byte[] bytes = se.tex.EncodeToPNG();
//								File.WriteAllBytes(path, bytes);
//								AssetDatabase.ImportAsset(path);
//								if (se.temporaryTexture) DestroyImmediate(se.tex);
//							}
//						}
//					}
                    GUILayout.EndHorizontal();
                    UGUIEditorTools.EndContents();
                }

                if (UGUIEditorTools.DrawHeader("Modify"))
                {
                    UGUIEditorTools.BeginContents();

                    EditorGUILayout.BeginHorizontal();
                    GUILayout.Space(20f);
                    EditorGUILayout.BeginVertical();

                    UGUISettings.backgroundColor = EditorGUILayout.ColorField("Background", UGUISettings.backgroundColor);

//					if (GUILayout.Button("Add a Shadow")) AddShadow(sprite);
//					if (GUILayout.Button("Add a Soft Outline")) AddOutline(sprite);

//					if (GUILayout.Button("Add a Transparent Border")) AddTransparentBorder(sprite);
//					if (GUILayout.Button("Add a Clamped Border")) AddClampedBorder(sprite);
//					if (GUILayout.Button("Add a Tiled Border")) AddTiledBorder(sprite);
//					EditorGUI.BeginDisabledGroup(!sprite.hasBorder);
//					if (GUILayout.Button("Crop Border")) CropBorder(sprite);
//					EditorGUI.EndDisabledGroup();

                    EditorGUILayout.EndVertical();
                    GUILayout.Space(20f);
                    EditorGUILayout.EndHorizontal();

                    UGUIEditorTools.EndContents();
                }

                if (UGUIEditorTools.previousSelection != null)
                {
                    GUILayout.Space(3f);
                    GUI.backgroundColor = Color.green;

                    if (GUILayout.Button("<< Return to " + UGUIEditorTools.previousSelection.name))
                    {
                        UGUIEditorTools.SelectPrevious();
                    }
                    GUI.backgroundColor = Color.white;
                }
            }
        }
    }