scarpe 0.2.2 → 0.4.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.
Files changed (378) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -1
  3. data/.yardopts +1 -0
  4. data/CHANGELOG.md +52 -6
  5. data/Gemfile +2 -1
  6. data/Gemfile.lock +20 -6
  7. data/LICENSE.txt +7 -1
  8. data/README.md +100 -21
  9. data/Rakefile +68 -1
  10. data/examples/Edit_box_Styles.rb +8 -0
  11. data/examples/Kerning.rb +7 -0
  12. data/examples/animate.rb +20 -0
  13. data/examples/arrow.rb +10 -0
  14. data/examples/border.rb +11 -0
  15. data/examples/btn_tooltip.rb +7 -0
  16. data/examples/button_style_changed.rb +7 -0
  17. data/examples/button_styles_default.rb +6 -0
  18. data/examples/check.rb +2 -0
  19. data/examples/download_and_show_image.rb +3 -0
  20. data/examples/flags/finland.rb +15 -0
  21. data/examples/flags/italy.rb +11 -0
  22. data/examples/flags/mauritius.rb +14 -0
  23. data/examples/font_family.rb +17 -0
  24. data/examples/font_shorthand.rb +9 -0
  25. data/examples/gen.rb +12 -8
  26. data/examples/highlander.rb +3 -3
  27. data/examples/legacy/README.md +6 -0
  28. data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +1 -1
  29. data/examples/legacy/not_checked/shoes-manual/append.rb +10 -0
  30. data/examples/legacy/not_checked/shoes-manual/background_change.rb +12 -0
  31. data/examples/legacy/not_checked/shoes-manual/background_pattern.rb +5 -0
  32. data/examples/legacy/not_checked/shoes-manual/basic_app.rb +8 -0
  33. data/examples/legacy/not_checked/shoes-manual/border.rb +9 -0
  34. data/examples/legacy/not_checked/shoes-manual/builtins/FONTS.rb +5 -0
  35. data/examples/legacy/not_checked/shoes-manual/builtins/ask.rb +2 -0
  36. data/examples/legacy/not_checked/shoes-manual/builtins/ask_color.rb +5 -0
  37. data/examples/legacy/not_checked/shoes-manual/builtins/ask_open_file.rb +5 -0
  38. data/examples/legacy/not_checked/shoes-manual/builtins/ask_save_folder.rb +2 -0
  39. data/examples/legacy/not_checked/shoes-manual/builtins/confirm.rb +4 -0
  40. data/examples/legacy/not_checked/shoes-manual/builtins/debug.rb +2 -0
  41. data/examples/legacy/not_checked/shoes-manual/builtins/info.rb +3 -0
  42. data/examples/legacy/not_checked/shoes-manual/button.rb +9 -0
  43. data/examples/legacy/not_checked/shoes-manual/clear.rb +7 -0
  44. data/examples/legacy/not_checked/shoes-manual/custom_header.rb +13 -0
  45. data/examples/legacy/not_checked/shoes-manual/displace.rb +14 -0
  46. data/examples/legacy/not_checked/shoes-manual/edit_box.rb +8 -0
  47. data/examples/legacy/not_checked/shoes-manual/fill_pattern.rb +5 -0
  48. data/examples/legacy/not_checked/shoes-manual/fonts.rb +7 -0
  49. data/examples/legacy/not_checked/shoes-manual/gutter.rb +6 -0
  50. data/examples/legacy/not_checked/shoes-manual/image_web.rb +4 -0
  51. data/examples/legacy/not_checked/shoes-manual/keypress.rb +7 -0
  52. data/examples/legacy/not_checked/shoes-manual/list_box.rb +10 -0
  53. data/examples/legacy/not_checked/shoes-manual/motion.rb +10 -0
  54. data/examples/legacy/not_checked/shoes-manual/mouse.rb +8 -0
  55. data/examples/legacy/not_checked/shoes-manual/move.rb +14 -0
  56. data/examples/legacy/not_checked/shoes-manual/nested_ovals.rb +8 -0
  57. data/examples/legacy/not_checked/shoes-manual/oval.rb +7 -0
  58. data/examples/legacy/not_checked/shoes-manual/ovals.rb +6 -0
  59. data/examples/legacy/not_checked/shoes-manual/ovals_image.rb +8 -0
  60. data/examples/legacy/not_checked/shoes-manual/prepend.rb +7 -0
  61. data/examples/legacy/not_checked/shoes-manual/progress_bar.rb +10 -0
  62. data/examples/legacy/not_checked/shoes-manual/radio.rb +18 -0
  63. data/examples/legacy/not_checked/shoes-manual/radio_alternative_1.rb +7 -0
  64. data/examples/legacy/not_checked/shoes-manual/radio_alternative_2.rb +9 -0
  65. data/examples/legacy/not_checked/shoes-manual/rotate_rectangle.rb +6 -0
  66. data/examples/legacy/not_checked/shoes-manual/shape.rb +11 -0
  67. data/examples/legacy/not_checked/shoes-manual/static/avatar.png +0 -0
  68. data/examples/legacy/not_checked/shoes-manual/stroke.rb +5 -0
  69. data/examples/legacy/not_checked/shoes-manual/style.rb +3 -0
  70. data/examples/legacy/not_checked/shoes-manual/style_alternative_1.rb +4 -0
  71. data/examples/legacy/not_checked/shoes-manual/style_alternative_2.rb +5 -0
  72. data/examples/legacy/not_checked/shoes-manual/style_length.rb +5 -0
  73. data/examples/legacy/not_checked/shoes-manual/timer.rb +6 -0
  74. data/examples/legacy/not_checked/shoes-manual/trigger_window.rb +8 -0
  75. data/examples/legacy/not_checked/shoes-manual/window_owner.rb +8 -0
  76. data/examples/legacy/not_checked/simple/anim-shapes.rb +1 -1
  77. data/examples/legacy/not_checked/speedometer_app.rb +55 -0
  78. data/examples/legacy/working/shoes_manual/alert_button.rb +2 -0
  79. data/examples/legacy/working/shoes_manual/animate.rb +7 -0
  80. data/examples/legacy/working/shoes_manual/background_para.rb +4 -0
  81. data/examples/legacy/working/shoes_manual/button_alternative.rb +7 -0
  82. data/examples/legacy/working/shoes_manual/checkbox.rb +17 -0
  83. data/examples/legacy/working/shoes_manual/download.rb +12 -0
  84. data/examples/legacy/working/shoes_manual/edit_box.rb +6 -0
  85. data/examples/legacy/working/shoes_manual/editline.rb +7 -0
  86. data/examples/legacy/working/shoes_manual/fixed_height.rb +8 -0
  87. data/examples/legacy/working/shoes_manual/fixed_width.rb +12 -0
  88. data/examples/legacy/working/shoes_manual/image.rb +5 -0
  89. data/examples/legacy/working/shoes_manual/instance_variable_check.rb +10 -0
  90. data/examples/legacy/working/shoes_manual/message.rb +18 -0
  91. data/examples/legacy/working/shoes_manual/rectangle.rb +6 -0
  92. data/examples/legacy/working/shoes_manual/save_download.rb +12 -0
  93. data/examples/legacy/working/shoes_manual/self_check.rb +10 -0
  94. data/examples/legacy/working/shoes_manual/stack.rb +7 -0
  95. data/examples/legacy/working/shoes_manual/style_info.rb +8 -0
  96. data/examples/legacy/working/shoes_manual/utf8_support.rb +8 -0
  97. data/examples/legacy/working/shoes_manual/width.rb +4 -0
  98. data/examples/legacy/working/simple/image-icon.rb +3 -0
  99. data/examples/legacy/{not_checked → working}/simple/image.rb +1 -1
  100. data/examples/list_box_choose.rb +17 -0
  101. data/examples/local_assets/local_file_server.rb +82 -0
  102. data/examples/local_assets/multi_image.rb +5 -0
  103. data/examples/local_assets/sample.gif +0 -0
  104. data/examples/local_assets/sample.mp4 +0 -0
  105. data/examples/local_assets/small.png +0 -0
  106. data/examples/local_fonts.rb +5 -2
  107. data/examples/local_images.rb +2 -3
  108. data/examples/margin.rb +13 -0
  109. data/examples/margin_check.rb +27 -0
  110. data/examples/oval-with-kwargs.rb +3 -0
  111. data/examples/oval.rb +26 -0
  112. data/examples/para/para_text.rb +14 -0
  113. data/examples/para_font_styles.rb +17 -0
  114. data/examples/para_font_variant.rb +6 -0
  115. data/examples/para_fontweight.rb +13 -0
  116. data/examples/parse_xl_funnies.rb +3 -0
  117. data/examples/progress.rb +31 -0
  118. data/examples/radio/radio_groups.rb +2 -2
  119. data/examples/rect.rb +4 -0
  120. data/examples/rotate_shapes.rb +17 -0
  121. data/examples/scarpe_ext.rb +3 -0
  122. data/examples/shapes/star.rb +1 -3
  123. data/examples/simpler-menu.rb +21 -0
  124. data/examples/spacing.rb +1 -1
  125. data/examples/span.rb +4 -2
  126. data/exe/scarpe +2 -1
  127. data/lacci/Gemfile +2 -0
  128. data/lacci/Gemfile.lock +8 -1
  129. data/lacci/lacci.gemspec +2 -2
  130. data/lacci/lib/lacci/scarpe_cli.rb +2 -2
  131. data/lacci/lib/lacci/scarpe_core.rb +2 -1
  132. data/lacci/lib/lacci/version.rb +1 -1
  133. data/lacci/lib/scarpe/niente/app.rb +23 -0
  134. data/lacci/lib/scarpe/niente/display_service.rb +66 -0
  135. data/lacci/lib/scarpe/niente/drawable.rb +59 -0
  136. data/lacci/lib/scarpe/niente/shoes_spec.rb +93 -0
  137. data/lacci/lib/scarpe/niente.rb +32 -0
  138. data/lacci/lib/shoes/app.rb +111 -72
  139. data/lacci/lib/shoes/background.rb +2 -2
  140. data/lacci/lib/shoes/border.rb +2 -2
  141. data/lacci/lib/shoes/builtins.rb +63 -0
  142. data/lacci/lib/shoes/changelog.rb +52 -0
  143. data/lacci/lib/shoes/colors.rb +3 -1
  144. data/lacci/lib/shoes/constants.rb +41 -2
  145. data/lacci/lib/shoes/display_service.rb +80 -18
  146. data/lacci/lib/shoes/download.rb +2 -2
  147. data/lacci/lib/shoes/drawable.rb +654 -0
  148. data/lacci/lib/shoes/drawables/arc.rb +27 -0
  149. data/lacci/lib/shoes/drawables/arrow.rb +21 -0
  150. data/lacci/lib/shoes/drawables/border.rb +28 -0
  151. data/lacci/lib/shoes/drawables/button.rb +57 -0
  152. data/lacci/lib/shoes/drawables/check.rb +33 -0
  153. data/lacci/lib/shoes/drawables/document_root.rb +20 -0
  154. data/lacci/lib/shoes/{widgets → drawables}/edit_box.rb +9 -8
  155. data/lacci/lib/shoes/{widgets → drawables}/edit_line.rb +8 -7
  156. data/lacci/lib/shoes/drawables/flow.rb +20 -0
  157. data/lacci/lib/shoes/drawables/font_helper.rb +62 -0
  158. data/lacci/lib/shoes/{widgets → drawables}/image.rb +7 -7
  159. data/lacci/lib/shoes/drawables/line.rb +17 -0
  160. data/lacci/lib/shoes/drawables/link.rb +31 -0
  161. data/lacci/lib/shoes/drawables/list_box.rb +59 -0
  162. data/lacci/lib/shoes/drawables/oval.rb +48 -0
  163. data/lacci/lib/shoes/drawables/para.rb +206 -0
  164. data/lacci/lib/shoes/drawables/progress.rb +15 -0
  165. data/lacci/lib/shoes/drawables/radio.rb +35 -0
  166. data/lacci/lib/shoes/drawables/rect.rb +18 -0
  167. data/lacci/lib/shoes/{widgets → drawables}/shape.rb +8 -8
  168. data/lacci/lib/shoes/drawables/slot.rb +178 -0
  169. data/lacci/lib/shoes/drawables/stack.rb +21 -0
  170. data/lacci/lib/shoes/drawables/star.rb +28 -0
  171. data/lacci/lib/shoes/drawables/subscription_item.rb +93 -0
  172. data/lacci/lib/shoes/drawables/text_drawable.rb +122 -0
  173. data/lacci/lib/shoes/drawables/video.rb +17 -0
  174. data/lacci/lib/shoes/drawables/widget.rb +74 -0
  175. data/lacci/lib/shoes/drawables.rb +32 -0
  176. data/lacci/lib/shoes/errors.rb +38 -0
  177. data/lacci/lib/shoes/log.rb +2 -2
  178. data/lacci/lib/shoes/margin_helper.rb +79 -0
  179. data/lacci/lib/shoes/ruby_extensions.rb +15 -0
  180. data/lacci/lib/shoes-spec.rb +93 -0
  181. data/lacci/lib/shoes.rb +31 -10
  182. data/lacci/test/.gitignore +1 -0
  183. data/lacci/test/test_draw_context.rb +167 -0
  184. data/lacci/test/test_font_helper.rb +57 -0
  185. data/lacci/test/test_helper.rb +81 -0
  186. data/lacci/test/test_lacci.rb +99 -3
  187. data/lacci/test/test_margin_helper.rb +82 -0
  188. data/lacci/test/test_niente_test_infra.rb +26 -0
  189. data/lacci/test/test_oval.rb +82 -0
  190. data/lacci/test/test_parenting.rb +140 -0
  191. data/lacci/test/test_shoes_errors.rb +49 -0
  192. data/lacci/test/test_text_drawables.rb +23 -0
  193. data/lib/scarpe/assets.rb +18 -0
  194. data/lib/scarpe/cats_cradle.rb +84 -103
  195. data/lib/scarpe/errors.rb +77 -0
  196. data/lib/scarpe/shoes_spec.rb +160 -0
  197. data/lib/scarpe/version.rb +2 -2
  198. data/lib/scarpe/wv/app.rb +21 -20
  199. data/lib/scarpe/wv/arc.rb +4 -51
  200. data/lib/scarpe/wv/arrow.rb +9 -0
  201. data/lib/scarpe/wv/border.rb +9 -18
  202. data/lib/scarpe/wv/button.rb +7 -35
  203. data/lib/scarpe/wv/check.rb +3 -5
  204. data/lib/scarpe/wv/control_interface.rb +20 -30
  205. data/lib/scarpe/wv/document_root.rb +81 -4
  206. data/lib/scarpe/wv/{widget.rb → drawable.rb} +71 -82
  207. data/lib/scarpe/wv/edit_box.rb +8 -18
  208. data/lib/scarpe/wv/edit_line.rb +9 -20
  209. data/lib/scarpe/wv/flow.rb +2 -18
  210. data/lib/scarpe/wv/image.rb +7 -30
  211. data/lib/scarpe/wv/line.rb +3 -25
  212. data/lib/scarpe/wv/link.rb +6 -17
  213. data/lib/scarpe/wv/list_box.rb +6 -29
  214. data/lib/scarpe/wv/oval.rb +13 -0
  215. data/lib/scarpe/wv/para.rb +12 -30
  216. data/lib/scarpe/wv/progress.rb +19 -0
  217. data/lib/scarpe/wv/radio.rb +9 -10
  218. data/lib/scarpe/wv/rect.rb +13 -0
  219. data/lib/scarpe/wv/scarpe_extensions.rb +8 -0
  220. data/lib/scarpe/wv/shape.rb +13 -13
  221. data/lib/scarpe/wv/slot.rb +8 -25
  222. data/lib/scarpe/wv/stack.rb +2 -18
  223. data/lib/scarpe/wv/star.rb +3 -53
  224. data/lib/scarpe/wv/subscription_item.rb +38 -4
  225. data/lib/scarpe/wv/text_drawable.rb +90 -0
  226. data/lib/scarpe/wv/video.rb +15 -15
  227. data/lib/scarpe/wv/web_wrangler.rb +320 -328
  228. data/lib/scarpe/wv/webview_local_display.rb +52 -33
  229. data/lib/scarpe/wv/webview_relay_display.rb +12 -12
  230. data/lib/scarpe/wv/webview_relay_util.rb +7 -10
  231. data/lib/scarpe/wv/wv_display_worker.rb +2 -2
  232. data/lib/scarpe/wv.rb +52 -12
  233. data/lib/scarpe/wv_local.rb +1 -1
  234. data/lib/scarpe/wv_relay.rb +1 -1
  235. data/lib/scarpe.rb +1 -0
  236. data/logger/debug_web_wrangler.json +1 -1
  237. data/logger/scarpe_wv_test.json +1 -1
  238. data/scarpe-components/Gemfile +4 -1
  239. data/scarpe-components/Gemfile.lock +85 -0
  240. data/scarpe-components/README.md +2 -2
  241. data/scarpe-components/assets/bootstrap-themes/bootstrap-cerulean.css +12229 -0
  242. data/scarpe-components/assets/bootstrap-themes/bootstrap-cosmo.css +11810 -0
  243. data/scarpe-components/assets/bootstrap-themes/bootstrap-cyborg.css +12210 -0
  244. data/scarpe-components/assets/bootstrap-themes/bootstrap-darkly.css +12153 -0
  245. data/scarpe-components/assets/bootstrap-themes/bootstrap-flatly.css +12126 -0
  246. data/scarpe-components/assets/bootstrap-themes/bootstrap-icons.min.css +5 -0
  247. data/scarpe-components/assets/bootstrap-themes/bootstrap-journal.css +12099 -0
  248. data/scarpe-components/assets/bootstrap-themes/bootstrap-litera.css +12211 -0
  249. data/scarpe-components/assets/bootstrap-themes/bootstrap-lumen.css +12369 -0
  250. data/scarpe-components/assets/bootstrap-themes/bootstrap-lux.css +11928 -0
  251. data/scarpe-components/assets/bootstrap-themes/bootstrap-materia.css +13184 -0
  252. data/scarpe-components/assets/bootstrap-themes/bootstrap-minty.css +12177 -0
  253. data/scarpe-components/assets/bootstrap-themes/bootstrap-morph.css +12750 -0
  254. data/scarpe-components/assets/bootstrap-themes/bootstrap-pulse.css +11890 -0
  255. data/scarpe-components/assets/bootstrap-themes/bootstrap-quartz.css +12622 -0
  256. data/scarpe-components/assets/bootstrap-themes/bootstrap-sandstone.css +12201 -0
  257. data/scarpe-components/assets/bootstrap-themes/bootstrap-simplex.css +12186 -0
  258. data/scarpe-components/assets/bootstrap-themes/bootstrap-sketchy.css +12451 -0
  259. data/scarpe-components/assets/bootstrap-themes/bootstrap-slate.css +12492 -0
  260. data/scarpe-components/assets/bootstrap-themes/bootstrap-solar.css +12149 -0
  261. data/scarpe-components/assets/bootstrap-themes/bootstrap-spacelab.css +12266 -0
  262. data/scarpe-components/assets/bootstrap-themes/bootstrap-superhero.css +12216 -0
  263. data/scarpe-components/assets/bootstrap-themes/bootstrap-united.css +12077 -0
  264. data/scarpe-components/assets/bootstrap-themes/bootstrap-vapor.css +12549 -0
  265. data/scarpe-components/assets/bootstrap-themes/bootstrap-yeti.css +12325 -0
  266. data/scarpe-components/assets/bootstrap-themes/bootstrap-zephyr.css +12283 -0
  267. data/scarpe-components/assets/bootstrap-themes/bootstrap.bundle.min.js +7 -0
  268. data/scarpe-components/lib/scarpe/components/asset_server.rb +219 -0
  269. data/scarpe-components/lib/scarpe/components/base64.rb +23 -5
  270. data/scarpe-components/lib/scarpe/components/calzini/alert.rb +49 -0
  271. data/scarpe-components/lib/scarpe/components/calzini/art_drawables.rb +227 -0
  272. data/scarpe-components/lib/scarpe/components/calzini/border.rb +38 -0
  273. data/scarpe-components/lib/scarpe/components/calzini/button.rb +37 -0
  274. data/scarpe-components/lib/scarpe/components/calzini/misc.rb +136 -0
  275. data/scarpe-components/lib/scarpe/components/calzini/para.rb +237 -0
  276. data/scarpe-components/lib/scarpe/components/calzini/slots.rb +109 -0
  277. data/scarpe-components/lib/scarpe/components/calzini.rb +236 -0
  278. data/scarpe-components/lib/scarpe/components/errors.rb +24 -0
  279. data/scarpe-components/lib/scarpe/components/file_helpers.rb +1 -0
  280. data/scarpe-components/lib/scarpe/components/html.rb +134 -0
  281. data/scarpe-components/lib/scarpe/components/minitest_export_reporter.rb +83 -0
  282. data/scarpe-components/lib/scarpe/components/minitest_import_runnable.rb +98 -0
  283. data/scarpe-components/lib/scarpe/components/minitest_result.rb +127 -0
  284. data/scarpe-components/lib/scarpe/components/modular_logger.rb +5 -5
  285. data/scarpe-components/lib/scarpe/components/print_logger.rb +22 -3
  286. data/scarpe-components/lib/scarpe/components/process_helpers.rb +37 -0
  287. data/scarpe-components/lib/scarpe/components/promises.rb +14 -14
  288. data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +36 -17
  289. data/scarpe-components/lib/scarpe/components/string_helpers.rb +10 -0
  290. data/scarpe-components/lib/scarpe/components/tiranti.rb +167 -0
  291. data/scarpe-components/lib/scarpe/components/unit_test_helpers.rb +48 -6
  292. data/scarpe-components/lib/scarpe/components/version.rb +2 -2
  293. data/scarpe-components/test/assets/big-image.png +0 -0
  294. data/scarpe-components/test/assets/big-stylesheet.css +497 -0
  295. data/scarpe-components/test/assets/little-image.png +0 -0
  296. data/scarpe-components/test/assets/little-stylesheet.css +1 -0
  297. data/scarpe-components/test/calzini/test_calzini_alert.rb +30 -0
  298. data/scarpe-components/test/calzini/test_calzini_art_drawables.rb +105 -0
  299. data/scarpe-components/test/calzini/test_calzini_button.rb +54 -0
  300. data/scarpe-components/test/calzini/test_calzini_misc.rb +115 -0
  301. data/scarpe-components/test/calzini/test_calzini_para.rb +34 -0
  302. data/scarpe-components/test/calzini/test_calzini_slots.rb +85 -0
  303. data/scarpe-components/test/calzini/test_calzini_text_drawables.rb +106 -0
  304. data/scarpe-components/test/calzini/test_various.rb +133 -0
  305. data/scarpe-components/test/mtr_data/exception.json +1 -0
  306. data/scarpe-components/test/mtr_data/fail_with_message.json +1 -0
  307. data/scarpe-components/test/mtr_data/skipped_no_message.json +1 -0
  308. data/scarpe-components/test/mtr_data/skipped_w_msg.json +1 -0
  309. data/scarpe-components/test/mtr_data/succeed_2_asserts.json +1 -0
  310. data/scarpe-components/test/test_asset_server.rb +72 -0
  311. data/scarpe-components/test/test_components.rb +31 -2
  312. data/scarpe-components/test/test_dimensions.rb +26 -0
  313. data/scarpe-components/test/test_helper.rb +20 -1
  314. data/scarpe-components/test/test_html.rb +65 -0
  315. data/scarpe-components/test/test_minitest_result.rb +68 -0
  316. data/scarpe-components/test/test_promises.rb +5 -4
  317. data/scarpe-components/test/test_segmented_app_files.rb +10 -6
  318. data/scarpegen.rb +14 -14
  319. data/sig/scarpe.rbs +1 -1
  320. data/tasks/check_html_fixtures.rb +140 -0
  321. data/tasks/regenerate_html_fixtures.rb +104 -0
  322. data/templates/basic_class_template.erb +13 -14
  323. data/templates/class_template_with_event_bind.erb +4 -4
  324. data/templates/class_template_with_shapes.erb +8 -28
  325. data/templates/example_template.erb +1 -1
  326. data/templates/module_template.erb +4 -4
  327. data/templates/webview_template.erb +3 -2
  328. metadata +286 -80
  329. data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +0 -3
  330. data/lacci/lib/shoes/spacing.rb +0 -9
  331. data/lacci/lib/shoes/widget.rb +0 -218
  332. data/lacci/lib/shoes/widgets/alert.rb +0 -19
  333. data/lacci/lib/shoes/widgets/arc.rb +0 -51
  334. data/lacci/lib/shoes/widgets/button.rb +0 -35
  335. data/lacci/lib/shoes/widgets/check.rb +0 -28
  336. data/lacci/lib/shoes/widgets/document_root.rb +0 -20
  337. data/lacci/lib/shoes/widgets/flow.rb +0 -22
  338. data/lacci/lib/shoes/widgets/font.rb +0 -14
  339. data/lacci/lib/shoes/widgets/line.rb +0 -18
  340. data/lacci/lib/shoes/widgets/link.rb +0 -25
  341. data/lacci/lib/shoes/widgets/list_box.rb +0 -25
  342. data/lacci/lib/shoes/widgets/para.rb +0 -68
  343. data/lacci/lib/shoes/widgets/radio.rb +0 -35
  344. data/lacci/lib/shoes/widgets/slot.rb +0 -75
  345. data/lacci/lib/shoes/widgets/span.rb +0 -26
  346. data/lacci/lib/shoes/widgets/stack.rb +0 -24
  347. data/lacci/lib/shoes/widgets/star.rb +0 -44
  348. data/lacci/lib/shoes/widgets/subscription_item.rb +0 -60
  349. data/lacci/lib/shoes/widgets/text_widget.rb +0 -51
  350. data/lacci/lib/shoes/widgets/video.rb +0 -15
  351. data/lacci/lib/shoes/widgets.rb +0 -29
  352. data/lib/scarpe/evented_assertions.rb +0 -88
  353. data/lib/scarpe/wv/alert.rb +0 -66
  354. data/lib/scarpe/wv/background.rb +0 -27
  355. data/lib/scarpe/wv/control_interface_test.rb +0 -238
  356. data/lib/scarpe/wv/dimensions.rb +0 -22
  357. data/lib/scarpe/wv/font.rb +0 -36
  358. data/lib/scarpe/wv/html.rb +0 -108
  359. data/lib/scarpe/wv/spacing.rb +0 -41
  360. data/lib/scarpe/wv/span.rb +0 -68
  361. data/lib/scarpe/wv/text_widget.rb +0 -30
  362. /data/examples/legacy/not_checked/{expert → shoes-contrib/basic}/definr.rb +0 -0
  363. /data/examples/legacy/not_checked/{expert → shoes-contrib/basic}/funnies.rb +0 -0
  364. /data/examples/legacy/not_checked/shoes-contrib/{elements → basic}/list_box-select-class.rb +0 -0
  365. /data/examples/legacy/{not_checked → working}/shoes3-tests/editline/editline.rb +0 -0
  366. /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/basic-edit-box.rb +0 -0
  367. /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/basic-fps.rb +0 -0
  368. /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/border-cat.rb +0 -0
  369. /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/check-mate.rb +0 -0
  370. /data/examples/legacy/{not_checked/shoes-contrib/manipulation → working/simple}/clear-slot.rb +0 -0
  371. /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/clock.rb +0 -0
  372. /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/gradient-shoes.rb +0 -0
  373. /data/examples/legacy/{not_checked/shoes-contrib/basic → working/simple}/list_box-shape-report.rb +0 -0
  374. /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/list_box.rb +0 -0
  375. /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/phat-button.rb +0 -0
  376. /data/examples/legacy/{not_checked/shoes-contrib → working}/simple/simple-calc.rb +0 -0
  377. /data/examples/legacy/{not_checked/shoes-contrib/position → working/simple}/stack-width.rb +0 -0
  378. /data/examples/legacy/{not_checked/shoes-contrib/elements → working/simple}/width-introspec.rb +0 -0
