Ejemplo n.º 1
0
        /// <summary>
        /// Подписывает элемент графического интерфейса на получение событий, которые для него доступны.
        ///
        /// Например, у стандартного грфического элемента Toggle есть событие onValueChanged, которое принимает делегат UnityAction&lt;bool&gt;
        /// Пусть у источника данных есть свойство MyToggle, которое связано с соответствующим GuiToggleBind. Тогда подписка на событие может выглядеть так:
        /// AddEventListener("MyToggle", "onValueChanged", (proxydata, args) => Debug.Log("MyToggle changed: " + (bool)args[0]));
        /// </summary>
        public GuiEventData AddEventListener(string bindName, string eventName, UniversalGuiEventDelegate callback)
        {
            GuiEventData guiEventData = null;

            IGuiBindable bindableData = _bindableGuiComponents.SingleOrDefault(data => data.GetBindName() == bindName);

            if (bindableData != null)
            {
                object unityEvent =
                    bindableData.GetGuiComponent()
                    .GetType()
                    .GetProperyOrFieldValue(bindableData.GetGuiComponent(), eventName);

                if (unityEvent != null)
                {
                    Type unityEventType = unityEvent.GetType();

                    UnityActionProxy proxyHandler = UnityActionProxy.Create(unityEventType, callback);
                    guiEventData = new GuiEventData(bindName, eventName, bindableData, proxyHandler);
                    RegisteredEvents.Add(guiEventData);


                    unityEventType.GetMethod("AddListener")
                    .Invoke(unityEvent, new object[] { proxyHandler.UnityActionDelegate });
                }
            }

            return(guiEventData);
        }
Ejemplo n.º 2
0
        private void CallRemoveListenerOnUnityEvent(GuiEventData guiEventData)
        {
            object unityEvent =
                guiEventData.GuiBindableData.GetGuiComponent()
                .GetType()
                .GetProperyOrFieldValue(guiEventData.GuiBindableData.GetGuiComponent(), guiEventData.EventName);

            if (unityEvent != null)
            {
                unityEvent.GetType().GetMethod("RemoveListener").Invoke(unityEvent, new object[] { guiEventData.UnityActionProxy.UnityActionDelegate });
            }
            // TODO else?
        }