Inheritance: UIWidgetInspector
Beispiel #1
0
    /// <summary>
    /// Sprite creation function.
    /// </summary>

    void CreateSprite <T> (GameObject go, ref string field) where T : UISprite
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string sp = UISpriteInspector.SpriteField(UISettings.atlas, "Sprite", field, GUILayout.Width(200f));

            if (!string.IsNullOrEmpty(sp))
            {
                GUILayout.Space(20f);
                GUILayout.Label("Sprite that will be created");
            }
            GUILayout.EndHorizontal();

            if (sp != field)
            {
                field = sp;
                Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null))
        {
            T sprite = NGUITools.AddWidget <T>(go);
            sprite.name       = sprite.name + " (" + field + ")";
            sprite.atlas      = UISettings.atlas;
            sprite.spriteName = field;
            sprite.MakePixelPerfect();
            Selection.activeGameObject = sprite.gameObject;
        }
    }
    /// <summary>
    /// Sprite creation function.
    /// </summary>

    void CreateSprite <T>(GameObject go, string field, SpriteSelector.Callback callback) where T : UISprite
    {
        if (UISettings.atlas != null)
        {
            UISpriteInspector.SpriteField("Sprite", "Sprite that will be created", UISettings.atlas, field, callback);

            if (!string.IsNullOrEmpty(field))
            {
                GUILayout.BeginHorizontal();
                UISettings.pivot = (UIWidget.Pivot)EditorGUILayout.EnumPopup("Pivot", UISettings.pivot, GUILayout.Width(200f));
                GUILayout.Space(20f);
                GUILayout.Label("Initial pivot point used by the sprite");
                GUILayout.EndHorizontal();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null))
        {
            T sprite = NGUITools.AddWidget <T>(go);
            sprite.name       = sprite.name + " (" + field + ")";
            sprite.atlas      = UISettings.atlas;
            sprite.spriteName = field;
            sprite.pivot      = UISettings.pivot;
            sprite.MakePixelPerfect();
            Selection.activeGameObject = sprite.gameObject;
        }
    }
Beispiel #3
0
    /// <summary>
    /// Input field creation function.
    /// </summary>

    void CreateInput(GameObject go)
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mInputBG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sliced Sprite for the background");
            GUILayout.EndHorizontal();
            if (mInputBG != bg)
            {
                mInputBG = bg; Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null && UISettings.font != null))
        {
            int depth = NGUITools.CalculateNextDepth(go);
            go      = NGUITools.AddChild(go);
            go.name = "Input";

            float padding = 3f;

            UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go);
            bg.name                 = "Background";
            bg.depth                = depth;
            bg.atlas                = UISettings.atlas;
            bg.spriteName           = mInputBG;
            bg.pivot                = UIWidget.Pivot.Left;
            bg.transform.localScale = new Vector3(400f, UISettings.font.size + padding * 2f, 1f);
            bg.MakePixelPerfect();

            UILabel lbl = NGUITools.AddWidget <UILabel>(go);
            lbl.font  = UISettings.font;
            lbl.pivot = UIWidget.Pivot.Left;
            lbl.transform.localPosition = new Vector3(padding, 0f, 0f);
            lbl.multiLine       = false;
            lbl.supportEncoding = false;
            lbl.lineWidth       = Mathf.RoundToInt(400f - padding * 2f);
            lbl.text            = "You can type here";
            lbl.MakePixelPerfect();

            // Add a collider to the background
            NGUITools.AddWidgetCollider(go);

            // Add an input script to the background and have it point to the label
            UIInput input = go.AddComponent <UIInput>();
            input.label = lbl;

            // Update the selection
            Selection.activeGameObject = go;
        }
    }
Beispiel #4
0
    /// <summary>
    /// Button creation function.
    /// </summary>

    void CreateButton(GameObject go)
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mButton, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sliced Sprite for the background");
            GUILayout.EndHorizontal();
            if (mButton != bg)
            {
                mButton = bg; Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null))
        {
            int depth = NGUITools.CalculateNextDepth(go);
            go      = NGUITools.AddChild(go);
            go.name = "Button";

            UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go);
            bg.name                 = "Background";
            bg.depth                = depth;
            bg.atlas                = UISettings.atlas;
            bg.spriteName           = mButton;
            bg.transform.localScale = new Vector3(150f, 40f, 1f);
            bg.MakePixelPerfect();

            if (UISettings.font != null)
            {
                UILabel lbl = NGUITools.AddWidget <UILabel>(go);
                lbl.font = UISettings.font;
                lbl.text = go.name;
                lbl.MakePixelPerfect();
            }

            // Add a collider
            NGUITools.AddWidgetCollider(go);

            // Add the scripts
            go.AddComponent <UIButton>().tweenTarget = bg.gameObject;
            go.AddComponent <UIButtonScale>();
            go.AddComponent <UIButtonOffset>();
            go.AddComponent <UIButtonSound>();

            Selection.activeGameObject = go;
        }
    }
    public override void OnInspectorGUI()
    {
                #pragma warning disable 0618
        EditorGUIUtility.LookLikeControls(80f);
                #pragma warning restore 0618
        mButton = target as UIImageButton;

        UISprite sprite = EditorGUILayout.ObjectField("Sprite", mButton.target, typeof(UISprite), true) as UISprite;

        if (mButton.target != sprite)
        {
            NGUIEditorTools.RegisterUndo("Image Button Change", mButton);
            mButton.target = sprite;
            if (sprite != null)
            {
                sprite.spriteName = mButton.normalSprite;
            }
        }

        if (mButton.target != null)
        {
            ComponentSelector.Draw <UIAtlas>(sprite.atlas as UIAtlas, OnSelectAtlas);

            if (sprite.atlas != null)
            {
                string normal = UISpriteInspector.SpriteField(sprite.atlas as UIAtlas, "Normal", mButton.normalSprite);
                string hover  = UISpriteInspector.SpriteField(sprite.atlas as UIAtlas, "Hover", mButton.hoverSprite);
                string press  = UISpriteInspector.SpriteField(sprite.atlas as UIAtlas, "Pressed", mButton.pressedSprite);

                if (mButton.normalSprite != normal ||
                    mButton.hoverSprite != hover ||
                    mButton.pressedSprite != press)
                {
                    NGUIEditorTools.RegisterUndo("Image Button Change", mButton, mButton.gameObject, sprite);
                    mButton.normalSprite  = normal;
                    mButton.hoverSprite   = hover;
                    mButton.pressedSprite = press;
                    sprite.spriteName     = normal;
                    sprite.MakePixelPerfect();
                    NGUITools.AddWidgetCollider(mButton.gameObject);
                }
            }
        }
    }
Beispiel #6
0
    /// <summary>
    /// Create a popup list or a menu.
    /// </summary>

    void CreatePopup(GameObject go, bool isDropDown)
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string sprite = UISpriteInspector.SpriteField(UISettings.atlas, "Foreground", mListFG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Foreground sprite (shown on the button)");
            GUILayout.EndHorizontal();
            if (mListFG != sprite)
            {
                mListFG = sprite; Save();
            }

            GUILayout.BeginHorizontal();
            sprite = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mListBG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Background sprite (envelops the options)");
            GUILayout.EndHorizontal();
            if (mListBG != sprite)
            {
                mListBG = sprite; Save();
            }

            GUILayout.BeginHorizontal();
            sprite = UISpriteInspector.SpriteField(UISettings.atlas, "Highlight", mListHL, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sprite used to highlight the selected option");
            GUILayout.EndHorizontal();
            if (mListHL != sprite)
            {
                mListHL = sprite; Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null && UISettings.font != null))
        {
            int depth = NGUITools.CalculateNextDepth(go);
            go      = NGUITools.AddChild(go);
            go.name = isDropDown ? "Popup List" : "Popup Menu";

            UIAtlas.Sprite sphl = UISettings.atlas.GetSprite(mListHL);
            UIAtlas.Sprite spfg = UISettings.atlas.GetSprite(mListFG);

            Vector2 hlPadding = new Vector2(
                Mathf.Max(4f, sphl.inner.xMin - sphl.outer.xMin),
                Mathf.Max(4f, sphl.inner.yMin - sphl.outer.yMin));

            Vector2 fgPadding = new Vector2(
                Mathf.Max(4f, spfg.inner.xMin - spfg.outer.xMin),
                Mathf.Max(4f, spfg.inner.yMin - spfg.outer.yMin));

            // Background sprite
            UISprite sprite = NGUITools.AddSprite(go, UISettings.atlas, mListFG);
            sprite.depth = depth;
            sprite.atlas = UISettings.atlas;
            sprite.transform.localScale = new Vector3(150f + fgPadding.x * 2f, UISettings.font.size + fgPadding.y * 2f, 1f);
            sprite.pivot = UIWidget.Pivot.Left;
            sprite.MakePixelPerfect();

            // Text label
            UILabel lbl = NGUITools.AddWidget <UILabel>(go);
            lbl.font  = UISettings.font;
            lbl.text  = go.name;
            lbl.pivot = UIWidget.Pivot.Left;
            lbl.cachedTransform.localPosition = new Vector3(fgPadding.x, 0f, 0f);
            lbl.MakePixelPerfect();

            // Add a collider
            NGUITools.AddWidgetCollider(go);

            // Add the popup list
            UIPopupList list = go.AddComponent <UIPopupList>();
            list.atlas            = UISettings.atlas;
            list.font             = UISettings.font;
            list.backgroundSprite = mListBG;
            list.highlightSprite  = mListHL;
            list.padding          = hlPadding;
            if (isDropDown)
            {
                list.textLabel = lbl;
            }
            for (int i = 0; i < 5; ++i)
            {
                list.items.Add(isDropDown ? ("List Option " + i) : ("Menu Option " + i));
            }

            // Add the scripts
            go.AddComponent <UIButton>().tweenTarget = sprite.gameObject;
            go.AddComponent <UIButtonSound>();

            Selection.activeGameObject = go;
        }
    }
Beispiel #7
0
    /// <summary>
    /// Progress bar creation function.
    /// </summary>

    void CreateSlider(GameObject go, bool slider)
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mSliderBG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sprite for the background (empty bar)");
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            string fg = UISpriteInspector.SpriteField(UISettings.atlas, "Foreground", mSliderFG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sprite for the foreground (full bar)");
            GUILayout.EndHorizontal();

            string tb = mSliderTB;

            if (slider)
            {
                GUILayout.BeginHorizontal();
                tb = UISpriteInspector.SpriteField(UISettings.atlas, "Thumb", mSliderTB, GUILayout.Width(200f));
                GUILayout.Space(20f);
                GUILayout.Label("Sprite for the thumb indicator");
                GUILayout.EndHorizontal();
            }

            if (mSliderBG != bg || mSliderFG != fg || mSliderTB != tb)
            {
                mSliderBG = bg;
                mSliderFG = fg;
                mSliderTB = tb;
                Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null))
        {
            int depth = NGUITools.CalculateNextDepth(go);
            go      = NGUITools.AddChild(go);
            go.name = slider ? "Slider" : "Progress Bar";

            // Background sprite
            UIAtlas.Sprite bgs  = UISettings.atlas.GetSprite(mSliderBG);
            UISprite       back = (bgs.inner == bgs.outer) ?
                                  (UISprite)NGUITools.AddWidget <UISprite>(go) :
                                  (UISprite)NGUITools.AddWidget <UISlicedSprite>(go);

            back.name                 = "Background";
            back.depth                = depth;
            back.pivot                = UIWidget.Pivot.Left;
            back.atlas                = UISettings.atlas;
            back.spriteName           = mSliderBG;
            back.transform.localScale = new Vector3(200f, 30f, 1f);
            back.MakePixelPerfect();

            // Fireground sprite
            UIAtlas.Sprite fgs   = UISettings.atlas.GetSprite(mSliderFG);
            UISprite       front = (fgs.inner == fgs.outer) ?
                                   (UISprite)NGUITools.AddWidget <UIFilledSprite>(go) :
                                   (UISprite)NGUITools.AddWidget <UISlicedSprite>(go);

            front.name                 = "Foreground";
            front.pivot                = UIWidget.Pivot.Left;
            front.atlas                = UISettings.atlas;
            front.spriteName           = mSliderFG;
            front.transform.localScale = new Vector3(200f, 30f, 1f);
            front.MakePixelPerfect();

            // Add a collider
            if (slider)
            {
                NGUITools.AddWidgetCollider(go);
            }

            // Add the slider script
            UISlider uiSlider = go.AddComponent <UISlider>();
            uiSlider.foreground = front.transform;
            uiSlider.fullSize   = front.transform.localScale;

            // Thumb sprite
            if (slider)
            {
                UIAtlas.Sprite tbs = UISettings.atlas.GetSprite(mSliderTB);
                UISprite       thb = (tbs.inner == tbs.outer) ?
                                     (UISprite)NGUITools.AddWidget <UISprite>(go) :
                                     (UISprite)NGUITools.AddWidget <UISlicedSprite>(go);

                thb.name       = "Thumb";
                thb.atlas      = UISettings.atlas;
                thb.spriteName = mSliderTB;
                thb.transform.localPosition = new Vector3(200f, 0f, 0f);
                thb.transform.localScale    = new Vector3(20f, 40f, 1f);
                thb.MakePixelPerfect();

                NGUITools.AddWidgetCollider(thb.gameObject);
                thb.gameObject.AddComponent <UIButtonColor>();
                thb.gameObject.AddComponent <UIButtonScale>();

                uiSlider.thumb = thb.transform;
            }
            uiSlider.sliderValue = 0.75f;

            // Select the slider
            Selection.activeGameObject = go;
        }
    }