data/lacci/lacci.gemspec CHANGED
@@ -23,14 +23,14 @@ Gem::Specification.new do |spec|
23
23
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
24
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
25
25
  `git ls-files -z`.split("\x0").reject do |f|
26
- (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
26
+ (f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features|tasks)/|\.(?:git|travis|circleci)|appveyor)})
27
27
  end
28
28
  end
29
29
  spec.bindir = "exe"
30
30
  spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
31
31
  spec.require_paths = ["lib"]
32
32
 
33
- #spec.add_dependency ""
33
+ spec.add_dependency "scarpe-components", "~>0.4.0"
34
34
 
35
35
  # For more information and examples about making a new gem, check out our
36
36
  # guide at: https://bundler.io/guides/creating_gem.html
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Scarpe
3
+ module Scarpe
4
4
  module CLI
5
5
  DEFAULT_USAGE = <<~'USAGE'
6
6
  Usage: scarpe_core [OPTIONS] <scarpe app file> # Same as "scarpe run"
@@ -23,11 +23,11 @@ class Scarpe
23
23
  end
24
24
 
25
25
  def default_env_categories
26
+ require "shoes"
26
27
  {
27
28
  "Lacci" => [
28
29
  env_or_default("SCARPE_DISPLAY_SERVICE", "(none)"),
29
30
  env_or_default("SCARPE_LOG_CONFIG", "(default)#{Shoes::Log::DEFAULT_LOG_CONFIG.inspect}"),
30
- env_or_default("SCARPE_APP_TEST", "(none)"),
31
31
  ],
32
32
  "Ruby and Shell" => [
33
33
  ["RUBY_DESCRIPTION", RUBY_DESCRIPTION],
@@ -12,9 +12,10 @@ if RUBY_VERSION[0..2] < "3.2"
12
12
  exit(-1)
13
13
  end
14
14
 
15
- class Scarpe; end
15
+ module Scarpe; end
16
16
 
17
17
  # The base error class for Scarpe errors, but not necessarily {Shoes::Error}s
18
+ class Shoes::Error < StandardError; end
18
19
  class Scarpe::Error < StandardError; end
19
20
 
20
21
  require "lacci/version"
@@ -9,5 +9,5 @@
9
9
  # mostly invisible. Instead, look at the {Shoes} module
10
10
  # to see what's in Lacci.
11
11
  module Lacci
12
- VERSION = "0.2.2"
12
+ VERSION = "0.4.0"
13
13
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Niente
4
+ class App < Drawable
5
+ def initialize(properties)
6
+ super
7
+
8
+ bind_shoes_event(event_name: "init") { init }
9
+ bind_shoes_event(event_name: "run") { run }
10
+ bind_shoes_event(event_name: "destroy") { destroy }
11
+ end
12
+
13
+ def init
14
+ end
15
+
16
+ def run
17
+ send_shoes_event("wait", event_name: "custom_event_loop")
18
+ end
19
+
20
+ def destroy
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Niente
4
+ # This is a "null" DisplayService, doing as little as it
5
+ # can get away with.
6
+ class DisplayService < Shoes::DisplayService
7
+ include Shoes::Log
8
+
9
+ class << self
10
+ attr_accessor :instance
11
+ end
12
+
13
+ def initialize
14
+ if Niente::DisplayService.instance
15
+ raise Shoes::SingletonError, "ERROR! This is meant to be a singleton!"
16
+ end
17
+
18
+ Niente::DisplayService.instance = self
19
+
20
+ log_init("Niente::DisplayService")
21
+ super()
22
+ end
23
+
24
+ # Create a fake display drawable for a specific Shoes drawable, and pair it with
25
+ # the linkable ID for this Shoes drawable.
26
+ #
27
+ # @param drawable_class_name [String] The class name of the Shoes drawable, e.g. Shoes::Button
28
+ # @param drawable_id [String] the linkable ID for drawable events
29
+ # @param properties [Hash] a JSON-serialisable Hash with the drawable's Shoes styles
30
+ # @param is_widget [Boolean] whether the class is a user-defined Shoes::Widget subclass
31
+ # @return [Webview::Drawable] the newly-created Webview drawable
32
+ def create_display_drawable_for(drawable_class_name, drawable_id, properties, parent_id:, is_widget:)
33
+ existing = query_display_drawable_for(drawable_id, nil_ok: true)
34
+ if existing
35
+ @log.warn("There is already a display drawable for #{drawable_id.inspect}! Returning #{existing.class.name}.")
36
+ return existing
37
+ end
38
+
39
+ if drawable_class_name == "App"
40
+ @app = Niente::App.new(properties)
41
+ set_drawable_pairing(drawable_id, @app)
42
+
43
+ return @app
44
+ end
45
+
46
+ display_drawable = Niente::Drawable.new(properties)
47
+ display_drawable.shoes_type = drawable_class_name
48
+ set_drawable_pairing(drawable_id, display_drawable)
49
+
50
+ # Nil parent is okay for DocumentRoot and TextDrawables, so we have to specify it.
51
+ parent = DisplayService.instance.query_display_drawable_for(parent_id, nil_ok: true)
52
+ display_drawable.set_parent(parent)
53
+
54
+ return display_drawable
55
+ end
56
+
57
+ # Destroy the display service and the app. Quit the process (eventually.)
58
+ #
59
+ # @return [void]
60
+ def destroy
61
+ @app.destroy
62
+ DisplayService.instance = nil
63
+ end
64
+ end
65
+ end
66
+
@@ -0,0 +1,59 @@
1
+ module Niente
2
+ class Drawable < Shoes::Linkable
3
+ attr_reader :shoes_linkable_id
4
+ attr_reader :parent
5
+ attr_reader :children
6
+
7
+ attr_accessor :shoes_type
8
+
9
+ def initialize(props)
10
+ @shoes_linkable_id = props.delete("shoes_linkable_id") || props.delete(:shoes_linkable_id)
11
+ @data = props
12
+
13
+ super(linkable_id: @shoes_linkable_id)
14
+
15
+ # This should only be used for reparenting after a drawable was initially created.
16
+ bind_shoes_event(event_name: "parent", target: shoes_linkable_id) do |new_parent_id|
17
+ display_parent = DisplayService.instance.query_display_drawable_for(new_parent_id)
18
+ if @parent != display_parent
19
+ set_parent(display_parent)
20
+ end
21
+ end
22
+
23
+ # When Shoes drawables change properties, we get a change notification here
24
+ bind_shoes_event(event_name: "prop_change", target: shoes_linkable_id) do |prop_changes|
25
+ prop_changes.each do |k, v|
26
+ instance_variable_set("@" + k, v)
27
+ end
28
+ properties_changed(prop_changes) if respond_to?(:properties_changed)
29
+ end
30
+
31
+ bind_shoes_event(event_name: "destroy", target: shoes_linkable_id) do
32
+ set_parent(nil)
33
+ end
34
+ end
35
+
36
+ def set_parent(new_parent)
37
+ @parent&.remove_child(self)
38
+ new_parent&.add_child(self)
39
+ @parent = new_parent
40
+ end
41
+
42
+ # Do not call directly, use set_parent
43
+ def remove_child(child)
44
+ @children ||= []
45
+ unless @children.include?(child)
46
+ STDERR.puts("remove_child: no such child(#{child.inspect}) for"\
47
+ " parent(#{parent.inspect})!")
48
+ end
49
+ @children.delete(child)
50
+ end
51
+
52
+ # Do not call directly, use set_parent
53
+ def add_child(child)
54
+ @children ||= []
55
+ @children << child
56
+ end
57
+ end
58
+ end
59
+
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "minitest"
4
+ require "scarpe/components/string_helpers"
5
+
6
+ module Niente; end
7
+
8
+ class Niente::Test
9
+ def self.run_shoes_spec_test_code(code, class_name: nil, test_name: nil)
10
+ if @shoes_spec_init
11
+ raise Shoes::Errors::MultipleShoesSpecRunsError, "Scarpe-Webview can only run a single Shoes spec per process!"
12
+ end
13
+ @shoes_spec_init = true
14
+
15
+ require "scarpe/components/minitest_export_reporter"
16
+ Minitest::Reporters::ShoesExportReporter.activate!
17
+
18
+ class_name ||= ENV["SHOES_MINITEST_CLASS_NAME"] || "TestShoesSpecCode"
19
+ test_name ||= ENV["SHOES_MINITEST_METHOD_NAME"] || "test_shoes_spec"
20
+
21
+ Shoes::DisplayService.subscribe_to_event("heartbeat", nil) do
22
+ unless @hb_init
23
+ Minitest.run []
24
+ Shoes::App.instance.destroy
25
+ end
26
+ @hb_init = true
27
+ end
28
+
29
+ test_class = Class.new(Niente::ShoesSpecTest)
30
+ Object.const_set(Scarpe::Components::StringHelpers.camelize(class_name), test_class)
31
+ test_name = "test_" + test_name unless test_name.start_with?("test_")
32
+ test_class.define_method(test_name) do
33
+ eval(code)
34
+ end
35
+ end
36
+ end
37
+
38
+ class Niente::ShoesSpecTest < Minitest::Test
39
+ Shoes::Drawable.drawable_classes.each do |drawable_class|
40
+ finder_name = drawable_class.dsl_name
41
+
42
+ define_method(finder_name) do |*args|
43
+ app = Shoes::App.instance
44
+
45
+ drawables = app.find_drawables_by(drawable_class, *args)
46
+ raise Shoes::Errors::MultipleDrawablesFoundError, "Found more than one #{finder_name} matching #{args.inspect}!" if drawables.size > 1
47
+ raise Shoes::Errors::NoDrawablesFoundError, "Found no #{finder_name} matching #{args.inspect}!" if drawables.empty?
48
+
49
+ Niente::ShoesSpecProxy.new(drawables[0])
50
+ end
51
+ end
52
+
53
+ def drawable(*specs)
54
+ drawables = Shoes::App.instance.find_drawables_by(*specs)
55
+ raise Shoes::Errors::MultipleDrawablesFoundError, "Found more than one #{finder_name} matching #{args.inspect}!" if drawables.size > 1
56
+ raise Shoes::Errors::NoDrawablesFoundError, "Found no #{finder_name} matching #{args.inspect}!" if drawables.empty?
57
+ Niente::ShoesSpecProxy.new(drawables[0])
58
+ end
59
+ end
60
+
61
+ class Niente::ShoesSpecProxy
62
+ attr_reader :obj
63
+ attr_reader :linkable_id
64
+ attr_reader :display
65
+
66
+ def initialize(obj)
67
+ @obj = obj
68
+ @linkable_id = obj.linkable_id
69
+ @display = ::Shoes::DisplayService.display_service.query_display_drawable_for(obj.linkable_id)
70
+ end
71
+
72
+ def method_missing(method, ...)
73
+ if @obj.respond_to?(method)
74
+ self.singleton_class.define_method(method) do |*args, **kwargs, &block|
75
+ @obj.send(method, *args, **kwargs, &block)
76
+ end
77
+ send(method, ...)
78
+ else
79
+ super # raise an exception
80
+ end
81
+ end
82
+
83
+ JS_EVENTS = [:click, :hover, :leave]
84
+ JS_EVENTS.each do |event|
85
+ define_method("trigger_#{event}") do |*args, **kwargs|
86
+ ::Shoes::DisplayService.dispatch_event(event.to_s, @linkable_id, *args, **kwargs)
87
+ end
88
+ end
89
+
90
+ def respond_to_missing?(method_name, include_private = false)
91
+ @obj.respond_to_missing?(method_name, include_private)
92
+ end
93
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Niente -- Italian for "nothing" -- is a null display service
4
+ # that doesn't display anything. It does very little, while
5
+ # keeping a certain amount of "mental model" or schema of
6
+ # how a real display service should act.
7
+ module Niente; end
8
+
9
+ require "scarpe/components/print_logger"
10
+ Shoes::Log.instance = Scarpe::Components::PrintLogImpl.new
11
+ if ENV["NIENTE_LOG_LEVEL"]
12
+ pl = Scarpe::Components::PrintLogImpl::PrintLogger
13
+ level = ENV["NIENTE_LOG_LEVEL"].strip.downcase.to_sym
14
+ unless pl::LEVELS.key?(level)
15
+ raise "Unrecognized Niente log level: #{level.inspect}!"
16
+ end
17
+ pl.min_level = pl::LEVELS[level]
18
+ end
19
+
20
+ require_relative "niente/drawable"
21
+ require_relative "niente/app"
22
+ require_relative "niente/display_service"
23
+
24
+ require_relative "niente/shoes_spec"
25
+ Shoes::Spec.instance = Niente::Test
26
+
27
+ require "scarpe/components/segmented_file_loader"
28
+ loader = Scarpe::Components::SegmentedFileLoader.new
29
+ Shoes.add_file_loader loader
30
+
31
+ Shoes::DisplayService.set_display_service_class(Niente::DisplayService)
32
+
@@ -1,61 +1,81 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Shoes
4
- class App < Shoes::Widget
3
+ class Shoes
4
+ class App < Shoes::Drawable
5
5
  include Shoes::Log
6
6
 
7
7
  class << self
8
8
  attr_accessor :instance
9
9
  end
10
10
 
11
+ # The Shoes root of the drawable tree
11
12
  attr_reader :document_root
12
13
 
13
- display_properties :title, :width, :height, :resizable
14
+ # The application directory for this app. Often this will be the directory
15
+ # containing the launched application file.
16
+ attr_reader :dir
17
+
18
+ shoes_styles :title, :width, :height, :resizable, :features
19
+
20
+ # This is defined to avoid the linkable-id check in the Shoes-style method_missing def'n
21
+ def features
22
+ @features
23
+ end
14
24
 
15
25
  CUSTOM_EVENT_LOOP_TYPES = ["displaylib", "return", "wait"]
16
26
 
27
+ init_args
17
28
  def initialize(
18
29
  title: "Shoes!",
19
30
  width: 480,
20
31
  height: 420,
21
32
  resizable: true,
33
+ features: [],
22
34
  &app_code_body
23
35
  )
24
36
  log_init("Shoes::App")
25
37
 
26
38
  if Shoes::App.instance
27
39
  @log.error("Trying to create a second Shoes::App in the same process! Fail!")
28
- raise "Cannot create multiple Shoes::App objects!"
40
+ raise Shoes::Errors::TooManyInstancesError, "Cannot create multiple Shoes::App objects!"
29
41
  else
30
42
  Shoes::App.instance = self
31
43
  end
32
44
 
45
+ # We cd to the app's containing dir when running the app
46
+ @dir = Dir.pwd
47
+
33
48
  @do_shutdown = false
34
49
  @event_loop_type = "displaylib" # the default
35
50
 
36
- super
51
+ @features = features
37
52
 
38
- # The draw context tracks current settings like fill and stroke,
39
- # plus potentially other current state that changes from widget
40
- # to widget and slot to slot.
41
- @draw_context = {
42
- "fill" => "",
43
- "stroke" => "",
44
- }
53
+ unknown_ext = features - Shoes::FEATURES - Shoes::EXTENSIONS
54
+ unsupported_features = unknown_ext & Shoes::KNOWN_FEATURES
55
+ unless unsupported_features.empty?
56
+ @log.error("Shoes app requires feature(s) not supported by this display service: #{unsupported_features.inspect}!")
57
+ raise Shoes::Errors::UnsupportedFeatureError, "Shoes app needs features: #{unsupported_features.inspect}"
58
+ end
59
+ unless unknown_ext.empty?
60
+ @log.warn("Shoes app requested unknown features #{unknown_ext.inspect}! Known: #{(Shoes::FEATURES + Shoes::EXTENSIONS).inspect}")
61
+ end
45
62
 
46
- # This creates the DocumentRoot, including its corresponding display widget
63
+ @slots = []
64
+
65
+ super
66
+
67
+ # This creates the DocumentRoot, including its corresponding display drawable
47
68
  @document_root = Shoes::DocumentRoot.new
48
69
 
49
- @slots = []
70
+ # Now create the App display drawable
71
+ create_display_drawable
50
72
 
51
- # Now create the App display widget
52
- create_display_widget
73
+ # Set up testing *after* Display Service basic objects exist
53
74
 
54
- # Set up testing events *after* Display Service basic objects exist
55
- if ENV["SCARPE_APP_TEST"]
56
- test_code = File.read ENV["SCARPE_APP_TEST"]
57
- if test_code != ""
58
- self.instance_eval test_code
75
+ if ENV["SHOES_SPEC_TEST"]
76
+ test_code = File.read ENV["SHOES_SPEC_TEST"]
77
+ unless test_code.empty?
78
+ Shoes::Spec.instance.run_shoes_spec_test_code test_code
59
79
  end
60
80
  end
61
81
 
@@ -70,7 +90,7 @@ module Shoes
70
90
  end
71
91
 
72
92
  @watch_for_event_loop = bind_shoes_event(event_name: "custom_event_loop") do |loop_type|
73
- raise("Unknown event loop type: #{loop_type.inspect}!") unless CUSTOM_EVENT_LOOP_TYPES.include?(loop_type)
93
+ raise(Shoes::Errors::InvalidAttributeValueError, "Unknown event loop type: #{loop_type.inspect}!") unless CUSTOM_EVENT_LOOP_TYPES.include?(loop_type)
74
94
 
75
95
  @event_loop_type = loop_type
76
96
  end
@@ -89,9 +109,9 @@ module Shoes
89
109
  ::Shoes::App.instance.with_slot(@document_root, &@app_code_body)
90
110
  end
91
111
 
92
- # "Container" widgets like flows, stacks, masks and the document root
112
+ # "Container" drawables like flows, stacks, masks and the document root
93
113
  # are considered "slots" in Shoes parlance. When a new slot is created,
94
- # we push it here in order to track what widgets are found in that slot.
114
+ # we push it here in order to track what drawables are found in that slot.
95
115
  def push_slot(slot)
96
116
  @slots.push(slot)
97
117
  end
@@ -115,8 +135,26 @@ module Shoes
115
135
  pop_slot
116
136
  end
117
137
 
138
+ # We use method_missing for drawable-creating methods like "button".
139
+ # The parent's method_missing will auto-create Shoes style getters and setters.
140
+ # This is similar to the method_missing in Shoes::Slot, but different in
141
+ # where the new drawable appears.
142
+ def method_missing(name, *args, **kwargs, &block)
143
+ klass = ::Shoes::Drawable.drawable_class_by_name(name)
144
+ return super unless klass
145
+
146
+ ::Shoes::App.define_method(name) do |*args, **kwargs, &block|
147
+ klass.new(*args, **kwargs, &block)
148
+ end
149
+
150
+ send(name, *args, **kwargs, &block)
151
+ end
152
+
153
+ # Get the current draw context for the current slot
154
+ #
155
+ # @return [Hash] a hash of Shoes styles for the current draw context
118
156
  def current_draw_context
119
- @draw_context.dup
157
+ current_slot&.current_draw_context
120
158
  end
121
159
 
122
160
  # This usually doesn't return. The display service may take control
@@ -136,7 +174,9 @@ module Shoes
136
174
  case @event_loop_type
137
175
  when "wait"
138
176
  # Display lib wants us to busy-wait instead of it.
139
- sleep 0.1 until @do_shutdown
177
+ until @do_shutdown
178
+ Shoes::DisplayService.dispatch_event("heartbeat", nil)
179
+ end
140
180
  when "displaylib"
141
181
  # If run event returned, that means we're done.
142
182
  destroy
@@ -144,7 +184,7 @@ module Shoes
144
184
  # We can just return to the main event loop. But we shouldn't call destroy.
145
185
  # Presumably some event loop *outside* our event loop is handling things.
146
186
  else
147
- raise "Internal error! Incorrect event loop type: #{@event_loop_type.inspect}!"
187
+ raise Shoes::Errors::InvalidAttributeValueError, "Internal error! Incorrect event loop type: #{@event_loop_type.inspect}!"
148
188
  end
149
189
  end
150
190
 
@@ -153,10 +193,10 @@ module Shoes
153
193
  send_shoes_event(event_name: "destroy") if send_event
154
194
  end
155
195
 
156
- def all_widgets
196
+ def all_drawables
157
197
  out = []
158
198
 
159
- to_add = @document_root.children
199
+ to_add = [@document_root, @document_root.children]
160
200
  until to_add.empty?
161
201
  out.concat(to_add)
162
202
  to_add = to_add.flat_map { |w| w.respond_to?(:children) ? w.children : [] }.compact
@@ -165,13 +205,15 @@ module Shoes
165
205
  out
166
206
  end
167
207
 
168
- # We can add various ways to find widgets here.
208
+ # We can add various ways to find drawables here.
169
209
  # These are sort of like Shoes selectors, used for testing.
170
- def find_widgets_by(*specs)
171
- widgets = all_widgets
210
+ def find_drawables_by(*specs)
211
+ drawables = all_drawables
172
212
  specs.each do |spec|
173
- if spec.is_a?(Class)
174
- widgets.select! { |w| spec === w }
213
+ if spec == Shoes::App
214
+ drawables = [Shoes::App.instance]
215
+ elsif spec.is_a?(Class)
216
+ drawables.select! { |w| spec === w }
175
217
  elsif spec.is_a?(Symbol) || spec.is_a?(String)
176
218
  s = spec.to_s
177
219
  case s[0]
@@ -179,71 +221,68 @@ module Shoes
179
221
  begin
180
222
  # I'm not finding a global_variable_get or similar...
181
223
  global_value = eval s
182
- widgets &= [global_value]
224
+ drawables &= [global_value]
183
225
  rescue
184
- raise "Error getting global variable: #{spec.inspect}"
226
+ raise Shoes::Errors::InvalidAttributeValueError, "Error getting global variable: #{spec.inspect}"
185
227
  end
186
228
  when "@"
187
229
  if Shoes::App.instance.instance_variables.include?(spec.to_sym)
188
- widgets &= [self.instance_variable_get(spec)]
230
+ drawables &= [self.instance_variable_get(spec)]
189
231
  else
190
- raise "Can't find top-level instance variable: #{spec.inspect}!"
232
+ raise Shoes::Errors::InvalidAttributeValueError, "Can't find top-level instance variable: #{spec.inspect}!"
191
233
  end
192
234
  else
235
+ if s.start_with?("id:")
236
+ find_id = Integer(s[3..-1])
237
+ drawable = Shoes::Drawable.drawable_by_id(find_id)
238
+ drawables &= [drawable]
239
+ else
240
+ raise Shoes::Errors::InvalidAttributeValueError, "Don't know how to find drawables by #{spec.inspect}!"
241
+ end
193
242
  end
194
243
  else
195
- raise("Don't know how to find widgets by #{spec.inspect}!")
244
+ raise(Shoes::Errors::InvalidAttributeValueError, "Don't know how to find drawables by #{spec.inspect}!")
196
245
  end
197
246
  end
198
- widgets
247
+ drawables
199
248
  end
200
249
  end
201
250
  end
202
251
 
203
- # DSL methods
204
- class Shoes::App
252
+ # Event handler DSLs get defined in both App and Slot - same code, slightly different results
253
+ events = [:motion, :hover, :leave, :click, :release, :keypress, :animate, :every, :timer]
254
+ events.each do |event|
255
+ Shoes::App.define_method(event) do |*args, &block|
256
+ subscription_item(args:, shoes_api_name: event.to_s, &block)
257
+ end
258
+ Shoes::Slot.define_method(event) do |*args, &block|
259
+ subscription_item(args:, shoes_api_name: event.to_s, &block)
260
+ end
261
+ end
262
+
263
+ # These methods will need to be defined on Slots too, but probably need a rework in general.
264
+ class Shoes::App < Shoes::Drawable
265
+ # This is going to go away. See issue #496
205
266
  def background(...)
206
267
  current_slot.background(...)
207
268
  end
208
269
 
270
+ # This is going to go away. See issue #498
209
271
  def border(...)
210
272
  current_slot.border(...)
211
273
  end
212
274
 
213
- def motion(&block)
214
- subscription_item(shoes_api_name: "motion", &block)
215
- end
216
-
217
- def hover(&block)
218
- subscription_item(shoes_api_name: "hover", &block)
219
- end
220
-
221
- def click(&block)
222
- subscription_item(shoes_api_name: "click", &block)
223
- end
224
-
225
- # Draw context methods
226
-
227
- def fill(color)
228
- @draw_context["fill"] = color
229
- end
230
-
231
- def nofill
232
- @draw_context["fill"] = ""
233
- end
234
-
235
- def stroke(color)
236
- @draw_context["stroke"] = color
237
- end
238
-
239
- def nostroke
240
- @draw_context["stroke"] = ""
275
+ # Draw Context methods -- forward to the current slot
276
+ [:fill, :nofill, :stroke, :strokewidth, :nostroke, :rotate].each do |dc_method|
277
+ define_method(dc_method) do |*args|
278
+ current_slot.send(dc_method, *args)
279
+ end
241
280
  end
242
281
 
243
282
  # Shape DSL methods
244
283
 
245
284
  def move_to(x, y)
246
- raise("Pass only Numeric arguments to move_to!") unless x.is_a?(Numeric) && y.is_a?(Numeric)
285
+ raise(Shoes::Errors::InvalidAttributeValueError, "Pass only Numeric arguments to move_to!") unless x.is_a?(Numeric) && y.is_a?(Numeric)
247
286
 
248
287
  if current_slot.is_a?(::Shoes::Shape)
249
288
  current_slot.add_shape_command(["move_to", x, y])
@@ -251,7 +290,7 @@ class Shoes::App
251
290
  end
252
291
 
253
292
  def line_to(x, y)
254
- raise("Pass only Numeric arguments to line_to!") unless x.is_a?(Numeric) && y.is_a?(Numeric)
293
+ raise(Shoes::Errors::InvalidAttributeValueError, "Pass only Numeric arguments to line_to!") unless x.is_a?(Numeric) && y.is_a?(Numeric)
255
294
 
256
295
  if current_slot.is_a?(::Shoes::Shape)
257
296
  current_slot.add_shape_command(["line_to", x, y])
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Shoes
3
+ class Shoes
4
4
  module Background
5
5
  def self.included(includer)
6
- includer.display_property(:background_color)
6
+ includer.shoes_style(:background_color)
7
7
  end
8
8
 
9
9
  # NOTE: this needs to be passed through in order for the styling to work
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module Shoes
3
+ class Shoes
4
4
  module Border
5
5
  def self.included(includer)
6
- includer.display_properties :border_color, :options
6
+ includer.shoes_styles :border_color, :options
7
7
  end
8
8
 
9
9
  # Considering a signature like this: