scarpe 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +80 -9
- data/.ruby-version +1 -0
- data/.vscode/extensions.json +5 -0
- data/.yardopts +3 -0
- data/CHANGELOG.md +14 -0
- data/CONTRIBUTING.md +20 -0
- data/Gemfile +14 -2
- data/README.md +138 -18
- data/Rakefile +2 -3
- data/dev.yml +7 -0
- data/docs/static/PKGBUILD +47 -0
- data/docs/static/Shoes.icns +0 -0
- data/docs/static/avatar.png +0 -0
- data/docs/static/code_highlighter.js +188 -0
- data/docs/static/code_highlighter_ruby.js +26 -0
- data/docs/static/icon-debug.png +0 -0
- data/docs/static/icon-error.png +0 -0
- data/docs/static/icon-info.png +0 -0
- data/docs/static/icon-warn.png +0 -0
- data/docs/static/listbox_button1.png +0 -0
- data/docs/static/listbox_button2.png +0 -0
- data/docs/static/man-app.png +0 -0
- data/docs/static/man-builds.png +0 -0
- data/docs/static/man-builds1.png +0 -0
- data/docs/static/man-editor-notepad.png +0 -0
- data/docs/static/man-editor-osx.png +0 -0
- data/docs/static/man-ele-background.png +0 -0
- data/docs/static/man-ele-border.png +0 -0
- data/docs/static/man-ele-button.png +0 -0
- data/docs/static/man-ele-check.png +0 -0
- data/docs/static/man-ele-editbox.png +0 -0
- data/docs/static/man-ele-editline.png +0 -0
- data/docs/static/man-ele-image.png +0 -0
- data/docs/static/man-ele-listbox.png +0 -0
- data/docs/static/man-ele-progress.png +0 -0
- data/docs/static/man-ele-radio.png +0 -0
- data/docs/static/man-ele-shape.png +0 -0
- data/docs/static/man-ele-textblock.png +0 -0
- data/docs/static/man-ele-video.png +0 -0
- data/docs/static/man-intro-dmg.png +0 -0
- data/docs/static/man-intro-exe.png +0 -0
- data/docs/static/man-look-tiger.png +0 -0
- data/docs/static/man-look-ubuntu.png +0 -0
- data/docs/static/man-look-vista.png +0 -0
- data/docs/static/man-run-osx.png +0 -0
- data/docs/static/man-run-vista.png +0 -0
- data/docs/static/man-run-xp.png +0 -0
- data/docs/static/man-shot1.png +0 -0
- data/docs/static/manual-en.txt +3529 -0
- data/docs/static/manual-ja.txt +2829 -0
- data/docs/static/manual.css +171 -0
- data/docs/static/manual.md +3528 -0
- data/docs/static/menu-corner1.png +0 -0
- data/docs/static/menu-corner2.png +0 -0
- data/docs/static/menu-gray.png +0 -0
- data/docs/static/menu-left.png +0 -0
- data/docs/static/menu-right.png +0 -0
- data/docs/static/menu-top.png +0 -0
- data/docs/static/shoes-dmg.jpg +0 -0
- data/docs/static/shoes-icon-blue.png +0 -0
- data/docs/static/shoes-icon.png +0 -0
- data/docs/static/shoes-manual-apps.gif +0 -0
- data/docs/static/shoes_main_window.png +0 -0
- data/docs/static/stripe.png +0 -0
- data/docs/static/stubs/blank.exe +0 -0
- data/docs/static/stubs/blank.hfz +0 -0
- data/docs/static/stubs/blank.run +375 -0
- data/docs/static/stubs/cocoa-install +0 -0
- data/docs/static/stubs/sh-install +49 -0
- data/docs/static/stubs/shoes-stub-inject.exe +0 -0
- data/docs/static/stubs/shoes-stub.exe +0 -0
- data/docs/static/tutor-back.png +0 -0
- data/examples/bloopsaphone/working/1901_by_Aanand_Prasad.rb +478 -0
- data/examples/bloopsaphone/working/b1.rb +64 -0
- data/examples/bloopsaphone/working/b2.rb +36 -0
- data/examples/bloopsaphone/working/bloops_test.rb +41 -0
- data/examples/bloopsaphone/working/bloopsaphone_theme_song_by_why.rb +31 -0
- data/examples/bloopsaphone/working/feepogram.rb +67 -0
- data/examples/bloopsaphone/working/simpsons_theme_song_by_why.rb +14 -0
- data/examples/bloopsaphone/working/tune_cheeky_drat.rb +210 -0
- data/examples/button.rb +6 -5
- data/examples/button_alert.rb +6 -0
- data/examples/button_go_away.rb +6 -0
- data/examples/button_with_position_and_size.rb +7 -0
- data/examples/coffee.rb +14 -0
- data/examples/download.rb +5 -0
- data/examples/edit_box.rb +10 -0
- data/examples/edit_line.rb +8 -0
- data/examples/fill.rb +25 -0
- data/examples/flow.rb +11 -0
- data/examples/fonts.rb +6 -0
- data/examples/gen.rb +140 -0
- data/examples/hello_world.rb +2 -4
- data/examples/highlander.rb +87 -0
- data/examples/image/clickable_image.rb +5 -0
- data/examples/{image.rb → image/image.rb} +2 -4
- data/examples/image/image_size.rb +7 -0
- data/examples/image/image_with_position_and_size.rb +3 -0
- data/examples/info.rb +9 -0
- data/examples/legacy/not_checked/expert/colours.rb +105 -0
- data/examples/legacy/not_checked/expert/curve-animation.rb +31 -0
- data/examples/legacy/not_checked/expert/curve-control-point.rb +51 -0
- data/examples/legacy/not_checked/expert/custom-list-box.rb +53 -0
- data/examples/legacy/not_checked/expert/definr.rb +23 -0
- data/examples/legacy/not_checked/expert/funnies.rb +56 -0
- data/examples/legacy/not_checked/expert/minesweeper.rb +267 -0
- data/examples/legacy/not_checked/expert/othello.rb +318 -0
- data/examples/legacy/not_checked/expert/pong.rb +62 -0
- data/examples/legacy/not_checked/expert/tankspank.rb +385 -0
- data/examples/legacy/not_checked/expert/tooltips.rb +45 -0
- data/examples/legacy/not_checked/expert/url.rb +37 -0
- data/examples/legacy/not_checked/expert/video-player.rb +256 -0
- data/examples/legacy/not_checked/good/_why-stories.rb +44 -0
- data/examples/legacy/not_checked/good/_why-stories.yaml +387 -0
- data/examples/legacy/not_checked/good/arc.rb +37 -0
- data/examples/legacy/not_checked/good/cardflip.rb +141 -0
- data/examples/legacy/not_checked/good/clock.rb +51 -0
- data/examples/legacy/not_checked/good/console.rb +21 -0
- data/examples/legacy/not_checked/good/follow.rb +26 -0
- data/examples/legacy/not_checked/good/image-rotate.rb +14 -0
- data/examples/legacy/not_checked/good/paris.svg +7236 -0
- data/examples/legacy/not_checked/good/path-animation.rb +46 -0
- data/examples/legacy/not_checked/good/plots.rb +100 -0
- data/examples/legacy/not_checked/good/reminder.rb +174 -0
- data/examples/legacy/not_checked/good/svgview.rb +113 -0
- data/examples/legacy/not_checked/good/vjot.rb +56 -0
- data/examples/legacy/not_checked/shoes-contrib/.gitignore +2 -0
- data/examples/legacy/not_checked/shoes-contrib/README.md +34 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/animate-ovals.rb +21 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/flowers.rb +59 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/happy-trails.rb +31 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/mice-satellites.rb +27 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/oval-motion.rb +12 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/pink-bubbles.rb +34 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/pulsate.rb +18 -0
- data/examples/legacy/not_checked/shoes-contrib/animation/rotating-star.rb +18 -0
- data/examples/legacy/not_checked/shoes-contrib/app/download-and-save.rb +11 -0
- data/examples/legacy/not_checked/shoes-contrib/app/download.rb +10 -0
- data/examples/legacy/not_checked/shoes-contrib/app/get-google.rb +11 -0
- data/examples/legacy/not_checked/shoes-contrib/app/mouse-detection.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/app/resizeable-false.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/art/bubble-bullseye.rb +23 -0
- data/examples/legacy/not_checked/shoes-contrib/art/faded.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/art/fill-oval.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/art/mask.rb +15 -0
- data/examples/legacy/not_checked/shoes-contrib/art/oval-gradient.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/art/star-gradient.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-edit-box.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-new-window.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-image.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-shape.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/class-book.rb +43 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/class-book.yaml +387 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/clock.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/edit-stack +14 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/gradient-shoes.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/list_box-shape-report.rb +19 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/rect-arrow.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/scribble.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/search.rb +32 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +16 -0
- data/examples/legacy/not_checked/shoes-contrib/basic/url-shoes-subclassing.rb +24 -0
- data/examples/legacy/not_checked/shoes-contrib/browser.rb +21 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/background-column.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/background.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/basic-fps.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/border-cat.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/button-block.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/check-mate.rb +15 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/common-styles.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/displace-animation.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/edit_box-character-count.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/edit_line-character-count.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/list_box-select-class.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/list_box.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/move-flow-animate.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/phat-button.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/popup.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/progress-bar.rb +10 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/radio-dreamcast-favs.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/timer.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/elements/width-introspec.rb +8 -0
- data/examples/legacy/not_checked/shoes-contrib/events/background-hover.rb +11 -0
- data/examples/legacy/not_checked/shoes-contrib/events/motion-detect.rb +9 -0
- data/examples/legacy/not_checked/shoes-contrib/events/pressed-key.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/expert/expert-funnies.rb +51 -0
- data/examples/legacy/not_checked/shoes-contrib/expert/expert-irb.rb +112 -0
- data/examples/legacy/not_checked/shoes-contrib/expert/expert-othello.rb +319 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-arc.rb +37 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-clock.rb +51 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-follow.rb +26 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-reminder.rb +174 -0
- data/examples/legacy/not_checked/shoes-contrib/good/good-vjot.rb +56 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask_color.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask_open_file.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/ask_save_file.rb +7 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/confirm.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/debug.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/exit.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/font.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/kernel/fonts.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/append-slot.rb +9 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/clear-slot.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/prepend-slot.rb +6 -0
- data/examples/legacy/not_checked/shoes-contrib/manipulation/roll.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/position/gutter-margin.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/position/stack-width.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-accordion.rb +75 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-shapes.rb +17 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-text.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-arc.rb +23 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-bounce.rb +24 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-calc.rb +70 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-chipmunk.rb +26 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-control-sizes.rb +24 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-curve.rb +26 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-dialogs.rb +29 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-downloader.rb +27 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-draw.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-editor.rb +28 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.rb +28 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.shy +0 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-mask.rb +21 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu.rb +31 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu1.rb +35 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-rubygems.rb +29 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-slide.rb +45 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-sphere.rb +28 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-sqlite3.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-timer.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/simple/simple-video.rb +13 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/alignment.rb +4 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/attachment.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/emphasis.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/gradient-angle.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/para-methods.rb +5 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/para-red-underlined.rb +3 -0
- data/examples/legacy/not_checked/shoes-contrib/styles/para-style-method.rb +4 -0
- data/examples/legacy/not_checked/shoes-dep-samples/expert-game-of-life.rb +243 -0
- data/examples/legacy/not_checked/shoes-dep-samples/expert-othello.rb +319 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-clock.rb +51 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-follow.rb +26 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-reminder.rb +174 -0
- data/examples/legacy/not_checked/shoes-dep-samples/good-vjot.rb +56 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-accordion.rb +75 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-shapes.rb +17 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-text.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-arc.rb +23 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-bounce.rb +24 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-calc.rb +70 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-chipmunk.rb +26 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-control-sizes.rb +24 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-curve.rb +26 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-dialogs.rb +29 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-draw.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-editor.rb +28 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-form.rb +28 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-form.shy +0 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-mask.rb +21 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-menu.rb +31 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-menu1.rb +35 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-rubygems.rb +29 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-slide.rb +45 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-sphere.rb +28 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-sqlite3.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-timer.rb +13 -0
- data/examples/legacy/not_checked/shoes-dep-samples/simple-video.rb +13 -0
- data/examples/legacy/not_checked/shoes3-tests/AnemicCinema1926marcelDuchampCut.mp4 +0 -0
- data/examples/legacy/not_checked/shoes3-tests/button/button.rb +53 -0
- data/examples/legacy/not_checked/shoes3-tests/cache/cache.rb +41 -0
- data/examples/legacy/not_checked/shoes3-tests/combo/combo.rb +24 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/bare.rb +34 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/downloader.rb +40 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m1.rb +11 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m2.rb +12 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m3.rb +11 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/m4.rb +5 -0
- data/examples/legacy/not_checked/shoes3-tests/curl/typ.rb +30 -0
- data/examples/legacy/not_checked/shoes3-tests/cursor/c1.rb +21 -0
- data/examples/legacy/not_checked/shoes3-tests/decoration.rb +14 -0
- data/examples/legacy/not_checked/shoes3-tests/dialogs/ask.rb +6 -0
- data/examples/legacy/not_checked/shoes3-tests/dialogs/confirm.rb +6 -0
- data/examples/legacy/not_checked/shoes3-tests/editbox/editbox.rb +36 -0
- data/examples/legacy/not_checked/shoes3-tests/editline/editline.rb +27 -0
- data/examples/legacy/not_checked/shoes3-tests/events/button.rb +32 -0
- data/examples/legacy/not_checked/shoes3-tests/events/button.yaml +40 -0
- data/examples/legacy/not_checked/shoes3-tests/events/capture.rb +57 -0
- data/examples/legacy/not_checked/shoes3-tests/events/chipmunk.yaml +47 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event0.rb +8 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event1.rb +51 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event1.yaml +26 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event2.rb +46 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event3.rb +44 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event4.rb +65 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event5.rb +17 -0
- data/examples/legacy/not_checked/shoes3-tests/events/event6.rb +51 -0
- data/examples/legacy/not_checked/shoes3-tests/events/replay.rb +60 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/fullscreen.rb +38 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/icon.rb +56 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/mon1.rb +46 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/settings1.rb +22 -0
- data/examples/legacy/not_checked/shoes3-tests/gapp/title1.rb +34 -0
- data/examples/legacy/not_checked/shoes3-tests/indian.m4a +0 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/event.rb +33 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu1.rb +8 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu2.rb +25 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu3.rb +103 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/menu4.rb +41 -0
- data/examples/legacy/not_checked/shoes3-tests/menus/tests.txt +42 -0
- data/examples/legacy/not_checked/shoes3-tests/opacity.rb +13 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/^IRX.R +5219 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/^SPX +5219 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/cstest.rb +51 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr1.rb +73 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr2.rb +40 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr3.rb +47 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr4.rb +35 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr5.rb +31 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr6.rb +35 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/gr7.rb +37 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/grcsv.rb +219 -0
- data/examples/legacy/not_checked/shoes3-tests/plot/manual.rb +40 -0
- data/examples/legacy/not_checked/shoes3-tests/progress/progress.rb +29 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/clear.rb +20 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/group.rb +18 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/multiple.rb +32 -0
- data/examples/legacy/not_checked/shoes3-tests/radio/nogroup.rb +9 -0
- data/examples/legacy/not_checked/shoes3-tests/simpletest.svg +14 -0
- data/examples/legacy/not_checked/shoes3-tests/spinner.rb +15 -0
- data/examples/legacy/not_checked/shoes3-tests/svg.rb +208 -0
- data/examples/legacy/not_checked/shoes3-tests/switch/switch.rb +28 -0
- data/examples/legacy/not_checked/shoes3-tests/systray/back.rb +20 -0
- data/examples/legacy/not_checked/shoes3-tests/systray/note.rb +17 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/cursor.rb +27 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/ed.rb +65 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/el.rb +50 -0
- data/examples/legacy/not_checked/shoes3-tests/terminal/logattr.rb +31 -0
- data/examples/legacy/not_checked/shoes3-tests/tests_color.rb +138 -0
- data/examples/legacy/not_checked/shoes3-tests/tests_svg.rb +228 -0
- data/examples/legacy/not_checked/shoes3-tests/tests_video_vlc.rb +186 -0
- data/examples/legacy/not_checked/shoes3-tests/tooltips.rb +20 -0
- data/examples/legacy/not_checked/shoes3-tests/video_vlc.rb +242 -0
- data/examples/legacy/not_checked/shoes3-tests/wheel/wheel1.rb +21 -0
- data/examples/legacy/not_checked/simple/accordion.rb +81 -0
- data/examples/legacy/not_checked/simple/anim-shapes.rb +17 -0
- data/examples/legacy/not_checked/simple/anim-text.rb +13 -0
- data/examples/legacy/not_checked/simple/arc.rb +23 -0
- data/examples/legacy/not_checked/simple/bounce.rb +24 -0
- data/examples/legacy/not_checked/simple/chipmunk.rb +26 -0
- data/examples/legacy/not_checked/simple/control-sizes.rb +24 -0
- data/examples/legacy/not_checked/simple/curve-control-points.rb +24 -0
- data/examples/legacy/not_checked/simple/curve.rb +26 -0
- data/examples/legacy/not_checked/simple/dialogs.rb +29 -0
- data/examples/legacy/not_checked/simple/downloader.rb +40 -0
- data/examples/legacy/not_checked/simple/downloader1.rb +31 -0
- data/examples/legacy/not_checked/simple/draw.rb +13 -0
- data/examples/legacy/not_checked/simple/editor.rb +28 -0
- data/examples/legacy/not_checked/simple/form.rb +30 -0
- data/examples/legacy/not_checked/simple/image.rb +21 -0
- data/examples/legacy/not_checked/simple/info.rb +78 -0
- data/examples/legacy/not_checked/simple/mask.rb +21 -0
- data/examples/legacy/not_checked/simple/mask2.rb +27 -0
- data/examples/legacy/not_checked/simple/menu.rb +31 -0
- data/examples/legacy/not_checked/simple/menu1.rb +35 -0
- data/examples/legacy/not_checked/simple/slide.rb +45 -0
- data/examples/legacy/not_checked/simple/sphere.rb +28 -0
- data/examples/legacy/not_checked/superleg.rb +244 -0
- data/examples/legacy/working/shoes-contrib/basic/a-poem.rb +24 -0
- data/examples/legacy/working/shoes-contrib/basic/basic-blocks-instances.rb +7 -0
- data/examples/legacy/working/shoes-contrib/basic/basic-blocks.rb +7 -0
- data/examples/legacy/working/shoes-contrib/basic/basic-slot.rb +8 -0
- data/examples/legacy/working/shoes-contrib/basic/intro.rb +20 -0
- data/examples/legacy/working/shoes-contrib/basic/two-column.rb +12 -0
- data/examples/legacy/working/shoes-contrib/elements/edit_box.rb +6 -0
- data/examples/legacy/working/shoes-contrib/kernel/alert.rb +3 -0
- data/examples/legacy/working/simple/calc.rb +71 -0
- data/examples/legacy/working/simple/sqlite3.rb +27 -0
- data/examples/legacy/working/simple/timer.rb +13 -0
- data/examples/line.rb +5 -0
- data/examples/link.rb +20 -0
- data/examples/list_box.rb +8 -0
- data/examples/para/collection_of_arguments.rb +9 -0
- data/examples/para/hello_world.rb +5 -0
- data/examples/para/hide_and_show.rb +9 -0
- data/examples/para/rainbow.rb +11 -0
- data/examples/para/rainbow_2.rb +11 -0
- data/examples/para/sizes.rb +11 -0
- data/examples/para/sizes_2.rb +12 -0
- data/examples/para/strong.rb +3 -0
- data/examples/para_text_widgets.rb +4 -0
- data/examples/pirate.png +0 -0
- data/examples/raw_flow.rb +11 -0
- data/examples/ruby_racer.rb +52 -0
- data/examples/shapes/arc.rb +8 -0
- data/examples/shapes/shapes.rb +8 -0
- data/examples/shapes/shapes_fill.rb +10 -0
- data/examples/shapes/star.rb +5 -0
- data/examples/shoes_school.rb +68 -0
- data/examples/shoes_splorer.rb +150 -0
- data/examples/simple_slides.rb +73 -0
- data/examples/skip_ci/parrot.rb +22 -0
- data/examples/skip_ci/say.rb +20 -0
- data/examples/sleepless.rb +26 -0
- data/examples/slots.rb +2 -4
- data/examples/spacing.rb +18 -0
- data/examples/span.rb +6 -0
- data/examples/stack/background.rb +35 -0
- data/examples/stack/border.rb +11 -0
- data/examples/stack/gradients.rb +6 -0
- data/examples/stack/raw_stack.rb +8 -0
- data/examples/stack/stack.rb +27 -0
- data/examples/text_change.rb +4 -0
- data/examples/text_sizes.rb +10 -0
- data/examples/timmy.rb +109 -0
- data/examples/title_and_resize.rb +3 -0
- data/exe/scarpe +108 -0
- data/lib/constants.rb +5 -0
- data/lib/scarpe/alert.rb +19 -0
- data/lib/scarpe/app.rb +78 -0
- data/lib/scarpe/arc.rb +49 -0
- data/lib/scarpe/background.rb +14 -0
- data/lib/scarpe/border.rb +16 -0
- data/lib/scarpe/button.rb +26 -18
- data/lib/scarpe/colors.rb +215 -0
- data/lib/scarpe/display_service.rb +189 -0
- data/lib/scarpe/document_root.rb +20 -0
- data/lib/scarpe/edit_box.rb +24 -0
- data/lib/scarpe/edit_line.rb +16 -30
- data/lib/scarpe/fill.rb +23 -0
- data/lib/scarpe/flow.rb +18 -15
- data/lib/scarpe/glibui/README.md +34 -0
- data/lib/scarpe/glibui/alert.rb +65 -0
- data/lib/scarpe/glibui/app.rb +27 -0
- data/lib/scarpe/glibui/background.rb +18 -0
- data/lib/scarpe/glibui/border.rb +22 -0
- data/lib/scarpe/glibui/button.rb +38 -0
- data/lib/scarpe/glibui/dimensions.rb +22 -0
- data/lib/scarpe/glibui/document_root.rb +33 -0
- data/lib/scarpe/glibui/edit_box.rb +44 -0
- data/lib/scarpe/glibui/edit_line.rb +43 -0
- data/lib/scarpe/glibui/flow.rb +33 -0
- data/lib/scarpe/glibui/html.rb +77 -0
- data/lib/scarpe/glibui/image.rb +36 -0
- data/lib/scarpe/glibui/link.rb +29 -0
- data/lib/scarpe/glibui/local_display.rb +62 -0
- data/lib/scarpe/glibui/para.rb +84 -0
- data/lib/scarpe/glibui/spacing.rb +41 -0
- data/lib/scarpe/glibui/stack.rb +33 -0
- data/lib/scarpe/glibui/text_widget.rb +30 -0
- data/lib/scarpe/glibui/widget.rb +81 -0
- data/lib/scarpe/glibui.rb +29 -0
- data/lib/scarpe/image.rb +28 -9
- data/lib/scarpe/libui/alert.rb +9 -0
- data/lib/scarpe/libui/button.rb +18 -0
- data/lib/scarpe/libui/colors.rb +157 -0
- data/lib/scarpe/libui/core.rb +66 -0
- data/lib/scarpe/libui/flow.rb +16 -0
- data/lib/scarpe/libui/libui.rb +45 -0
- data/lib/scarpe/libui/notepad.md +26 -0
- data/lib/scarpe/libui/para.rb +154 -0
- data/lib/scarpe/libui/stack.rb +34 -0
- data/lib/scarpe/line.rb +25 -0
- data/lib/scarpe/link.rb +25 -0
- data/lib/scarpe/list_box.rb +25 -0
- data/lib/scarpe/logger.rb +155 -0
- data/lib/scarpe/para.rb +84 -12
- data/lib/scarpe/promises.rb +387 -0
- data/lib/scarpe/shape.rb +19 -0
- data/lib/scarpe/spacing.rb +9 -0
- data/lib/scarpe/span.rb +26 -0
- data/lib/scarpe/stack.rb +66 -12
- data/lib/scarpe/star.rb +47 -0
- data/lib/scarpe/text_widget.rb +42 -0
- data/lib/scarpe/unit_test_helpers.rb +163 -0
- data/lib/scarpe/version.rb +2 -2
- data/lib/scarpe/widget.rb +198 -0
- data/lib/scarpe/widgets.rb +30 -0
- data/lib/scarpe/wv/alert.rb +65 -0
- data/lib/scarpe/wv/app.rb +85 -0
- data/lib/scarpe/wv/arc.rb +57 -0
- data/lib/scarpe/wv/background.rb +18 -0
- data/lib/scarpe/wv/border.rb +22 -0
- data/lib/scarpe/wv/button.rb +50 -0
- data/lib/scarpe/wv/control_interface.rb +153 -0
- data/lib/scarpe/wv/control_interface_test.rb +253 -0
- data/lib/scarpe/wv/dimensions.rb +22 -0
- data/lib/scarpe/wv/document_root.rb +50 -0
- data/lib/scarpe/wv/edit_box.rb +44 -0
- data/lib/scarpe/wv/edit_line.rb +43 -0
- data/lib/scarpe/wv/fill.rb +30 -0
- data/lib/scarpe/wv/flow.rb +32 -0
- data/lib/scarpe/wv/html.rb +107 -0
- data/lib/scarpe/wv/image.rb +36 -0
- data/lib/scarpe/wv/line.rb +38 -0
- data/lib/scarpe/wv/link.rb +29 -0
- data/lib/scarpe/wv/list_box.rb +50 -0
- data/lib/scarpe/wv/para.rb +90 -0
- data/lib/scarpe/wv/shape.rb +34 -0
- data/lib/scarpe/wv/shape_helper.rb +44 -0
- data/lib/scarpe/wv/spacing.rb +41 -0
- data/lib/scarpe/wv/span.rb +66 -0
- data/lib/scarpe/wv/stack.rb +42 -0
- data/lib/scarpe/wv/star.rb +64 -0
- data/lib/scarpe/wv/text_widget.rb +30 -0
- data/lib/scarpe/wv/web_wrangler.rb +679 -0
- data/lib/scarpe/wv/webview_local_display.rb +72 -0
- data/lib/scarpe/wv/webview_relay_display.rb +185 -0
- data/lib/scarpe/wv/widget.rb +181 -0
- data/lib/scarpe/wv/wv_display_worker.rb +65 -0
- data/lib/scarpe/wv.rb +39 -0
- data/lib/scarpe/wv_local.rb +6 -0
- data/lib/scarpe/wv_relay.rb +6 -0
- data/lib/scarpe.rb +35 -27
- data/logger/debug_web_wrangler.json +4 -0
- data/logger/scarpe_wv_test.json +4 -0
- data/scarpegen.rb +193 -0
- data/sig/scarpe.rbs +1 -1
- data/templates/basic_class_template.erb +38 -0
- data/templates/class_template_with_event_bind.erb +27 -0
- data/templates/class_template_with_shapes.erb +43 -0
- data/templates/example_template.erb +3 -0
- data/templates/module_template.erb +12 -0
- data/templates/webview_template.erb +30 -0
- metadata +586 -9
- data/lib/scarpe/container.rb +0 -10
- data/lib/scarpe/internal_app.rb +0 -46
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Scarpe Shoes apps operate in multiple layers. A Shoes widget tree exists as fairly
|
|
4
|
+
# plain, simple Ruby objects. And then a display-service widget tree integrates with
|
|
5
|
+
# the display technology, initially Webview. This lets us use Ruby as our API while
|
|
6
|
+
# not tying it too closely to the limitations of Webview.
|
|
7
|
+
#
|
|
8
|
+
# ## Choosing Display Services
|
|
9
|
+
#
|
|
10
|
+
# Before running a Scarpe app, you can set SCARPE_DISPLAY_SERVICE. If you
|
|
11
|
+
# set it to "whatever_service", Scarpe will require "scarpe/whatever_service",
|
|
12
|
+
# which can be supplied by the Scarpe gem or another Scarpe-based gem.
|
|
13
|
+
# Currently leaving the environment variable empty is equivalent to requesting
|
|
14
|
+
# local Webview.
|
|
15
|
+
#
|
|
16
|
+
# ## Events
|
|
17
|
+
#
|
|
18
|
+
# Events are a lot of what tie the Shoes widgets and the display service together.
|
|
19
|
+
#
|
|
20
|
+
# Scarpe widgets *expect* to operate in a fairly "hands off" mode where they record
|
|
21
|
+
# to an event queue to send to the display service, and the display service records
|
|
22
|
+
# events to send back.
|
|
23
|
+
#
|
|
24
|
+
# When a Shoes handler takes an action (e.g. some_para.replace(),) the relevant
|
|
25
|
+
# call will be dispatched as a :display event, to be sent to the display service.
|
|
26
|
+
# And when a display-side event occurs (e.g. user pushes a button,) it will be
|
|
27
|
+
# dispatched as a :shoes event, to be sent to the Shoes tree of widgets.
|
|
28
|
+
#
|
|
29
|
+
# It is normally assumed that there will only be a single 'real' consumer for each
|
|
30
|
+
# queue. You wouldn't usually want multiple display services sending back click
|
|
31
|
+
# events, for example. But that's not a technical limitation of the system.
|
|
32
|
+
# You could have no display service and not get any events back, or a debug
|
|
33
|
+
# display service that just records what happened. But in real situations,
|
|
34
|
+
# exactly one display service is a reasonable and appropriate assumption.
|
|
35
|
+
#
|
|
36
|
+
# The event types are "queues" in the sense that they're separate from each
|
|
37
|
+
# other. You need to subscribe separately to :shoes and :display events if
|
|
38
|
+
# you want both. But internally they're immediately dispatched as events
|
|
39
|
+
# rather than keeping a literal array of items.
|
|
40
|
+
#
|
|
41
|
+
class Scarpe
|
|
42
|
+
class DisplayService
|
|
43
|
+
class << self
|
|
44
|
+
# This is in the eigenclass/metaclass, *not* instances of DisplayService
|
|
45
|
+
include Scarpe::Log
|
|
46
|
+
|
|
47
|
+
attr_accessor :json_debug_serialize
|
|
48
|
+
|
|
49
|
+
# An event_target may be nil, to indicate there is no target.
|
|
50
|
+
def dispatch_event(event_name, event_target, *args, **kwargs)
|
|
51
|
+
@@display_event_handlers ||= {}
|
|
52
|
+
|
|
53
|
+
unless @log
|
|
54
|
+
log_init("DisplayService")
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
raise "Cannot dispatch on event_name :any!" if event_name == :any
|
|
58
|
+
|
|
59
|
+
@log.debug("Dispatch event: #{event_name.inspect} T: #{event_target.inspect} A: #{args.inspect} KW: #{kwargs.inspect}")
|
|
60
|
+
|
|
61
|
+
if DisplayService.json_debug_serialize
|
|
62
|
+
args = JSON.parse JSON.dump(args)
|
|
63
|
+
new_kw = {}
|
|
64
|
+
kwargs.each do |k, v|
|
|
65
|
+
new_kw[k] = JSON.parse JSON.dump(v)
|
|
66
|
+
end
|
|
67
|
+
kwargs = new_kw
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
same_name_handlers = @@display_event_handlers[event_name] || {}
|
|
71
|
+
any_name_handlers = @@display_event_handlers[:any] || {}
|
|
72
|
+
|
|
73
|
+
# Do we have any keys, in same_name_handlers or any_name_handlers, matching the target or :any?
|
|
74
|
+
# Note that "nil" is a target like any other for these purposes -- subscribing to a nil target
|
|
75
|
+
# won't get you non-nil-target events and vice-versa.
|
|
76
|
+
handlers = [
|
|
77
|
+
same_name_handlers[:any], # Same name, any target
|
|
78
|
+
same_name_handlers[event_target], # Same name, same target
|
|
79
|
+
any_name_handlers[:any], # Any name, any target
|
|
80
|
+
any_name_handlers[event_target], # Any name, same target
|
|
81
|
+
].compact.inject([], &:+)
|
|
82
|
+
kwargs[:event_name] = event_name
|
|
83
|
+
kwargs[:event_target] = event_target if event_target
|
|
84
|
+
handlers.each { |h| h[:handler].call(*args, **kwargs) }
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# It's permitted to subscribe to event_name :any for all event names, and event_target :any for all targets.
|
|
88
|
+
# An event_target of nil means "no target", and only matches events dispatched with a nil target.
|
|
89
|
+
def subscribe_to_event(event_name, event_target, &handler)
|
|
90
|
+
@@display_event_handlers ||= {}
|
|
91
|
+
@@display_event_unsub_id ||= 0
|
|
92
|
+
unless handler
|
|
93
|
+
raise "Must pass a block as a handler to DisplayService.subscribe_to_event!"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
unless @log
|
|
97
|
+
log_init("DisplayService")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
@log.debug("Subscribe to event: #{event_name.inspect} T: #{event_target.inspect}")
|
|
101
|
+
|
|
102
|
+
id = @@display_event_unsub_id
|
|
103
|
+
@@display_event_unsub_id += 1
|
|
104
|
+
|
|
105
|
+
@@display_event_handlers[event_name] ||= {}
|
|
106
|
+
@@display_event_handlers[event_name][event_target] ||= []
|
|
107
|
+
@@display_event_handlers[event_name][event_target] << { handler:, unsub_id: id }
|
|
108
|
+
|
|
109
|
+
id
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def unsub_from_events(unsub_id)
|
|
113
|
+
raise "Must provide an unsubscribe ID!" if unsub_id.nil?
|
|
114
|
+
|
|
115
|
+
@@display_event_handlers.each do |_e_name, target_hash|
|
|
116
|
+
target_hash.each do |_target, h_list|
|
|
117
|
+
h_list.delete_if { |item| item[:unsub_id] == unsub_id }
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def full_reset!
|
|
123
|
+
@@display_event_handlers = {}
|
|
124
|
+
@json_debug_serialize = nil
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def set_display_service_class(klass)
|
|
128
|
+
raise "Can only set a single display service class!" if @display_service_klass
|
|
129
|
+
|
|
130
|
+
@display_service_klass = klass
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def display_service
|
|
134
|
+
return @service if @service
|
|
135
|
+
|
|
136
|
+
raise "No display service was set!" unless @display_service_klass
|
|
137
|
+
|
|
138
|
+
@service = @display_service_klass.new
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# This is for objects that can be referred to via events, using their
|
|
143
|
+
# IDs. There are also convenience functions for binding and sending
|
|
144
|
+
# events.
|
|
145
|
+
class Linkable
|
|
146
|
+
attr_reader :linkable_id
|
|
147
|
+
|
|
148
|
+
def initialize(linkable_id: object_id)
|
|
149
|
+
@linkable_id = linkable_id
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
def send_self_event(*args, event_name:, **kwargs)
|
|
153
|
+
DisplayService.dispatch_event(event_name, self.linkable_id, *args, **kwargs)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def send_shoes_event(*args, event_name:, target: nil, **kwargs)
|
|
157
|
+
DisplayService.dispatch_event(event_name, target, *args, **kwargs)
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def bind_shoes_event(event_name:, target: nil, &handler)
|
|
161
|
+
DisplayService.subscribe_to_event(event_name, target, &handler)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
# These methods are an interface to DisplayService objects.
|
|
166
|
+
|
|
167
|
+
def create_display_widget_for(widget_class_name, widget_id, properties)
|
|
168
|
+
raise "Override in DisplayService implementation!"
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def set_widget_pairing(id, display_widget)
|
|
172
|
+
@display_widget_for ||= {}
|
|
173
|
+
@display_widget_for[id] = display_widget
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def query_display_widget_for(id, nil_ok: false)
|
|
177
|
+
display_widget = @display_widget_for[id]
|
|
178
|
+
unless display_widget || nil_ok
|
|
179
|
+
raise "Could not find display widget for linkable ID #{id.inspect}!"
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
display_widget
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def destroy
|
|
186
|
+
raise "Override in DisplayService implementation!"
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class DocumentRoot < Scarpe::Widget
|
|
5
|
+
include Scarpe::Background
|
|
6
|
+
|
|
7
|
+
def initialize
|
|
8
|
+
super
|
|
9
|
+
|
|
10
|
+
create_display_widget
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# This can be absolutely huge in console output, and it's frequently printed.
|
|
14
|
+
def inspect
|
|
15
|
+
"<Scarpe::DocumentRoot>"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
alias_method :info, :puts
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class EditBox < Scarpe::Widget
|
|
5
|
+
display_properties :text, :height, :width
|
|
6
|
+
|
|
7
|
+
def initialize(text = nil, height: nil, width: nil, &block)
|
|
8
|
+
@text = text.nil? ? block&.call : text || ""
|
|
9
|
+
|
|
10
|
+
super
|
|
11
|
+
|
|
12
|
+
bind_self_event("change") do |new_text|
|
|
13
|
+
self.text = new_text
|
|
14
|
+
@callback&.call(new_text)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
create_display_widget
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def change(&block)
|
|
21
|
+
@callback = block
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/scarpe/edit_line.rb
CHANGED
|
@@ -1,39 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
class EditLine
|
|
3
|
-
def initialize(app, &block)
|
|
4
|
-
@app = app
|
|
5
|
-
@block = block
|
|
6
|
-
@text = ""
|
|
7
|
-
@app.append(render)
|
|
8
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
9
2
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
class Scarpe
|
|
4
|
+
class EditLine < Scarpe::Widget
|
|
5
|
+
display_properties :text, :width
|
|
13
6
|
|
|
14
|
-
def
|
|
7
|
+
def initialize(text = "", width: nil, &block)
|
|
15
8
|
@block = block
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def text
|
|
19
|
-
@text
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def text=(text)
|
|
23
9
|
@text = text
|
|
24
|
-
|
|
25
|
-
|
|
10
|
+
|
|
11
|
+
super
|
|
12
|
+
|
|
13
|
+
bind_self_event("change") do |new_text|
|
|
14
|
+
self.text = new_text
|
|
15
|
+
@block&.call(new_text)
|
|
26
16
|
end
|
|
17
|
+
|
|
18
|
+
create_display_widget
|
|
27
19
|
end
|
|
28
20
|
|
|
29
|
-
def
|
|
30
|
-
@
|
|
31
|
-
@text = text
|
|
32
|
-
if @block
|
|
33
|
-
@block.call(text)
|
|
34
|
-
end
|
|
35
|
-
end
|
|
36
|
-
"<input id=#{object_id} oninput='scarpeHandler(#{function_name}, this.value)' value='#{@text}'></input>"
|
|
21
|
+
def change(&block)
|
|
22
|
+
@block = block
|
|
37
23
|
end
|
|
38
24
|
end
|
|
39
|
-
end
|
|
25
|
+
end
|
data/lib/scarpe/fill.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class Fill < Scarpe::Widget
|
|
5
|
+
display_properties :color
|
|
6
|
+
|
|
7
|
+
def initialize(color)
|
|
8
|
+
@color = color
|
|
9
|
+
super
|
|
10
|
+
create_display_widget
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def element
|
|
14
|
+
HTML.render do |h|
|
|
15
|
+
h.style(<<~CSS)
|
|
16
|
+
##{html_id} {
|
|
17
|
+
background-color: #{@color};
|
|
18
|
+
}
|
|
19
|
+
CSS
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
data/lib/scarpe/flow.rb
CHANGED
|
@@ -1,16 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class Flow < Scarpe::Widget
|
|
5
|
+
include Scarpe::Background
|
|
6
|
+
include Scarpe::Border
|
|
7
|
+
|
|
8
|
+
display_properties :width, :height, :margin, :padding
|
|
9
|
+
|
|
10
|
+
def initialize(width: nil, height: "100%", margin: nil, padding: nil, &block)
|
|
11
|
+
super
|
|
12
|
+
|
|
13
|
+
# Create the display-side widget *before* instance_eval, which will add child widgets with their display widgets
|
|
14
|
+
create_display_widget
|
|
15
|
+
|
|
16
|
+
instance_eval(&block)
|
|
15
17
|
end
|
|
16
|
-
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
## IN DEVELOPMENT
|
|
2
|
+
|
|
3
|
+
Glimmer LibUI is a fully functioning way to build desktop applications in Ruby.
|
|
4
|
+
|
|
5
|
+
One possible way to make this work would be a parser-compiler setup to essentially _transform_ shoes app text into GlimmerLibUI text. Which should be abstract enough that we wouldn't have to go more bare metal and use the ruby dependency LibUI.
|
|
6
|
+
|
|
7
|
+
Hello world example:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
# parser/compiler example:
|
|
11
|
+
|
|
12
|
+
Shoes.app do
|
|
13
|
+
para "Hello World"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# becomes
|
|
17
|
+
|
|
18
|
+
include Glimmer
|
|
19
|
+
|
|
20
|
+
window {
|
|
21
|
+
area {
|
|
22
|
+
text {
|
|
23
|
+
string "Hello World"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}.show
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
# GLibUI Finished Examples
|
|
30
|
+
|
|
31
|
+
* /examples/hello_world.rb
|
|
32
|
+
* /examples/title_and_resize.rb
|
|
33
|
+
* /examples/stack/raw_stack.rb
|
|
34
|
+
* /examples/raw_flow.rb
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class GlimmerLibUIAlert < GlimmerLibUIWidget
|
|
5
|
+
def initialize(properties)
|
|
6
|
+
super
|
|
7
|
+
|
|
8
|
+
bind("click") do
|
|
9
|
+
send_self_event(event_name: "click")
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def element
|
|
14
|
+
onclick = handler_js_code("click")
|
|
15
|
+
|
|
16
|
+
HTML.render do |h|
|
|
17
|
+
h.div(id: html_id, style: overlay_style) do
|
|
18
|
+
h.div(style: modal_style) do
|
|
19
|
+
h.div(style: text_style) { @text }
|
|
20
|
+
h.button(style: button_style, onclick: onclick) { "OK" }
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def overlay_style
|
|
29
|
+
{
|
|
30
|
+
position: "fixed",
|
|
31
|
+
top: "0",
|
|
32
|
+
left: "0",
|
|
33
|
+
width: "100%",
|
|
34
|
+
height: "100%",
|
|
35
|
+
overflow: "auto",
|
|
36
|
+
"z-index": "1",
|
|
37
|
+
background: "rgba(0,0,0,0.4)",
|
|
38
|
+
display: "flex",
|
|
39
|
+
"align-items": "center",
|
|
40
|
+
"justify-content": "center",
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def modal_style
|
|
45
|
+
{
|
|
46
|
+
"min-width": "200px",
|
|
47
|
+
"min-height": "50px",
|
|
48
|
+
padding: "10px",
|
|
49
|
+
display: "flex",
|
|
50
|
+
background: "#fefefe",
|
|
51
|
+
"flex-direction": "column",
|
|
52
|
+
"justify-content": "space-between",
|
|
53
|
+
"border-radius": "9px",
|
|
54
|
+
}
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def text_style
|
|
58
|
+
{}
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def button_style
|
|
62
|
+
{}
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "glimmer-dsl-libui"
|
|
4
|
+
|
|
5
|
+
class Scarpe
|
|
6
|
+
# Scarpe::GlimmerLibUIApp must only be used from the main thread, due to GTK+ limitations.
|
|
7
|
+
class GlimmerLibUIApp < GlimmerLibUIWidget
|
|
8
|
+
include Glimmer
|
|
9
|
+
|
|
10
|
+
attr_reader :debug
|
|
11
|
+
attr_writer :shoes_linkable_id
|
|
12
|
+
|
|
13
|
+
def initialize(properties)
|
|
14
|
+
super
|
|
15
|
+
|
|
16
|
+
bind_shoes_event(event_name: "run") do
|
|
17
|
+
code = @document_root.display(properties)
|
|
18
|
+
puts code
|
|
19
|
+
# This is for if I want to confirm textual output. But not actually fire up the service.
|
|
20
|
+
exit if ENV["NO_RUN"]
|
|
21
|
+
eval code
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
attr_writer :document_root
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
module GlimmerLibUIBackground
|
|
5
|
+
def style
|
|
6
|
+
styles = (super if defined?(super)) || {}
|
|
7
|
+
return styles unless @background_color
|
|
8
|
+
|
|
9
|
+
color = if @background_color.is_a?(Range)
|
|
10
|
+
"linear-gradient(45deg, #{@background_color.first}, #{@background_color.last})"
|
|
11
|
+
else
|
|
12
|
+
@background_color
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
styles.merge(background: color)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
module GlimmerLibUIBorder
|
|
5
|
+
def style
|
|
6
|
+
styles = (super if defined?(super)) || {}
|
|
7
|
+
return styles unless @border_color
|
|
8
|
+
|
|
9
|
+
border_color = if @border_color.is_a?(Range)
|
|
10
|
+
{ "border-image": "linear-gradient(45deg, #{@border_color.first}, #{@border_color.last}) 1" }
|
|
11
|
+
else
|
|
12
|
+
{ "border-color": @border_color }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
styles.merge(
|
|
16
|
+
"border-style": "solid",
|
|
17
|
+
"border-width": "#{@options[:strokewidth] || 1}px",
|
|
18
|
+
"border-radius": "#{@options[:curve] || 0}px",
|
|
19
|
+
).merge(border_color)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class GlimmerLibUIButton < GlimmerLibUIWidget
|
|
5
|
+
def initialize(properties)
|
|
6
|
+
super
|
|
7
|
+
|
|
8
|
+
# Bind to display-side handler for "click"
|
|
9
|
+
bind("click") do
|
|
10
|
+
# This will be sent to the bind_self_event in Button
|
|
11
|
+
send_self_event(event_name: "click")
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def element
|
|
16
|
+
HTML.render do |h|
|
|
17
|
+
h.button(id: html_id, onclick: handler_js_code("click"), style: style) do
|
|
18
|
+
@text
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def style
|
|
26
|
+
styles = {}
|
|
27
|
+
|
|
28
|
+
styles[:width] = Dimensions.length(@width) if @width
|
|
29
|
+
styles[:height] = Dimensions.length(@height) if @height
|
|
30
|
+
|
|
31
|
+
styles[:top] = Dimensions.length(@top) if @top
|
|
32
|
+
styles[:left] = Dimensions.length(@left) if @left
|
|
33
|
+
styles[:position] = "absolute" if @top || @left
|
|
34
|
+
|
|
35
|
+
styles
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class Dimensions
|
|
5
|
+
class << self
|
|
6
|
+
def length(value)
|
|
7
|
+
case value
|
|
8
|
+
when Integer
|
|
9
|
+
if value < 0
|
|
10
|
+
"calc(100% - #{value.abs}px)"
|
|
11
|
+
else
|
|
12
|
+
"#{value}px"
|
|
13
|
+
end
|
|
14
|
+
when Float
|
|
15
|
+
"#{value * 100}%"
|
|
16
|
+
else
|
|
17
|
+
value
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class GlimmerLibUIDocumentRoot < Scarpe::GlimmerLibUIWidget
|
|
5
|
+
include Scarpe::GlimmerLibUIBackground
|
|
6
|
+
|
|
7
|
+
attr_reader :debug
|
|
8
|
+
|
|
9
|
+
def initialize(properties)
|
|
10
|
+
@callbacks = {}
|
|
11
|
+
super
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def display(properties = {})
|
|
15
|
+
<<~GTEXT
|
|
16
|
+
window("#{properties["title"] || "Scarpe with GlimmerLibUI"}", #{properties["width"] || 640}, #{properties["height"] || 480}) {
|
|
17
|
+
horizontal_box {
|
|
18
|
+
#{@children.map(&:display).join}
|
|
19
|
+
}
|
|
20
|
+
}.show
|
|
21
|
+
GTEXT
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def element(&blck)
|
|
25
|
+
window(&blck).show
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Bind a Scarpe callback name; see Scarpe::Widget for how the naming is set up
|
|
29
|
+
def bind(name, &block)
|
|
30
|
+
@callbacks[name] = block
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Scarpe
|
|
4
|
+
class GlimmerLibUIEditBox < Scarpe::GlimmerLibUIWidget
|
|
5
|
+
attr_reader :text, :height, :width
|
|
6
|
+
|
|
7
|
+
def initialize(properties)
|
|
8
|
+
super
|
|
9
|
+
|
|
10
|
+
# The JS handler sends a "change" event, which we forward to the Shoes widget tree
|
|
11
|
+
bind("change") do |new_text|
|
|
12
|
+
send_self_event(new_text, event_name: "change")
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def properties_changed(changes)
|
|
17
|
+
t = changes.delete("text")
|
|
18
|
+
if t
|
|
19
|
+
html_element.value = t
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
super
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def element
|
|
26
|
+
oninput = handler_js_code("change", "this.value")
|
|
27
|
+
|
|
28
|
+
HTML.render do |h|
|
|
29
|
+
h.textarea(id: html_id, oninput: oninput, style: style) { text }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def style
|
|
36
|
+
styles = {}
|
|
37
|
+
|
|
38
|
+
styles[:height] = Dimensions.length(height)
|
|
39
|
+
styles[:width] = Dimensions.length(width)
|
|
40
|
+
|
|
41
|
+
styles.compact
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|