Module: Apotomo::EventMethods

Extended by:
ActiveSupport::Concern
Included in:
Widget
Defined in:
lib/apotomo/event_methods.rb

Overview

Introduces event-processing functions into the StatefulWidget.

Defined Under Namespace

Modules: ClassMethods

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#page_updatesObject



14
15
16
# File 'lib/apotomo/event_methods.rb', line 14

def page_updates
  @page_updates ||= []
end

Instance Method Details

#add_class_event_handlersObject



18
19
20
# File 'lib/apotomo/event_methods.rb', line 18

def add_class_event_handlers(*)
  self.class.responds_to_event_options.each { |options| respond_to_event(*options) }
end

#respond_to_event(type, options = {}) ⇒ Object

Instructs the widget to look out for type Events that are passing by while bubbling. If an appropriate event is encountered the widget will send the targeted widget (or itself) to another state, which implies an update of the invoked widget.

You may configure the event handler with the following options:

:with  => (optional) the state to invoke on the target widget, defaults to +type+.
:on    => (optional) the targeted widget's id, defaults to <tt>self.name</tt>
:from  => (optional) the source id of the widget that triggered the event, defaults to any widget

Example:

trap = widget(:trap, :charged, 'mouse_trap')
trap.respond_to_event :mouseOver, :with => :catch_mouse

This would instruct trap to catch a :mouseOver event from any widget (including itself) and to invoke the state :catch_mouse on itself as trigger.

hunter = widget(:form, :hunt_for_mice, 'my_form')
  hunter << widget(:input_field, :smell_like_cheese,  'mouse_trap')
  hunter << widget(:text_area,   :stick_like_honey,   'bear_trap')
hunter.respond_to_event :captured, :from => 'mouse_trap', :with => :refill_cheese, :on => 'mouse_trap'

As both the bear- and the mouse trap can trigger a :captured event the later respond_to_event would invoke :refill_cheese on the mouse_trap widget as soon as this and only this widget fired. It is important to understand the :from parameter as it filters the event source - it wouldn't make sense to refill the mouse trap if the bear trap snapped, would it?



59
60
61
62
63
64
65
66
67
68
69
# File 'lib/apotomo/event_methods.rb', line 59

def respond_to_event(type, options={})
  options = options.reverse_merge(:once => true,
                                  :with => type,
                                  :on   => self.name)
  
  handler = InvokeEventHandler.new(:widget_id => options[:on], :state => options[:with])
  
  return if options[:once] and event_table.all_handlers_for(type, options[:from]).include?(handler)
  
  on(type, :do => handler, :from => options[:from])
end

#trigger(*args) ⇒ Object

Fire an event of type and let it bubble up. You may add arbitrary payload data to the event.

Example:

trigger(:dropped, :area => 59)

which can be queried in a triggered state.

def on_drop(event)
  if event[:area] == 59


81
82
83
# File 'lib/apotomo/event_methods.rb', line 81

def trigger(*args)
  fire(*args)
end