Class: Hyalite::EventDispatcher

Inherits:
Object
  • Object
show all
Defined in:
lib/hyalite/event_dispatcher.rb

Defined Under Namespace

Classes: TopLevelCallbackBookKeeping

Instance Method Summary collapse

Constructor Details

#initialize(&extract_events) ⇒ EventDispatcher

Returns a new instance of EventDispatcher.



3
4
5
6
7
8
# File 'lib/hyalite/event_dispatcher.rb', line 3

def initialize(&extract_events)
  @enabled = true
  @listener_bank = {}
  @extract_events = extract_events
  @event_queue = []
end

Instance Method Details

#delete_all_listeners(id, &block) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/hyalite/event_dispatcher.rb', line 81

def delete_all_listeners(id, &block)
  @listener_bank.each do |registration_name, bank|
    next unless bank[id]
    yield(id, registration_name) if block_given?
    bank.delete(id)
  end
end

#delete_listener(id, registration_name) ⇒ Object



74
75
76
77
78
79
# File 'lib/hyalite/event_dispatcher.rb', line 74

def delete_listener(id, registration_name)
  if @listener_bank.has_key? registration_name
    yield(id, registration_name)
    @listener_bank[registration_name].delete(id)
  end
end

#dispatch_event(top_level_type, event) ⇒ Object



58
59
60
61
62
63
# File 'lib/hyalite/event_dispatcher.rb', line 58

def dispatch_event(top_level_type, event)
  return unless @enabled

  book_keeping = TopLevelCallbackBookKeeping.new(top_level_type, event)
  Hyalite.updates.batched_updates { handle_top_level(book_keeping) }
end

#enabled=(enabled) ⇒ Object



14
15
16
# File 'lib/hyalite/event_dispatcher.rb', line 14

def enabled=(enabled)
  @enabled = enabled
end

#enabled?Boolean

Returns:

  • (Boolean)


10
11
12
# File 'lib/hyalite/event_dispatcher.rb', line 10

def enabled?
  @enabled
end

#find_parent(node) ⇒ Object



26
27
28
29
30
31
# File 'lib/hyalite/event_dispatcher.rb', line 26

def find_parent(node)
  node_id = Mount.node_id(node)
  root_id = InstanceHandles.root_id_from_node_id(node_id)
  container = Mount.container_for_id(root_id)
  Mount.find_first_hyalite_dom(container)
end

#get_listener(id, registration_name) ⇒ Object



70
71
72
# File 'lib/hyalite/event_dispatcher.rb', line 70

def get_listener(id, registration_name)
  @listener_bank[registration_name].try {|listeners| listeners[id] }
end

#handle_top_level(book_keeping) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/hyalite/event_dispatcher.rb', line 33

def handle_top_level(book_keeping)
  ancestor = Mount.find_first_hyalite_dom(book_keeping.event.target)
  while ancestor
    book_keeping.ancestors << ancestor
    ancestor = find_parent(ancestor)
  end

  book_keeping.ancestors.each do |top_level_target|
    top_level_target_id = Mount.node_id(top_level_target) || ''
    synthetic_events = @extract_events.call(
      book_keeping.top_level_type,
      top_level_target,
      top_level_target_id,
      book_keeping.event,
    ).flatten

    synthetic_events.each do |synthetic_event|
      synthetic_event.each_listener do |listener, dom_id|
        target = Mount.node(dom_id);
        listener.call(synthetic_event.event, target)
      end
    end
  end
end

#put_listener(id, registration_name, listener) ⇒ Object



65
66
67
68
# File 'lib/hyalite/event_dispatcher.rb', line 65

def put_listener(id, registration_name, listener)
  listeners = @listener_bank[registration_name] ||= {}
  listeners[id] = listener
end

#trap_bubbled_event(top_level_type, handler_base_name, element) ⇒ Object



18
19
20
21
22
23
24
# File 'lib/hyalite/event_dispatcher.rb', line 18

def trap_bubbled_event(top_level_type, handler_base_name, element)
  return nil unless element

  element.on handler_base_name do |event|
    dispatch_event(top_level_type, event)
  end
end