Class: Scarpe::Webview::ControlInterface

Inherits:
Object
  • Object
show all
Includes:
Shoes::Log
Defined in:
lib/scarpe/wv/control_interface.rb

Constant Summary collapse

SUBSCRIBE_EVENTS =
[:init, :shutdown, :next_redraw, :every_redraw, :next_heartbeat, :every_heartbeat]
DISPATCH_EVENTS =
[:init, :shutdown, :redraw, :heartbeat]
INVALID_SYSTEM_COMPONENTS_MESSAGE =
"Must pass non-nil app and wrangler to ControlInterface#set_system_components!"
CONTROL_INTERFACE_INIT_MESSAGE =
"ControlInterface code needs to be wrapped in handlers like on_event(:init) " +
"to make sure they have access to app, doc_root, wrangler, etc!"

Constants included from Shoes::Log

Shoes::Log::DEFAULT_COMPONENT, Shoes::Log::DEFAULT_DEBUG_LOG_CONFIG, Shoes::Log::DEFAULT_LOG_CONFIG

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Shoes::Log

configure_logger, #log_init, logger

Constructor Details

#initializeControlInterface

The control interface needs to see major system components to hook into their events



27
28
29
30
31
32
33
# File 'lib/scarpe/wv/control_interface.rb', line 27

def initialize
  log_init("Webview::ControlInterface")

  @do_shutdown = false
  @event_handlers = {}
  (SUBSCRIBE_EVENTS | DISPATCH_EVENTS).each { |e| @event_handlers[e] = [] }
end

Instance Attribute Details

#do_shutdownObject (readonly)

Returns the value of attribute do_shutdown.



24
25
26
# File 'lib/scarpe/wv/control_interface.rb', line 24

def do_shutdown
  @do_shutdown
end

#doc_rootObject



65
66
67
68
69
# File 'lib/scarpe/wv/control_interface.rb', line 65

def doc_root
  raise Scarpe::MissingDocRootError, CONTROL_INTERFACE_INIT_MESSAGE unless @doc_root

  @doc_root
end

Instance Method Details

#appObject



59
60
61
62
63
# File 'lib/scarpe/wv/control_interface.rb', line 59

def app
  raise Scarpe::MissingAppError, CONTROL_INTERFACE_INIT_MESSAGE unless @app

  @app
end

#dispatch_event(event, *args, **keywords) ⇒ Object

Send out the specified event



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/scarpe/wv/control_interface.rb', line 94

def dispatch_event(event, *args, **keywords)
  @log.debug("CTL event #{event.inspect} #{args.inspect} #{keywords.inspect}")

  unless DISPATCH_EVENTS.include?(event)
    raise Scarpe::IllegalDispatchEventError, "Illegal dispatch of event #{event.inspect}! Valid values are: #{DISPATCH_EVENTS.inspect}"
  end

  if @do_shutdown
    @log.debug("CTL: Shutting down - not dispatching #{event}!")
    return
  end

  if event == :redraw
    dumb_dispatch_event(:every_redraw, *args, **keywords)

    # Next redraw is interesting. We can add new handlers
    # when dispatching a next_redraw handler. But we want
    # each handler to run only once.
    handlers = @event_handlers[:next_redraw]
    dumb_dispatch_event(:next_redraw, *args, **keywords)
    @event_handlers[:next_redraw] -= handlers
    return
  end

  if event == :heartbeat
    dumb_dispatch_event(:every_heartbeat, *args, **keywords)

    # Next heartbeat is interesting. We can add new handlers
    # when dispatching a next_heartbeat handler. But we want
    # each handler to run only once.
    handlers = @event_handlers[:next_heartbeat]
    dumb_dispatch_event(:next_heartbeat, *args, **keywords)
    @event_handlers[:next_heartbeat] -= handlers
    return
  end

  if event == :shutdown
    @do_shutdown = true
  end

  dumb_dispatch_event(event, *args, **keywords)
end

#inspectObject



35
36
37
# File 'lib/scarpe/wv/control_interface.rb', line 35

def inspect
  "<#ControlInterface>"
end

#on_event(event, &block) ⇒ Object

On recognised events, this sets a handler for that event



81
82
83
84
85
86
87
88
89
90
91
# File 'lib/scarpe/wv/control_interface.rb', line 81

def on_event(event, &block)
  unless SUBSCRIBE_EVENTS.include?(event)
    raise Scarpe::IllegalSubscribeEventError, "Illegal subscribe to event #{event.inspect}! Valid values are: #{SUBSCRIBE_EVENTS.inspect}"
  end

  @unsub_id ||= 0
  @unsub_id += 1

  @event_handlers[event] << { handler: block, unsub: @unsub_id }
  @unsub_id
end

#set_system_components(app:, doc_root:, wrangler:) ⇒ Object

This should get called once, from Shoes::App



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/scarpe/wv/control_interface.rb', line 40

def set_system_components(app:, doc_root:, wrangler:)
  unless app
    @log.error("False app passed to set_system_components!")
    raise Scarpe::MissingAppError, INVALID_SYSTEM_COMPONENTS_MESSAGE
  end
  unless wrangler
    @log.error("False wrangler passed to set_system_components!")
    raise Scarpe::MissingWranglerError, INVALID_SYSTEM_COMPONENTS_MESSAGE
  end

  @app = app
  @doc_root = doc_root # May be nil at this point
  @wrangler = wrangler

  @wrangler.control_interface = self

  @wrangler.on_every_redraw { self.dispatch_event(:redraw) }
end

#wranglerObject



71
72
73
74
75
# File 'lib/scarpe/wv/control_interface.rb', line 71

def wrangler
  raise Scarpe::MissingWranglerError, CONTROL_INTERFACE_INIT_MESSAGE unless @wrangler

  @wrangler
end