Beispiel #8
0
    /// <summary>
    /// Scroll bar template.
    /// </summary>

    void CreateScrollBar(GameObject go)
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mScrollBG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sprite for the background");
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            string fg = UISpriteInspector.SpriteField(UISettings.atlas, "Foreground", mScrollFG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sprite for the foreground (thumb)");
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            UIScrollBar.Direction dir = (UIScrollBar.Direction)EditorGUILayout.EnumPopup("Direction", mScrollDir, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Add colliders?", GUILayout.Width(80f));
            bool draggable = EditorGUILayout.Toggle(mScrollCL);
            GUILayout.EndHorizontal();

            if (mScrollBG != bg || mScrollFG != fg || mScrollCL != draggable || mScrollDir != dir)
            {
                mScrollBG  = bg;
                mScrollFG  = fg;
                mScrollCL  = draggable;
                mScrollDir = dir;
                Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null))
        {
            int depth = NGUITools.CalculateNextDepth(go);
            go      = NGUITools.AddChild(go);
            go.name = "Scroll Bar";

            UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go);
            bg.name                 = "Background";
            bg.depth                = depth;
            bg.atlas                = UISettings.atlas;
            bg.spriteName           = mScrollBG;
            bg.transform.localScale = new Vector3(400f + bg.border.x + bg.border.z, 14f + bg.border.y + bg.border.w, 1f);
            bg.MakePixelPerfect();

            UISlicedSprite fg = NGUITools.AddWidget <UISlicedSprite>(go);
            fg.name       = "Foreground";
            fg.atlas      = UISettings.atlas;
            fg.spriteName = mScrollFG;

            UIScrollBar sb = go.AddComponent <UIScrollBar>();
            sb.background  = bg;
            sb.foreground  = fg;
            sb.direction   = mScrollDir;
            sb.barSize     = 0.3f;
            sb.scrollValue = 0.3f;
            sb.ForceUpdate();

            if (mScrollCL)
            {
                NGUITools.AddWidgetCollider(bg.gameObject);
                NGUITools.AddWidgetCollider(fg.gameObject);
            }
            Selection.activeGameObject = go;
        }
    }
Beispiel #9
0
    /// <summary>
    /// Checkbox creation function.
    /// </summary>

    void CreateCheckbox(GameObject go)
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Background", mCheckBG, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sliced Sprite for the background");
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            string ck = UISpriteInspector.SpriteField(UISettings.atlas, "Checkmark", mCheck, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Sprite visible when the state is 'checked'");
            GUILayout.EndHorizontal();

            if (mCheckBG != bg || mCheck != ck)
            {
                mCheckBG = bg;
                mCheck   = ck;
                Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null))
        {
            int depth = NGUITools.CalculateNextDepth(go);
            go      = NGUITools.AddChild(go);
            go.name = "Checkbox";

            UISlicedSprite bg = NGUITools.AddWidget <UISlicedSprite>(go);
            bg.name                 = "Background";
            bg.depth                = depth;
            bg.atlas                = UISettings.atlas;
            bg.spriteName           = mCheckBG;
            bg.transform.localScale = new Vector3(26f, 26f, 1f);
            bg.MakePixelPerfect();

            UISprite fg = NGUITools.AddWidget <UISprite>(go);
            fg.name       = "Checkmark";
            fg.atlas      = UISettings.atlas;
            fg.spriteName = mCheck;
            fg.MakePixelPerfect();

            if (UISettings.font != null)
            {
                UILabel lbl = NGUITools.AddWidget <UILabel>(go);
                lbl.font  = UISettings.font;
                lbl.text  = go.name;
                lbl.pivot = UIWidget.Pivot.Left;
                lbl.transform.localPosition = new Vector3(16f, 0f, 0f);
                lbl.MakePixelPerfect();
            }

            // Add a collider
            NGUITools.AddWidgetCollider(go);

            // Add the scripts
            go.AddComponent <UICheckbox>().checkSprite    = fg;
            go.AddComponent <UIButton>().tweenTarget      = bg.gameObject;
            go.AddComponent <UIButtonScale>().tweenTarget = bg.transform;
            go.AddComponent <UIButtonSound>();

            Selection.activeGameObject = go;
        }
    }
Beispiel #10
0
    /// <summary>
    /// Button creation function.
    /// </summary>

    void CreateImageButton(GameObject go)
    {
        if (UISettings.atlas != null)
        {
            GUILayout.BeginHorizontal();
            string bg = UISpriteInspector.SpriteField(UISettings.atlas, "Normal", mImage0, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Normal state sprite");
            GUILayout.EndHorizontal();
            if (mImage0 != bg)
            {
                mImage0 = bg; Save();
            }

            GUILayout.BeginHorizontal();
            bg = UISpriteInspector.SpriteField(UISettings.atlas, "Hover", mImage1, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Hover state sprite");
            GUILayout.EndHorizontal();
            if (mImage1 != bg)
            {
                mImage1 = bg; Save();
            }

            GUILayout.BeginHorizontal();
            bg = UISpriteInspector.SpriteField(UISettings.atlas, "Pressed", mImage2, GUILayout.Width(200f));
            GUILayout.Space(20f);
            GUILayout.Label("Pressed state sprite");
            GUILayout.EndHorizontal();
            if (mImage2 != bg)
            {
                mImage2 = bg; Save();
            }
        }

        if (ShouldCreate(go, UISettings.atlas != null))
        {
            int depth = NGUITools.CalculateNextDepth(go);
            go      = NGUITools.AddChild(go);
            go.name = "Image Button";

            UIAtlas.Sprite sp     = UISettings.atlas.GetSprite(mImage0);
            UISprite       sprite = (sp.inner == sp.outer) ? NGUITools.AddWidget <UISprite>(go) :
                                    (UISprite)NGUITools.AddWidget <UISlicedSprite>(go);

            sprite.name                 = "Background";
            sprite.depth                = depth;
            sprite.atlas                = UISettings.atlas;
            sprite.spriteName           = mImage0;
            sprite.transform.localScale = new Vector3(150f, 40f, 1f);
            sprite.MakePixelPerfect();

            if (UISettings.font != null)
            {
                UILabel lbl = NGUITools.AddWidget <UILabel>(go);
                lbl.font = UISettings.font;
                lbl.text = go.name;
                lbl.MakePixelPerfect();
            }

            // Add a collider
            NGUITools.AddWidgetCollider(go);

            // Add the scripts
            UIImageButton ib = go.AddComponent <UIImageButton>();
            ib.target        = sprite;
            ib.normalSprite  = mImage0;
            ib.hoverSprite   = mImage1;
            ib.pressedSprite = mImage2;
            go.AddComponent <UIButtonSound>();

            Selection.activeGameObject = go;
        }
    }
    /// <summary>
    /// Draw the inspector widget.
    /// </summary>

    public override void OnInspectorGUI()
    {
        EditorGUIUtility.LookLikeControls(80f);
        mAtlas = target as UIAtlas;

        NGUIEditorTools.DrawSeparator();

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

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

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

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

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

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

        if (!mConfirmDelete)
        {
            NGUIEditorTools.DrawSeparator();
            Material mat = EditorGUILayout.ObjectField("Material", mAtlas.spriteMaterial, typeof(Material), false) as Material;

            if (mAtlas.spriteMaterial != mat)
            {
                NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
                mAtlas.spriteMaterial = mat;

                // Ensure that this atlas has valid import settings
                if (mAtlas.texture != null)
                {
                    NGUIEditorTools.ImportTexture(mAtlas.texture, false, false);
                }

                mAtlas.MarkAsDirty();
                mConfirmDelete = false;
            }

            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)
                    {
                        NGUIEditorTools.ImportTexture(mAtlas.texture, false, false);
                    }

                    NGUIEditorTools.RegisterUndo("Import Sprites", mAtlas);
                    NGUIJson.LoadSpriteData(mAtlas, ta);
                    if (mSprite != null)
                    {
                        mSprite = mAtlas.GetSprite(mSprite.name);
                    }
                    mAtlas.MarkAsDirty();
                }

                UIAtlas.Coordinates coords = (UIAtlas.Coordinates)EditorGUILayout.EnumPopup("Coordinates", mAtlas.coordinates);

                if (coords != mAtlas.coordinates)
                {
                    NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
                    mAtlas.coordinates = coords;
                    mConfirmDelete     = false;
                }

                float pixelSize = EditorGUILayout.FloatField("Pixel Size", mAtlas.pixelSize);

                if (pixelSize != mAtlas.pixelSize)
                {
                    NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
                    mAtlas.pixelSize = pixelSize;
                    mConfirmDelete   = false;
                }
            }
        }

        if (mAtlas.spriteMaterial != null)
        {
            Color blue  = new Color(0f, 0.7f, 1f, 1f);
            Color green = new Color(0.4f, 1f, 0f, 1f);

            if (mConfirmDelete)
            {
                if (mSprite != null)
                {
                    // Show the confirmation dialog
                    NGUIEditorTools.DrawSeparator();
                    GUILayout.Label("Are you sure you want to delete '" + mSprite.name + "'?");
                    NGUIEditorTools.DrawSeparator();

                    GUILayout.BeginHorizontal();
                    {
                        GUI.backgroundColor = Color.green;
                        if (GUILayout.Button("Cancel"))
                        {
                            mConfirmDelete = false;
                        }
                        GUI.backgroundColor = Color.red;

                        if (GUILayout.Button("Delete"))
                        {
                            NGUIEditorTools.RegisterUndo("Delete Sprite", mAtlas);
                            mAtlas.spriteList.Remove(mSprite);
                            mConfirmDelete = false;
                        }
                        GUI.backgroundColor = Color.white;
                    }
                    GUILayout.EndHorizontal();
                }
                else
                {
                    mConfirmDelete = false;
                }
            }
            else
            {
                if (mSprite == null && mAtlas.spriteList.Count > 0)
                {
                    string spriteName = EditorPrefs.GetString("NGUI Selected Sprite");
                    if (!string.IsNullOrEmpty(spriteName))
                    {
                        mSprite = mAtlas.GetSprite(spriteName);
                    }
                    if (mSprite == null)
                    {
                        mSprite = mAtlas.spriteList[0];
                    }
                }

                GUI.backgroundColor = Color.green;

                GUILayout.BeginHorizontal();
                {
                    EditorGUILayout.PrefixLabel("Add/Delete");

                    if (GUILayout.Button("New Sprite"))
                    {
                        NGUIEditorTools.RegisterUndo("Add Sprite", mAtlas);
                        UIAtlas.Sprite newSprite = new UIAtlas.Sprite();

                        if (mSprite != null)
                        {
                            newSprite.name  = "Copy of " + mSprite.name;
                            newSprite.outer = mSprite.outer;
                            newSprite.inner = mSprite.inner;
                        }
                        else
                        {
                            newSprite.name = "New Sprite";
                        }

                        mAtlas.spriteList.Add(newSprite);
                        mSprite = newSprite;
                    }

                    // Show the delete button
                    GUI.backgroundColor = Color.red;

                    if (mSprite != null && GUILayout.Button("Delete", GUILayout.Width(55f)))
                    {
                        mConfirmDelete = true;
                    }
                    GUI.backgroundColor = Color.white;
                }
                GUILayout.EndHorizontal();

                if (!mConfirmDelete && mSprite != null)
                {
                    NGUIEditorTools.DrawSeparator();

                    string spriteName = UISpriteInspector.SpriteField(mAtlas, mSprite.name);

                    if (spriteName != mSprite.name)
                    {
                        mSprite = mAtlas.GetSprite(spriteName);
                        EditorPrefs.SetString("NGUI Selected Sprite", spriteName);
                    }

                    if (mSprite == null)
                    {
                        return;
                    }

                    Texture2D tex = mAtlas.spriteMaterial.mainTexture as Texture2D;

                    if (tex != null)
                    {
                        Rect inner = mSprite.inner;
                        Rect outer = mSprite.outer;

                        string name = EditorGUILayout.TextField("Edit Name", mSprite.name);

                        if (mSprite.name != name && !string.IsNullOrEmpty(name))
                        {
                            bool found = false;

                            foreach (UIAtlas.Sprite sp in mAtlas.spriteList)
                            {
                                if (sp.name == name)
                                {
                                    found = true;
                                    break;
                                }
                            }

                            if (!found)
                            {
                                NGUIEditorTools.RegisterUndo("Edit Sprite Name", mAtlas);
                                mSprite.name = name;
                            }
                        }

                        if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels)
                        {
                            GUI.backgroundColor = green;
                            outer = NGUIEditorTools.IntRect("Dimensions", mSprite.outer);

                            Vector4 border = new Vector4(
                                mSprite.inner.xMin - mSprite.outer.xMin,
                                mSprite.inner.yMin - mSprite.outer.yMin,
                                mSprite.outer.xMax - mSprite.inner.xMax,
                                mSprite.outer.yMax - mSprite.inner.yMax);

                            GUI.backgroundColor = blue;
                            border = NGUIEditorTools.IntPadding("Border", border);
                            GUI.backgroundColor = Color.white;

                            inner.xMin = mSprite.outer.xMin + border.x;
                            inner.yMin = mSprite.outer.yMin + border.y;
                            inner.xMax = mSprite.outer.xMax - border.z;
                            inner.yMax = mSprite.outer.yMax - border.w;
                        }
                        else
                        {
                            // Draw the inner and outer rectangle dimensions
                            GUI.backgroundColor = green;
                            outer = EditorGUILayout.RectField("Outer Rect", mSprite.outer);
                            GUI.backgroundColor = blue;
                            inner = EditorGUILayout.RectField("Inner Rect", mSprite.inner);
                            GUI.backgroundColor = Color.white;
                        }

                        if (outer.xMax < outer.xMin)
                        {
                            outer.xMax = outer.xMin;
                        }
                        if (outer.yMax < outer.yMin)
                        {
                            outer.yMax = outer.yMin;
                        }

                        if (outer != mSprite.outer)
                        {
                            float x = outer.xMin - mSprite.outer.xMin;
                            float y = outer.yMin - mSprite.outer.yMin;

                            inner.x += x;
                            inner.y += y;
                        }

                        // Sanity checks to ensure that the inner rect is always inside the outer
                        inner.xMin = Mathf.Clamp(inner.xMin, outer.xMin, outer.xMax);
                        inner.xMax = Mathf.Clamp(inner.xMax, outer.xMin, outer.xMax);
                        inner.yMin = Mathf.Clamp(inner.yMin, outer.yMin, outer.yMax);
                        inner.yMax = Mathf.Clamp(inner.yMax, outer.yMin, outer.yMax);

                        EditorGUILayout.Separator();

                        // Padding is mainly meant to be used by the 'trimmed' feature of TexturePacker
                        if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels)
                        {
                            int left   = Mathf.RoundToInt(mSprite.paddingLeft * mSprite.outer.width);
                            int right  = Mathf.RoundToInt(mSprite.paddingRight * mSprite.outer.width);
                            int top    = Mathf.RoundToInt(mSprite.paddingTop * mSprite.outer.height);
                            int bottom = Mathf.RoundToInt(mSprite.paddingBottom * mSprite.outer.height);

                            NGUIEditorTools.IntVector a = NGUIEditorTools.IntPair("Padding", "Left", "Top", left, top);
                            NGUIEditorTools.IntVector b = NGUIEditorTools.IntPair(null, "Right", "Bottom", right, bottom);

                            if (a.x != left || a.y != top || b.x != right || b.y != bottom)
                            {
                                NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
                                mSprite.paddingLeft   = a.x / mSprite.outer.width;
                                mSprite.paddingTop    = a.y / mSprite.outer.width;
                                mSprite.paddingRight  = b.x / mSprite.outer.height;
                                mSprite.paddingBottom = b.y / mSprite.outer.height;
                                MarkSpriteAsDirty();
                            }
                        }
                        else
                        {
                            // Create a button that can make the coordinates pixel-perfect on click
                            GUILayout.BeginHorizontal();
                            {
                                GUILayout.Label("Correction", GUILayout.Width(75f));

                                Rect corrected0 = outer;
                                Rect corrected1 = inner;

                                if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels)
                                {
                                    corrected0 = NGUIMath.MakePixelPerfect(corrected0);
                                    corrected1 = NGUIMath.MakePixelPerfect(corrected1);
                                }
                                else
                                {
                                    corrected0 = NGUIMath.MakePixelPerfect(corrected0, tex.width, tex.height);
                                    corrected1 = NGUIMath.MakePixelPerfect(corrected1, tex.width, tex.height);
                                }

                                if (corrected0 == mSprite.outer && corrected1 == mSprite.inner)
                                {
                                    GUI.color = Color.grey;
                                    GUILayout.Button("Make Pixel-Perfect");
                                    GUI.color = Color.white;
                                }
                                else if (GUILayout.Button("Make Pixel-Perfect"))
                                {
                                    outer       = corrected0;
                                    inner       = corrected1;
                                    GUI.changed = true;
                                }
                            }
                            GUILayout.EndHorizontal();
                        }

                        GUILayout.BeginHorizontal();
                        {
                            mView = (View)EditorGUILayout.EnumPopup("Show", mView);
                            GUILayout.Label("Shader", GUILayout.Width(45f));

                            if (mUseShader != EditorGUILayout.Toggle(mUseShader, GUILayout.Width(20f)))
                            {
                                mUseShader = !mUseShader;

                                if (mUseShader && mView == View.Sprite)
                                {
                                    // TODO: Remove this when Unity fixes the bug with DrawPreviewTexture not being affected by BeginGroup
                                    Debug.LogWarning("There is a bug in Unity that prevents the texture from getting clipped properly.\n" +
                                                     "Until it's fixed by Unity, your texture may spill onto the rest of the Unity's GUI while using this mode.");
                                }
                            }
                        }
                        GUILayout.EndHorizontal();

                        if (mSprite.outer != outer || mSprite.inner != inner)
                        {
                            NGUIEditorTools.RegisterUndo("Atlas Change", mAtlas);
                            mSprite.outer  = outer;
                            mSprite.inner  = inner;
                            mConfirmDelete = false;
                            MarkSpriteAsDirty();
                        }

                        Rect uv0 = outer;
                        Rect uv1 = inner;

                        if (mAtlas.coordinates == UIAtlas.Coordinates.Pixels)
                        {
                            uv0 = NGUIMath.ConvertToTexCoords(uv0, tex.width, tex.height);
                            uv1 = NGUIMath.ConvertToTexCoords(uv1, tex.width, tex.height);
                        }

                        // Draw the atlas
                        EditorGUILayout.Separator();
                        Material m    = mUseShader ? mAtlas.spriteMaterial : null;
                        Rect     rect = (mView == View.Atlas) ? NGUIEditorTools.DrawAtlas(tex, m) : NGUIEditorTools.DrawSprite(tex, uv0, m);

                        // Draw the sprite outline
                        NGUIEditorTools.DrawOutline(rect, uv0, uv1);
                        EditorGUILayout.Separator();
                    }
                }
            }
        }
    }
    public override void OnInspectorGUI()
    {
        EditorGUIUtility.LookLikeControls(80f);
        mList = target as UIPopupList;

        ComponentSelector.Draw <UIAtlas>(mList.atlas, OnSelectAtlas);
        ComponentSelector.Draw <UIFont>(mList.font, OnSelectFont);

        UILabel lbl = EditorGUILayout.ObjectField("Text Label", mList.textLabel, typeof(UILabel), true) as UILabel;

        if (mList.textLabel != lbl)
        {
            RegisterUndo();
            mList.textLabel = lbl;
            if (lbl != null)
            {
                lbl.text = mList.selection;
            }
        }

        if (mList.atlas != null)
        {
            string bg = UISpriteInspector.SpriteField(mList.atlas, "Background", mList.backgroundSprite);
            string hl = UISpriteInspector.SpriteField(mList.atlas, "Highlight", mList.highlightSprite);

            if (mList.backgroundSprite != bg || mList.highlightSprite != hl)
            {
                RegisterUndo();
                mList.backgroundSprite = bg;
                mList.highlightSprite  = hl;
            }

            GUILayout.BeginHorizontal();
            GUILayout.Space(6f);
            GUILayout.Label("Options");
            GUILayout.EndHorizontal();

            string text = "";
            foreach (string s in mList.items)
            {
                text += s + "\n";
            }

            GUILayout.Space(-22f);
            GUILayout.BeginHorizontal();
            GUILayout.Space(84f);
            string modified = EditorGUILayout.TextArea(text, GUILayout.Height(100f));
            GUILayout.EndHorizontal();

            if (modified != text)
            {
                RegisterUndo();
                string[] split = modified.Split(new char[] { '\n' }, System.StringSplitOptions.RemoveEmptyEntries);
                mList.items.Clear();
                foreach (string s in split)
                {
                    mList.items.Add(s);
                }

                if (string.IsNullOrEmpty(mList.selection) || !mList.items.Contains(mList.selection))
                {
                    mList.selection = mList.items.Count > 0 ? mList.items[0] : "";
                }
            }

            string sel = NGUIEditorTools.DrawList("Selection", mList.items.ToArray(), mList.selection);

            if (mList.selection != sel)
            {
                RegisterUndo();
                mList.selection = sel;
            }

            UIPopupList.Position pos = (UIPopupList.Position)EditorGUILayout.EnumPopup("Position", mList.position);

            if (mList.position != pos)
            {
                RegisterUndo();
                mList.position = pos;
            }

            float ts = EditorGUILayout.FloatField("Text Scale", mList.textScale);
            Color tc = EditorGUILayout.ColorField("Text Color", mList.textColor);
            Color bc = EditorGUILayout.ColorField("Background", mList.backgroundColor);
            Color hc = EditorGUILayout.ColorField("Highlight", mList.highlightColor);

            GUILayout.BeginHorizontal();
            bool isLocalized = EditorGUILayout.Toggle("Localized", mList.isLocalized, GUILayout.Width(100f));
            bool isAnimated  = EditorGUILayout.Toggle("Animated", mList.isAnimated);
            GUILayout.EndHorizontal();

            if (mList.textScale != ts ||
                mList.textColor != tc ||
                mList.highlightColor != hc ||
                mList.backgroundColor != bc ||
                mList.isLocalized != isLocalized ||
                mList.isAnimated != isAnimated)
            {
                RegisterUndo();
                mList.textScale       = ts;
                mList.textColor       = tc;
                mList.backgroundColor = bc;
                mList.highlightColor  = hc;
                mList.isLocalized     = isLocalized;
                mList.isAnimated      = isAnimated;
            }

            NGUIEditorTools.DrawSeparator();

            GUILayout.BeginHorizontal();
            GUILayout.Space(6f);
            GUILayout.Label("Padding", GUILayout.Width(76f));
            GUILayout.BeginVertical();
            GUILayout.Space(-12f);
            Vector2 padding = EditorGUILayout.Vector2Field("", mList.padding);
            GUILayout.EndVertical();
            GUILayout.EndHorizontal();

            if (mList.padding != padding)
            {
                RegisterUndo();
                mList.padding = padding;
            }

            EditorGUIUtility.LookLikeControls(100f);

            GameObject go = EditorGUILayout.ObjectField("Event Receiver", mList.eventReceiver,
                                                        typeof(GameObject), true) as GameObject;

            string fn = EditorGUILayout.TextField("Function Name", mList.functionName);

            if (mList.eventReceiver != go || mList.functionName != fn)
            {
                RegisterUndo();
                mList.eventReceiver = go;
                mList.functionName  = fn;
            }
        }
    }