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

Returns a new instance of 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

Parameters:

  • value

    the value to set the attribute document_root to.



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

Parameters:

  • value

    the value to set the attribute shoes_linkable_id to.



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