Class: Scarpe::Webview::App
- Inherits:
-
Drawable
- Object
- Shoes::Linkable
- Drawable
- Scarpe::Webview::App
- 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
-
#control_interface ⇒ Object
readonly
App inherits from Drawable to set up linkable IDs and event methods.
-
#document_root ⇒ Object
writeonly
Sets the attribute document_root.
-
#shoes_linkable_id ⇒ Object
writeonly
Sets the attribute shoes_linkable_id.
Attributes inherited from Drawable
#children, #parent, #shoes_linkable_id
Attributes inherited from Shoes::Linkable
Instance Method Summary collapse
-
#bind(name, &block) ⇒ Object
Bind a Scarpe callback name; see handle_callback above.
- #destroy ⇒ Object
-
#handle_callback(name, *args) ⇒ Object
All JS callbacks to Scarpe drawables are dispatched via this handler.
- #init ⇒ Object
-
#initialize(properties) ⇒ App
constructor
A new instance of App.
-
#request_redraw! ⇒ void
Request a full redraw if Webview is running.
- #run ⇒ Object
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_interface ⇒ Object (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 |
#destroy ⇒ Object
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 |
#init ⇒ Object
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 |
#run ⇒ Object
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 |