Class: Scarpe::Webview::App

Inherits:
Drawable show all
Defined in:
lib/scarpe/wv/app.rb

Overview

Scarpe::Webview::App must only be used from the main thread, due to GTK+ limitations.

Constant Summary

Constants included from Shoes::Log

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

Instance Attribute Summary collapse

Attributes inherited from Drawable

#children, #parent, #shoes_linkable_id

Attributes inherited from Shoes::Linkable

#linkable_id

Instance Method Summary collapse

Methods inherited from Drawable

#add_child, #destroy_self, display_class_for, #full_window_redraw!, #handler_js_code, #html_element, #html_id, #inspect, #needs_update!, #promise_update, #properties_changed, #remove_child, #set_parent, #shoes_styles, #to_html

Methods included from Shoes::Log

configure_logger, #log_init, logger

Methods inherited from Shoes::Linkable

#bind_shoes_event, #send_self_event, #send_shoes_event, #unsub_all_shoes_events, #unsub_shoes_event

Constructor Details

#initialize(properties) ⇒ App



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/scarpe/wv/app.rb', line 10

def initialize(properties)
  super

  # Scarpe's ControlInterface sets up event handlers
  # for the display service that aren't sent to
  # Lacci (Shoes). In general it's used for setup
  # and additional control or testing, outside the
  # Shoes app. This is how CatsCradle and Shoes-Spec
  # set up testing, for instance.
  @control_interface = ControlInterface.new

  # TODO: rename @view
  @view = Scarpe::Webview::WebWrangler.new title: @title,
    width: @width,
    height: @height,
    resizable: @resizable

  @callbacks = {}

  # The control interface has to exist to get callbacks like "override Scarpe app opts".
  # But the Scarpe App needs those options to be created. So we can't pass these to
  # ControlInterface.new.
  @control_interface.set_system_components app: self, doc_root: nil, wrangler: @view

  bind_shoes_event(event_name: "init") { init }
  bind_shoes_event(event_name: "run") { run }
  bind_shoes_event(event_name: "destroy") { destroy }
end

Instance Attribute Details

#control_interfaceObject (readonly)

App inherits from Drawable to set up linkable IDs and event methods



6
7
8
# File 'lib/scarpe/wv/app.rb', line 6

def control_interface
  @control_interface
end

#document_root=(value) ⇒ Object (writeonly)

Sets the attribute document_root



39
40
41
# File 'lib/scarpe/wv/app.rb', line 39

def document_root=(value)
  @document_root = value
end

#shoes_linkable_id=(value) ⇒ Object (writeonly)

Sets the attribute shoes_linkable_id



8
9
10
# File 'lib/scarpe/wv/app.rb', line 8

def shoes_linkable_id=(value)
  @shoes_linkable_id = value
end

Instance Method Details

#bind(name, &block) ⇒ Object

Bind a Scarpe callback name; see handle_callback above. See Scarpe::Drawable for how the naming is set up



92
93
94
# File 'lib/scarpe/wv/app.rb', line 92

def bind(name, &block)
  @callbacks[name] = block
end

#destroyObject



69
70
71
72
73
74
75
76
77
78
# File 'lib/scarpe/wv/app.rb', line 69

def destroy
  if @document_root || @view
    @control_interface.dispatch_event :shutdown
  end
  @document_root = nil
  if @view
    @view.destroy
    @view = nil
  end
end

#handle_callback(name, *args) ⇒ Object

All JS callbacks to Scarpe drawables are dispatched via this handler



82
83
84
85
86
87
88
# File 'lib/scarpe/wv/app.rb', line 82

def handle_callback(name, *args)
  if @callbacks.key?(name)
    @callbacks[name].call(*args)
  else
    raise Scarpe::UnknownEventTypeError, "No such Webview callback: #{name.inspect}!"
  end
end

#initObject



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

def init
  scarpe_app = self

  @view.init_code("scarpeInit") do
    request_redraw!
  end

  @view.bind("scarpeHandler") do |*args|
    handle_callback(*args)
  end

  @view.bind("scarpeExit") do
    scarpe_app.destroy
  end
end

#request_redraw!void

This method returns an undefined value.

Request a full redraw if Webview is running. Otherwise this is a no-op.



100
101
102
103
104
105
106
# File 'lib/scarpe/wv/app.rb', line 100

def request_redraw!
  wrangler = DisplayService.instance.wrangler
  if wrangler.is_running
    wrangler.replace(@document_root.to_html)
  end
  nil
end

#runObject



57
58
59
60
61
62
63
64
65
66
67
# File 'lib/scarpe/wv/app.rb', line 57

def run
  # This is run before the Webview event loop is up and running
  @control_interface.dispatch_event(:init)

  @view.empty_page = empty_page_element

  # This takes control of the main thread and never returns. And it *must* be run from
  # the main thread. And it stops any Ruby background threads.
  # That's totally cool and normal, right?
  @view.run
end