Advertisement
Dramiel

RIFT event handling

Oct 17th, 2011
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 4.54 KB | None | 0 0
  1. setfenv(1, (...).data);
  2.  
  3. MulticastDelegate = nil;
  4. do
  5.     local methods = { };
  6.  
  7.     local metatable = {
  8.         __add = function(self, value)
  9.             self:bind(value);
  10.            
  11.             return self;
  12.         end,
  13.        
  14.         __sub = function(self, value)
  15.             self:unbind(value);
  16.            
  17.             return self;
  18.         end,
  19.        
  20.         __call = function(self, ...)
  21.             for _, v in ipairs(self) do
  22.                 v(...);
  23.             end
  24.         end,
  25.        
  26.         __index = methods,
  27.        
  28.         _bind = dummy,
  29.        
  30.         _unbind = dummy,
  31.     };
  32.    
  33.     -- public members
  34.     methods.bind = function(self, delegate)
  35.         assert(type(delegate) == "function", "MulticastDelegate.bind requires 'delegate' (function) parameter");
  36.    
  37.         getmetatable(self)._bind(self, delegate);
  38.         tinsert(self, delegate);       
  39.     end
  40.    
  41.     methods.unbind = function(self, delegate)
  42.         assert(type(delegate) == "function", "MulticastDelegate.unbind requires 'delegate' (function) parameter");
  43.    
  44.         getmetatable(self)._unbind(self, delegate);
  45.         tremovevalue(self, delegate);
  46.     end
  47.  
  48.     -- constructor
  49.     MulticastDelegate = function()
  50.         local self = {};
  51.  
  52.         setmetatable(self, metatable);
  53.    
  54.         return self;
  55.     end
  56. end
  57.  
  58. EventTable = nil;
  59. do
  60.     local methods = {};
  61.  
  62.     -- private members
  63.     local function __newindex(self, key, value)
  64.         self:bind(key, value);
  65.     end
  66.    
  67.     local function __index(self, key)
  68.         local method = methods[key];
  69.  
  70.         if (method ~= nil) then
  71.             return method;
  72.         end
  73.        
  74.         local metatable = getmetatable(self);
  75.         local events = metatable.events;
  76.        
  77.         if (events[key] ~= nil) then
  78.             local delegates = metatable.delegates;
  79.             local delegate = delegates[key];
  80.        
  81.             if (delegate ~= nil) then
  82.                 return delegate;           
  83.             end
  84.            
  85.             return dummy;
  86.         else
  87.             error("Unknown event '" .. tostring(key) .. "'");
  88.         end
  89.     end
  90.    
  91.     -- public members
  92.     methods.bind = function(self, key, value)
  93.         assert(type(value) == "function", "EventTable.bind requires value (function) parameter");
  94.    
  95.         local metatable = getmetatable(self);
  96.         local events = metatable.events;
  97.        
  98.         if (events[key] ~= nil) then
  99.             local delegates = metatable.delegates;
  100.             local delegate = delegates[key];
  101.            
  102.             if (delegate == nil) then
  103.                 delegate = MulticastDelegate();
  104.                 delegates[key] = delegate;
  105.             end
  106.            
  107.             metatable._bind(self, key, value, delegate);
  108.             _= delegate + value;
  109.         else
  110.             error("Unknown event '" .. tostring(key) .. "'");
  111.         end
  112.     end
  113.    
  114.     methods.unbind = function(self, key, value)
  115.         assert(type(value) == "function", "EventTable.unbind requires value (function) parameter");
  116.    
  117.         local metatable = getmetatable(self);
  118.         local events = metatable.events;
  119.        
  120.         if (events[key] ~= nil) then
  121.             local delegates = metatable.delegates;
  122.             local delegate = delegates[key];
  123.            
  124.             if (delegate == nil) then
  125.                 return;
  126.             end
  127.  
  128.             metatable._unbind(self, key, value, delegate);
  129.             _= delegate - value;
  130.         else
  131.             error("Unknown event '" .. tostring(key) .. "'");
  132.         end
  133.     end
  134.    
  135.     methods.add = function(self, ...)
  136.         local events = getmetatable(self).events;
  137.        
  138.         for value in values(...) do
  139.             assert(type(value) == "string", "EventTable.add requires ... (string) arguments");
  140.             if (events[value] ~= nil) then
  141.                 error(events[value] == nil, "EventTable.add '" .. value .. "' is already registered");
  142.             end
  143.        
  144.             events[value] = true;
  145.         end
  146.     end
  147.    
  148.     -- constructor
  149.     EventTable = function(...)
  150.         local events = { };
  151.    
  152.         for value in values(...) do
  153.             assert(type(value) == "string", "EventTable requires ... (string) parameters");
  154.             events[value] = true;
  155.         end
  156.    
  157.         return setmetatable({ }, {
  158.             events = events,
  159.             delegates = {},
  160.             __newindex = __newindex,
  161.             __index = __index,
  162.             _bind = dummy,
  163.             _unbind = dummy,
  164.         });
  165.     end
  166. end
  167.  
  168. UIEventTable = nil;
  169. do
  170.     -- private members
  171.     local function _bind(self, key, value, delegate)
  172.         local metatable = getmetatable(self);
  173.         local nativeEvents = metatable.nativeEvents;
  174.  
  175.         if (getmetatable(nativeEvents).List[key] ~= nil and nativeEvents[key] == nil) then
  176.             nativeEvents[key] = function(...) self[key](...); end
  177.         end
  178.     end
  179.    
  180.     local function _unbind(self, key, value, delegate)
  181.         local metatable = getmetatable(self);
  182.         local nativeEvents = metatable.nativeEvents;
  183.        
  184.         if (#delegate <= 0 and nativeEvents[key] ~= nil) then
  185.             nativeEvents[key] = nil;
  186.         end
  187.     end
  188.  
  189.     -- constructor
  190.     UIEventTable = function(nativeEvents, ...)
  191.         local self = EventTable(...);
  192.  
  193.         local metatable = getmetatable(self);
  194.         metatable._bind = _bind;
  195.         metatable._unbind = _unbind;
  196.         metatable.nativeEvents = nativeEvents;
  197.        
  198.         setmetatable(metatable.events, { __index = getmetatable(nativeEvents).List });
  199.        
  200.         return self;
  201.     end
  202. end
  203.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement