Class: EventChain

Inherits:
Object show all
Defined in:
lib/volt/reactive/event_chain.rb

Instance Method Summary collapse

Constructor Details

#initialize(main_object) ⇒ EventChain

Returns a new instance of EventChain.



35
36
37
38
39
# File 'lib/volt/reactive/event_chain.rb', line 35

def initialize(main_object)
  @event_chain = {}
  @main_object = main_object
  @event_counts = {}
end

Instance Method Details

#add_event(event) ⇒ Object



90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'lib/volt/reactive/event_chain.rb', line 90

def add_event(event)
  unless @event_counts[event]
    @event_chain.each_pair do |chain_listener,listeners|
      # Only add if we haven't already chained this event
      unless listeners[event]
        listeners[event] = setup_listener(event, chain_listener)
      end
    end
  end

  @event_counts[event] ||= 0
  @event_counts[event] += 1
end

#add_object(object, &block) ⇒ Object

We can chain our events to any other object that includes Events



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/volt/reactive/event_chain.rb', line 63

def add_object(object, &block)
  # puts "ADD OBJECT: #{object.inspect} to #{self.inspect}"

  chain_listener = ChainListener.new(self, object, block)

  listeners = {}

  @main_object.listeners.keys.each do |event|
    # Create a listener for each event
    listeners[event] = setup_listener(event, chain_listener)
  end

  @event_chain[chain_listener] = listeners

  return chain_listener
end

#remove_event(event) ⇒ Object

Removes the event from all events in all objects



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/volt/reactive/event_chain.rb', line 105

def remove_event(event)
  if @event_counts[event]
    count = @event_counts[event] -= 1

    if count == 0
      @event_chain.each_pair do |chain_listener,listeners|
        listeners[event].remove# if listeners[event]
        listeners.delete(event)
      end

      # Also remove the event count
      @event_counts.delete(event)
    end
  end
end

#remove_object(chain_listener) ⇒ Object



81
82
83
84
85
86
87
88
# File 'lib/volt/reactive/event_chain.rb', line 81

def remove_object(chain_listener)
  @event_chain[chain_listener].each_pair do |event,listener|
    # Unbind each listener
    listener.remove
  end

  @event_chain.delete(chain_listener)
end

#setup_listener(event, chain_listener) ⇒ Object

Register an event listener that chains from object to self



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/volt/reactive/event_chain.rb', line 42

def setup_listener(event, chain_listener)
  return chain_listener.object.on(event, @main_object) do |filter, *args|
    if callback = chain_listener.callback
      callback.call(event, filter, *args)
    else
      # Trigger on this value, when it happens on the parent

      # Only pass the filter from non-reactive to reactive?  This
      # lets us scope the calls on a proxied object.
      # Filters limit which listeners are triggered, passing them to
      # the ReactiveValue's from non-reactive lets us filter at the
      # reactive level as well.
      filter = nil unless !chain_listener.object.reactive? && @main_object.reactive?

      @main_object.trigger!(event, filter, *args)
    end
  end
end