| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 | using System;using UnityEngine;namespace FairyGUI{    /// <summary>    ///     /// </summary>    public class PopupMenu : EventDispatcher    {        protected GComponent _contentPane;        protected GList _list;        protected GObject _expandingItem;        PopupMenu _parentMenu;        TimerCallback _showSubMenu;        TimerCallback _closeSubMenu;        EventListener _onPopup;        EventListener _onClose;        public int visibleItemCount;        public bool hideOnClickItem;        public bool autoSize;        const string EVENT_TYPE = "PopupMenuItemClick";        public PopupMenu()        {            Create(null);        }        /// <summary>        ///         /// </summary>        /// <param name="resourceURL"></param>        public PopupMenu(string resourceURL)        {            Create(resourceURL);        }        public EventListener onPopup        {            get { return _onPopup ?? (_onPopup = new EventListener(this, "onPopup")); }        }        public EventListener onClose        {            get { return _onClose ?? (_onClose = new EventListener(this, "onClose")); }        }        void Create(string resourceURL)        {            if (resourceURL == null)            {                resourceURL = UIConfig.popupMenu;                if (resourceURL == null)                {                    Debug.LogError("FairyGUI: UIConfig.popupMenu not defined");                    return;                }            }            _contentPane = UIPackage.CreateObjectFromURL(resourceURL).asCom;            _contentPane.onAddedToStage.Add(__addedToStage);            _contentPane.onRemovedFromStage.Add(__removeFromStage);            _contentPane.focusable = false;            _list = _contentPane.GetChild("list").asList;            _list.RemoveChildrenToPool();            _list.AddRelation(_contentPane, RelationType.Width);            _list.RemoveRelation(_contentPane, RelationType.Height);            _contentPane.AddRelation(_list, RelationType.Height);            _list.onClickItem.Add(__clickItem);            hideOnClickItem = true;            _showSubMenu = __showSubMenu;            _closeSubMenu = CloseSubMenu;        }        /// <summary>        ///         /// </summary>        /// <param name="caption"></param>        /// <param name="callback"></param>        /// <returns></returns>        public GButton AddItem(string caption, EventCallback0 callback)        {            GButton item = CreateItem(caption, callback);            _list.AddChild(item);            return item;        }        /// <summary>        ///         /// </summary>        /// <param name="caption"></param>        /// <param name="callback"></param>        /// <returns></returns>        public GButton AddItem(string caption, EventCallback1 callback)        {            GButton item = CreateItem(caption, callback);            _list.AddChild(item);            return item;        }        /// <summary>        ///         /// </summary>        /// <param name="caption"></param>        /// <param name="index"></param>        /// <param name="callback"></param>        /// <returns></returns>        public GButton AddItemAt(string caption, int index, EventCallback1 callback)        {            GButton item = CreateItem(caption, callback);            _list.AddChildAt(item, index);            return item;        }        /// <summary>        ///         /// </summary>        /// <param name="caption"></param>        /// <param name="index"></param>        /// <param name="callback"></param>        /// <returns></returns>        public GButton AddItemAt(string caption, int index, EventCallback0 callback)        {            GButton item = CreateItem(caption, callback);            _list.AddChildAt(item, index);            return item;        }        GButton CreateItem(string caption, Delegate callback)        {            GButton item = _list.GetFromPool(_list.defaultItem).asButton;            item.title = caption;            item.grayed = false;            Controller c = item.GetController("checked");            if (c != null)                c.selectedIndex = 0;            item.RemoveEventListeners(EVENT_TYPE);            if (callback is EventCallback0)                item.AddEventListener(EVENT_TYPE, (EventCallback0)callback);            else                item.AddEventListener(EVENT_TYPE, (EventCallback1)callback);            item.onRollOver.Add(__rollOver);            item.onRollOut.Add(__rollOut);            return item;        }        /// <summary>        ///         /// </summary>        public void AddSeperator()        {            AddSeperator(-1);        }        /// <summary>        ///         /// </summary>        public void AddSeperator(int index)        {            if (UIConfig.popupMenu_seperator == null)            {                Debug.LogError("FairyGUI: UIConfig.popupMenu_seperator not defined");                return;            }            if (index == -1)                _list.AddItemFromPool(UIConfig.popupMenu_seperator);            else            {                GObject item = _list.GetFromPool(UIConfig.popupMenu_seperator);                _list.AddChildAt(item, index);            }        }        /// <summary>        ///         /// </summary>        /// <param name="index"></param>        /// <returns></returns>        public string GetItemName(int index)        {            GButton item = _list.GetChildAt(index).asButton;            return item.name;        }        /// <summary>        ///         /// </summary>        /// <param name="name"></param>        /// <param name="caption"></param>        public void SetItemText(string name, string caption)        {            GButton item = _list.GetChild(name).asButton;            item.title = caption;        }        /// <summary>        ///         /// </summary>        /// <param name="name"></param>        /// <param name="visible"></param>        public void SetItemVisible(string name, bool visible)        {            GButton item = _list.GetChild(name).asButton;            if (item.visible != visible)            {                item.visible = visible;                _list.SetBoundsChangedFlag();            }        }        /// <summary>        ///         /// </summary>        /// <param name="name"></param>        /// <param name="grayed"></param>        public void SetItemGrayed(string name, bool grayed)        {            GButton item = _list.GetChild(name).asButton;            item.grayed = grayed;        }        /// <summary>        ///         /// </summary>        /// <param name="name"></param>        /// <param name="checkable"></param>        public void SetItemCheckable(string name, bool checkable)        {            GButton item = _list.GetChild(name).asButton;            Controller c = item.GetController("checked");            if (c != null)            {                if (checkable)                {                    if (c.selectedIndex == 0)                        c.selectedIndex = 1;                }                else                    c.selectedIndex = 0;            }        }        /// <summary>        ///         /// </summary>        /// <param name="name"></param>        /// <param name="check"></param>        public void SetItemChecked(string name, bool check)        {            GButton item = _list.GetChild(name).asButton;            Controller c = item.GetController("checked");            if (c != null)                c.selectedIndex = check ? 2 : 1;        }        [Obsolete("Use IsItemChecked instead")]        public bool isItemChecked(string name)        {            return IsItemChecked(name);        }        /// <summary>        ///         /// </summary>        /// <param name="name"></param>        /// <returns></returns>        public bool IsItemChecked(string name)        {            GButton item = _list.GetChild(name).asButton;            Controller c = item.GetController("checked");            if (c != null)                return c.selectedIndex == 2;            else                return false;        }        /// <summary>        ///         /// </summary>        /// <param name="name"></param>        public void RemoveItem(string name)        {            GComponent item = _list.GetChild(name).asCom;            if (item != null)            {                item.RemoveEventListeners(EVENT_TYPE);                if (item.data is PopupMenu)                {                    ((PopupMenu)item.data).Dispose();                    item.data = null;                }                int index = _list.GetChildIndex(item);                _list.RemoveChildToPoolAt(index);            }        }        /// <summary>        ///         /// </summary>        public void ClearItems()        {            _list.RemoveChildrenToPool();        }        /// <summary>        ///         /// </summary>        public int itemCount        {            get { return _list.numChildren; }        }        /// <summary>        ///         /// </summary>        public GComponent contentPane        {            get { return _contentPane; }        }        /// <summary>        ///         /// </summary>        public GList list        {            get { return _list; }        }        public void Dispose()        {            int cnt = _list.numChildren;            for (int i = 0; i < cnt; i++)            {                GObject obj = _list.GetChildAt(i);                if (obj.data is PopupMenu)                    ((PopupMenu)obj.data).Dispose();            }            _contentPane.Dispose();        }        /// <summary>        ///         /// </summary>        public void Show()        {            Show(null, PopupDirection.Auto);        }        /// <summary>        ///         /// </summary>        /// <param name="target"></param>        public void Show(GObject target)        {            Show(target, PopupDirection.Auto, null);        }        [Obsolete]        public void Show(GObject target, object downward)        {            Show(target, downward == null ? PopupDirection.Auto : ((bool)downward == true ? PopupDirection.Down : PopupDirection.Up), null);        }        /// <summary>        ///         /// </summary>        /// <param name="target"></param>        /// <param name="dir"></param>        public void Show(GObject target, PopupDirection dir)        {            Show(target, PopupDirection.Auto, null);        }        /// <summary>        ///         /// </summary>        /// <param name="target"></param>        /// <param name="dir"></param>        /// <param name="parentMenu"></param>        public void Show(GObject target, PopupDirection dir, PopupMenu parentMenu)        {            GRoot r = target != null ? target.root : GRoot.inst;            r.ShowPopup(this.contentPane, (target is GRoot) ? null : target, dir);            _parentMenu = parentMenu;        }        public void Hide()        {            if (contentPane.parent != null)                ((GRoot)contentPane.parent).HidePopup(contentPane);        }        void ShowSubMenu(GObject item)        {            _expandingItem = item;            PopupMenu popup = item.data as PopupMenu;            if (item is GButton)                ((GButton)item).selected = true;            popup.Show(item, PopupDirection.Auto, this);            Vector2 pt = contentPane.LocalToRoot(new Vector2(item.x + item.width - 5, item.y - 5), item.root);            popup.contentPane.position = pt;        }        void CloseSubMenu(object param)        {            if (contentPane.isDisposed)                return;            if (_expandingItem == null)                return;            if (_expandingItem is GButton)                ((GButton)_expandingItem).selected = false;            PopupMenu popup = (PopupMenu)_expandingItem.data;            if (popup == null)                return;            _expandingItem = null;            popup.Hide();        }        private void __clickItem(EventContext context)        {            GButton item = ((GObject)context.data).asButton;            if (item == null)                return;            if (item.grayed)            {                _list.selectedIndex = -1;                return;            }            Controller c = item.GetController("checked");            if (c != null && c.selectedIndex != 0)            {                if (c.selectedIndex == 1)                    c.selectedIndex = 2;                else                    c.selectedIndex = 1;            }            if (hideOnClickItem)            {                if (_parentMenu != null)                    _parentMenu.Hide();                Hide();            }            item.DispatchEvent(EVENT_TYPE, item); //event data is for backward compatibility         }        void __addedToStage()        {            DispatchEvent("onPopup", null);            if (autoSize)            {                _list.EnsureBoundsCorrect();                int cnt = _list.numChildren;                float maxDelta = -1000;                for (int i = 0; i < cnt; i++)                {                    GButton obj = _list.GetChildAt(i).asButton;                    if (obj == null)                        continue;                    GTextField tf = obj.GetTextField();                    if (tf != null)                    {                        float v = tf.textWidth - tf.width;                        if (v > maxDelta)                            maxDelta = v;                    }                }                if (contentPane.width + maxDelta > contentPane.initWidth)                    contentPane.width += maxDelta;                else                    contentPane.width = contentPane.initWidth;            }            _list.selectedIndex = -1;            _list.ResizeToFit(visibleItemCount > 0 ? visibleItemCount : int.MaxValue, 10);        }        void __removeFromStage()        {            _parentMenu = null;            if (_expandingItem != null)                Timers.inst.Add(0, 1, _closeSubMenu);            DispatchEvent("onClose", null);        }        void __rollOver(EventContext context)        {            GObject item = (GObject)context.sender;            if ((item.data is PopupMenu) || _expandingItem != null)            {                Timers.inst.Add(0.1f, 1, _showSubMenu, item);            }        }        void __showSubMenu(object param)        {            if (contentPane.isDisposed)                return;            GObject item = (GObject)param;            GRoot r = contentPane.root;            if (r == null)                return;            if (_expandingItem != null)            {                if (_expandingItem == item)                    return;                CloseSubMenu(null);            }            PopupMenu popup = item.data as PopupMenu;            if (popup == null)                return;            ShowSubMenu(item);        }        void __rollOut(EventContext context)        {            if (_expandingItem == null)                return;            Timers.inst.Remove(_showSubMenu);            GRoot r = contentPane.root;            if (r != null)            {                PopupMenu popup = (PopupMenu)_expandingItem.data;                Vector2 pt = popup.contentPane.GlobalToLocal(context.inputEvent.position);                if (pt.x >= 0 && pt.y >= 0 && pt.x < popup.contentPane.width && pt.y < popup.contentPane.height)                    return;            }            CloseSubMenu(null);        }    }}
 |