You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			173 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			173 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
| #if FAIRYGUI_TOLUA
 | |
| using System;
 | |
| using LuaInterface;
 | |
| #endif
 | |
| 
 | |
| namespace FairyGUI
 | |
| {
 | |
|     /// <summary>
 | |
|     /// 
 | |
|     /// </summary>
 | |
|     class EventBridge
 | |
|     {
 | |
|         public EventDispatcher owner;
 | |
| 
 | |
|         EventCallback0 _callback0;
 | |
|         EventCallback1 _callback1;
 | |
|         EventCallback1 _captureCallback;
 | |
|         internal bool _dispatching;
 | |
| 
 | |
|         public EventBridge(EventDispatcher owner)
 | |
|         {
 | |
|             this.owner = owner;
 | |
|         }
 | |
| 
 | |
|         public void AddCapture(EventCallback1 callback)
 | |
|         {
 | |
|             _captureCallback -= callback;
 | |
|             _captureCallback += callback;
 | |
|         }
 | |
| 
 | |
|         public void RemoveCapture(EventCallback1 callback)
 | |
|         {
 | |
|             _captureCallback -= callback;
 | |
|         }
 | |
| 
 | |
|         public void Add(EventCallback1 callback)
 | |
|         {
 | |
|             _callback1 -= callback;
 | |
|             _callback1 += callback;
 | |
|         }
 | |
| 
 | |
|         public void Remove(EventCallback1 callback)
 | |
|         {
 | |
|             _callback1 -= callback;
 | |
|         }
 | |
| 
 | |
|         public void Add(EventCallback0 callback)
 | |
|         {
 | |
|             _callback0 -= callback;
 | |
|             _callback0 += callback;
 | |
|         }
 | |
| 
 | |
|         public void Remove(EventCallback0 callback)
 | |
|         {
 | |
|             _callback0 -= callback;
 | |
|         }
 | |
| 
 | |
| #if FAIRYGUI_TOLUA
 | |
|         public void Add(LuaFunction func, LuaTable self)
 | |
|         {
 | |
|             EventCallback1 callback = (EventCallback1)DelegateTraits<EventCallback1>.Create(func, self);
 | |
|             _callback1 -= callback;
 | |
|             _callback1 += callback;
 | |
|         }
 | |
| 
 | |
|         public void Add(LuaFunction func, GComponent self)
 | |
|         {
 | |
|             if (self._peerTable == null)
 | |
|                 throw new Exception("self is not connected to lua.");
 | |
| 
 | |
|             Add(func, self._peerTable);
 | |
|         }
 | |
| 
 | |
|         public void Remove(LuaFunction func, LuaTable self)
 | |
|         {
 | |
|             LuaState state = func.GetLuaState();
 | |
|             LuaDelegate target;
 | |
|             if (self != null)
 | |
|                 target = state.GetLuaDelegate(func, self);
 | |
|             else
 | |
|                 target = state.GetLuaDelegate(func);
 | |
| 
 | |
|             Delegate[] ds = _callback1.GetInvocationList();
 | |
| 
 | |
|             for (int i = 0; i < ds.Length; i++)
 | |
|             {
 | |
|                 LuaDelegate ld = ds[i].Target as LuaDelegate;
 | |
|                 if (ld != null && ld.Equals(target))
 | |
|                 {
 | |
|                     _callback1 = (EventCallback1)Delegate.Remove(_callback1, ds[i]);
 | |
|                     //DelayDispose will cause problem
 | |
|                     //state.DelayDispose(ld.func);
 | |
|                     //if (ld.self != null)
 | |
|                     //	state.DelayDispose(ld.self);
 | |
|                     break;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Remove(LuaFunction func, GComponent self)
 | |
|         {
 | |
|             if (self._peerTable == null)
 | |
|                 throw new Exception("self is not connected to lua.");
 | |
| 
 | |
|             Remove(func, self._peerTable);
 | |
|         }
 | |
| #endif
 | |
| 
 | |
|         public bool isEmpty
 | |
|         {
 | |
|             get { return _callback1 == null && _callback0 == null && _captureCallback == null; }
 | |
|         }
 | |
| 
 | |
|         public void Clear()
 | |
|         {
 | |
| #if FAIRYGUI_TOLUA
 | |
|             //if (_callback1 != null)
 | |
|             //{
 | |
|             //	Delegate[] ds = _callback1.GetInvocationList();
 | |
|             //	for (int i = 0; i < ds.Length; i++)
 | |
|             //	{
 | |
|             //		LuaDelegate ld = ds[i].Target as LuaDelegate;
 | |
|             //		if (ld != null)
 | |
|             //		{
 | |
|             //			LuaState state = ld.func.GetLuaState();
 | |
|             //			state.DelayDispose(ld.func);
 | |
|             //			if (ld.self != null)
 | |
|             //				state.DelayDispose(ld.self);
 | |
|             //		}
 | |
|             //	}
 | |
|             //}
 | |
| #endif
 | |
|             _callback1 = null;
 | |
|             _callback0 = null;
 | |
|             _captureCallback = null;
 | |
|         }
 | |
| 
 | |
|         public void CallInternal(EventContext context)
 | |
|         {
 | |
|             _dispatching = true;
 | |
|             context.sender = owner;
 | |
|             try
 | |
|             {
 | |
|                 if (_callback1 != null)
 | |
|                     _callback1(context);
 | |
|                 if (_callback0 != null)
 | |
|                     _callback0();
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 _dispatching = false;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void CallCaptureInternal(EventContext context)
 | |
|         {
 | |
|             if (_captureCallback == null)
 | |
|                 return;
 | |
| 
 | |
|             _dispatching = true;
 | |
|             context.sender = owner;
 | |
|             try
 | |
|             {
 | |
|                 _captureCallback(context);
 | |
|             }
 | |
|             finally
 | |
|             {
 | |
|                 _dispatching = false;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |