示例#1
0
 public void SetFlag(int i, HandlerFlags flag, bool value)
 {
     if (value)
     {
         flags[i] |= flag;
     }
     else
     {
         flags[i] &= ~flag;
     }
 }
示例#2
0
        public void Add(object listener, Delegate handler, HandlerFlags flag)
        {
            UnityEngine.Debug.Assert(listeners.Count == handlers.Count);

            // if not in a handler, don't set this flag as it would ignore first
            // nested handler
            if (invocationCount == 0)
            {
                flag &= ~HandlerFlags.DontInvokeIfAddedInAHandler;
            }

            listeners.Add(listener);
            handlers.Add(handler);
            flags.Add(flag);
        }
示例#3
0
    /// <summary>
    /// Register a message handler.
    ///
    /// The <paramref name="handler"/> will be invoked every time a message of type <typeparamref name="MessageType"/> is raised,
    /// unless <paramref name="listener"/> gets destroyed or one of Unlisten/Clear methods is called.
    /// </summary>
    /// <typeparam name="ListenerType"></typeparam>
    /// <typeparam name="MessageType"></typeparam>
    /// <param name="listener"></param>
    /// <param name="handler"></param>
    /// <param name="once">After the <paramref name="handler"/> is invoked - unlisten automatically.</param>
    /// <param name="exculdeInactive">If <paramref name="listener"/> is a Behaviour or GameObject, will only invoke <paramref name="handler"/>
    /// if <paramref name="listener"/> is active and enabled.</param>
    /// <exception cref="System.InvalidOperationException">Thrown if the internal worker has been disabled somehow.</exception>
    public static void Listen <ListenerType, MessageType>(ListenerType listener, System.Action <MessageType> handler,
                                                          bool once            = false,
                                                          bool exculdeInactive = false)
        where ListenerType : UnityEngine.Object
    {
        HandlerFlags flags = HandlerFlags.IsUnityObject;

        if (once)
        {
            flags |= HandlerFlags.Once;
        }
        if (exculdeInactive)
        {
            flags |= HandlerFlags.OnlyIfActiveAndEnabled;
        }

        RegisterInternal(listener, handler, flags);
    }
示例#4
0
    private static Delegate RegisterInternal(Type messageType, object listener, Delegate handler, HandlerFlags flags)
    {
        if (messageType == null)
        {
            throw new ArgumentNullException("messageType");
        }
        if (listener == null)
        {
            throw new ArgumentNullException("listener");
        }
        if (handler == null)
        {
            throw new ArgumentNullException("handler");
        }

        if ((flags & HandlerFlags.IsUnityObject) == HandlerFlags.IsUnityObject)
        {
            Debug.Assert(listener is UnityEngine.Object);
            EnsureWorkerExistsAndIsActive();
        }

        EventEntry entry;

        if (!s_entries.TryGetValue(messageType, out entry))
        {
            entry = new EventEntry();
            s_entries.Add(messageType, entry);
            s_entriesList.Add(entry);
        }

        entry.Add(listener, handler, flags);

        return(handler);
    }
示例#5
0
 private static Delegate RegisterInternal <ListenerType, MessageType>(ListenerType listener, System.Action <MessageType> handler, HandlerFlags flags)
 {
     return(RegisterInternal(typeof(MessageType), listener, handler, flags));
 }
示例#6
0
 public bool HasFlag(int i, HandlerFlags flag)
 {
     return((flags[i] & flag) == flag);
 }