scarpe 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +1 -0
- data/CHANGELOG.md +16 -2
- data/Gemfile.lock +7 -3
- data/README.md +24 -8
- data/Rakefile +1 -1
- data/examples/animate.rb +20 -0
- data/examples/arrow.rb +10 -0
- data/examples/btn_tooltip.rb +7 -0
- data/examples/button_style_changed.rb +7 -0
- data/examples/button_styles_default.rb +6 -0
- data/examples/gen.rb +8 -8
- data/examples/highlander.rb +3 -3
- data/examples/legacy/README.md +6 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +1 -1
- data/examples/legacy/not_checked/simple/anim-shapes.rb +1 -1
- data/examples/legacy/not_checked/speedometer_app.rb +55 -0
- data/examples/legacy/working/simple/image-icon.rb +3 -0
- data/examples/legacy/{not_checked → working}/simple/image.rb +1 -1
- data/examples/list_box_choose.rb +17 -0
- data/examples/local_assets/local_file_server.rb +82 -0
- data/examples/local_assets/sample.gif +0 -0
- data/examples/local_assets/sample.mp4 +0 -0
- data/examples/local_fonts.rb +2 -2
- data/examples/local_images.rb +2 -3
- data/examples/para/para_text.rb +14 -0
- data/examples/progress.rb +31 -0
- data/examples/radio/radio_groups.rb +2 -2
- data/examples/rect.rb +4 -0
- data/examples/rotate_shapes.rb +17 -0
- data/examples/simpler-menu.rb +21 -0
- data/exe/scarpe +2 -1
- data/lacci/Gemfile +2 -0
- data/lacci/Gemfile.lock +8 -1
- data/lacci/lacci.gemspec +1 -1
- data/lacci/lib/lacci/scarpe_cli.rb +2 -1
- data/lacci/lib/lacci/scarpe_core.rb +2 -1
- data/lacci/lib/lacci/version.rb +1 -1
- data/lacci/lib/scarpe/niente/app.rb +23 -0
- data/lacci/lib/scarpe/niente/display_service.rb +62 -0
- data/lacci/lib/scarpe/niente/drawable.rb +57 -0
- data/lacci/lib/scarpe/niente/logger.rb +29 -0
- data/lacci/lib/scarpe/niente/shoes_spec.rb +87 -0
- data/lacci/lib/scarpe/niente.rb +20 -0
- data/lacci/lib/shoes/app.rb +88 -43
- data/lacci/lib/shoes/background.rb +2 -2
- data/lacci/lib/shoes/border.rb +2 -2
- data/lacci/lib/shoes/builtins.rb +63 -0
- data/lacci/lib/shoes/changelog.rb +52 -0
- data/lacci/lib/shoes/colors.rb +3 -1
- data/lacci/lib/shoes/constants.rb +19 -1
- data/lacci/lib/shoes/display_service.rb +39 -16
- data/lacci/lib/shoes/download.rb +2 -2
- data/lacci/lib/shoes/drawable.rb +380 -0
- data/lacci/lib/shoes/drawables/arc.rb +49 -0
- data/lacci/lib/shoes/drawables/arrow.rb +41 -0
- data/lacci/lib/shoes/drawables/button.rb +73 -0
- data/lacci/lib/shoes/{widgets → drawables}/check.rb +5 -4
- data/lacci/lib/shoes/{widgets → drawables}/document_root.rb +3 -3
- data/lacci/lib/shoes/{widgets → drawables}/edit_box.rb +6 -6
- data/lacci/lib/shoes/{widgets → drawables}/edit_line.rb +6 -6
- data/lacci/lib/shoes/{widgets → drawables}/flow.rb +6 -6
- data/lacci/lib/shoes/{widgets → drawables}/image.rb +6 -6
- data/lacci/lib/shoes/{widgets → drawables}/line.rb +7 -5
- data/lacci/lib/shoes/drawables/link.rb +34 -0
- data/lacci/lib/shoes/drawables/list_box.rb +56 -0
- data/lacci/lib/shoes/drawables/para.rb +118 -0
- data/lacci/lib/shoes/drawables/progress.rb +14 -0
- data/lacci/lib/shoes/drawables/radio.rb +33 -0
- data/lacci/lib/shoes/drawables/rect.rb +17 -0
- data/lacci/lib/shoes/{widgets → drawables}/shape.rb +6 -7
- data/lacci/lib/shoes/{widgets → drawables}/slot.rb +32 -20
- data/lacci/lib/shoes/{widgets → drawables}/span.rb +8 -7
- data/lacci/lib/shoes/{widgets → drawables}/stack.rb +6 -4
- data/lacci/lib/shoes/drawables/star.rb +50 -0
- data/lacci/lib/shoes/drawables/subscription_item.rb +93 -0
- data/lacci/lib/shoes/drawables/text_drawable.rb +63 -0
- data/lacci/lib/shoes/drawables/video.rb +16 -0
- data/lacci/lib/shoes/drawables/widget.rb +69 -0
- data/lacci/lib/shoes/drawables.rb +31 -0
- data/lacci/lib/shoes/errors.rb +28 -0
- data/lacci/lib/shoes/log.rb +2 -2
- data/lacci/lib/shoes/ruby_extensions.rb +15 -0
- data/lacci/lib/shoes/spacing.rb +2 -2
- data/lacci/lib/shoes-spec.rb +93 -0
- data/lacci/lib/shoes.rb +27 -7
- data/lacci/test/test_helper.rb +54 -0
- data/lacci/test/test_lacci.rb +12 -3
- data/lacci/test/test_shoes_errors.rb +49 -0
- data/lib/scarpe/cats_cradle.rb +81 -59
- data/lib/scarpe/errors.rb +77 -0
- data/lib/scarpe/evented_assertions.rb +50 -17
- data/lib/scarpe/shoes_spec.rb +181 -0
- data/lib/scarpe/version.rb +2 -2
- data/lib/scarpe/wv/app.rb +20 -20
- data/lib/scarpe/wv/arc.rb +4 -47
- data/lib/scarpe/wv/arrow.rb +9 -0
- data/lib/scarpe/wv/button.rb +7 -35
- data/lib/scarpe/wv/check.rb +3 -5
- data/lib/scarpe/wv/control_interface.rb +18 -20
- data/lib/scarpe/wv/document_root.rb +81 -4
- data/lib/scarpe/wv/{widget.rb → drawable.rb} +66 -43
- data/lib/scarpe/wv/edit_box.rb +4 -17
- data/lib/scarpe/wv/edit_line.rb +4 -18
- data/lib/scarpe/wv/flow.rb +2 -18
- data/lib/scarpe/wv/image.rb +8 -28
- data/lib/scarpe/wv/line.rb +3 -25
- data/lib/scarpe/wv/link.rb +3 -16
- data/lib/scarpe/wv/list_box.rb +6 -29
- data/lib/scarpe/wv/para.rb +11 -30
- data/lib/scarpe/wv/progress.rb +19 -0
- data/lib/scarpe/wv/radio.rb +9 -10
- data/lib/scarpe/wv/rect.rb +13 -0
- data/lib/scarpe/wv/shape.rb +3 -8
- data/lib/scarpe/wv/slot.rb +8 -25
- data/lib/scarpe/wv/span.rb +3 -27
- data/lib/scarpe/wv/stack.rb +2 -18
- data/lib/scarpe/wv/star.rb +3 -53
- data/lib/scarpe/wv/subscription_item.rb +38 -4
- data/lib/scarpe/wv/text_drawable.rb +32 -0
- data/lib/scarpe/wv/video.rb +15 -15
- data/lib/scarpe/wv/web_wrangler.rb +299 -329
- data/lib/scarpe/wv/webview_local_display.rb +48 -33
- data/lib/scarpe/wv/webview_relay_display.rb +12 -12
- data/lib/scarpe/wv/webview_relay_util.rb +7 -10
- data/lib/scarpe/wv/wv_display_worker.rb +2 -2
- data/lib/scarpe/wv.rb +45 -12
- data/lib/scarpe/wv_local.rb +1 -1
- data/lib/scarpe/wv_relay.rb +1 -1
- data/lib/scarpe.rb +1 -0
- data/logger/debug_web_wrangler.json +1 -1
- data/logger/scarpe_wv_test.json +1 -1
- data/scarpe-components/Gemfile.lock +86 -0
- data/scarpe-components/lib/scarpe/components/base64.rb +3 -7
- data/scarpe-components/lib/scarpe/components/calzini/alert.rb +49 -0
- data/scarpe-components/lib/scarpe/components/calzini/art_widgets.rb +203 -0
- data/scarpe-components/lib/scarpe/components/calzini/button.rb +39 -0
- data/scarpe-components/lib/scarpe/components/calzini/misc.rb +146 -0
- data/scarpe-components/lib/scarpe/components/calzini/para.rb +35 -0
- data/scarpe-components/lib/scarpe/components/calzini/slots.rb +155 -0
- data/scarpe-components/lib/scarpe/components/calzini/text_widgets.rb +65 -0
- data/scarpe-components/lib/scarpe/components/calzini.rb +149 -0
- data/scarpe-components/lib/scarpe/components/errors.rb +20 -0
- data/scarpe-components/lib/scarpe/components/file_helpers.rb +1 -0
- data/scarpe-components/lib/scarpe/components/html.rb +131 -0
- data/scarpe-components/lib/scarpe/components/minitest_export_reporter.rb +75 -0
- data/scarpe-components/lib/scarpe/components/minitest_import_runnable.rb +98 -0
- data/scarpe-components/lib/scarpe/components/minitest_result.rb +86 -0
- data/scarpe-components/lib/scarpe/components/modular_logger.rb +5 -5
- data/scarpe-components/lib/scarpe/components/print_logger.rb +9 -5
- data/scarpe-components/lib/scarpe/components/promises.rb +14 -14
- data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +36 -17
- data/scarpe-components/lib/scarpe/components/string_helpers.rb +10 -0
- data/scarpe-components/lib/scarpe/components/tiranti.rb +225 -0
- data/scarpe-components/lib/scarpe/components/unit_test_helpers.rb +45 -5
- data/scarpe-components/lib/scarpe/components/version.rb +2 -2
- data/scarpe-components/test/calzini/test_calzini_alert.rb +30 -0
- data/scarpe-components/test/calzini/test_calzini_art_drawables.rb +105 -0
- data/scarpe-components/test/calzini/test_calzini_button.rb +52 -0
- data/scarpe-components/test/calzini/test_calzini_misc.rb +115 -0
- data/scarpe-components/test/calzini/test_calzini_para.rb +37 -0
- data/scarpe-components/test/calzini/test_calzini_slots.rb +130 -0
- data/scarpe-components/test/calzini/test_calzini_text_drawables.rb +41 -0
- data/scarpe-components/test/mtr_data/exception.json +1 -0
- data/scarpe-components/test/mtr_data/fail_with_message.json +1 -0
- data/scarpe-components/test/mtr_data/skipped_no_message.json +1 -0
- data/scarpe-components/test/mtr_data/skipped_w_msg.json +1 -0
- data/scarpe-components/test/mtr_data/succeed_2_asserts.json +1 -0
- data/scarpe-components/test/test_dimensions.rb +26 -0
- data/scarpe-components/test/test_helper.rb +20 -0
- data/scarpe-components/test/test_html.rb +65 -0
- data/scarpe-components/test/test_minitest_result.rb +61 -0
- data/scarpe-components/test/test_promises.rb +5 -4
- data/scarpe-components/test/test_segmented_app_files.rb +8 -6
- data/scarpegen.rb +14 -14
- data/sig/scarpe.rbs +1 -1
- data/templates/basic_class_template.erb +13 -14
- data/templates/class_template_with_event_bind.erb +4 -4
- data/templates/class_template_with_shapes.erb +8 -17
- data/templates/example_template.erb +1 -1
- data/templates/module_template.erb +4 -4
- data/templates/webview_template.erb +3 -2
- metadata +113 -55
- data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +0 -3
- data/lacci/lib/shoes/widget.rb +0 -218
- data/lacci/lib/shoes/widgets/alert.rb +0 -19
- data/lacci/lib/shoes/widgets/arc.rb +0 -51
- data/lacci/lib/shoes/widgets/button.rb +0 -35
- data/lacci/lib/shoes/widgets/font.rb +0 -14
- data/lacci/lib/shoes/widgets/link.rb +0 -25
- data/lacci/lib/shoes/widgets/list_box.rb +0 -25
- data/lacci/lib/shoes/widgets/para.rb +0 -68
- data/lacci/lib/shoes/widgets/radio.rb +0 -35
- data/lacci/lib/shoes/widgets/star.rb +0 -44
- data/lacci/lib/shoes/widgets/subscription_item.rb +0 -60
- data/lacci/lib/shoes/widgets/text_widget.rb +0 -51
- data/lacci/lib/shoes/widgets/video.rb +0 -15
- data/lacci/lib/shoes/widgets.rb +0 -29
- data/lib/scarpe/wv/alert.rb +0 -66
- data/lib/scarpe/wv/background.rb +0 -27
- data/lib/scarpe/wv/border.rb +0 -24
- data/lib/scarpe/wv/control_interface_test.rb +0 -238
- data/lib/scarpe/wv/dimensions.rb +0 -22
- data/lib/scarpe/wv/font.rb +0 -36
- data/lib/scarpe/wv/html.rb +0 -108
- data/lib/scarpe/wv/spacing.rb +0 -41
- data/lib/scarpe/wv/text_widget.rb +0 -30
- /data/examples/legacy/not_checked/{expert → shoes-contrib/basic}/definr.rb +0 -0
- /data/examples/legacy/not_checked/{expert → shoes-contrib/basic}/funnies.rb +0 -0
- /data/examples/legacy/not_checked/shoes-contrib/{elements → basic}/list_box-select-class.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/basic-edit-box.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/basic-fps.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/border-cat.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/check-mate.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/manipulation → working/simple}/clear-slot.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/clock.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/gradient-shoes.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/list_box-shape-report.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/list_box.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/phat-button.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib → working}/simple/simple-calc.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/position → working/simple}/stack-width.rb +0 -0
- /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/width-introspec.rb +0 -0
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
# This is the simplest type of Webview DisplayService. It creates Webview
|
5
|
-
# corresponding to Shoes
|
3
|
+
module Scarpe
|
4
|
+
# This is the simplest type of Webview DisplayService. It creates Webview drawables
|
5
|
+
# corresponding to Shoes drawables, manages the Webview and its DOM tree, and
|
6
6
|
# generally keeps the Shoes/Webview connection working.
|
7
7
|
#
|
8
8
|
# This is an in-process Webview-based display service, with all the limitations that
|
@@ -10,7 +10,7 @@ class Scarpe
|
|
10
10
|
# process, too many or too large evals can crash the process, etc.
|
11
11
|
# Frequently it's better to use a RelayDisplayService to a second
|
12
12
|
# process containing one of these.
|
13
|
-
class
|
13
|
+
class Webview::DisplayService < Shoes::DisplayService
|
14
14
|
include Shoes::Log
|
15
15
|
|
16
16
|
class << self
|
@@ -20,67 +20,82 @@ class Scarpe
|
|
20
20
|
# The ControlInterface is used to handle internal events in Webview Scarpe
|
21
21
|
attr_reader :control_interface
|
22
22
|
|
23
|
-
# The DocumentRoot is the top
|
23
|
+
# The DocumentRoot is the top drawable of the Webview-side drawable tree
|
24
24
|
attr_reader :doc_root
|
25
25
|
|
26
|
-
# app is the Scarpe::
|
26
|
+
# app is the Scarpe::Webview::App
|
27
27
|
attr_reader :app
|
28
28
|
|
29
29
|
# wrangler is the Scarpe::WebWrangler
|
30
30
|
attr_reader :wrangler
|
31
31
|
|
32
|
-
# This is called before any of the various
|
32
|
+
# This is called before any of the various Webview::Drawables are created, to be
|
33
33
|
# able to create them and look them up.
|
34
34
|
def initialize
|
35
|
-
if
|
36
|
-
raise "ERROR! This is meant to be a singleton!"
|
35
|
+
if Webview::DisplayService.instance
|
36
|
+
raise Shoes::Errors::SingletonError, "ERROR! This is meant to be a singleton!"
|
37
37
|
end
|
38
38
|
|
39
|
-
|
39
|
+
Webview::DisplayService.instance = self
|
40
40
|
|
41
41
|
super()
|
42
|
-
log_init("
|
42
|
+
log_init("Webview::DisplayService")
|
43
43
|
|
44
|
-
@
|
44
|
+
@display_drawable_for = {}
|
45
45
|
end
|
46
46
|
|
47
|
-
# Create a Webview display
|
48
|
-
# the linkable ID for this Shoes
|
47
|
+
# Create a Webview display drawable for a specific Shoes drawable, and pair it with
|
48
|
+
# the linkable ID for this Shoes drawable.
|
49
49
|
#
|
50
|
-
# @param
|
51
|
-
# @param
|
52
|
-
# @param properties [Hash] a JSON-serialisable Hash with the
|
53
|
-
# @
|
54
|
-
|
55
|
-
|
50
|
+
# @param drawable_class_name [String] The class name of the Shoes drawable, e.g. Shoes::Button
|
51
|
+
# @param drawable_id [String] the linkable ID for drawable events
|
52
|
+
# @param properties [Hash] a JSON-serialisable Hash with the drawable's Shoes styles
|
53
|
+
# @param is_widget [Boolean] whether the class is a user-defined Shoes::Widget subclass
|
54
|
+
# @return [Webview::Drawable] the newly-created Webview drawable
|
55
|
+
def create_display_drawable_for(drawable_class_name, drawable_id, properties, is_widget:)
|
56
|
+
existing = query_display_drawable_for(drawable_id, nil_ok: true)
|
57
|
+
if existing
|
58
|
+
@log.warn("There is already a display drawable for #{drawable_id.inspect}! Returning #{existing.class.name}.")
|
59
|
+
return existing
|
60
|
+
end
|
61
|
+
|
62
|
+
if drawable_class_name == "App"
|
56
63
|
unless @doc_root
|
57
|
-
raise "
|
64
|
+
raise Scarpe::MissingDocRootError, "Webview::DocumentRoot is supposed to be created before Webview::App!"
|
58
65
|
end
|
59
66
|
|
60
|
-
display_app = Scarpe::
|
67
|
+
display_app = Scarpe::Webview::App.new(properties)
|
61
68
|
display_app.document_root = @doc_root
|
62
69
|
@control_interface = display_app.control_interface
|
63
70
|
@control_interface.doc_root = @doc_root
|
64
71
|
@app = @control_interface.app
|
65
72
|
@wrangler = @control_interface.wrangler
|
66
73
|
|
67
|
-
|
74
|
+
set_drawable_pairing(drawable_id, display_app)
|
68
75
|
|
69
76
|
return display_app
|
70
77
|
end
|
71
78
|
|
72
|
-
# Create a corresponding display
|
73
|
-
|
74
|
-
|
75
|
-
|
79
|
+
# Create a corresponding display drawable
|
80
|
+
|
81
|
+
if is_widget
|
82
|
+
display_class = Scarpe::Webview::Flow
|
83
|
+
else
|
84
|
+
display_class = Scarpe::Webview::Drawable.display_class_for(drawable_class_name)
|
85
|
+
unless display_class < Scarpe::Webview::Drawable
|
86
|
+
raise Scarpe::BadDisplayClassType, "Wrong display class type #{display_class.inspect} for class name #{drawable_class_name.inspect}!"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
display_drawable = display_class.new(properties)
|
90
|
+
set_drawable_pairing(drawable_id, display_drawable)
|
76
91
|
|
77
|
-
if
|
78
|
-
#
|
79
|
-
# but we'll want a reference to it when we create
|
80
|
-
@doc_root =
|
92
|
+
if drawable_class_name == "DocumentRoot"
|
93
|
+
# DocumentRoot is created before App. Mostly doc_root is just like any other drawable,
|
94
|
+
# but we'll want a reference to it when we create App.
|
95
|
+
@doc_root = display_drawable
|
81
96
|
end
|
82
97
|
|
83
|
-
|
98
|
+
display_drawable
|
84
99
|
end
|
85
100
|
|
86
101
|
# Destroy the display service and the app. Quit the process (eventually.)
|
@@ -88,7 +103,7 @@ class Scarpe
|
|
88
103
|
# @return [void]
|
89
104
|
def destroy
|
90
105
|
@app.destroy
|
91
|
-
|
106
|
+
Webview::DisplayService.instance = nil
|
92
107
|
end
|
93
108
|
end
|
94
109
|
end
|
@@ -5,16 +5,16 @@ require "rbconfig"
|
|
5
5
|
|
6
6
|
require_relative "webview_relay_util"
|
7
7
|
|
8
|
-
|
8
|
+
module Scarpe
|
9
9
|
# This display service creates a child process and sends events
|
10
|
-
# back and forth, but creates no
|
11
|
-
# process will spawn a worker with its own
|
10
|
+
# back and forth, but creates no drawables of its own. The child
|
11
|
+
# process will spawn a worker with its own Webview::DisplayService
|
12
12
|
# where the real Webview exists. By splitting the Webview
|
13
|
-
# process from the Shoes
|
13
|
+
# process from the Shoes drawables, it can be easier to return
|
14
14
|
# control to Webview's event handler promptly. Also, the Ruby
|
15
15
|
# process could run background threads if it wanted, and
|
16
16
|
# otherwise behave like a process ***not*** containing Webview.
|
17
|
-
class
|
17
|
+
class Webview::RelayDisplayService < Shoes::DisplayService
|
18
18
|
include Shoes::Log
|
19
19
|
include WVRelayUtil # Needs Shoes::Log
|
20
20
|
|
@@ -23,7 +23,7 @@ class Scarpe
|
|
23
23
|
# Create a Webview Relay Display Service
|
24
24
|
def initialize
|
25
25
|
super()
|
26
|
-
log_init("
|
26
|
+
log_init("Webview::RelayDisplayService")
|
27
27
|
|
28
28
|
@event_subs = []
|
29
29
|
@shutdown = false
|
@@ -46,7 +46,7 @@ class Scarpe
|
|
46
46
|
if event_name == "run"
|
47
47
|
run_event_loop
|
48
48
|
end
|
49
|
-
rescue AppShutdownError
|
49
|
+
rescue Scarpe::AppShutdownError
|
50
50
|
@shutdown = true
|
51
51
|
@log.info("Attempting to shut down...")
|
52
52
|
self.destroy
|
@@ -59,16 +59,16 @@ class Scarpe
|
|
59
59
|
respond_to_datagram while ready_to_read?
|
60
60
|
sleep 0.1
|
61
61
|
end
|
62
|
-
rescue AppShutdownError
|
62
|
+
rescue Scarpe::AppShutdownError
|
63
63
|
@shutdown = true
|
64
64
|
@log.info("Attempting to shut down...")
|
65
65
|
self.destroy
|
66
66
|
end
|
67
67
|
|
68
|
-
# This method sends a message to the worker process to create a
|
69
|
-
#
|
70
|
-
def
|
71
|
-
send_datagram({ type: :create, class_name:
|
68
|
+
# This method sends a message to the worker process to create a drawable. No actual
|
69
|
+
# drawable is created or registered with the display service.
|
70
|
+
def create_display_drawable_for(drawable_class_name, drawable_id, properties)
|
71
|
+
send_datagram({ type: :create, class_name: drawable_class_name, id: drawable_id, properties: })
|
72
72
|
# Don't need to return anything. It wouldn't be used anyway.
|
73
73
|
end
|
74
74
|
|
@@ -2,10 +2,7 @@
|
|
2
2
|
|
3
3
|
require "socket"
|
4
4
|
|
5
|
-
|
6
|
-
# An error occurred which would normally be handled by shutting down the app
|
7
|
-
class AppShutdownError < Scarpe::Error; end
|
8
|
-
|
5
|
+
module Scarpe
|
9
6
|
# WVRelayUtil defines the datagram format for the sockets that connect a parent
|
10
7
|
# Shoes application with a child display server.
|
11
8
|
#
|
@@ -24,7 +21,7 @@ class Scarpe
|
|
24
21
|
return if r.nil?
|
25
22
|
|
26
23
|
unless e.empty?
|
27
|
-
raise "#{@i_am}: Got error on connection(s) from IO.select! Dying!"
|
24
|
+
raise Scarpe::ConnectionError, "#{@i_am}: Got error on connection(s) from IO.select! Dying!"
|
28
25
|
end
|
29
26
|
|
30
27
|
!r.empty?
|
@@ -43,7 +40,7 @@ class Scarpe
|
|
43
40
|
until written == to_write
|
44
41
|
count = @to.write(dgram_str.byteslice(written..-1))
|
45
42
|
if count.nil? || count == 0
|
46
|
-
raise "Something was wrong in send_datagram! Write returned #{count.inspect}!"
|
43
|
+
raise Scarpe::DatagramSendError, "Something was wrong in send_datagram! Write returned #{count.inspect}!"
|
47
44
|
end
|
48
45
|
|
49
46
|
written += count
|
@@ -73,7 +70,7 @@ class Scarpe
|
|
73
70
|
new_bytes = @from.read(10)
|
74
71
|
if new_bytes.nil?
|
75
72
|
# This is perfectly normal, if the connection closed
|
76
|
-
raise AppShutdownError, "Got an unexpected EOF reading datagram! " +
|
73
|
+
raise Scarpe::AppShutdownError, "Got an unexpected EOF reading datagram! " +
|
77
74
|
"Did the #{@i_am == :child ? "parent" : "child"} process die?"
|
78
75
|
end
|
79
76
|
@readbuf << new_bytes
|
@@ -90,7 +87,7 @@ class Scarpe
|
|
90
87
|
@readbuf << new_bytes
|
91
88
|
end
|
92
89
|
rescue
|
93
|
-
raise AppShutdownError, "Got exception #{$!.class} when receiving datagram... #{$!.inspect}"
|
90
|
+
raise Scarpe::AppShutdownError, "Got exception #{$!.class} when receiving datagram... #{$!.inspect}"
|
94
91
|
end
|
95
92
|
|
96
93
|
# Read a datagram from the internal buffer and then dispatch it to the
|
@@ -109,9 +106,9 @@ class Scarpe
|
|
109
106
|
**kwargs_hash,
|
110
107
|
)
|
111
108
|
elsif m_data["type"] == "create"
|
112
|
-
raise "Parent process should never receive :create datagram!" if @i_am == :parent
|
109
|
+
raise Scarpe::InvalidOperationError, "Parent process should never receive :create datagram!" if @i_am == :parent
|
113
110
|
|
114
|
-
@wv_display.
|
111
|
+
@wv_display.create_display_drawable_for(m_data["class_name"], m_data["id"], m_data["properties"])
|
115
112
|
elsif m_data["type"] == "destroy"
|
116
113
|
if @i_am == :parent
|
117
114
|
@shutdown = true
|
@@ -38,11 +38,11 @@ class Scarpe::Webview::ContainedService < Shoes::Linkable
|
|
38
38
|
# @param to [Socket] a writable socket on which to send output to the Shoes process
|
39
39
|
def initialize(from, to)
|
40
40
|
super()
|
41
|
-
log_init("
|
41
|
+
log_init("Webview::DisplayWorker")
|
42
42
|
|
43
43
|
@i_am = :child
|
44
44
|
@event_subs = []
|
45
|
-
@wv_display = Scarpe::
|
45
|
+
@wv_display = Scarpe::Webview::DisplayService.new
|
46
46
|
|
47
47
|
@from = from
|
48
48
|
@to = to
|
data/lib/scarpe/wv.rb
CHANGED
@@ -8,11 +8,26 @@ require "securerandom"
|
|
8
8
|
require "json"
|
9
9
|
|
10
10
|
require "bloops"
|
11
|
+
require "scarpe/components/html" # HTML renderer
|
11
12
|
require "scarpe/components/modular_logger"
|
12
13
|
require "scarpe/components/promises"
|
14
|
+
require "scarpe/components/string_helpers"
|
13
15
|
|
14
16
|
# Module to contain the various Scarpe Webview classes
|
15
|
-
module Scarpe::Webview
|
17
|
+
module Scarpe::Webview
|
18
|
+
HTML = Scarpe::Components::HTML
|
19
|
+
end
|
20
|
+
|
21
|
+
# Set up Scarpe-Webview's HTML renderer
|
22
|
+
ren = ENV["SCARPE_HTML_RENDERER"] || "calzini"
|
23
|
+
# This should *not* be require_relative so that other gems can implement HTML renderers.
|
24
|
+
require "scarpe/components/#{ren}"
|
25
|
+
class Scarpe::Webview::Drawable < Shoes::Linkable
|
26
|
+
# By default it's Scarpe::Components::Calzini
|
27
|
+
comp = Scarpe::Components::StringHelpers.camelize(ENV["SCARPE_HTML_RENDERER"] || "calzini")
|
28
|
+
mod = Scarpe::Components.const_get(comp)
|
29
|
+
include mod
|
30
|
+
end
|
16
31
|
|
17
32
|
# Set up hierarchical logging using the SCARPE_LOG_CONFIG var for configuration
|
18
33
|
log_config = if ENV["SCARPE_LOG_CONFIG"]
|
@@ -28,22 +43,38 @@ require "scarpe/components/segmented_file_loader"
|
|
28
43
|
loader = Scarpe::Components::SegmentedFileLoader.new
|
29
44
|
Shoes.add_file_loader loader
|
30
45
|
|
46
|
+
# Fun trivia: listing the full set of available fonts is a fingerprinting attack, so it's not
|
47
|
+
# available from JS. These are all commonly available web fonts, though.
|
48
|
+
Shoes::FONTS.push(
|
49
|
+
"Helvetica",
|
50
|
+
"Arial",
|
51
|
+
"Arial Black",
|
52
|
+
"Verdana",
|
53
|
+
"Tahoma",
|
54
|
+
"Trebuchet MS",
|
55
|
+
"Impact",
|
56
|
+
"Gill Sans",
|
57
|
+
"Times New Roman",
|
58
|
+
"Georgia",
|
59
|
+
"Palatino",
|
60
|
+
"Baskerville",
|
61
|
+
"Courier",
|
62
|
+
"Lucida",
|
63
|
+
"Monaco",
|
64
|
+
)
|
65
|
+
|
66
|
+
require_relative "shoes_spec"
|
67
|
+
Shoes::Spec.instance = Scarpe::Test
|
68
|
+
|
31
69
|
require_relative "wv/web_wrangler"
|
32
70
|
require_relative "wv/control_interface"
|
33
71
|
|
34
|
-
require_relative "wv/
|
35
|
-
|
36
|
-
require_relative "wv/dimensions"
|
37
|
-
require_relative "wv/html"
|
72
|
+
require_relative "wv/drawable"
|
38
73
|
|
39
|
-
require_relative "wv/spacing"
|
40
74
|
require_relative "wv/star"
|
41
75
|
require_relative "wv/radio"
|
42
|
-
require_relative "wv/background"
|
43
|
-
require_relative "wv/border"
|
44
76
|
|
45
77
|
require_relative "wv/arc"
|
46
|
-
require_relative "wv/font"
|
47
78
|
|
48
79
|
require_relative "wv/app"
|
49
80
|
require_relative "wv/para"
|
@@ -57,12 +88,14 @@ require_relative "wv/image"
|
|
57
88
|
require_relative "wv/edit_box"
|
58
89
|
require_relative "wv/edit_line"
|
59
90
|
require_relative "wv/list_box"
|
60
|
-
require_relative "wv/alert"
|
61
|
-
require_relative "wv/span"
|
62
91
|
require_relative "wv/shape"
|
63
92
|
|
64
|
-
require_relative "wv/
|
93
|
+
require_relative "wv/text_drawable"
|
94
|
+
require_relative "wv/span"
|
65
95
|
require_relative "wv/link"
|
66
96
|
require_relative "wv/line"
|
97
|
+
require_relative "wv/rect"
|
67
98
|
require_relative "wv/video"
|
68
99
|
require_relative "wv/check"
|
100
|
+
require_relative "wv/progress"
|
101
|
+
require_relative "wv/arrow"
|
data/lib/scarpe/wv_local.rb
CHANGED
data/lib/scarpe/wv_relay.rb
CHANGED
data/lib/scarpe.rb
CHANGED
data/logger/scarpe_wv_test.json
CHANGED
@@ -0,0 +1,86 @@
|
|
1
|
+
PATH
|
2
|
+
remote: ../lacci
|
3
|
+
specs:
|
4
|
+
lacci (0.3.0)
|
5
|
+
scarpe-components
|
6
|
+
|
7
|
+
PATH
|
8
|
+
remote: .
|
9
|
+
specs:
|
10
|
+
scarpe-components (0.3.0)
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: https://rubygems.org/
|
14
|
+
specs:
|
15
|
+
ansi (1.5.0)
|
16
|
+
ast (2.4.2)
|
17
|
+
base64 (0.1.1)
|
18
|
+
builder (3.2.4)
|
19
|
+
debug (1.8.0)
|
20
|
+
irb (>= 1.5.0)
|
21
|
+
reline (>= 0.3.1)
|
22
|
+
io-console (0.6.0)
|
23
|
+
irb (1.8.0)
|
24
|
+
rdoc (~> 6.5)
|
25
|
+
reline (>= 0.3.6)
|
26
|
+
json (2.6.3)
|
27
|
+
language_server-protocol (3.17.0.3)
|
28
|
+
minitest (5.19.0)
|
29
|
+
minitest-reporters (1.6.1)
|
30
|
+
ansi
|
31
|
+
builder
|
32
|
+
minitest (>= 5.0)
|
33
|
+
ruby-progressbar
|
34
|
+
nokogiri (1.15.4-x86_64-darwin)
|
35
|
+
racc (~> 1.4)
|
36
|
+
parallel (1.23.0)
|
37
|
+
parser (3.2.2.3)
|
38
|
+
ast (~> 2.4.1)
|
39
|
+
racc
|
40
|
+
psych (5.1.0)
|
41
|
+
stringio
|
42
|
+
racc (1.7.1)
|
43
|
+
rainbow (3.1.1)
|
44
|
+
rake (13.0.6)
|
45
|
+
rdoc (6.5.0)
|
46
|
+
psych (>= 4.0.0)
|
47
|
+
regexp_parser (2.8.1)
|
48
|
+
reline (0.3.8)
|
49
|
+
io-console (~> 0.5)
|
50
|
+
rexml (3.2.6)
|
51
|
+
rubocop (1.56.2)
|
52
|
+
base64 (~> 0.1.1)
|
53
|
+
json (~> 2.3)
|
54
|
+
language_server-protocol (>= 3.17.0)
|
55
|
+
parallel (~> 1.10)
|
56
|
+
parser (>= 3.2.2.3)
|
57
|
+
rainbow (>= 2.2.2, < 4.0)
|
58
|
+
regexp_parser (>= 1.8, < 3.0)
|
59
|
+
rexml (>= 3.2.5, < 4.0)
|
60
|
+
rubocop-ast (>= 1.28.1, < 2.0)
|
61
|
+
ruby-progressbar (~> 1.7)
|
62
|
+
unicode-display_width (>= 2.4.0, < 3.0)
|
63
|
+
rubocop-ast (1.29.0)
|
64
|
+
parser (>= 3.2.1.0)
|
65
|
+
rubocop-shopify (2.14.0)
|
66
|
+
rubocop (~> 1.51)
|
67
|
+
ruby-progressbar (1.13.0)
|
68
|
+
stringio (3.0.8)
|
69
|
+
unicode-display_width (2.4.2)
|
70
|
+
|
71
|
+
PLATFORMS
|
72
|
+
x86_64-darwin-22
|
73
|
+
|
74
|
+
DEPENDENCIES
|
75
|
+
debug
|
76
|
+
lacci!
|
77
|
+
minitest (~> 5.0)
|
78
|
+
minitest-reporters
|
79
|
+
nokogiri
|
80
|
+
rake (~> 13.0)
|
81
|
+
rubocop (~> 1.21)
|
82
|
+
rubocop-shopify
|
83
|
+
scarpe-components!
|
84
|
+
|
85
|
+
BUNDLED WITH
|
86
|
+
2.4.14
|
@@ -3,9 +3,9 @@
|
|
3
3
|
require "base64"
|
4
4
|
require "uri"
|
5
5
|
|
6
|
-
|
6
|
+
module Scarpe; end
|
7
7
|
module Scarpe::Components; end
|
8
|
-
|
8
|
+
module Scarpe
|
9
9
|
module Components::Base64
|
10
10
|
def valid_url?(string)
|
11
11
|
uri = URI.parse(string)
|
@@ -14,11 +14,7 @@ class Scarpe
|
|
14
14
|
false
|
15
15
|
end
|
16
16
|
|
17
|
-
def encode_file_to_base64(
|
18
|
-
directory_path = File.dirname(__FILE__, 5)
|
19
|
-
|
20
|
-
image_path = File.join(directory_path, image_filename)
|
21
|
-
|
17
|
+
def encode_file_to_base64(image_path)
|
22
18
|
image_data = File.binread(image_path)
|
23
19
|
|
24
20
|
encoded_data = ::Base64.strict_encode64(image_data)
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scarpe::Components::Calzini
|
4
|
+
def alert_element(props)
|
5
|
+
event = props["event_name"] || "click"
|
6
|
+
onclick = handler_js_code(event)
|
7
|
+
|
8
|
+
HTML.render do |h|
|
9
|
+
h.div(id: html_id, style: alert_overlay_style(props)) do
|
10
|
+
h.div(style: alert_modal_style) do
|
11
|
+
h.div(style: {}) { props["text"] }
|
12
|
+
h.button(style: {}, onclick: onclick) { "OK" }
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# If the whole drawable is hidden, the parent style adds display:none
|
21
|
+
def alert_overlay_style(props)
|
22
|
+
{
|
23
|
+
position: "fixed",
|
24
|
+
top: "0",
|
25
|
+
left: "0",
|
26
|
+
width: "100%",
|
27
|
+
height: "100%",
|
28
|
+
overflow: "auto",
|
29
|
+
"z-index": "1",
|
30
|
+
background: "rgba(0,0,0,0.4)",
|
31
|
+
display: "flex",
|
32
|
+
"align-items": "center",
|
33
|
+
"justify-content": "center",
|
34
|
+
}.merge(drawable_style(props))
|
35
|
+
end
|
36
|
+
|
37
|
+
def alert_modal_style
|
38
|
+
{
|
39
|
+
"min-width": "200px",
|
40
|
+
"min-height": "50px",
|
41
|
+
padding: "10px",
|
42
|
+
display: "flex",
|
43
|
+
background: "#fefefe",
|
44
|
+
"flex-direction": "column",
|
45
|
+
"justify-content": "space-between",
|
46
|
+
"border-radius": "9px",
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|