public void SetFlag(int i, HandlerFlags flag, bool value) { if (value) { flags[i] |= flag; } else { flags[i] &= ~flag; } }
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); }
/// <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); }
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); }
private static Delegate RegisterInternal <ListenerType, MessageType>(ListenerType listener, System.Action <MessageType> handler, HandlerFlags flags) { return(RegisterInternal(typeof(MessageType), listener, handler, flags)); }
public bool HasFlag(int i, HandlerFlags flag) { return((flags[i] & flag) == flag); }