scarpe 0.2.1 → 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/.rubocop.yml +4 -0
- data/.yardopts +12 -0
- data/CHANGELOG.md +16 -2
- data/Gemfile +3 -0
- data/Gemfile.lock +116 -0
- data/README.md +53 -30
- data/Rakefile +13 -1
- data/docs/yard/catscradle.md +44 -0
- data/docs/yard/template/default/fulldoc/html/setup.rb +13 -0
- data/docs/yard/template/default/layout/html/setup.rb +9 -0
- data/examples/animate.rb +20 -0
- data/examples/arrow.rb +10 -0
- data/examples/background_with_image.rb +16 -0
- data/examples/bloopsaphone/working/bronx_army_knife.rb +66 -0
- data/examples/bloopsaphone/working/morning_serenity.rb +21 -0
- data/examples/bloopsaphone/working/simpsons_theme_song_by_why.rb +6 -4
- data/examples/btn_tooltip.rb +7 -0
- data/examples/button_go_away.rb +1 -1
- data/examples/button_style_changed.rb +7 -0
- data/examples/button_styles_default.rb +6 -0
- data/examples/check.rb +18 -0
- data/examples/clear_and_append.rb +24 -0
- data/examples/download_and_show_image.rb +28 -0
- data/examples/edit_box.rb +3 -5
- data/examples/fonts.rb +2 -2
- data/examples/gen.rb +8 -8
- data/examples/get_headers.rb +10 -0
- data/examples/highlander.rb +4 -2
- 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/link.rb +2 -2
- 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 +4 -0
- data/examples/local_images.rb +3 -0
- data/examples/motion_events.rb +20 -0
- data/examples/para/para_text.rb +14 -0
- data/examples/parse_xl_funnies.rb +58 -0
- data/examples/progress.rb +31 -0
- data/examples/radio/radio.rb +16 -0
- data/examples/radio/radio_groups.rb +18 -0
- data/examples/radio/radio_same_slot.rb +6 -0
- data/examples/rect.rb +4 -0
- data/examples/rotate_shapes.rb +17 -0
- data/examples/ruby_racer.rb +13 -15
- data/examples/selfitude.rb +18 -0
- data/examples/shapes/shapes_fill.rb +4 -3
- data/examples/shoes_school.rb +2 -4
- data/examples/show_hide.rb +6 -0
- data/examples/simpler-menu.rb +21 -0
- data/examples/skip_ci/change_my_audio_source.rb +21 -0
- data/examples/skip_ci/guitar_fretboard.rb +137 -0
- data/examples/video.rb +10 -0
- data/exe/scarpe +43 -66
- data/fonts/Pacifico.ttf +0 -0
- data/lacci/Gemfile +24 -0
- data/lacci/Gemfile.lock +79 -0
- data/lacci/Rakefile +12 -0
- data/lacci/lacci.gemspec +37 -0
- data/lacci/lib/lacci/scarpe_cli.rb +71 -0
- data/lacci/lib/lacci/scarpe_core.rb +22 -0
- data/lacci/lib/lacci/version.rb +13 -0
- 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 +309 -0
- data/{lib/scarpe → lacci/lib/shoes}/background.rb +2 -2
- data/{lib/scarpe → lacci/lib/shoes}/border.rb +2 -2
- data/lacci/lib/shoes/builtins.rb +63 -0
- data/lacci/lib/shoes/changelog.rb +52 -0
- data/{lib/scarpe → lacci/lib/shoes}/colors.rb +3 -1
- data/lacci/lib/shoes/constants.rb +47 -0
- data/{lib/scarpe → lacci/lib/shoes}/display_service.rb +71 -53
- data/lacci/lib/shoes/download.rb +123 -0
- 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/drawables/check.rb +29 -0
- data/lacci/lib/shoes/drawables/document_root.rb +20 -0
- data/lacci/lib/shoes/drawables/edit_box.rb +29 -0
- data/{lib/scarpe → lacci/lib/shoes/drawables}/edit_line.rb +6 -6
- data/lacci/lib/shoes/drawables/flow.rb +22 -0
- data/{lib/scarpe → lacci/lib/shoes/drawables}/image.rb +7 -11
- data/lacci/lib/shoes/drawables/line.rb +20 -0
- 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/drawables/shape.rb +36 -0
- data/lacci/lib/shoes/drawables/slot.rb +87 -0
- data/{lib/scarpe → lacci/lib/shoes/drawables}/span.rb +8 -7
- data/lacci/lib/shoes/drawables/stack.rb +26 -0
- 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 +71 -0
- data/lacci/lib/shoes/ruby_extensions.rb +15 -0
- data/lacci/lib/shoes/spacing.rb +9 -0
- data/lacci/lib/shoes-spec.rb +93 -0
- data/lacci/lib/shoes.rb +147 -0
- data/lacci/test/test_colors.rb +39 -0
- data/lacci/test/test_helper.rb +63 -0
- data/lacci/test/test_lacci.rb +18 -0
- data/lacci/test/test_shoes_errors.rb +49 -0
- data/lib/scarpe/cats_cradle.rb +271 -0
- data/lib/scarpe/errors.rb +77 -0
- data/lib/scarpe/evented_assertions.rb +121 -0
- data/lib/scarpe/shoes_spec.rb +181 -0
- data/lib/scarpe/version.rb +2 -2
- data/lib/scarpe/wv/app.rb +45 -23
- data/lib/scarpe/wv/arc.rb +4 -48
- data/lib/scarpe/wv/arrow.rb +9 -0
- data/lib/scarpe/wv/button.rb +7 -33
- data/lib/scarpe/wv/check.rb +27 -0
- data/lib/scarpe/wv/control_interface.rb +32 -40
- data/lib/scarpe/wv/document_root.rb +66 -31
- data/lib/scarpe/wv/drawable.rb +273 -0
- data/lib/scarpe/wv/edit_box.rb +4 -19
- data/lib/scarpe/wv/edit_line.rb +4 -18
- data/lib/scarpe/wv/flow.rb +2 -28
- data/lib/scarpe/wv/image.rb +10 -25
- data/lib/scarpe/wv/line.rb +3 -28
- data/lib/scarpe/wv/link.rb +3 -15
- data/lib/scarpe/wv/list_box.rb +6 -29
- data/lib/scarpe/wv/para.rb +11 -28
- data/lib/scarpe/wv/progress.rb +19 -0
- data/lib/scarpe/wv/radio.rb +33 -0
- data/lib/scarpe/wv/rect.rb +13 -0
- data/lib/scarpe/wv/shape.rb +41 -10
- data/lib/scarpe/wv/slot.rb +64 -0
- data/lib/scarpe/wv/span.rb +3 -25
- data/lib/scarpe/wv/stack.rb +2 -38
- data/lib/scarpe/wv/star.rb +3 -54
- data/lib/scarpe/wv/subscription_item.rb +84 -0
- data/lib/scarpe/wv/text_drawable.rb +32 -0
- data/lib/scarpe/wv/video.rb +34 -0
- data/lib/scarpe/wv/web_wrangler.rb +449 -299
- data/lib/scarpe/wv/webview_local_display.rb +63 -26
- data/lib/scarpe/wv/webview_relay_display.rb +24 -125
- data/lib/scarpe/wv/webview_relay_util.rb +140 -0
- data/lib/scarpe/wv/wv_display_worker.rb +19 -6
- data/lib/scarpe/wv.rb +76 -14
- data/lib/scarpe/wv_local.rb +1 -1
- data/lib/scarpe/wv_relay.rb +1 -1
- data/lib/scarpe.rb +4 -32
- data/logger/debug_web_wrangler.json +1 -1
- data/logger/scarpe_wv_test.json +1 -1
- data/scarpe-components/.gitignore +1 -0
- data/scarpe-components/Gemfile +22 -0
- data/scarpe-components/Gemfile.lock +86 -0
- data/scarpe-components/README.md +35 -0
- data/scarpe-components/Rakefile +12 -0
- data/scarpe-components/lib/scarpe/components/base64.rb +25 -0
- 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 +66 -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 +113 -0
- data/scarpe-components/lib/scarpe/components/print_logger.rb +47 -0
- data/{lib/scarpe → scarpe-components/lib/scarpe/components}/promises.rb +115 -48
- data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +189 -0
- 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 +257 -0
- data/scarpe-components/lib/scarpe/components/version.rb +7 -0
- data/scarpe-components/scarpe-components.gemspec +38 -0
- 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_components.rb +9 -0
- data/scarpe-components/test/test_dimensions.rb +26 -0
- data/scarpe-components/test/test_helper.rb +43 -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 +261 -0
- data/scarpe-components/test/test_segmented_app_files.rb +184 -0
- data/scarpegen.rb +14 -14
- data/sig/scarpe.rbs +1 -1
- data/{lib/scarpe → spikes}/glibui/widget.rb +2 -2
- data/{lib/scarpe → spikes}/glibui.rb +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 -5
- metadata +236 -145
- data/examples/fill.rb +0 -25
- data/examples/legacy/not_checked/shoes-contrib/basic/class-book.yaml +0 -387
- data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +0 -3
- data/examples/legacy/not_checked/shoes-contrib/good/good-clock.rb +0 -51
- data/examples/legacy/not_checked/shoes-contrib/good/good-follow.rb +0 -26
- data/examples/legacy/not_checked/shoes-contrib/good/good-reminder.rb +0 -174
- data/examples/legacy/not_checked/shoes-contrib/good/good-vjot.rb +0 -56
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-timer.rb +0 -13
- data/examples/legacy/not_checked/shoes-dep-samples/good-clock.rb +0 -51
- data/examples/legacy/not_checked/shoes-dep-samples/good-follow.rb +0 -26
- data/examples/legacy/not_checked/shoes-dep-samples/good-reminder.rb +0 -174
- data/examples/legacy/not_checked/shoes-dep-samples/good-vjot.rb +0 -56
- data/examples/legacy/not_checked/shoes-dep-samples/simple-accordion.rb +0 -75
- data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-shapes.rb +0 -17
- data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-text.rb +0 -13
- data/examples/legacy/not_checked/shoes-dep-samples/simple-arc.rb +0 -23
- data/examples/legacy/not_checked/shoes-dep-samples/simple-bounce.rb +0 -24
- data/examples/legacy/not_checked/shoes-dep-samples/simple-calc.rb +0 -70
- data/examples/legacy/not_checked/shoes-dep-samples/simple-chipmunk.rb +0 -26
- data/examples/legacy/not_checked/shoes-dep-samples/simple-control-sizes.rb +0 -24
- data/examples/legacy/not_checked/shoes-dep-samples/simple-curve.rb +0 -26
- data/examples/legacy/not_checked/shoes-dep-samples/simple-dialogs.rb +0 -29
- data/examples/legacy/not_checked/shoes-dep-samples/simple-draw.rb +0 -13
- data/examples/legacy/not_checked/shoes-dep-samples/simple-editor.rb +0 -28
- data/examples/legacy/not_checked/shoes-dep-samples/simple-form.rb +0 -28
- data/examples/legacy/not_checked/shoes-dep-samples/simple-form.shy +0 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-mask.rb +0 -21
- data/examples/legacy/not_checked/shoes-dep-samples/simple-menu.rb +0 -31
- data/examples/legacy/not_checked/shoes-dep-samples/simple-menu1.rb +0 -35
- data/examples/legacy/not_checked/shoes-dep-samples/simple-rubygems.rb +0 -29
- data/examples/legacy/not_checked/shoes-dep-samples/simple-slide.rb +0 -45
- data/examples/legacy/not_checked/shoes-dep-samples/simple-sphere.rb +0 -28
- data/examples/legacy/not_checked/shoes-dep-samples/simple-sqlite3.rb +0 -13
- data/examples/legacy/not_checked/shoes-dep-samples/simple-timer.rb +0 -13
- data/examples/legacy/not_checked/shoes-dep-samples/simple-video.rb +0 -13
- data/examples/legacy/not_checked/simple/anim-text.rb +0 -13
- data/examples/legacy/not_checked/simple/arc.rb +0 -23
- data/examples/legacy/not_checked/simple/bounce.rb +0 -24
- data/examples/legacy/not_checked/simple/chipmunk.rb +0 -26
- data/examples/legacy/not_checked/simple/curve.rb +0 -26
- data/examples/legacy/not_checked/simple/dialogs.rb +0 -29
- data/examples/legacy/not_checked/simple/downloader.rb +0 -40
- data/examples/legacy/not_checked/simple/draw.rb +0 -13
- data/examples/legacy/not_checked/simple/mask.rb +0 -21
- data/examples/legacy/not_checked/simple/slide.rb +0 -45
- data/examples/legacy/not_checked/simple/sphere.rb +0 -28
- data/lib/constants.rb +0 -5
- data/lib/scarpe/alert.rb +0 -19
- data/lib/scarpe/app.rb +0 -78
- data/lib/scarpe/arc.rb +0 -49
- data/lib/scarpe/button.rb +0 -35
- data/lib/scarpe/document_root.rb +0 -20
- data/lib/scarpe/edit_box.rb +0 -24
- data/lib/scarpe/fill.rb +0 -23
- data/lib/scarpe/flow.rb +0 -19
- data/lib/scarpe/line.rb +0 -25
- data/lib/scarpe/link.rb +0 -25
- data/lib/scarpe/list_box.rb +0 -25
- data/lib/scarpe/logger.rb +0 -155
- data/lib/scarpe/para.rb +0 -90
- data/lib/scarpe/shape.rb +0 -19
- data/lib/scarpe/spacing.rb +0 -9
- data/lib/scarpe/stack.rb +0 -70
- data/lib/scarpe/star.rb +0 -47
- data/lib/scarpe/text_widget.rb +0 -42
- data/lib/scarpe/unit_test_helpers.rb +0 -163
- data/lib/scarpe/widget.rb +0 -198
- data/lib/scarpe/widgets.rb +0 -30
- data/lib/scarpe/wv/alert.rb +0 -65
- data/lib/scarpe/wv/background.rb +0 -18
- data/lib/scarpe/wv/border.rb +0 -22
- data/lib/scarpe/wv/control_interface_test.rb +0 -253
- data/lib/scarpe/wv/dimensions.rb +0 -22
- data/lib/scarpe/wv/fill.rb +0 -30
- data/lib/scarpe/wv/html.rb +0 -107
- data/lib/scarpe/wv/shape_helper.rb +0 -44
- data/lib/scarpe/wv/spacing.rb +0 -41
- data/lib/scarpe/wv/text_widget.rb +0 -30
- data/lib/scarpe/wv/widget.rb +0 -181
- data/scarpe-0.2.0.gem +0 -0
- /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
- /data/{lib/scarpe → spikes}/glibui/README.md +0 -0
- /data/{lib/scarpe → spikes}/glibui/alert.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/app.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/background.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/border.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/button.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/dimensions.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/document_root.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/edit_box.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/edit_line.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/flow.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/html.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/image.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/link.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/local_display.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/para.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/spacing.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/stack.rb +0 -0
- /data/{lib/scarpe → spikes}/glibui/text_widget.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/alert.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/button.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/colors.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/core.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/flow.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/libui.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/notepad.md +0 -0
- /data/{lib/scarpe → spikes}/libui/para.rb +0 -0
- /data/{lib/scarpe → spikes}/libui/stack.rb +0 -0
data/lib/scarpe.rb
CHANGED
@@ -1,42 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative "scarpe/logger"
|
4
|
-
|
5
|
-
# This will never be triggered -- we use the (...) feature below, which means this
|
6
|
-
# file won't even parse in old Rubies.
|
7
3
|
if RUBY_VERSION[0..2] < "3.2"
|
8
|
-
|
4
|
+
Shoes::Log.logger("Scarpe").error("Scarpe requires Ruby 3.2 or higher!")
|
9
5
|
exit(-1)
|
10
6
|
end
|
11
7
|
|
12
|
-
require "
|
13
|
-
require "
|
14
|
-
|
15
|
-
require_relative "constants"
|
16
|
-
|
17
|
-
class Scarpe::Error < StandardError; end
|
18
|
-
|
19
|
-
require_relative "scarpe/version"
|
20
|
-
require_relative "scarpe/promises"
|
21
|
-
require_relative "scarpe/display_service"
|
22
|
-
require_relative "scarpe/widgets"
|
23
|
-
|
24
|
-
require "bloops"
|
8
|
+
require "shoes"
|
9
|
+
require "lacci/scarpe_core"
|
25
10
|
|
26
11
|
d_s = ENV["SCARPE_DISPLAY_SERVICE"] || "wv_local"
|
27
12
|
# This is require, not require_relative, to allow gems to supply a new display service
|
13
|
+
require "scarpe/errors"
|
28
14
|
require "scarpe/#{d_s}"
|
29
|
-
|
30
|
-
#Constants Module
|
31
|
-
include Constants
|
32
|
-
|
33
|
-
class Scarpe
|
34
|
-
class << self
|
35
|
-
def app(...)
|
36
|
-
app = Scarpe::App.new(...)
|
37
|
-
app.init
|
38
|
-
app.run
|
39
|
-
app.destroy
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
data/logger/scarpe_wv_test.json
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
scarpe-components-*.gem
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
gemspec
|
6
|
+
|
7
|
+
gem "lacci", path: "../lacci"
|
8
|
+
|
9
|
+
gem "rake", "~> 13.0"
|
10
|
+
|
11
|
+
gem "nokogiri"
|
12
|
+
|
13
|
+
group :test do
|
14
|
+
gem "minitest", "~> 5.0"
|
15
|
+
gem "minitest-reporters"
|
16
|
+
end
|
17
|
+
|
18
|
+
group :development do
|
19
|
+
gem "debug"
|
20
|
+
gem "rubocop", "~> 1.21"
|
21
|
+
gem "rubocop-shopify"
|
22
|
+
end
|
@@ -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
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# Scarpe-Components
|
2
|
+
|
3
|
+
Scarpe is several things. We package up the Shoes API with as few implementation details as possible (called Lacci.) We have a Webview-based display library, in both local and over-a-socket (relay) versions. We have a Wasm display library (Scarpe-Wasm) in a separate gem.
|
4
|
+
|
5
|
+
And we have various default implementations of different reusable components. Scarpe's hierarchical logger isn't particularly specific to your display library or underlying GUI library, but we'd like it to be usable by multiple display libs. CatsCradle is only useful if you're trying to fix up an impedance mismatch between Ruby and an evented under-layer, but it's not really specific to Webview. Scarpe's default downloader, using Ruby's built-in HTTP libraries, is good in many cases but you might want to replace it (e.g. with Typhoeus for better parallel downloads or Hystrix for robustness to bad network connections) in some cases.
|
6
|
+
|
7
|
+
Part of our solution is the Scarpe-Components gem, which lives in the same repository as Scarpe (for now?). These components can live there. Any specific display library can pick and choose what it wants or needs and handle its dependencies as it sees fit.
|
8
|
+
|
9
|
+
## Dependency Hell
|
10
|
+
|
11
|
+
A "gem full of optional reusable components" presents an awkward challenge for Rubygems. What are the gem's dependencies? Do you make it depend on every possible library, requiring FastImage and Nokogiri and SQLite and whatever else any component might ever require? That would be as bad as making ActiveRecord need MySQL and SQLite and Postgres and Oracle and... But if you don't give it *any* dependencies, you're going to have a harsh surprise at runtime when Bundler can't find any of the gems you need.
|
12
|
+
|
13
|
+
You can break everything up into tiny pieces, like ActiveRecord having a separate adapter for certain databases. You could do the same with an activerecord-mysql and activerecord-postgres and activerecord-sqlite gem to complete the set. Or, like, ActiveRecord, you can say "declare activerecord as a dependency, and also one or more other database gems, and we'll figure out what's available at runtime." That approach can be pretty fragile and it adds extra complexity -- how do you make sure everything is required at the right time and ActiveRecord can find everything that's available? How do you balance gem dependencies that are built into ActiveRecord with those for unusual databases that get added by other gems, later? Your plugin system (like ActiveRecord's) can get extensive and fragile.
|
14
|
+
|
15
|
+
Scarpe-Components kicks that problem down the road to the display libraries. Would a particular display library like to use the FastImage-based image implementation? Great! It can declare a dependency on the FastImage gem. Would it like to optionally allow the built-in Ruby downloader, but also have an optional robustified version using RestClient? Lovely. It can either create multiple gems (e.g. scarpe-gtk-rcdownload and scarpe-gtk-plaindownload) or look for RestClient being available at runtime, as it pleases. The FastImage implementation lives in Scarpe-Components, but the dependency is declared by the display library or the app.
|
16
|
+
|
17
|
+
## Using an Implementation
|
18
|
+
|
19
|
+
Components in Scarpe-Components are designed to be used individually. They can require each other, but they should only require components they will actually use. The whole library is designed to be used a la carte, and normally no display service will use every component.
|
20
|
+
|
21
|
+
A display library will declare scarpe-components as a dependency. Then, usually from its named require file (e.g. wv_local.rb, wv_relay.rb, wasm_local.rb) it will set up those dependencies by requiring components that it wants and if necessary creating and configuring them. That way a specific display service (e.g. wv_local) can require a specific component (e.g. Logging-gem-based hierarchical logging) and configure it how it wants (e.g. ENV var pointing to a local JSON config file.)
|
22
|
+
|
23
|
+
## How is this Different from Lacci?
|
24
|
+
|
25
|
+
Scarpe already has a gem full of reusable components, one that every Scarpe-based application already has to use. Lacci declares the Shoes API, and is 100% required for every Scarpe-based Shoes application everywhere.
|
26
|
+
|
27
|
+
So how do you tell what goes into Scarpe-Components vs what goes into Lacci?
|
28
|
+
|
29
|
+
Lacci is, at heart, an API with as little implementation as possible. It declares the Shoes GUI objects, but not how to display them. Ordinarily a Shoes application will require (in the sense of Kernel#require) every part of Lacci -- it will load the entire library. Even if we add optional components (e.g. a Lacci-based Bloops API with no implementation behind it), those components will be loaded by every Shoes app that uses that part of the API.
|
30
|
+
|
31
|
+
As a result, Lacci should have minimal (preferably zero) dependencies. Any code doing "real work" should be removed from Lacci completely, as soon as possible. Since *every* Shoes app is going to require Lacci, it should be possible to use it with essentially no dependencies, minimal memory footprint, minimal load time. It is a skeleton to hang functionality on, not a thing that functions for itself.
|
32
|
+
|
33
|
+
Scarpe-Components is a grab bag of default implementations, intended to be replaceable. But each of them does something. Most of them have dependencies. It's fine for a Scarpe-Component implementation to depend on the Logging gem, provided it says it does. Nokogiri? 100% fair. Does it do something with a nontrivial amount of computation, like rendering HTML output? No problem. This is very different from Lacci.
|
34
|
+
|
35
|
+
If a component should be reused, it's probably fine to put it into Scarpe-Components. It *might* be fine to put it in Lacci. For Scarpe-Components, ask yourself, "will more than one Scarpe display service possibly want to use this?" For Lacci, the test is more strict: "will *every* Scarpe display service want to use this? Does it have no dependencies at all, and do very little computation and take very little memory?"
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "base64"
|
4
|
+
require "uri"
|
5
|
+
|
6
|
+
module Scarpe; end
|
7
|
+
module Scarpe::Components; end
|
8
|
+
module Scarpe
|
9
|
+
module Components::Base64
|
10
|
+
def valid_url?(string)
|
11
|
+
uri = URI.parse(string)
|
12
|
+
uri.is_a?(URI::HTTP) || uri.is_a?(URI::HTTPS)
|
13
|
+
rescue URI::InvalidURIError, URI::BadURIError
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def encode_file_to_base64(image_path)
|
18
|
+
image_data = File.binread(image_path)
|
19
|
+
|
20
|
+
encoded_data = ::Base64.strict_encode64(image_data)
|
21
|
+
|
22
|
+
encoded_data
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -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
|
@@ -0,0 +1,203 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scarpe::Components::Calzini
|
4
|
+
def arc_element(props, &block)
|
5
|
+
dc = props["draw_context"] || {}
|
6
|
+
rotate = dc["rotate"]
|
7
|
+
HTML.render do |h|
|
8
|
+
h.div(id: html_id, style: arc_style(props)) do
|
9
|
+
h.svg(width: props["width"], height: props["height"]) do
|
10
|
+
h.path(d: arc_path(props), transform: "rotate(#{rotate}, #{props["width"] / 2}, #{props["height"] / 2})")
|
11
|
+
end
|
12
|
+
block.call(h) if block_given?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def rect_element(props)
|
18
|
+
dc = props["draw_context"] || {}
|
19
|
+
rotate = dc["rotate"]
|
20
|
+
HTML.render do |h|
|
21
|
+
h.div(id: html_id, style: drawable_style(props)) do
|
22
|
+
width = props["width"].to_i
|
23
|
+
height = props["height"].to_i
|
24
|
+
if props["curve"]
|
25
|
+
width += 2 * props["curve"].to_i
|
26
|
+
height += 2 * props["curve"].to_i
|
27
|
+
end
|
28
|
+
h.svg(width:, height:) do
|
29
|
+
attrs = { x: props["left"], y: props["top"], width: props["width"], height: props["height"], style: rect_svg_style(props) }
|
30
|
+
attrs[:rx] = props["curve"] if props["curve"]
|
31
|
+
|
32
|
+
h.rect(**attrs, transform: "rotate(#{rotate} #{width / 2} #{height / 2})")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def line_element(props)
|
39
|
+
HTML.render do |h|
|
40
|
+
h.div(id: html_id, style: line_div_style(props)) do
|
41
|
+
h.svg(width: props["x2"], height: props["y2"]) do
|
42
|
+
h.line(x1: props["left"], y1: props["top"], x2: props["x2"], y2: props["y2"], style: line_svg_style(props))
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def star_element(props, &block)
|
49
|
+
dc = props["draw_context"] || {}
|
50
|
+
fill = dc["fill"]
|
51
|
+
stroke = dc["stroke"]
|
52
|
+
fill = "black" if !fill || fill == ""
|
53
|
+
stroke = "black" if !stroke || stroke == ""
|
54
|
+
HTML.render do |h|
|
55
|
+
h.div(id: html_id, style: star_style(props)) do
|
56
|
+
h.svg(width: props["outer"], height: props["outer"], style: "fill:#{fill}") do
|
57
|
+
h.polygon(points: star_points(props), style: "stroke:#{stroke};stroke-width:2")
|
58
|
+
end
|
59
|
+
block.call(h) if block_given?
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def arc_style(props)
|
67
|
+
drawable_style(props).merge({
|
68
|
+
left: "#{props["left"]}px",
|
69
|
+
top: "#{props["top"]}px",
|
70
|
+
width: "#{props["width"]}px",
|
71
|
+
height: "#{props["height"]}px",
|
72
|
+
})
|
73
|
+
end
|
74
|
+
|
75
|
+
def arc_path(props)
|
76
|
+
center_x = props["width"] / 2
|
77
|
+
center_y = props["height"] / 2
|
78
|
+
radius_x = props["width"] / 2
|
79
|
+
radius_y = props["height"] / 2
|
80
|
+
start_angle_degrees = radians_to_degrees(props["angle1"]) % 360
|
81
|
+
end_angle_degrees = radians_to_degrees(props["angle2"]) % 360
|
82
|
+
large_arc_flag = (end_angle_degrees - start_angle_degrees) % 360 > 180 ? 1 : 0
|
83
|
+
|
84
|
+
"M#{center_x} #{center_y} L#{props["width"]} #{center_y} " \
|
85
|
+
"A#{radius_x} #{radius_y} 0 #{large_arc_flag} 0 " \
|
86
|
+
"#{center_x + radius_x * Math.cos(degrees_to_radians(end_angle_degrees))} " \
|
87
|
+
"#{center_y + radius_y * Math.sin(degrees_to_radians(end_angle_degrees))} Z"
|
88
|
+
end
|
89
|
+
|
90
|
+
def line_div_style(props)
|
91
|
+
drawable_style(props).merge({
|
92
|
+
left: "#{props["left"]}px",
|
93
|
+
top: "#{props["top"]}px",
|
94
|
+
})
|
95
|
+
end
|
96
|
+
|
97
|
+
def line_svg_style(props)
|
98
|
+
stroke = if props["draw_context"] && !props["draw_context"]["stroke"].to_s.empty?
|
99
|
+
(props["draw_context"]["stroke"]).to_s
|
100
|
+
else
|
101
|
+
"black"
|
102
|
+
end
|
103
|
+
{
|
104
|
+
|
105
|
+
"stroke": stroke,
|
106
|
+
"stroke-width": "4",
|
107
|
+
}.compact
|
108
|
+
end
|
109
|
+
|
110
|
+
def rect_svg_style(props)
|
111
|
+
{
|
112
|
+
stroke: (props["draw_context"] || {})["stroke"],
|
113
|
+
#"stroke-width": "1",
|
114
|
+
}.compact
|
115
|
+
end
|
116
|
+
|
117
|
+
def star_style(props)
|
118
|
+
drawable_style(props).merge({
|
119
|
+
width: dimensions_length(props["width"]),
|
120
|
+
height: dimensions_length(props["height"]),
|
121
|
+
}).compact
|
122
|
+
end
|
123
|
+
|
124
|
+
def star_points(props)
|
125
|
+
angle = 2 * Math::PI / props["points"]
|
126
|
+
coordinates = []
|
127
|
+
|
128
|
+
props["points"].times do |i|
|
129
|
+
outer_angle = i * angle
|
130
|
+
inner_angle = outer_angle + angle / 2
|
131
|
+
|
132
|
+
coordinates.concat(star_get_coordinates(outer_angle, inner_angle, props))
|
133
|
+
end
|
134
|
+
|
135
|
+
coordinates.join(",")
|
136
|
+
end
|
137
|
+
|
138
|
+
def star_get_coordinates(outer_angle, inner_angle, props)
|
139
|
+
outer_x = props["outer"] / 2 + Math.cos(outer_angle) * props["outer"] / 2
|
140
|
+
outer_y = props["outer"] / 2 + Math.sin(outer_angle) * props["outer"] / 2
|
141
|
+
|
142
|
+
inner_x = props["outer"] / 2 + Math.cos(inner_angle) * props["inner"] / 2
|
143
|
+
inner_y = props["outer"] / 2 + Math.sin(inner_angle) * props["inner"] / 2
|
144
|
+
|
145
|
+
[outer_x, outer_y, inner_x, inner_y]
|
146
|
+
end
|
147
|
+
|
148
|
+
def arrow_element(props)
|
149
|
+
left = props["left"]
|
150
|
+
top = props["top"]
|
151
|
+
width = props["width"]
|
152
|
+
end_x = left + width
|
153
|
+
end_y = top
|
154
|
+
stroke_width = width / 2
|
155
|
+
dc = props["draw_context"] || {}
|
156
|
+
fill = dc["fill"]
|
157
|
+
stroke = dc["stroke"]
|
158
|
+
rotate = dc["rotate"]
|
159
|
+
fill = "black" if !fill || fill == ""
|
160
|
+
stroke = "black" if !stroke || stroke == ""
|
161
|
+
|
162
|
+
stroke_width = width / 4
|
163
|
+
|
164
|
+
HTML.render do |h|
|
165
|
+
h.div(id: html_id, style: arrow_div_style(props)) do
|
166
|
+
h.svg do
|
167
|
+
h.defs do
|
168
|
+
h.marker(
|
169
|
+
id: "head",
|
170
|
+
viewBox: "0 0 70 70",
|
171
|
+
markerWidth: stroke_width.to_s,
|
172
|
+
markerHeight: stroke_width.to_s,
|
173
|
+
refX: "5",
|
174
|
+
refY: "5",
|
175
|
+
orient: "auto-start-reverse",
|
176
|
+
) do
|
177
|
+
h.path(d: "M 0 0 L 10 5 L 0 10 z", fill: fill.to_s)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
h.line(
|
182
|
+
x2: left.to_s,
|
183
|
+
y2: top.to_s,
|
184
|
+
x1: end_x.to_s,
|
185
|
+
y1: end_y.to_s,
|
186
|
+
fill: fill.to_s,
|
187
|
+
stroke: stroke.to_s,
|
188
|
+
"stroke-width" => stroke_width.to_s,
|
189
|
+
"marker-end" => "url(#head)",
|
190
|
+
transform: "rotate(#{rotate}, #{left + width / 2}, #{top})",
|
191
|
+
)
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
def arrow_div_style(props)
|
197
|
+
drawable_style(props).merge({
|
198
|
+
position: "absolute",
|
199
|
+
left: "#{props["left"]}px",
|
200
|
+
top: "#{props["top"]}px",
|
201
|
+
})
|
202
|
+
end
|
203
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scarpe::Components::Calzini
|
4
|
+
def button_element(props)
|
5
|
+
HTML.render do |h|
|
6
|
+
h.button(
|
7
|
+
id: html_id,
|
8
|
+
onclick: handler_js_code("click"),
|
9
|
+
onmouseover: handler_js_code("hover"),
|
10
|
+
style: button_style(props),
|
11
|
+
title: props["tooltip"],
|
12
|
+
) do
|
13
|
+
props["text"]
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def button_style(props)
|
21
|
+
styles = drawable_style(props)
|
22
|
+
|
23
|
+
styles[:"background-color"] = props["color"] if props["color"]
|
24
|
+
styles[:"padding-top"] = props["padding_top"] if props["padding_top"]
|
25
|
+
styles[:"padding-bottom"] = props["padding_bottom"] if props["padding_bottom"]
|
26
|
+
styles[:color] = props["text_color"] if props["text_color"]
|
27
|
+
styles[:width] = dimensions_length(props["width"]) if props["width"]
|
28
|
+
styles[:height] = dimensions_length(props["height"]) if props["height"]
|
29
|
+
styles[:"font-size"] = props["font_size"] if props["font_size"]
|
30
|
+
|
31
|
+
styles[:top] = dimensions_length(props["top"]) if props["top"]
|
32
|
+
styles[:left] = dimensions_length(props["left"]) if props["left"]
|
33
|
+
styles[:position] = "absolute" if props["top"] || props["left"]
|
34
|
+
styles[:"font-size"] = dimensions_length(text_size(props["size"])) if props["size"]
|
35
|
+
styles[:"font-family"] = props["font"] if props["font"]
|
36
|
+
|
37
|
+
styles
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,146 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Scarpe::Components::Calzini
|
4
|
+
def check_element(props)
|
5
|
+
HTML.render do |h|
|
6
|
+
h.input type: :checkbox,
|
7
|
+
id: html_id,
|
8
|
+
onclick: handler_js_code("click"),
|
9
|
+
value: props["text"],
|
10
|
+
checked: props["checked"],
|
11
|
+
style: drawable_style(props)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def edit_box_element(props)
|
16
|
+
oninput = handler_js_code("change", "this.value")
|
17
|
+
|
18
|
+
HTML.render do |h|
|
19
|
+
h.textarea(id: html_id, oninput: oninput, style: edit_box_style(props)) { props["text"] }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def edit_line_element(props)
|
24
|
+
oninput = handler_js_code("change", "this.value")
|
25
|
+
|
26
|
+
HTML.render do |h|
|
27
|
+
h.input(id: html_id, oninput: oninput, value: props["text"], style: edit_line_style(props))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def image_element(props)
|
32
|
+
style = image_style(props)
|
33
|
+
|
34
|
+
if props["click"]
|
35
|
+
HTML.render do |h|
|
36
|
+
h.a(id: html_id, href: props["click"]) { h.img(id: html_id, src: props["url"], style:) }
|
37
|
+
end
|
38
|
+
else
|
39
|
+
HTML.render do |h|
|
40
|
+
h.img(id: html_id, src: props["url"], style:)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def list_box_element(props)
|
46
|
+
onchange = handler_js_code("change", "this.options[this.selectedIndex].value")
|
47
|
+
|
48
|
+
# Is this useful at all? Is it overridden below completely?
|
49
|
+
option_attrs = { value: nil, selected: false }
|
50
|
+
|
51
|
+
HTML.render do |h|
|
52
|
+
h.select(id: html_id, onchange:, style: list_box_style(props)) do
|
53
|
+
(props["items"] || []).each do |item|
|
54
|
+
option_attrs = {
|
55
|
+
value: item,
|
56
|
+
}
|
57
|
+
if item == props["choose"]
|
58
|
+
option_attrs[:selected] = "true"
|
59
|
+
end
|
60
|
+
h.option(**option_attrs) do
|
61
|
+
item
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def radio_element(props)
|
69
|
+
# This is wrong - need to default to the parent slot -- maybe its linkable ID?
|
70
|
+
group_name = props["group"] || "no_group"
|
71
|
+
|
72
|
+
HTML.render do |h|
|
73
|
+
h.input(
|
74
|
+
type: :radio,
|
75
|
+
id: html_id,
|
76
|
+
onclick: handler_js_code("click"),
|
77
|
+
name: group_name,
|
78
|
+
value: props["text"],
|
79
|
+
checked: props["checked"],
|
80
|
+
style: drawable_style(props),
|
81
|
+
)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def video_element(props)
|
86
|
+
HTML.render do |h|
|
87
|
+
h.video(id: html_id, style: drawable_style(props), controls: true) do
|
88
|
+
h.source(src: @url, type: props["format"])
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def progress_element(props)
|
94
|
+
HTML.render do |h|
|
95
|
+
h.progress(
|
96
|
+
id: html_id,
|
97
|
+
style: drawable_style(props),
|
98
|
+
role: "progressbar",
|
99
|
+
"aria-valuenow": props["fraction"],
|
100
|
+
"aria-valuemin": 0.0,
|
101
|
+
"aria-valuemax": 1.0,
|
102
|
+
max: 1,
|
103
|
+
value: props["fraction"],
|
104
|
+
)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
|
110
|
+
def edit_box_style(props)
|
111
|
+
drawable_style(props).merge({
|
112
|
+
height: dimensions_length(props["height"]),
|
113
|
+
width: dimensions_length(props["width"]),
|
114
|
+
}.compact)
|
115
|
+
end
|
116
|
+
|
117
|
+
def edit_line_style(props)
|
118
|
+
styles = drawable_style(props)
|
119
|
+
|
120
|
+
styles[:width] = dimensions_length(props["width"]) if props["width"]
|
121
|
+
|
122
|
+
styles
|
123
|
+
end
|
124
|
+
|
125
|
+
def image_style(props)
|
126
|
+
styles = drawable_style(props)
|
127
|
+
|
128
|
+
styles[:width] = dimensions_length(props["width"]) if props["width"]
|
129
|
+
styles[:height] = dimensions_length(props["height"]) if props["height"]
|
130
|
+
|
131
|
+
styles[:top] = dimensions_length(props["top"]) if props["top"]
|
132
|
+
styles[:left] = dimensions_length(props["left"]) if props["left"]
|
133
|
+
styles[:position] = "absolute" if props["top"] || props["left"]
|
134
|
+
|
135
|
+
styles
|
136
|
+
end
|
137
|
+
|
138
|
+
def list_box_style(props)
|
139
|
+
styles = drawable_style(props)
|
140
|
+
|
141
|
+
styles[:height] = dimensions_length(props["height"]) if props["height"]
|
142
|
+
styles[:width] = dimensions_length(props["width"]) if props["width"]
|
143
|
+
|
144
|
+
styles
|
145
|
+
end
|
146
|
+
end
|