lacci 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (559) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +85 -0
  3. data/.ruby-version +1 -0
  4. data/.vscode/extensions.json +5 -0
  5. data/.yardopts +12 -0
  6. data/CHANGELOG.md +19 -0
  7. data/CODE_OF_CONDUCT.md +84 -0
  8. data/CONTRIBUTING.md +20 -0
  9. data/Gemfile +24 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +178 -0
  12. data/Rakefile +15 -0
  13. data/bin/console +15 -0
  14. data/bin/setup +8 -0
  15. data/dev.yml +7 -0
  16. data/docs/static/PKGBUILD +47 -0
  17. data/docs/static/Shoes.icns +0 -0
  18. data/docs/static/avatar.png +0 -0
  19. data/docs/static/code_highlighter.js +188 -0
  20. data/docs/static/code_highlighter_ruby.js +26 -0
  21. data/docs/static/icon-debug.png +0 -0
  22. data/docs/static/icon-error.png +0 -0
  23. data/docs/static/icon-info.png +0 -0
  24. data/docs/static/icon-warn.png +0 -0
  25. data/docs/static/listbox_button1.png +0 -0
  26. data/docs/static/listbox_button2.png +0 -0
  27. data/docs/static/man-app.png +0 -0
  28. data/docs/static/man-builds.png +0 -0
  29. data/docs/static/man-builds1.png +0 -0
  30. data/docs/static/man-editor-notepad.png +0 -0
  31. data/docs/static/man-editor-osx.png +0 -0
  32. data/docs/static/man-ele-background.png +0 -0
  33. data/docs/static/man-ele-border.png +0 -0
  34. data/docs/static/man-ele-button.png +0 -0
  35. data/docs/static/man-ele-check.png +0 -0
  36. data/docs/static/man-ele-editbox.png +0 -0
  37. data/docs/static/man-ele-editline.png +0 -0
  38. data/docs/static/man-ele-image.png +0 -0
  39. data/docs/static/man-ele-listbox.png +0 -0
  40. data/docs/static/man-ele-progress.png +0 -0
  41. data/docs/static/man-ele-radio.png +0 -0
  42. data/docs/static/man-ele-shape.png +0 -0
  43. data/docs/static/man-ele-textblock.png +0 -0
  44. data/docs/static/man-ele-video.png +0 -0
  45. data/docs/static/man-intro-dmg.png +0 -0
  46. data/docs/static/man-intro-exe.png +0 -0
  47. data/docs/static/man-look-tiger.png +0 -0
  48. data/docs/static/man-look-ubuntu.png +0 -0
  49. data/docs/static/man-look-vista.png +0 -0
  50. data/docs/static/man-run-osx.png +0 -0
  51. data/docs/static/man-run-vista.png +0 -0
  52. data/docs/static/man-run-xp.png +0 -0
  53. data/docs/static/man-shot1.png +0 -0
  54. data/docs/static/manual-en.txt +3529 -0
  55. data/docs/static/manual-ja.txt +2829 -0
  56. data/docs/static/manual.css +171 -0
  57. data/docs/static/manual.md +3528 -0
  58. data/docs/static/menu-corner1.png +0 -0
  59. data/docs/static/menu-corner2.png +0 -0
  60. data/docs/static/menu-gray.png +0 -0
  61. data/docs/static/menu-left.png +0 -0
  62. data/docs/static/menu-right.png +0 -0
  63. data/docs/static/menu-top.png +0 -0
  64. data/docs/static/shoes-dmg.jpg +0 -0
  65. data/docs/static/shoes-icon-blue.png +0 -0
  66. data/docs/static/shoes-icon.png +0 -0
  67. data/docs/static/shoes-manual-apps.gif +0 -0
  68. data/docs/static/shoes_main_window.png +0 -0
  69. data/docs/static/stripe.png +0 -0
  70. data/docs/static/stubs/blank.exe +0 -0
  71. data/docs/static/stubs/blank.hfz +0 -0
  72. data/docs/static/stubs/blank.run +375 -0
  73. data/docs/static/stubs/cocoa-install +0 -0
  74. data/docs/static/stubs/sh-install +49 -0
  75. data/docs/static/stubs/shoes-stub-inject.exe +0 -0
  76. data/docs/static/stubs/shoes-stub.exe +0 -0
  77. data/docs/static/tutor-back.png +0 -0
  78. data/docs/yard/catscradle.md +44 -0
  79. data/docs/yard/template/default/fulldoc/html/setup.rb +13 -0
  80. data/docs/yard/template/default/layout/html/setup.rb +9 -0
  81. data/examples/backdround_with_image.rb +16 -0
  82. data/examples/bloopsaphone/working/1901_by_Aanand_Prasad.rb +478 -0
  83. data/examples/bloopsaphone/working/b1.rb +64 -0
  84. data/examples/bloopsaphone/working/b2.rb +36 -0
  85. data/examples/bloopsaphone/working/bloops_test.rb +41 -0
  86. data/examples/bloopsaphone/working/bloopsaphone_theme_song_by_why.rb +31 -0
  87. data/examples/bloopsaphone/working/feepogram.rb +67 -0
  88. data/examples/bloopsaphone/working/simpsons_theme_song_by_why.rb +14 -0
  89. data/examples/bloopsaphone/working/tune_cheeky_drat.rb +210 -0
  90. data/examples/button.rb +10 -0
  91. data/examples/button_alert.rb +6 -0
  92. data/examples/button_go_away.rb +6 -0
  93. data/examples/button_with_position_and_size.rb +7 -0
  94. data/examples/coffee.rb +14 -0
  95. data/examples/download.rb +5 -0
  96. data/examples/download_and_show_image.rb +28 -0
  97. data/examples/edit_box.rb +8 -0
  98. data/examples/edit_line.rb +8 -0
  99. data/examples/fill.rb +25 -0
  100. data/examples/flow.rb +11 -0
  101. data/examples/fonts.rb +6 -0
  102. data/examples/gen.rb +140 -0
  103. data/examples/get_headers.rb +10 -0
  104. data/examples/hello_world.rb +3 -0
  105. data/examples/highlander.rb +87 -0
  106. data/examples/image/clickable_image.rb +5 -0
  107. data/examples/image/image.rb +3 -0
  108. data/examples/image/image_size.rb +7 -0
  109. data/examples/image/image_with_position_and_size.rb +3 -0
  110. data/examples/info.rb +9 -0
  111. data/examples/legacy/not_checked/expert/colours.rb +105 -0
  112. data/examples/legacy/not_checked/expert/curve-animation.rb +31 -0
  113. data/examples/legacy/not_checked/expert/curve-control-point.rb +51 -0
  114. data/examples/legacy/not_checked/expert/custom-list-box.rb +53 -0
  115. data/examples/legacy/not_checked/expert/definr.rb +23 -0
  116. data/examples/legacy/not_checked/expert/funnies.rb +56 -0
  117. data/examples/legacy/not_checked/expert/minesweeper.rb +267 -0
  118. data/examples/legacy/not_checked/expert/othello.rb +318 -0
  119. data/examples/legacy/not_checked/expert/pong.rb +62 -0
  120. data/examples/legacy/not_checked/expert/tankspank.rb +385 -0
  121. data/examples/legacy/not_checked/expert/tooltips.rb +45 -0
  122. data/examples/legacy/not_checked/expert/url.rb +37 -0
  123. data/examples/legacy/not_checked/expert/video-player.rb +256 -0
  124. data/examples/legacy/not_checked/good/_why-stories.rb +44 -0
  125. data/examples/legacy/not_checked/good/_why-stories.yaml +387 -0
  126. data/examples/legacy/not_checked/good/arc.rb +37 -0
  127. data/examples/legacy/not_checked/good/cardflip.rb +141 -0
  128. data/examples/legacy/not_checked/good/clock.rb +51 -0
  129. data/examples/legacy/not_checked/good/console.rb +21 -0
  130. data/examples/legacy/not_checked/good/follow.rb +26 -0
  131. data/examples/legacy/not_checked/good/image-rotate.rb +14 -0
  132. data/examples/legacy/not_checked/good/paris.svg +7236 -0
  133. data/examples/legacy/not_checked/good/path-animation.rb +46 -0
  134. data/examples/legacy/not_checked/good/plots.rb +100 -0
  135. data/examples/legacy/not_checked/good/reminder.rb +174 -0
  136. data/examples/legacy/not_checked/good/svgview.rb +113 -0
  137. data/examples/legacy/not_checked/good/vjot.rb +56 -0
  138. data/examples/legacy/not_checked/shoes-contrib/.gitignore +2 -0
  139. data/examples/legacy/not_checked/shoes-contrib/README.md +34 -0
  140. data/examples/legacy/not_checked/shoes-contrib/animation/animate-ovals.rb +21 -0
  141. data/examples/legacy/not_checked/shoes-contrib/animation/flowers.rb +59 -0
  142. data/examples/legacy/not_checked/shoes-contrib/animation/happy-trails.rb +31 -0
  143. data/examples/legacy/not_checked/shoes-contrib/animation/mice-satellites.rb +27 -0
  144. data/examples/legacy/not_checked/shoes-contrib/animation/oval-motion.rb +12 -0
  145. data/examples/legacy/not_checked/shoes-contrib/animation/pink-bubbles.rb +34 -0
  146. data/examples/legacy/not_checked/shoes-contrib/animation/pulsate.rb +18 -0
  147. data/examples/legacy/not_checked/shoes-contrib/animation/rotating-star.rb +18 -0
  148. data/examples/legacy/not_checked/shoes-contrib/app/download-and-save.rb +11 -0
  149. data/examples/legacy/not_checked/shoes-contrib/app/download.rb +10 -0
  150. data/examples/legacy/not_checked/shoes-contrib/app/get-google.rb +11 -0
  151. data/examples/legacy/not_checked/shoes-contrib/app/mouse-detection.rb +7 -0
  152. data/examples/legacy/not_checked/shoes-contrib/app/resizeable-false.rb +6 -0
  153. data/examples/legacy/not_checked/shoes-contrib/art/bubble-bullseye.rb +23 -0
  154. data/examples/legacy/not_checked/shoes-contrib/art/faded.rb +17 -0
  155. data/examples/legacy/not_checked/shoes-contrib/art/fill-oval.rb +5 -0
  156. data/examples/legacy/not_checked/shoes-contrib/art/mask.rb +15 -0
  157. data/examples/legacy/not_checked/shoes-contrib/art/oval-gradient.rb +6 -0
  158. data/examples/legacy/not_checked/shoes-contrib/art/star-gradient.rb +4 -0
  159. data/examples/legacy/not_checked/shoes-contrib/basic/basic-edit-box.rb +8 -0
  160. data/examples/legacy/not_checked/shoes-contrib/basic/basic-new-window.rb +8 -0
  161. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-image.rb +8 -0
  162. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval-shape.rb +8 -0
  163. data/examples/legacy/not_checked/shoes-contrib/basic/basic-oval.rb +6 -0
  164. data/examples/legacy/not_checked/shoes-contrib/basic/class-book.rb +43 -0
  165. data/examples/legacy/not_checked/shoes-contrib/basic/class-book.yaml +387 -0
  166. data/examples/legacy/not_checked/shoes-contrib/basic/clock.rb +6 -0
  167. data/examples/legacy/not_checked/shoes-contrib/basic/edit-stack +14 -0
  168. data/examples/legacy/not_checked/shoes-contrib/basic/gradient-shoes.rb +7 -0
  169. data/examples/legacy/not_checked/shoes-contrib/basic/list_box-shape-report.rb +19 -0
  170. data/examples/legacy/not_checked/shoes-contrib/basic/rect-arrow.rb +7 -0
  171. data/examples/legacy/not_checked/shoes-contrib/basic/scribble.rb +8 -0
  172. data/examples/legacy/not_checked/shoes-contrib/basic/search.rb +32 -0
  173. data/examples/legacy/not_checked/shoes-contrib/basic/shoes-notes.rb +16 -0
  174. data/examples/legacy/not_checked/shoes-contrib/basic/url-shoes-subclassing.rb +24 -0
  175. data/examples/legacy/not_checked/shoes-contrib/browser.rb +21 -0
  176. data/examples/legacy/not_checked/shoes-contrib/elements/background-column.rb +3 -0
  177. data/examples/legacy/not_checked/shoes-contrib/elements/background.rb +4 -0
  178. data/examples/legacy/not_checked/shoes-contrib/elements/basic-fps.rb +6 -0
  179. data/examples/legacy/not_checked/shoes-contrib/elements/border-cat.rb +6 -0
  180. data/examples/legacy/not_checked/shoes-contrib/elements/button-block.rb +8 -0
  181. data/examples/legacy/not_checked/shoes-contrib/elements/check-mate.rb +15 -0
  182. data/examples/legacy/not_checked/shoes-contrib/elements/common-styles.rb +13 -0
  183. data/examples/legacy/not_checked/shoes-contrib/elements/displace-animation.rb +13 -0
  184. data/examples/legacy/not_checked/shoes-contrib/elements/edit_box-character-count.rb +7 -0
  185. data/examples/legacy/not_checked/shoes-contrib/elements/edit_line-character-count.rb +7 -0
  186. data/examples/legacy/not_checked/shoes-contrib/elements/image-icon.rb +3 -0
  187. data/examples/legacy/not_checked/shoes-contrib/elements/list_box-select-class.rb +13 -0
  188. data/examples/legacy/not_checked/shoes-contrib/elements/list_box.rb +6 -0
  189. data/examples/legacy/not_checked/shoes-contrib/elements/move-flow-animate.rb +13 -0
  190. data/examples/legacy/not_checked/shoes-contrib/elements/phat-button.rb +7 -0
  191. data/examples/legacy/not_checked/shoes-contrib/elements/popup.rb +7 -0
  192. data/examples/legacy/not_checked/shoes-contrib/elements/progress-bar.rb +10 -0
  193. data/examples/legacy/not_checked/shoes-contrib/elements/radio-dreamcast-favs.rb +17 -0
  194. data/examples/legacy/not_checked/shoes-contrib/elements/timer.rb +6 -0
  195. data/examples/legacy/not_checked/shoes-contrib/elements/width-introspec.rb +8 -0
  196. data/examples/legacy/not_checked/shoes-contrib/events/background-hover.rb +11 -0
  197. data/examples/legacy/not_checked/shoes-contrib/events/motion-detect.rb +9 -0
  198. data/examples/legacy/not_checked/shoes-contrib/events/pressed-key.rb +6 -0
  199. data/examples/legacy/not_checked/shoes-contrib/expert/expert-funnies.rb +51 -0
  200. data/examples/legacy/not_checked/shoes-contrib/expert/expert-irb.rb +112 -0
  201. data/examples/legacy/not_checked/shoes-contrib/expert/expert-othello.rb +319 -0
  202. data/examples/legacy/not_checked/shoes-contrib/good/good-arc.rb +37 -0
  203. data/examples/legacy/not_checked/shoes-contrib/good/good-clock.rb +51 -0
  204. data/examples/legacy/not_checked/shoes-contrib/good/good-follow.rb +26 -0
  205. data/examples/legacy/not_checked/shoes-contrib/good/good-reminder.rb +174 -0
  206. data/examples/legacy/not_checked/shoes-contrib/good/good-vjot.rb +56 -0
  207. data/examples/legacy/not_checked/shoes-contrib/kernel/ask.rb +4 -0
  208. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_color.rb +4 -0
  209. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_open_file.rb +4 -0
  210. data/examples/legacy/not_checked/shoes-contrib/kernel/ask_save_file.rb +7 -0
  211. data/examples/legacy/not_checked/shoes-contrib/kernel/confirm.rb +3 -0
  212. data/examples/legacy/not_checked/shoes-contrib/kernel/debug.rb +4 -0
  213. data/examples/legacy/not_checked/shoes-contrib/kernel/exit.rb +5 -0
  214. data/examples/legacy/not_checked/shoes-contrib/kernel/font.rb +5 -0
  215. data/examples/legacy/not_checked/shoes-contrib/kernel/fonts.rb +3 -0
  216. data/examples/legacy/not_checked/shoes-contrib/manipulation/append-slot.rb +9 -0
  217. data/examples/legacy/not_checked/shoes-contrib/manipulation/clear-slot.rb +6 -0
  218. data/examples/legacy/not_checked/shoes-contrib/manipulation/prepend-slot.rb +6 -0
  219. data/examples/legacy/not_checked/shoes-contrib/manipulation/roll.rb +17 -0
  220. data/examples/legacy/not_checked/shoes-contrib/position/gutter-margin.rb +5 -0
  221. data/examples/legacy/not_checked/shoes-contrib/position/stack-width.rb +3 -0
  222. data/examples/legacy/not_checked/shoes-contrib/simple/simple-accordion.rb +75 -0
  223. data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-shapes.rb +17 -0
  224. data/examples/legacy/not_checked/shoes-contrib/simple/simple-anim-text.rb +13 -0
  225. data/examples/legacy/not_checked/shoes-contrib/simple/simple-arc.rb +23 -0
  226. data/examples/legacy/not_checked/shoes-contrib/simple/simple-bounce.rb +24 -0
  227. data/examples/legacy/not_checked/shoes-contrib/simple/simple-calc.rb +70 -0
  228. data/examples/legacy/not_checked/shoes-contrib/simple/simple-chipmunk.rb +26 -0
  229. data/examples/legacy/not_checked/shoes-contrib/simple/simple-control-sizes.rb +24 -0
  230. data/examples/legacy/not_checked/shoes-contrib/simple/simple-curve.rb +26 -0
  231. data/examples/legacy/not_checked/shoes-contrib/simple/simple-dialogs.rb +29 -0
  232. data/examples/legacy/not_checked/shoes-contrib/simple/simple-downloader.rb +27 -0
  233. data/examples/legacy/not_checked/shoes-contrib/simple/simple-draw.rb +13 -0
  234. data/examples/legacy/not_checked/shoes-contrib/simple/simple-editor.rb +28 -0
  235. data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.rb +28 -0
  236. data/examples/legacy/not_checked/shoes-contrib/simple/simple-form.shy +0 -0
  237. data/examples/legacy/not_checked/shoes-contrib/simple/simple-mask.rb +21 -0
  238. data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu.rb +31 -0
  239. data/examples/legacy/not_checked/shoes-contrib/simple/simple-menu1.rb +35 -0
  240. data/examples/legacy/not_checked/shoes-contrib/simple/simple-rubygems.rb +29 -0
  241. data/examples/legacy/not_checked/shoes-contrib/simple/simple-slide.rb +45 -0
  242. data/examples/legacy/not_checked/shoes-contrib/simple/simple-sphere.rb +28 -0
  243. data/examples/legacy/not_checked/shoes-contrib/simple/simple-sqlite3.rb +13 -0
  244. data/examples/legacy/not_checked/shoes-contrib/simple/simple-timer.rb +13 -0
  245. data/examples/legacy/not_checked/shoes-contrib/simple/simple-video.rb +13 -0
  246. data/examples/legacy/not_checked/shoes-contrib/styles/alignment.rb +4 -0
  247. data/examples/legacy/not_checked/shoes-contrib/styles/attachment.rb +5 -0
  248. data/examples/legacy/not_checked/shoes-contrib/styles/emphasis.rb +3 -0
  249. data/examples/legacy/not_checked/shoes-contrib/styles/gradient-angle.rb +3 -0
  250. data/examples/legacy/not_checked/shoes-contrib/styles/para-methods.rb +5 -0
  251. data/examples/legacy/not_checked/shoes-contrib/styles/para-red-underlined.rb +3 -0
  252. data/examples/legacy/not_checked/shoes-contrib/styles/para-style-method.rb +4 -0
  253. data/examples/legacy/not_checked/shoes-dep-samples/expert-game-of-life.rb +243 -0
  254. data/examples/legacy/not_checked/shoes-dep-samples/expert-othello.rb +319 -0
  255. data/examples/legacy/not_checked/shoes-dep-samples/good-clock.rb +51 -0
  256. data/examples/legacy/not_checked/shoes-dep-samples/good-follow.rb +26 -0
  257. data/examples/legacy/not_checked/shoes-dep-samples/good-reminder.rb +174 -0
  258. data/examples/legacy/not_checked/shoes-dep-samples/good-vjot.rb +56 -0
  259. data/examples/legacy/not_checked/shoes-dep-samples/simple-accordion.rb +75 -0
  260. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-shapes.rb +17 -0
  261. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-text.rb +13 -0
  262. data/examples/legacy/not_checked/shoes-dep-samples/simple-arc.rb +23 -0
  263. data/examples/legacy/not_checked/shoes-dep-samples/simple-bounce.rb +24 -0
  264. data/examples/legacy/not_checked/shoes-dep-samples/simple-calc.rb +70 -0
  265. data/examples/legacy/not_checked/shoes-dep-samples/simple-chipmunk.rb +26 -0
  266. data/examples/legacy/not_checked/shoes-dep-samples/simple-control-sizes.rb +24 -0
  267. data/examples/legacy/not_checked/shoes-dep-samples/simple-curve.rb +26 -0
  268. data/examples/legacy/not_checked/shoes-dep-samples/simple-dialogs.rb +29 -0
  269. data/examples/legacy/not_checked/shoes-dep-samples/simple-draw.rb +13 -0
  270. data/examples/legacy/not_checked/shoes-dep-samples/simple-editor.rb +28 -0
  271. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.rb +28 -0
  272. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.shy +0 -0
  273. data/examples/legacy/not_checked/shoes-dep-samples/simple-mask.rb +21 -0
  274. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu.rb +31 -0
  275. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu1.rb +35 -0
  276. data/examples/legacy/not_checked/shoes-dep-samples/simple-rubygems.rb +29 -0
  277. data/examples/legacy/not_checked/shoes-dep-samples/simple-slide.rb +45 -0
  278. data/examples/legacy/not_checked/shoes-dep-samples/simple-sphere.rb +28 -0
  279. data/examples/legacy/not_checked/shoes-dep-samples/simple-sqlite3.rb +13 -0
  280. data/examples/legacy/not_checked/shoes-dep-samples/simple-timer.rb +13 -0
  281. data/examples/legacy/not_checked/shoes-dep-samples/simple-video.rb +13 -0
  282. data/examples/legacy/not_checked/shoes3-tests/AnemicCinema1926marcelDuchampCut.mp4 +0 -0
  283. data/examples/legacy/not_checked/shoes3-tests/button/button.rb +53 -0
  284. data/examples/legacy/not_checked/shoes3-tests/cache/cache.rb +41 -0
  285. data/examples/legacy/not_checked/shoes3-tests/combo/combo.rb +24 -0
  286. data/examples/legacy/not_checked/shoes3-tests/curl/bare.rb +34 -0
  287. data/examples/legacy/not_checked/shoes3-tests/curl/downloader.rb +40 -0
  288. data/examples/legacy/not_checked/shoes3-tests/curl/m1.rb +11 -0
  289. data/examples/legacy/not_checked/shoes3-tests/curl/m2.rb +12 -0
  290. data/examples/legacy/not_checked/shoes3-tests/curl/m3.rb +11 -0
  291. data/examples/legacy/not_checked/shoes3-tests/curl/m4.rb +5 -0
  292. data/examples/legacy/not_checked/shoes3-tests/curl/typ.rb +30 -0
  293. data/examples/legacy/not_checked/shoes3-tests/cursor/c1.rb +21 -0
  294. data/examples/legacy/not_checked/shoes3-tests/decoration.rb +14 -0
  295. data/examples/legacy/not_checked/shoes3-tests/dialogs/ask.rb +6 -0
  296. data/examples/legacy/not_checked/shoes3-tests/dialogs/confirm.rb +6 -0
  297. data/examples/legacy/not_checked/shoes3-tests/editbox/editbox.rb +36 -0
  298. data/examples/legacy/not_checked/shoes3-tests/editline/editline.rb +27 -0
  299. data/examples/legacy/not_checked/shoes3-tests/events/button.rb +32 -0
  300. data/examples/legacy/not_checked/shoes3-tests/events/button.yaml +40 -0
  301. data/examples/legacy/not_checked/shoes3-tests/events/capture.rb +57 -0
  302. data/examples/legacy/not_checked/shoes3-tests/events/chipmunk.yaml +47 -0
  303. data/examples/legacy/not_checked/shoes3-tests/events/event0.rb +8 -0
  304. data/examples/legacy/not_checked/shoes3-tests/events/event1.rb +51 -0
  305. data/examples/legacy/not_checked/shoes3-tests/events/event1.yaml +26 -0
  306. data/examples/legacy/not_checked/shoes3-tests/events/event2.rb +46 -0
  307. data/examples/legacy/not_checked/shoes3-tests/events/event3.rb +44 -0
  308. data/examples/legacy/not_checked/shoes3-tests/events/event4.rb +65 -0
  309. data/examples/legacy/not_checked/shoes3-tests/events/event5.rb +17 -0
  310. data/examples/legacy/not_checked/shoes3-tests/events/event6.rb +51 -0
  311. data/examples/legacy/not_checked/shoes3-tests/events/replay.rb +60 -0
  312. data/examples/legacy/not_checked/shoes3-tests/gapp/fullscreen.rb +38 -0
  313. data/examples/legacy/not_checked/shoes3-tests/gapp/icon.rb +56 -0
  314. data/examples/legacy/not_checked/shoes3-tests/gapp/mon1.rb +46 -0
  315. data/examples/legacy/not_checked/shoes3-tests/gapp/settings1.rb +22 -0
  316. data/examples/legacy/not_checked/shoes3-tests/gapp/title1.rb +34 -0
  317. data/examples/legacy/not_checked/shoes3-tests/indian.m4a +0 -0
  318. data/examples/legacy/not_checked/shoes3-tests/menus/event.rb +33 -0
  319. data/examples/legacy/not_checked/shoes3-tests/menus/menu1.rb +8 -0
  320. data/examples/legacy/not_checked/shoes3-tests/menus/menu2.rb +25 -0
  321. data/examples/legacy/not_checked/shoes3-tests/menus/menu3.rb +103 -0
  322. data/examples/legacy/not_checked/shoes3-tests/menus/menu4.rb +41 -0
  323. data/examples/legacy/not_checked/shoes3-tests/menus/tests.txt +42 -0
  324. data/examples/legacy/not_checked/shoes3-tests/opacity.rb +13 -0
  325. data/examples/legacy/not_checked/shoes3-tests/plot/^IRX.R +5219 -0
  326. data/examples/legacy/not_checked/shoes3-tests/plot/^SPX +5219 -0
  327. data/examples/legacy/not_checked/shoes3-tests/plot/cstest.rb +51 -0
  328. data/examples/legacy/not_checked/shoes3-tests/plot/gr1.rb +73 -0
  329. data/examples/legacy/not_checked/shoes3-tests/plot/gr2.rb +40 -0
  330. data/examples/legacy/not_checked/shoes3-tests/plot/gr3.rb +47 -0
  331. data/examples/legacy/not_checked/shoes3-tests/plot/gr4.rb +35 -0
  332. data/examples/legacy/not_checked/shoes3-tests/plot/gr5.rb +31 -0
  333. data/examples/legacy/not_checked/shoes3-tests/plot/gr6.rb +35 -0
  334. data/examples/legacy/not_checked/shoes3-tests/plot/gr7.rb +37 -0
  335. data/examples/legacy/not_checked/shoes3-tests/plot/grcsv.rb +219 -0
  336. data/examples/legacy/not_checked/shoes3-tests/plot/manual.rb +40 -0
  337. data/examples/legacy/not_checked/shoes3-tests/progress/progress.rb +29 -0
  338. data/examples/legacy/not_checked/shoes3-tests/radio/clear.rb +20 -0
  339. data/examples/legacy/not_checked/shoes3-tests/radio/group.rb +18 -0
  340. data/examples/legacy/not_checked/shoes3-tests/radio/multiple.rb +32 -0
  341. data/examples/legacy/not_checked/shoes3-tests/radio/nogroup.rb +9 -0
  342. data/examples/legacy/not_checked/shoes3-tests/simpletest.svg +14 -0
  343. data/examples/legacy/not_checked/shoes3-tests/spinner.rb +15 -0
  344. data/examples/legacy/not_checked/shoes3-tests/svg.rb +208 -0
  345. data/examples/legacy/not_checked/shoes3-tests/switch/switch.rb +28 -0
  346. data/examples/legacy/not_checked/shoes3-tests/systray/back.rb +20 -0
  347. data/examples/legacy/not_checked/shoes3-tests/systray/note.rb +17 -0
  348. data/examples/legacy/not_checked/shoes3-tests/terminal/cursor.rb +27 -0
  349. data/examples/legacy/not_checked/shoes3-tests/terminal/ed.rb +65 -0
  350. data/examples/legacy/not_checked/shoes3-tests/terminal/el.rb +50 -0
  351. data/examples/legacy/not_checked/shoes3-tests/terminal/logattr.rb +31 -0
  352. data/examples/legacy/not_checked/shoes3-tests/tests_color.rb +138 -0
  353. data/examples/legacy/not_checked/shoes3-tests/tests_svg.rb +228 -0
  354. data/examples/legacy/not_checked/shoes3-tests/tests_video_vlc.rb +186 -0
  355. data/examples/legacy/not_checked/shoes3-tests/tooltips.rb +20 -0
  356. data/examples/legacy/not_checked/shoes3-tests/video_vlc.rb +242 -0
  357. data/examples/legacy/not_checked/shoes3-tests/wheel/wheel1.rb +21 -0
  358. data/examples/legacy/not_checked/simple/accordion.rb +81 -0
  359. data/examples/legacy/not_checked/simple/anim-shapes.rb +17 -0
  360. data/examples/legacy/not_checked/simple/anim-text.rb +13 -0
  361. data/examples/legacy/not_checked/simple/arc.rb +23 -0
  362. data/examples/legacy/not_checked/simple/bounce.rb +24 -0
  363. data/examples/legacy/not_checked/simple/chipmunk.rb +26 -0
  364. data/examples/legacy/not_checked/simple/control-sizes.rb +24 -0
  365. data/examples/legacy/not_checked/simple/curve-control-points.rb +24 -0
  366. data/examples/legacy/not_checked/simple/curve.rb +26 -0
  367. data/examples/legacy/not_checked/simple/dialogs.rb +29 -0
  368. data/examples/legacy/not_checked/simple/downloader.rb +40 -0
  369. data/examples/legacy/not_checked/simple/downloader1.rb +31 -0
  370. data/examples/legacy/not_checked/simple/draw.rb +13 -0
  371. data/examples/legacy/not_checked/simple/editor.rb +28 -0
  372. data/examples/legacy/not_checked/simple/form.rb +30 -0
  373. data/examples/legacy/not_checked/simple/image.rb +21 -0
  374. data/examples/legacy/not_checked/simple/info.rb +78 -0
  375. data/examples/legacy/not_checked/simple/mask.rb +21 -0
  376. data/examples/legacy/not_checked/simple/mask2.rb +27 -0
  377. data/examples/legacy/not_checked/simple/menu.rb +31 -0
  378. data/examples/legacy/not_checked/simple/menu1.rb +35 -0
  379. data/examples/legacy/not_checked/simple/slide.rb +45 -0
  380. data/examples/legacy/not_checked/simple/sphere.rb +28 -0
  381. data/examples/legacy/not_checked/superleg.rb +244 -0
  382. data/examples/legacy/working/shoes-contrib/basic/a-poem.rb +24 -0
  383. data/examples/legacy/working/shoes-contrib/basic/basic-blocks-instances.rb +7 -0
  384. data/examples/legacy/working/shoes-contrib/basic/basic-blocks.rb +7 -0
  385. data/examples/legacy/working/shoes-contrib/basic/basic-slot.rb +8 -0
  386. data/examples/legacy/working/shoes-contrib/basic/intro.rb +20 -0
  387. data/examples/legacy/working/shoes-contrib/basic/two-column.rb +12 -0
  388. data/examples/legacy/working/shoes-contrib/elements/edit_box.rb +6 -0
  389. data/examples/legacy/working/shoes-contrib/kernel/alert.rb +3 -0
  390. data/examples/legacy/working/simple/calc.rb +71 -0
  391. data/examples/legacy/working/simple/sqlite3.rb +27 -0
  392. data/examples/legacy/working/simple/timer.rb +13 -0
  393. data/examples/line.rb +5 -0
  394. data/examples/link.rb +20 -0
  395. data/examples/list_box.rb +8 -0
  396. data/examples/local_fonts.rb +4 -0
  397. data/examples/local_images.rb +4 -0
  398. data/examples/motion_events.rb +20 -0
  399. data/examples/para/collection_of_arguments.rb +9 -0
  400. data/examples/para/hello_world.rb +5 -0
  401. data/examples/para/hide_and_show.rb +9 -0
  402. data/examples/para/rainbow.rb +11 -0
  403. data/examples/para/rainbow_2.rb +11 -0
  404. data/examples/para/sizes.rb +11 -0
  405. data/examples/para/sizes_2.rb +12 -0
  406. data/examples/para/strong.rb +3 -0
  407. data/examples/para_text_widgets.rb +4 -0
  408. data/examples/parse_xl_funnies.rb +58 -0
  409. data/examples/pirate.png +0 -0
  410. data/examples/raw_flow.rb +11 -0
  411. data/examples/ruby_racer.rb +50 -0
  412. data/examples/selfitude.rb +18 -0
  413. data/examples/shapes/arc.rb +8 -0
  414. data/examples/shapes/shapes.rb +8 -0
  415. data/examples/shapes/shapes_fill.rb +10 -0
  416. data/examples/shapes/star.rb +5 -0
  417. data/examples/shoes_school.rb +66 -0
  418. data/examples/shoes_splorer.rb +150 -0
  419. data/examples/simple_slides.rb +73 -0
  420. data/examples/skip_ci/parrot.rb +22 -0
  421. data/examples/skip_ci/say.rb +20 -0
  422. data/examples/sleepless.rb +26 -0
  423. data/examples/slots.rb +10 -0
  424. data/examples/spacing.rb +18 -0
  425. data/examples/span.rb +6 -0
  426. data/examples/stack/background.rb +35 -0
  427. data/examples/stack/border.rb +11 -0
  428. data/examples/stack/gradients.rb +6 -0
  429. data/examples/stack/raw_stack.rb +8 -0
  430. data/examples/stack/stack.rb +27 -0
  431. data/examples/text_change.rb +4 -0
  432. data/examples/text_sizes.rb +10 -0
  433. data/examples/timmy.rb +109 -0
  434. data/examples/title_and_resize.rb +3 -0
  435. data/examples/video.rb +10 -0
  436. data/exe/scarpe +107 -0
  437. data/fonts/Pacifico.ttf +0 -0
  438. data/lib/scarpe/alert.rb +19 -0
  439. data/lib/scarpe/arc.rb +49 -0
  440. data/lib/scarpe/background.rb +14 -0
  441. data/lib/scarpe/base64.rb +27 -0
  442. data/lib/scarpe/border.rb +16 -0
  443. data/lib/scarpe/button.rb +35 -0
  444. data/lib/scarpe/cats_cradle.rb +255 -0
  445. data/lib/scarpe/colors.rb +215 -0
  446. data/lib/scarpe/display_service.rb +185 -0
  447. data/lib/scarpe/document_root.rb +20 -0
  448. data/lib/scarpe/download.rb +123 -0
  449. data/lib/scarpe/edit_box.rb +29 -0
  450. data/lib/scarpe/edit_line.rb +25 -0
  451. data/lib/scarpe/fill.rb +23 -0
  452. data/lib/scarpe/flow.rb +18 -0
  453. data/lib/scarpe/font.rb +14 -0
  454. data/lib/scarpe/glibui/README.md +34 -0
  455. data/lib/scarpe/glibui/alert.rb +65 -0
  456. data/lib/scarpe/glibui/app.rb +27 -0
  457. data/lib/scarpe/glibui/background.rb +18 -0
  458. data/lib/scarpe/glibui/border.rb +22 -0
  459. data/lib/scarpe/glibui/button.rb +38 -0
  460. data/lib/scarpe/glibui/dimensions.rb +22 -0
  461. data/lib/scarpe/glibui/document_root.rb +33 -0
  462. data/lib/scarpe/glibui/edit_box.rb +44 -0
  463. data/lib/scarpe/glibui/edit_line.rb +43 -0
  464. data/lib/scarpe/glibui/flow.rb +33 -0
  465. data/lib/scarpe/glibui/html.rb +77 -0
  466. data/lib/scarpe/glibui/image.rb +36 -0
  467. data/lib/scarpe/glibui/link.rb +29 -0
  468. data/lib/scarpe/glibui/local_display.rb +62 -0
  469. data/lib/scarpe/glibui/para.rb +84 -0
  470. data/lib/scarpe/glibui/spacing.rb +41 -0
  471. data/lib/scarpe/glibui/stack.rb +33 -0
  472. data/lib/scarpe/glibui/text_widget.rb +30 -0
  473. data/lib/scarpe/glibui/widget.rb +81 -0
  474. data/lib/scarpe/glibui.rb +29 -0
  475. data/lib/scarpe/image.rb +35 -0
  476. data/lib/scarpe/libui/alert.rb +9 -0
  477. data/lib/scarpe/libui/button.rb +18 -0
  478. data/lib/scarpe/libui/colors.rb +157 -0
  479. data/lib/scarpe/libui/core.rb +66 -0
  480. data/lib/scarpe/libui/flow.rb +16 -0
  481. data/lib/scarpe/libui/libui.rb +45 -0
  482. data/lib/scarpe/libui/notepad.md +26 -0
  483. data/lib/scarpe/libui/para.rb +154 -0
  484. data/lib/scarpe/libui/stack.rb +34 -0
  485. data/lib/scarpe/line.rb +25 -0
  486. data/lib/scarpe/link.rb +25 -0
  487. data/lib/scarpe/list_box.rb +25 -0
  488. data/lib/scarpe/logger.rb +159 -0
  489. data/lib/scarpe/para.rb +92 -0
  490. data/lib/scarpe/promises.rb +405 -0
  491. data/lib/scarpe/shape.rb +20 -0
  492. data/lib/scarpe/slot.rb +7 -0
  493. data/lib/scarpe/spacing.rb +9 -0
  494. data/lib/scarpe/span.rb +26 -0
  495. data/lib/scarpe/stack.rb +20 -0
  496. data/lib/scarpe/star.rb +47 -0
  497. data/lib/scarpe/subscription_item.rb +60 -0
  498. data/lib/scarpe/unit_test_helpers.rb +236 -0
  499. data/lib/scarpe/version.rb +5 -0
  500. data/lib/scarpe/video.rb +15 -0
  501. data/lib/scarpe/widgets.rb +35 -0
  502. data/lib/scarpe/wv/alert.rb +65 -0
  503. data/lib/scarpe/wv/app.rb +104 -0
  504. data/lib/scarpe/wv/arc.rb +57 -0
  505. data/lib/scarpe/wv/background.rb +27 -0
  506. data/lib/scarpe/wv/border.rb +24 -0
  507. data/lib/scarpe/wv/button.rb +50 -0
  508. data/lib/scarpe/wv/control_interface.rb +147 -0
  509. data/lib/scarpe/wv/control_interface_test.rb +234 -0
  510. data/lib/scarpe/wv/dimensions.rb +22 -0
  511. data/lib/scarpe/wv/document_root.rb +8 -0
  512. data/lib/scarpe/wv/edit_box.rb +44 -0
  513. data/lib/scarpe/wv/edit_line.rb +43 -0
  514. data/lib/scarpe/wv/fill.rb +30 -0
  515. data/lib/scarpe/wv/flow.rb +24 -0
  516. data/lib/scarpe/wv/font.rb +36 -0
  517. data/lib/scarpe/wv/html.rb +108 -0
  518. data/lib/scarpe/wv/image.rb +41 -0
  519. data/lib/scarpe/wv/line.rb +38 -0
  520. data/lib/scarpe/wv/link.rb +29 -0
  521. data/lib/scarpe/wv/list_box.rb +50 -0
  522. data/lib/scarpe/wv/para.rb +90 -0
  523. data/lib/scarpe/wv/shape.rb +35 -0
  524. data/lib/scarpe/wv/shape_helper.rb +44 -0
  525. data/lib/scarpe/wv/slot.rb +81 -0
  526. data/lib/scarpe/wv/spacing.rb +41 -0
  527. data/lib/scarpe/wv/span.rb +66 -0
  528. data/lib/scarpe/wv/stack.rb +24 -0
  529. data/lib/scarpe/wv/star.rb +64 -0
  530. data/lib/scarpe/wv/subscription_item.rb +50 -0
  531. data/lib/scarpe/wv/text_widget.rb +30 -0
  532. data/lib/scarpe/wv/video.rb +42 -0
  533. data/lib/scarpe/wv/web_wrangler.rb +683 -0
  534. data/lib/scarpe/wv/webview_local_display.rb +73 -0
  535. data/lib/scarpe/wv/webview_relay_display.rb +185 -0
  536. data/lib/scarpe/wv/widget.rb +185 -0
  537. data/lib/scarpe/wv/wv_display_worker.rb +65 -0
  538. data/lib/scarpe/wv.rb +43 -0
  539. data/lib/scarpe/wv_local.rb +6 -0
  540. data/lib/scarpe/wv_relay.rb +6 -0
  541. data/lib/scarpe.rb +29 -0
  542. data/lib/shoes/app.rb +187 -0
  543. data/lib/shoes/constants.rb +26 -0
  544. data/lib/shoes/text_widget.rb +52 -0
  545. data/lib/shoes/widget.rb +209 -0
  546. data/lib/shoes.rb +65 -0
  547. data/logger/debug_web_wrangler.json +4 -0
  548. data/logger/scarpe_wv_test.json +4 -0
  549. data/scarpe-0.2.0.gem +0 -0
  550. data/scarpe.gemspec +44 -0
  551. data/scarpegen.rb +193 -0
  552. data/sig/scarpe.rbs +4 -0
  553. data/templates/basic_class_template.erb +38 -0
  554. data/templates/class_template_with_event_bind.erb +27 -0
  555. data/templates/class_template_with_shapes.erb +43 -0
  556. data/templates/example_template.erb +3 -0
  557. data/templates/module_template.erb +12 -0
  558. data/templates/webview_template.erb +27 -0
  559. metadata +606 -0
@@ -0,0 +1,3528 @@
1
+ # Hello!
2
+
3
+ Shoes is a tiny graphics toolkit. It's simple and straightforward. Shoes was
4
+ born to be easy! Really, it was made for absolute beginners. There's really
5
+ nothing to it.
6
+
7
+ You see, the trivial Shoes program can be just one line:
8
+
9
+ ```ruby
10
+ #!ruby
11
+ Shoes.app { button("Click me!") { alert("Good job.") } }
12
+ ```
13
+
14
+ Shoes programs are written in a language called Ruby. When Shoes is handed
15
+ this simple line of Ruby code, a window appears with a button inside reading
16
+ "Click me!" When the button is clicked, a message pops up.
17
+
18
+ On Linux, here's how this might look: ![man-shot1.png](man-shot1.png)
19
+
20
+ While lots of Shoes apps are graphical games and art programs, you can also
21
+ layout text and edit controls easily. ![shoes-manual-apps.gif](shoes-manual-apps.gif)
22
+
23
+ And, ideally, Shoes programs will run on any of the major platforms out there.
24
+ Microsoft Windows, Apple's Mac OS X, Linux and many others.
25
+
26
+ __So, welcome to Shoes' built-in manual. This manual is a Shoes program itself!__
27
+
28
+ ## Introducing Shoes
29
+
30
+ How does Shoes look on OS X and Windows? Does it really look okay? Is it all
31
+ ugly and awkward? People must immediately convulse! It must be so watered down
32
+ trying to do everything.
33
+
34
+ Well, before getting into the stuff about installing and running Shoes, time to
35
+ just check out some screenshots, to give you an idea of what you can do.
36
+
37
+ #### Mac OS X
38
+
39
+ Shoes runs on Apple Mac OS X Leopard, as well as Tiger. Shoes supports PowerPC
40
+ machines as well, however, there is no video support on that platform.
41
+ !man-look-tiger.png!
42
+
43
+ This is the `simple-sphere.rb` sample running on Tiger. Notice that the app
44
+ runs inside a normal OS X window border.
45
+
46
+ The whole sphere is drawn with blurred ovals and shadows. You can draw and
47
+ animate shapes and apply effects to those shapes in Shoes.
48
+
49
+ #### Windows
50
+
51
+ Shoes runs on all versions of `'Microsoft Windows XP`', `'Windows Vista`',
52
+ `'Windows 7`', and anything else `'Windows 2000`' compatible.
53
+ !man-look-vista.png!
54
+
55
+ Above is pictured the `simple-clock.rb` sample running on Windows Vista. This
56
+ example is also draws ovals and lines to build the clock, which is animated to
57
+ repaint itself several times each second.
58
+
59
+ Notice the text on the top of the app, showing the current time. Shoes has the
60
+ skills to layout words using any color, bold, italics, underlines, and supports
61
+ loading fonts from a file.
62
+
63
+ #### Linux
64
+
65
+ Here's a screenshot of the `simple-downloader.rb` sample running on `'Ubuntu
66
+ Linux`'. !man-look-ubuntu.png!
67
+
68
+ Notice the buttons and progress bars. These types of controls look different on
69
+ OS X and Windows. The text and links would look the same, though.
70
+
71
+ Shapes, text, images and videos all look the same on every platforms. However,
72
+ native controls (like edit lines and edit boxes) will match the look of the
73
+ window theme. Shoes will try to keep native controls all within the size you
74
+ give them, only the look will vary.
75
+
76
+ ## Installing Shoes
77
+
78
+ Okay, on to installing Shoes. I'm sure you're wondering: do I need to install
79
+ Ruby? Do I need to unzip anything? What commands do I need to type?
80
+
81
+ Nope. You don't need Ruby. You don't need WinZip. Nothing to type.
82
+
83
+ On most systems, starting Shoes is just a matter of running the installer and
84
+ clicking the Shoes icon. Shoes comes with everything built in. We'll talk
85
+ through all the steps, though, just to be clear about it.
86
+
87
+ #### Step 1: Installing Shoes
88
+
89
+ You'll want to visit [the site of Shoes](http://shoesrb.com/) to download
90
+ the Shoes installer. Usually, you'll just want one of the installers on the
91
+ downloads page of the site. !man-builds1.png!
92
+
93
+ Here's how to run the installer:
94
+
95
+ * On `'Mac OS X`', you'll have a file ending with `'.dmg`'. Double-click this file and a window should appear with a `'Shoes`' icon and an `'Applications`' folder. Following the arrow, drag the Shoes icon into the `'Applications`' folder. !man-intro-dmg.png!
96
+ * On `'Windows`', you'll download a `'.exe`' file. Double-click this file and follow the instructions. !man-intro-exe.png!
97
+ * On `'Linux`', you'll need to compile your own Shoes. Check out [this page](https://github.com/shoes/shoes/wiki/Building-Shoes-on-Linux) for more. We want to provide packages eventually!
98
+
99
+ #### Step 2: Start a New Text File
100
+
101
+ Shoes programs are just plain text files ending with a `'.rb`' extension.
102
+
103
+ Here are a few ways to create a blank text file:
104
+
105
+ * On `'Mac OS X`', visit your `'Applications`' folder and double-click on the `'TextEdit`' app. A blank editor window should come up. Now, go to the `'Format`' menu and select the `'Make Plain Text`' option. Okay, you're all set! !man-editor-osx.png!
106
+ * On `'Windows`', go to the Start menu. Select `'All Programs`', then `'Accessories`', then `'Notepad`'. !man-editor-notepad.png!
107
+ * On `'Linux`', most distros come with `'gedit`'. You might try running that. Or, if your distro is KDE-based, run `'kate`'.
108
+
109
+ Now, in your blank window, type in the following:
110
+
111
+ ```ruby
112
+ Shoes.app do
113
+ background "#DFA"
114
+ para "Welcome to Shoes"
115
+ end
116
+ ```
117
+
118
+ Save to your desktop as `welcome.rb`.
119
+
120
+ #### Step 3: Run It! Go Shoes!
121
+
122
+ To run your program:
123
+
124
+ * On `'Mac OS X`', visit your `'Applications`' folder again. This time, double-click the `'Shoes`' icon in that folder. You should see the red shoes icon appear in the dock. Drag your `welcome.rb` from the desktop on to that dock icon. !man-run-osx.png!
125
+ * On `'Windows`', get to the Start menu. Go into `'All Programs`', then `'Shoes`', then `'Shoes`'. A file selector box should come up. Browse to your desktop and select `welcome.rb`. Click `'OK`' and you're on your way. !man-run-xp.png! !man-run-vista.png!
126
+ * On `'Linux`', run Shoes just like you did in step one. You should see a file selector box. Browse to your desktop, select `welcome.rb` and hit `'OK`'.
127
+
128
+ So, not much of a program yet. But it's something! You've got the knack of it, at least!
129
+
130
+ #### What Can You Make With Shoes?
131
+
132
+ Well, you can make windowing applications. But Shoes is inspired by the web, so
133
+ applications tend to use images and text layout rather than a lot of widgets.
134
+ For example, Shoes doesn't come with tabbed controls or toolbars. Shoes is a
135
+ `tiny` toolkit, remember?
136
+
137
+ Still, Shoes does have a few widgets like buttons and edit boxes. And many
138
+ missing elements (like tabbed controls or toolbars) can be simulated with
139
+ images.
140
+
141
+ Shoes is written in part thanks to a very good art engine called Cairo, which
142
+ is used for drawing with shapes and colors. In this way, Shoes is inspired by
143
+ NodeBox and Processing, two very good languages for drawing animated graphics.
144
+
145
+ ## The Rules of Shoes
146
+
147
+ Time to stop guessing how Shoes works. Some of the tricky things will come
148
+ back to haunt you. I've boiled down the central rules to Shoes. These are the
149
+ things you MUST know to really make it all work.
150
+
151
+ These are general rules found throughout Shoes. While Shoes has an overall
152
+ philosophy of simplicity and clarity, there are a few points that need to be
153
+ studied and remembered.
154
+
155
+ #### Shoes Tricky Blocks
156
+
157
+ Okay, this is absolutely crucial. Shoes does a trick with blocks. This trick
158
+ makes everything easier to read. But it also can make blocks harder to use
159
+ once you're in deep.
160
+
161
+ `'Let's take a normal Ruby block:`'
162
+
163
+ ```ruby
164
+ ary = ['potion', 'swords', 'shields']
165
+ ary.each do |item|
166
+ puts item
167
+ end
168
+ ```
169
+
170
+ In Shoes, these sorts of blocks work the same. This block above loops through
171
+ the array and stores each object in the `item` variable. The `item` variable
172
+ disappears (goes out of scope) when the block ends.
173
+
174
+ One other thing to keep in mind is that `self` stays the same inside normal
175
+ Ruby blocks. Whatever `self` was before the call to `each`, it is the same
176
+ inside the `each` block.
177
+
178
+ `'Both of these things are also true for most Shoes blocks.`'
179
+
180
+ ```ruby
181
+ Shoes.app do
182
+ stack do
183
+ para "First"
184
+ para "Second"
185
+ para "Third"
186
+ end
187
+ end
188
+ ```
189
+
190
+ Here we have two blocks. The first block is sent to `Shoes.app`. This `app`
191
+ block changes `self`.
192
+
193
+ The other block is the `stack` block. That block does NOT change self.
194
+
195
+ `'For what reason does the `app` block change self?`' Let's start by
196
+ spelling out that last example completely.
197
+
198
+ ```ruby
199
+ Shoes.app do
200
+ self.stack do
201
+ self.para "First"
202
+ self.para "Second"
203
+ self.para "Third"
204
+ end
205
+ end
206
+ ```
207
+
208
+ All of the `self`s in the above example are the App object. Shoes uses Ruby's
209
+ `instance_eval` to change self inside the `app` block. So the method calls to
210
+ `stack` and `para` get sent to the app.
211
+
212
+ `'This also is why you can use instance variables throughout a Shoes app:`'
213
+
214
+ ```ruby
215
+ Shoes.app do
216
+ @s = stack do
217
+ @p1 = para "First"
218
+ @p2 = para "Second"
219
+ @p3 = para "Third"
220
+ end
221
+ end
222
+ ```
223
+
224
+ These instance variables will all end up inside the App object.
225
+
226
+ `'Whenever you create a new window, `self` is also changed.`' So, this means
227
+ the [[Element.window]] and [[Element.dialog]] methods, in addition to
228
+ Shoes.app.
229
+
230
+ ```ruby
231
+ Shoes.app title: "MAIN" do
232
+ para self
233
+ button "Spawn" do
234
+ window title: "CHILD" do
235
+ para self
236
+ end
237
+ end
238
+ end
239
+ ```
240
+
241
+ #### Block Redirection
242
+
243
+ The `stack` block is a different story, though. It doesn't change `self` and
244
+ it's basically a regular block.
245
+
246
+ `'But there's a trick:`' when you attach a `stack` and give it a block, the
247
+ App object places that stack in its memory. The stack gets popped off when the
248
+ block ends. So all drawing inside the block gets `'redirected`' from the
249
+ App's top slot to the new stack.
250
+
251
+ So those three `para`s will get drawn on the `stack`, even though they actually
252
+ get sent to the App object first.
253
+
254
+ ```ruby
255
+ Shoes.app do
256
+ stack do
257
+ para "First"
258
+ para "Second"
259
+ para "Third"
260
+ end
261
+ end
262
+ ```
263
+
264
+ A bit tricky, you see? This can bite you even if you know about it.
265
+
266
+ One way it'll get you is if you try to edit a stack somewhere else in your
267
+ program, outside the `app` block.
268
+
269
+ Like let's say you pass around a stack object. And you have a class that edits
270
+ that object.
271
+
272
+ ```ruby
273
+ class Messenger
274
+ def initialize(stack)
275
+ @stack = stack
276
+ end
277
+ def add(msg)
278
+ @stack.append do
279
+ para msg
280
+ end
281
+ end
282
+ end
283
+ ```
284
+
285
+ So, let's assume you pass the stack object into your Messenger class when the
286
+ app starts. And, later, when a message comes in, the `add` method gets used to
287
+ append a paragraph to that stack. Should work, right?
288
+
289
+ Nope, it won't work. The `para` method won't be found. The App object isn't
290
+ around any more. And it's the one with the `para` method.
291
+
292
+ Fortunately, each Shoes object has an `app` method that will let you reopen the
293
+ App object so you can do somefurther editing.
294
+
295
+ ```ruby
296
+ class Messenger
297
+ def initialize(stack)
298
+ @stack = stack
299
+ end
300
+ def add(msg)
301
+ @stack.app do
302
+ @stack.append do
303
+ para msg
304
+ end
305
+ end
306
+ end
307
+ end
308
+ ```
309
+
310
+ As you can imagine, the `app` method changes `self` to the App object.
311
+
312
+ So the rules here are:
313
+
314
+ 1. `'Methods named "app" or which create new windows alter `self` to the App
315
+ object.`'[[BR]](This is true for both Shoes.app and Slot.app, as well as
316
+ [[Element.window]] and [[Element.dialog]].)[[BR]]
317
+ 2. `'Blocks attached to stacks, flows or any manipulation method (such as
318
+ append) do not change self. Instead, they pop the slot on to the app's editing
319
+ stack.`'
320
+
321
+ #### Careful With Fixed Heights
322
+
323
+ Fixed widths on slots are great so you can split the window into columns.
324
+
325
+ ```ruby
326
+ Shoes.app do
327
+ flow do
328
+ stack width: 200 do
329
+ caption "Column one"
330
+ para "is 200 pixels wide"
331
+ end
332
+ stack width: -200 do
333
+ caption "Column two"
334
+ para "is 100% minus 200 pixels wide"
335
+ end
336
+ end
337
+ end
338
+ ```
339
+
340
+ Fixed heights on slots should be less common. Usually you want your text and
341
+ images to just flow down the window as far as they can. Height usually happens
342
+ naturally.
343
+
344
+ The important thing here is that fixed heights actually force slots to behave
345
+ differently. To be sure that the end of the slot is chopped off perfectly, the
346
+ slot becomes a `'nested window`'. A new layer is created by the operating
347
+ system to keep the slot in a fixed square.
348
+
349
+ One difference between normal slots and nested window slots is that the latter
350
+ can have scrollbars.
351
+
352
+ ```ruby
353
+ Shoes.app do
354
+ stack width: 200, height: 200, scroll: true do
355
+ background "#DFA"
356
+ 100.times do |i|
357
+ para "Paragraph No. #{i}"
358
+ end
359
+ end
360
+ end
361
+ ```
362
+
363
+ These nested windows require more memory. They tax the application a bit more.
364
+ So if you're experiencing some slowness with hundreds of fixed-height slots,
365
+ try a different approach.
366
+
367
+ #### Image and Shape Blocks
368
+
369
+ Most beginners start littering the window with shapes. It's just easier to
370
+ throw all your rectangles and ovals in a slot.
371
+
372
+ `'However, bear in mind that Shoes will create objects for all those
373
+ shapes!`'
374
+
375
+ ```ruby
376
+ Shoes.app do
377
+ fill black(0.1)
378
+ 100.times do |i|
379
+ oval i, i, i * 2
380
+ end
381
+ end
382
+ ```
383
+
384
+ In this example, one-hundred Oval objects are created. This isn't too bad.
385
+ But things would be slimmer if we made these into a single shape.
386
+
387
+ ```ruby
388
+ Shoes.app do
389
+ fill black(0.1)
390
+ shape do
391
+ 100.times do |i|
392
+ oval i, i, i * 2
393
+ end
394
+ end
395
+ end
396
+ ```
397
+
398
+ Oh, wait. The ovals aren't filled in this time! That's because the ovals have
399
+ been combined into a single huge shape. And Shoes isn't sure where to fill in
400
+ this case.
401
+
402
+ So you usually only want to combine into a single shape when you're dealing
403
+ strictly with outlines.
404
+
405
+ Another option is to combine all those ovals into a single image.
406
+
407
+ ```ruby
408
+ Shoes.app do
409
+ fill black(0.1)
410
+ image 300, 300 do
411
+ 100.times do |i|
412
+ oval i, i, i * 2
413
+ end
414
+ end
415
+ end
416
+ ```
417
+
418
+ There we go! The ovals are all combined into a single 300 x 300 pixel image.
419
+ In this case, storing that image in memory might be much bigger than having
420
+ one-hundred ovals around. But when you're dealing with thousands of shapes,
421
+ the image block can be cheaper.
422
+
423
+ The point is: it's easy to group shapes together into image or shape blocks, so
424
+ give it a try if you're looking to gain some speed. Shape blocks particularly
425
+ will save you some memory and speed.
426
+
427
+ #### UTF-8 Everywhere
428
+
429
+ Ruby itself isn't Unicode aware. And UTF-8 is a type of Unicode. (See
430
+ [Wikipedia](http://en.wikipedia.org/wiki/UTF-8) for a full explanation of
431
+ UTF-8.)
432
+
433
+ However, UTF-8 is common on the web. And lots of different platforms support
434
+ it. So to cut down on the amount of conversion that Shoes has to do, Shoes
435
+ expects all strings to be in UTF-8 format.
436
+
437
+ This is great because you can show a myriad of languages (Russian, Japanese,
438
+ Spanish, English) using UTF-8 in Shoes. Just be sure that your text editor
439
+ uses UTF-8!
440
+
441
+ To illustrate:
442
+
443
+ ```ruby
444
+ Shoes.app do
445
+ stack margin: 10 do
446
+ @edit = edit_box width: 1.0 do
447
+ @para.text = @edit.text
448
+ end
449
+ @para = para ""
450
+ end
451
+ end
452
+ ```
453
+
454
+ This app will copy anything you paste into the edit box and display it in a
455
+ Shoes paragraph. You can try copying some foreign text (such as Greek or
456
+ Japanese) into this box to see how it displays.
457
+
458
+ This is a good test because it proves that the edit box gives back UTF-8
459
+ characters. And the paragraph can be set to any UTF-8 characters.
460
+
461
+ `'Important note:`' if some UTF-8 characters don't display for you, you will
462
+ need to change the paragraph's font. This is especially common on OS X.
463
+
464
+ So, a good Japanese font on OS X is `'AppleGothic`' and on Windows is `'MS
465
+ UI Gothic`'.
466
+
467
+ ```ruby
468
+ Shoes.app do
469
+ para "てすと (te-su-to)", font: case RUBY_PLATFORM
470
+ when /mingw/; "MS UI Gothic"
471
+ when /darwin/; "AppleGothic, Arial"
472
+ else "Arial"
473
+ end
474
+ end
475
+ ```
476
+
477
+ Again, anything which takes a string in Shoes will need a UTF-8 string. Edit
478
+ boxes, edit lines, list boxes, window titles and text blocks all take UTF-8. If
479
+ you give a string with bad characters in it, an error will show up in the
480
+ console.
481
+
482
+ #### The Main App and Its Requires
483
+
484
+ `'NOTE:`' This rule is for Raisins. Policeman uses TOPLEVEL_BINDING. So, you
485
+ can get `main`, Ruby top-level object, with the first snippet. Although you
486
+ need to use `Shoes::Para` instead of `Para` outside `Shoes.app` block.
487
+
488
+ Each Shoes app is given a little room where it can create itself. You can
489
+ create classes and set variables and they won't be seen by other Shoes
490
+ programs. Each program runs inside its own anonymous class.
491
+
492
+ ```ruby
493
+ main = self
494
+ Shoes.app do
495
+ para main.to_s
496
+ end
497
+ ```
498
+
499
+ This anonymous class is called `(shoes)` and it's just an empty, unnamed class.
500
+ The `Shoes` module is mixed into this class (using `include Shoes`) so that you
501
+ can use either `Para` or `Shoes::Para` when referring to the paragraph class.
502
+
503
+ The advantages of this approach are:
504
+
505
+ * Shoes apps cannot share local variables.
506
+ * Classes created in the main app code are temporary.
507
+ * The Shoes module can be mixed in to the anonymous class, but not the top-level environment of Ruby itself.
508
+ * Garbage collection can clean up apps entirely once they complete.
509
+
510
+ The second part is especially important to remember.
511
+
512
+ ```ruby
513
+ class Storage; end
514
+
515
+ Shoes.app do
516
+ para Storage.new
517
+ end
518
+ ```
519
+
520
+ The `Storage` class will disappear once the app completes. Other apps aren't
521
+ able to use the Storage class. And it can't be gotten to from files that are
522
+ loaded using `require`.
523
+
524
+ When you `require` code, though, that code will stick around. It will be kept
525
+ in the Ruby top-level environment.
526
+
527
+ So, the rule is: `'keep your temporary classes in the code with the app and
528
+ keep your permanent classes in requires.`'
529
+
530
+ # Shoes
531
+
532
+ Shoes is all about drawing windows and the stuff inside those windows. Let's
533
+ focus on the window itself, for now. The other sections [[Slots]] and
534
+ [[Elements]] cover everything that goes inside the window.
535
+
536
+ For here on, the manual reads more like a dictionary. Each page is mostly a
537
+ list of methods you can use for each topic covered. The idea is to be very
538
+ thorough and clear about everything.
539
+
540
+ So, if you've hit this far in the manual and you're still hazy about getting
541
+ started, you should probably either go back to the [[Hello! beginning]] of the
542
+ manual. Or you could try [Nobody Knows Shoes](https://github.com/downloads/shoes/shoes/nks.pdf), the beginner's leaflet PDF.
543
+
544
+ #### Finding Your Way
545
+
546
+ This section covers:
547
+
548
+ * [[Built-in Built-in methods]] - general methods available anywhere in a Shoes program.
549
+ * [[App The App window]] - methods found attached to every main Shoes window.
550
+ * [[Styles The Styles Master List]] - a complete list of every style in Shoes.
551
+ * [[Classes The Classes list]] - a chart showing what Shoes classes subclass what.
552
+ * [[Colors The Colors list]] - a chart of all built-in colors and the [[Built-in.rgb]] numbers for each.
553
+
554
+ If you find yourself paging around a lot and not finding something, give the
555
+ [[Search]] page a try. It's the quickest way to get around.
556
+
557
+ After this general reference, there are two other more specific sections:
558
+
559
+ * [[Slots]] - covering [[Element.stack]] and [[Element.flow]], the two types of slots.
560
+ * [[Elements]] - documentation for all the buttons, shapes, images, and so on.
561
+
562
+ Two really important pages in there are the [[Element Element Creation]] page
563
+ (which lists all the elements you can add) and the [[Common Common Methods]]
564
+ page (which lists methods you'll find on any slot or element.)
565
+
566
+ ## Built-in Methods
567
+
568
+ These methods can be used anywhere throughout Shoes programs.
569
+
570
+ All of these commands are unusual because you don't attach them with a dot.
571
+ `'Every other method in this manual must be attached to an object with a dot.`'
572
+ But these are built-in methods (also called: Kernel methods.) Which means no dot!
573
+
574
+ A common one is `alert`:
575
+
576
+ ```ruby
577
+ #!ruby
578
+ alert "No dots in sight"
579
+ ```
580
+
581
+ Compare that to the method `reverse`, which isn't a Kernel method and is only
582
+ available for Arrays and Strings:
583
+
584
+ ```ruby
585
+ #!ruby
586
+ "Plaster of Paris".reverse
587
+ #=> "siraP fo retsalP"
588
+ [:dogs, :cows, :snakes].reverse
589
+ #=> [:snakes, :cows, :dogs]
590
+ ```
591
+
592
+ Most Shoes methods for drawing and making buttons and so on are attached to
593
+ slots. See the section on [[Slots]] for more.
594
+
595
+ #### Built-in Constants
596
+
597
+ Shoes also has a handful of built-in constants which may prove useful if you
598
+ are trying to sniff out what release of Shoes is running.
599
+
600
+ `'Shoes::RELEASE_NAME`' contains a string with the name of the Shoes release.
601
+ All Shoes releases are named, starting with Curious.
602
+
603
+ `'Shoes::RELEASE_ID`' contains a number representing the Shoes release. So,
604
+ for example, Curious is number 1, as it was the first official release.
605
+
606
+ `'Shoes::REVISION`' is the Subversion revision number for this build.
607
+
608
+ `'Shoes::FONTS`' is a complete list of fonts available to the app. This list
609
+ includes any fonts loaded by the [[Built-in.font]] method.
610
+
611
+ ### alert(message: a string) » nil
612
+
613
+ Pops up a window containing a short message.
614
+
615
+ ```ruby
616
+ #!ruby
617
+ alert("I'm afraid I must interject!")
618
+ ```
619
+
620
+ Please use alerts sparingly, as they are incredibly annoying! If you are using
621
+ alerts to show messages to help you debug your program, try checking out the
622
+ [[Built-in.debug]] or [[Built-in.info]] methods.
623
+
624
+ ### ask(message: a string) » a string
625
+
626
+ Pops up a window and asks a question. For example, you may want to ask someone
627
+ their name.
628
+
629
+ ```ruby
630
+ #!ruby
631
+ name = ask("Please, enter your name:")
632
+ ```
633
+
634
+ When the above script is run, the person at the computer will see a window with
635
+ a blank box for entering their name. The name will then be saved in the `name`
636
+ variable.
637
+
638
+ ### ask_color(title: a string) » Shoes::Color
639
+
640
+ Pops up a color picker window. The program will wait for a color to be picked,
641
+ then gives you back a Color object. See the `Color` help for some ways you can
642
+ use this color.
643
+
644
+ ```ruby
645
+ #!ruby
646
+ backcolor = ask_color("Pick a background")
647
+ Shoes.app do
648
+ background backcolor
649
+ end
650
+ ```
651
+
652
+ ### ask_open_file() » a string
653
+
654
+ Pops up an "Open file..." window. It's the standard window which shows all of
655
+ your folders and lets you select a file to open. Hands you back the name of the
656
+ file.
657
+
658
+ ```ruby
659
+ #!ruby
660
+ filename = ask_open_file
661
+ Shoes.app do
662
+ para File.read(filename)
663
+ end
664
+ ```
665
+
666
+ ### ask_save_file() » a string
667
+
668
+ Pops up a "Save file..." window, similiar to `ask_open_file`, described
669
+ previously.
670
+
671
+ ```ruby
672
+ #!ruby
673
+ save_as = ask_save_file
674
+ ```
675
+
676
+ ### ask_open_folder() » a string
677
+
678
+ Pops up an "Open folder..." window. It's the standard window which shows all of
679
+ your folders and lets you select a folder to open. Hands you back the name of
680
+ the folder.
681
+
682
+ ```ruby
683
+ #!ruby
684
+ folder = ask_open_folder
685
+ Shoes.app do
686
+ para Dir.entries(folder)
687
+ end
688
+ ```
689
+
690
+ ### ask_save_folder() » a string
691
+
692
+ Pops up a "Save folder..." window, similiar to `ask_open_folder`, described
693
+ previously. On OS X, this method currently behaves like an alias of
694
+ `ask_open_folder`.
695
+
696
+ ```ruby
697
+ #!ruby
698
+ save_to = ask_save_folder
699
+ ```
700
+
701
+
702
+ ### confirm(question: a string) » true or false
703
+
704
+ Pops up a yes-or-no question. If the person at the computer, clicks `'yes`',
705
+ you'll get back a `true`. If not, you'll get back `false`.
706
+
707
+ ```ruby
708
+ #!ruby
709
+ if confirm("Draw a circle?")
710
+ Shoes.app{ oval top: 0, left: 0, radius: 50 }
711
+ end
712
+ ```
713
+
714
+ ### debug(message: a string) » nil
715
+
716
+ Sends a debug message to the Shoes console. You can bring up the Shoes console
717
+ by pressing `Alt-/` on any Shoes window (or `⌘-/` on OS X.)
718
+
719
+ ```ruby
720
+ #!ruby
721
+ debug("Running Shoes on " + RUBY_PLATFORM)
722
+ ```
723
+
724
+ Also check out the [[Built-in.error]], [[Built-in.warn]] and [[Built-in.info]]
725
+ methods.
726
+
727
+ ### error(message: a string) » nil
728
+
729
+ Sends an error message to the Shoes console. This method should only be used
730
+ to log errors. Try the [[Built-in.debug]] method for logging messages to
731
+ yourself.
732
+
733
+ Oh, and, rather than a string, you may also hand exceptions directly to this
734
+ method and they'll be formatted appropriately.
735
+
736
+ ### exit()
737
+
738
+ Stops your program. Call this anytime you want to suddenly call it quits.
739
+
740
+ `'PLEASE NOTE:`' If you need to use Ruby's own `exit` method (like in a
741
+ forked Ruby process,) call `Kernel.exit`.
742
+
743
+ ### font(message: a string) » an array of font family names
744
+
745
+ Loads a TrueType (or other type of font) from a file. While TrueType is
746
+ supported by all platforms, your platform may support other types of fonts.
747
+ Shoes uses each operating system's built-in font system to make this work.
748
+
749
+ Here's a rough idea of what fonts work on which platforms:
750
+
751
+ * Bitmap fonts (.bdf, .pcf, .snf) - Linux
752
+ * Font resource (.fon) - Windows
753
+ * Windows bitmap font file (.fnt) - Linux, Windows
754
+ * PostScript OpenType font (.otf) - Mac OS X, Linux, Windows
755
+ * Type1 multiple master (.mmm) - Windows
756
+ * Type1 font bits (.pfb) - Linux, Windows
757
+ * Type1 font metrics (.pfm) - Linux, Windows
758
+ * TrueType font (.ttf) - Mac OS X, Linux, Windows
759
+ * TrueType collection (.ttc) - Mac OS X, Linux, Windows
760
+
761
+ If the font is properly loaded, you'll get back an array of font names found in
762
+ the file. Otherwise, `nil` is returned if no fonts were found in the file.
763
+
764
+ Also of interest: the `Shoes::FONTS` constant is a complete list of fonts
765
+ available to you on this platform. You can check for a certain font by using
766
+ `include?`.
767
+
768
+ ```ruby
769
+ if Shoes::FONTS.include? "Helvetica"
770
+ alert "Helvetica is available on this system."
771
+ else
772
+ alert "You do not have the Helvetica font."
773
+ end
774
+ ```
775
+
776
+ If you have trouble with fonts showing up, make sure your app loads the font
777
+ before it is used. Especially on OS X, if fonts are used before they are
778
+ loaded, the font cache will tend to ignore loaded fonts.
779
+
780
+ ### gradient(color1, color2) » Shoes::Pattern
781
+
782
+ Builds a linear gradient from two colors. For each color, you may pass in a
783
+ Shoes::Color object or a string describing the color.
784
+
785
+ ### gray(the numbers: darkness, alpha) » Shoes::Color
786
+
787
+ Create a grayscale color from a level of darkness and, optionally, an alpha
788
+ level.
789
+
790
+ ```ruby
791
+ black = gray(0.0)
792
+ white = gray(1.0)
793
+ ```
794
+
795
+ ### info(message: a string) » nil
796
+
797
+ Logs an informational message to the user in the Shoes console. So, where
798
+ debug messages are designed to help the program figure out what's happening,
799
+ `info` messages tell the user extra information about the program.
800
+
801
+ ```ruby
802
+ #!ruby
803
+
804
+ info("You just ran the info example on Shoes #{Shoes::RELEASE_NAME}.")
805
+ ```
806
+
807
+ For example, whenever a Shy file loads, Shoes prints an informational message
808
+ in the console describing the author of the Shy and its version.
809
+
810
+ ### rgb(a series of numbers: red, green, blue, alpha) » Shoes::Color
811
+
812
+ Create a color from red, green and blue components. An alpha level (indicating
813
+ transparency) can also be added, optionally.
814
+
815
+ When passing in a whole number, use values from 0 to 255.
816
+
817
+ ```ruby
818
+ blueviolet = rgb(138, 43, 226)
819
+ darkgreen = rgb(0, 100, 0)
820
+ ```
821
+
822
+ Or, use a decimal number from 0.0 to 1.0.
823
+
824
+ ```ruby
825
+ blueviolet = rgb(0.54, 0.17, 0.89)
826
+ darkgreen = rgb(0, 0.4, 0)
827
+ ```
828
+
829
+ This method may also be called as `Shoes.rgb`.
830
+
831
+ ### warn(message: a string) » nil
832
+
833
+ Logs a warning for the user. A warning is not a catastrophic error (see
834
+ [[Built-in.error]] for that.) It is just a notice that the program will be
835
+ changing in the future or that certain parts of the program aren't reliable
836
+ yet.
837
+
838
+ To view warnings and errors, open the Shoes console with `Alt-/` (or `⌘-/` on
839
+ OS X.)
840
+
841
+ ## The App Object
842
+
843
+ An App is a single window running code at a URL. When you switch URLs, a new
844
+ App object is created and filled up with stacks, flows and other Shoes
845
+ elements.
846
+
847
+ The App is the window itself. Which may be closed or cleared and filled with
848
+ new elements. ![man-app.png](man-app.png)
849
+
850
+ The App itself, in slot/box terminology, is a flow. See the `Slots` section
851
+ for more, but this just means that any elements placed directly at the
852
+ top-level will flow.
853
+
854
+ ### Shoes.app(styles) { ... } » Shoes::App
855
+
856
+ Starts up a Shoes app window. This is the starting place for making a Shoes
857
+ program. Inside the block, you fill the window with various Shoes elements
858
+ (buttons, artwork, etc.) and, outside the block, you use the `styles` to
859
+ describe how big the window is. Perhaps also the name of the app or if it's
860
+ resizable.
861
+
862
+ ```ruby
863
+ #!ruby
864
+ Shoes.app(title: "White Circle",
865
+ width: 200, height: 200, resizable: false) {
866
+ background black
867
+ fill white
868
+ oval top: 20, left: 20, radius: 160
869
+ }
870
+ ```
871
+
872
+ In the case above, a small window is built. 200 pixels by 200 pixels. It's
873
+ not resizable. And, inside the window, two elements: a black background and a
874
+ white circle.
875
+
876
+ Once an app is created, it is added to the [[App.Shoes.APPS]] list. If you
877
+ want an app to spawn more windows, see the [[Element.window]] method and the
878
+ [[Element.dialog]] method.
879
+
880
+ ### Shoes.APPS() » An array of Shoes::App objects
881
+
882
+ Builds a complete list of all the Shoes apps that are open right now. Once an
883
+ app is closed, it is removed from the list. Yes, you can run many apps at once
884
+ in Shoes. It's completely encouraged.
885
+
886
+ ### clipboard() » a string
887
+
888
+ Returns a string containing all of the text that's on the system clipboard.
889
+ This is the global clipboard that every program on the computer cuts and pastes
890
+ into.
891
+
892
+ ### clipboard = a string
893
+
894
+ Stores `a string` of text in the system clipboard.
895
+
896
+ ### close()
897
+
898
+ Closes the app window. If multiple windows are open and you want to close the
899
+ entire application, use the built-in method `exit`.
900
+
901
+ ### download(url: a string, styles)
902
+
903
+ Starts a download thread (much like XMLHttpRequest, if you're familiar with
904
+ JavaScript.) This method returns immediately and runs the download in the
905
+ background. Each download thread also fires `start`, `progress` and `finish`
906
+ events. You can send the download to a file or just get back a string (in the
907
+ `finish` event.)
908
+
909
+ If you attach a block to a download, it'll get called as the `finish` event.
910
+
911
+ ```ruby
912
+ #!ruby
913
+ Shoes.app do
914
+ stack do
915
+ title "Searching Google", size: 16
916
+ @status = para "One moment..."
917
+
918
+ # Search Google for 'shoes' and print the HTTP headers
919
+ download "http://www.google.com/search?q=shoes" do |goog|
920
+ @status.text = "Headers: " + goog.response.headers.inspect
921
+ end
922
+ end
923
+ end
924
+ ```
925
+
926
+ And, if we wanted to use the downloaded data, we'd get it using
927
+ `goog.response.body`. This example is truly the simplest form of `download`:
928
+ pulling some web data down into memory and handling it once it's done.
929
+
930
+ Another simple use of `download` is to save some web data to a file, using the
931
+ `:save` style.
932
+
933
+ ```ruby
934
+ #!ruby
935
+ Shoes.app do
936
+ stack do
937
+ title "Downloading Google image", size: 16
938
+ @status = para "One moment..."
939
+
940
+ download "http://www.google.com/logos/nasa50th.gif",
941
+ save: "nasa50th.gif" do
942
+ @status.text = "Okay, is downloaded."
943
+ end
944
+ end
945
+ end
946
+ ```
947
+
948
+ In this case, you can still get the headers for the downloaded file, but
949
+ `response.body` will be `nil`, since the data wasn't saved to memory. You will
950
+ need to open the file to get the downloaded goods.
951
+
952
+ If you need to send certain headers or actions to the web server, you can use
953
+ the `:method`, `:headers` and `:body` styles to customize the HTTP request.
954
+ (And, if you need to go beyond these, you can always break out Ruby's OpenURI
955
+ class.)
956
+
957
+ ```ruby
958
+ #!ruby
959
+ Shoes.app do
960
+ stack do
961
+ title "GET Google", size: 16
962
+ @status = para "One moment..."
963
+
964
+ download "http://www.google.com/search?q=shoes",
965
+ method: "GET" do |dump|
966
+ @status.text = dump.response.body
967
+ end
968
+ end
969
+ end
970
+ ```
971
+
972
+ As you can see from the above example, Shoes makes use of the "GET" method to
973
+ query google's search engine.
974
+
975
+ ### location() » a string
976
+
977
+ Gets a string containing the URL of the current app.
978
+
979
+ ### mouse() » an array of numbers: button, left, top
980
+
981
+ Identifies the mouse cursor's location, along with which button is being
982
+ pressed.
983
+
984
+ ```ruby
985
+ #!ruby
986
+ Shoes.app do
987
+ @p = para
988
+ animate do
989
+ button, left, top = self.mouse
990
+ @p.replace "mouse: #{button}, #{left}, #{top}"
991
+ end
992
+ end
993
+ ```
994
+
995
+ ### owner() » Shoes::App
996
+
997
+ Gets the app which launched this app. In most cases, this will be `nil`. But
998
+ if this app was launched using the [[Element.window]] method, the owner will be
999
+ the app which called `window`.
1000
+
1001
+ ### started?() » true or false
1002
+
1003
+ Has the window been fully constructed and displayed? This is useful for
1004
+ threaded code which may try to use the window before it is completely built.
1005
+ (Also see the `start` event which fires once the window is open.)
1006
+
1007
+ ### visit(url: a string)
1008
+
1009
+ Changes the location, in order to view a different Shoes URL.
1010
+
1011
+ Absolute URLs (such as http://google.com) are okay, but Shoes will be expecting
1012
+ a Shoes application to be at that address. (So, google.com won't work, as it's
1013
+ an HTML app.)
1014
+
1015
+ ## The Styles Master List
1016
+
1017
+ You want to mess with the look of things? Well, throughout Shoes, styles are
1018
+ used to change the way elements appear. In some cases, you can even style an
1019
+ entire class of elements. (Like giving all paragraphs a certain font.)
1020
+
1021
+ Styles are easy to spot. They usually show up when the element is created.
1022
+
1023
+ ```ruby
1024
+ Shoes.app title: "A Styling Sample" do
1025
+ para "Red with an underline", stroke: red, underline: "single"
1026
+ end
1027
+ ```
1028
+
1029
+ Here we've got a `:title` style on the app. And on the paragraph inside the
1030
+ app, a red `:stroke` style and an `:underline` style.
1031
+
1032
+ The style hash can also be changed by using the [[Common.style]] method,
1033
+ available on every element and slot.
1034
+
1035
+ ```ruby
1036
+ Shoes.app title: "A Styling Sample" do
1037
+ @text = para "Red with an underline"
1038
+ @text.style(stroke: red, underline: "single")
1039
+ end
1040
+ ```
1041
+
1042
+ Most styles can also be set by calling them as methods. (I'd use the manual
1043
+ search to find the method.)
1044
+
1045
+ ```ruby
1046
+ Shoes.app title: "A Styling Sample" do
1047
+ @text = para "Red with an underline"
1048
+ @text.stroke = red
1049
+ @text.underline = "single"
1050
+ end
1051
+ ```
1052
+
1053
+ Rather than making you plow through the whole manual to figure out what styles
1054
+ go where, this helpful page speeds through every style in Shoes and suggests
1055
+ where that style is used.
1056
+
1057
+ ### :align » a string
1058
+
1059
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1060
+ strong, sub, sup, subtitle, tagline, title`
1061
+
1062
+ The alignment of the text. It is either:
1063
+
1064
+ * "left" - Align the text to the left.
1065
+ * "center" - Align the text in the center.
1066
+ * "right" - Align the text to the right.
1067
+
1068
+ ### :angle » a number
1069
+
1070
+ For: `background, border, gradient`.
1071
+
1072
+ The angle at which to apply a gradient. Normally, gradient colors range from
1073
+ top to bottom. If the `:angle` is set to 90, the gradient will rotate 90
1074
+ degrees counter-clockwise and the gradient will go from left to right.
1075
+
1076
+ ### :attach » a slot or element
1077
+
1078
+ For: `flow, stack`.
1079
+
1080
+ Pins a slot relative to another slot or element. Also, one may write `attach: Window` to position the slot at the window's top, left corner. Taking this
1081
+ a bit further, the style `top: 10, left: 10, attach: Window` would
1082
+ place the slot at (10, 10) in the window's coordinates.
1083
+
1084
+ If a slot is attached to an element that moves, the slot will move with it. If
1085
+ the attachment is reset to `nil`, the slot will flow in with the other objects
1086
+ that surround, as normal.
1087
+
1088
+ ### :autoplay » true or false
1089
+
1090
+ For: `video`.
1091
+
1092
+ Should this video begin playing after it appears? If set to `true`, the video
1093
+ will start without asking the user.
1094
+
1095
+ ### :bottom » a number
1096
+
1097
+ For: `all slots and elements`.
1098
+
1099
+ Sets the pixel coordinate of an element's lower edge. The edge is placed
1100
+ relative to its container's lower edge. So, `bottom: 0` will align the
1101
+ element so that its bottom edge and the bottom edge of its slot touch.
1102
+
1103
+ ### :cap » :curve or :rect or :project
1104
+
1105
+ For: `arc, arrow, border, flow, image, mask, rect, star, shape, stack`.
1106
+
1107
+ Sets the shape of the line endpoint, whether curved or square. See the
1108
+ [[Art.cap]] method for more explanation.
1109
+
1110
+ ### :center » true or false
1111
+
1112
+ For: `arc, image, oval, rect, shape`.
1113
+
1114
+ Indicates whether the `:top` and `:left` coordinates refer to the center of the
1115
+ shape or not. If set to `true`, this is similar to setting the
1116
+ [[Art.transform]] method to `:center`.
1117
+
1118
+ ### :change » a proc
1119
+
1120
+ For: `edit_box, edit_line, list_box`.
1121
+
1122
+ The `change` event handler is stored in this style. See the [[EditBox.change]]
1123
+ method for the edit_box, as an example.
1124
+
1125
+ ### :checked » true or false
1126
+
1127
+ For: `check, radio`.
1128
+
1129
+ Is this checkbox or radio button checked? If set to `true`, the box is
1130
+ checked. Also see the [[Check.checked=]] method.
1131
+
1132
+ ### :choose » a string
1133
+
1134
+ For: `list_box`.
1135
+
1136
+ Sets the currently chosen item in the list. More information at
1137
+ [[ListBox.choose]].
1138
+
1139
+ ### :click » a proc
1140
+
1141
+ For: `arc, arrow, banner, button, caption, check, flow, image, inscription,
1142
+ line, link, mask, oval, para, radio, rect, shape, stack, star, subtitle,
1143
+ tagline, title`.
1144
+
1145
+ The `click` event handler is stored in this style. See the [[Events.click]]
1146
+ method for a description.
1147
+
1148
+ ### :curve » a number
1149
+
1150
+ For: `background, border, rect`.
1151
+
1152
+ The radius of curved corners on each of these rectangular elements. As an
1153
+ example, if this is set to 6, the corners of the rectangle are given a curve
1154
+ with a 6-pixel radius.
1155
+
1156
+ ### :displace_left » a number
1157
+
1158
+ For: `all slots and elements`.
1159
+
1160
+ Moves a shape, text block or any other kind of object to the left or right. A
1161
+ positive number displaces to the right by the given number of pixels; a
1162
+ negative number displaces to the left. Displacing an object doesn't effect the
1163
+ actual layout of the page. Before using this style, be sure to read the
1164
+ [[Position.displace]] docs, since its behavior can be a bit surprising.
1165
+
1166
+ ### :displace_top » a number
1167
+
1168
+ For: `all slots and elements`.
1169
+
1170
+ Moves a shape, text block or any other kind of object up or down. A positive
1171
+ number moves the object down by this number of pixels; a negative number moves
1172
+ it up. Displacing doesn't effect the actual layout of the page or the object's
1173
+ true coordinates. Read the [[Position.displace]] docs, since its behavior can
1174
+ be a bit surprising.
1175
+
1176
+ ### :emphasis » a string
1177
+
1178
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1179
+ strong, sub, sup, subtitle, tagline, title`.
1180
+
1181
+ Styles the text with an emphasis (commonly italicized.)
1182
+
1183
+ This style recognizes three possible settings:
1184
+
1185
+ * "normal" - the font is upright.
1186
+ * "oblique" - the font is slanted, but in a roman style.
1187
+ * "italic" - the font is slanted in an italic style.
1188
+
1189
+ ### :family » a string
1190
+
1191
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1192
+ strong, sub, sup, subtitle, tagline, title`.
1193
+
1194
+ Styles the text with a given font family. The string should contain the family
1195
+ name or a comma-separated list of families.
1196
+
1197
+ ### :fill » a hex code, a Shoes::Color or a range of either
1198
+
1199
+ For: `arc, arrow, background, banner, caption, code, del, em, flow, image,
1200
+ ins, inscription, line, link, mask, oval, para, rect, shape, span, stack, star,
1201
+ strong, sub, sup, subtitle, tagline, title`.
1202
+
1203
+ The color of the background pen. For shapes, this is the fill color, the paint
1204
+ inside the shape. For text stuffs, this color is painted in the background (as
1205
+ if marked with a highlighter pen.)
1206
+
1207
+ ### :font » a string
1208
+
1209
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1210
+ strong, sub, sup, subtitle, tagline, title`.
1211
+
1212
+ Styles the text with a font description. The string is pretty flexible, but
1213
+ can take the form "[FAMILY-LIST] [STYLE-OPTIONS] [SIZE]", where FAMILY-LIST is
1214
+ a comma separated list of families optionally terminated by a comma,
1215
+ STYLE_OPTIONS is a whitespace separated list of words where each WORD describes
1216
+ one of style, variant, weight, stretch, or gravity, and SIZE is a decimal
1217
+ number (size in points) or optionally followed by the unit modifier "px" for
1218
+ absolute size. Any one of the options may be absent. If FAMILY-LIST is absent,
1219
+ then the default font family (Arial) will be used.
1220
+
1221
+ ### :group » a string
1222
+
1223
+ For: `radio`.
1224
+
1225
+ Indicates what group a radio button belongs to. Without this setting, radio
1226
+ buttons are grouped together with other radio buttons in their immediate slot.
1227
+ "Grouping" radio buttons doesn't mean they'll be grouped next to each other on
1228
+ the screen. It means that only one radio button from the group can be selected
1229
+ at a time.
1230
+
1231
+ By giving this style a string, the radio button will be grouped with other
1232
+ radio buttons that have the same group name.
1233
+
1234
+ ### :height » a number
1235
+
1236
+ For: `all slots and elements`.
1237
+
1238
+ Sets the pixel height of this object. If the number is a decimal number, the
1239
+ height becomes a percentage of its parent's height (with 0.0 being 0% and 1.0
1240
+ being 100%.)
1241
+
1242
+ ### :hidden » true or false
1243
+
1244
+ For: `all slots and elements`.
1245
+
1246
+ Hides or shows this object. Any object with `hidden: true` are not
1247
+ displayed on the screen. Neither are its children.
1248
+
1249
+ ### :inner » a number
1250
+
1251
+ For: `star`.
1252
+
1253
+ The size of the inner radius (in pixels.) The inner radius describes the solid
1254
+ circle within the star where the points begin to separate.
1255
+
1256
+ ### :items » an array
1257
+
1258
+ For: `list_box`.
1259
+
1260
+ The list of selections in the list box. See the [[Element.list_box]] method
1261
+ for an example.
1262
+
1263
+ ### :justify » true or false
1264
+
1265
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1266
+ strong, sub, sup, subtitle, tagline, title`
1267
+
1268
+ Evenly spaces the text horizontally.
1269
+
1270
+ ### :kerning » a number
1271
+
1272
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1273
+ strong, sub, sup, subtitle, tagline, title`.
1274
+
1275
+ Adds to the natural spacing between letters, in pixels.
1276
+
1277
+ ### :leading » a number
1278
+
1279
+ For: `banner, caption, inscription, para, subtitle, tagline, title`.
1280
+
1281
+ Sets the spacing between lines in a text block. Defaults to 4 pixels.
1282
+
1283
+ ### :left » a number
1284
+
1285
+ For: `all slots and elements`.
1286
+
1287
+ Sets the left coordinate of this object to a specific pixel. Setting `left: 10` places the object's left edge ten pixels away from the left edge of the
1288
+ slot containing it. If this style is left unset (or set to `nil`,) the object
1289
+ will flow in with the other objects surrounding it.
1290
+
1291
+ You might also want to give it a :top, if it's acting a bit funny. Sometimes it needs both. :)
1292
+
1293
+ ### :margin » a number or an array of four numbers
1294
+
1295
+ For: `all slots and elements`.
1296
+
1297
+ Margins space an element out from its surroundings. Each element has a left,
1298
+ top, right, and bottom margin. If the `:margin` style is set to a single
1299
+ number, the spacing around the element uniformly matches that number. In other
1300
+ words, if `margin: 8` is set, all the margins around the element are set to
1301
+ eight pixels in length.
1302
+
1303
+ This style can also be given an array of four numbers in the form `[left, top,
1304
+ right, bottom]`.
1305
+
1306
+ ### :margin_bottom » a number
1307
+
1308
+ For: `all slots and elements`.
1309
+
1310
+ Sets the bottom margin of the element to a specific pixel size.
1311
+
1312
+ ### :margin_left » a number
1313
+
1314
+ For: `all slots and elements`.
1315
+
1316
+ Sets the left margin of the element to a specific pixel size.
1317
+
1318
+ ### :margin_right » a number
1319
+
1320
+ For: `all slots and elements`.
1321
+
1322
+ Sets the right margin of the element to a specific pixel size.
1323
+
1324
+ ### :margin_top » a number
1325
+
1326
+ For: `all slots and elements`.
1327
+
1328
+ Sets the top margin of the element to a specific pixel size.
1329
+
1330
+ ### :outer » a number
1331
+
1332
+ For: `star`.
1333
+
1334
+ Sets the outer radius (half of the `total` width) of the star, in pixels.
1335
+
1336
+ ### :points » a number
1337
+
1338
+ For: `star`.
1339
+
1340
+ How many points does this star have? A style of `points: 5` creates a
1341
+ five-pointed star.
1342
+
1343
+ ### :radius » a number
1344
+
1345
+ For: `arc, arrow, background, border, gradient, oval, rect, shape`.
1346
+
1347
+ Sets the radius (half of the diameter or total width) for each of these
1348
+ elements. Setting this is equivalent to setting both `:width` and `:height` to
1349
+ double this number.
1350
+
1351
+ ### :right » a number
1352
+
1353
+ For: `all slots and elements`.
1354
+
1355
+ Sets the pixel coordinate of an element's right edge. The edge is placed
1356
+ relative to its container's rightmost edge. So, `right: 0` will align the
1357
+ element so that its own right edge and the right edge of its slot touch.
1358
+ Whereas `right: 20` will position the right edge of the element off to the
1359
+ left of its slot's right edge by twenty pixels.
1360
+
1361
+ ### :rise » a number
1362
+
1363
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1364
+ strong, sub, sup, subtitle, tagline, title`.
1365
+
1366
+ Lifts or plunges the font baseline for some text. For example, a
1367
+ [[Element.sup]] has a `:rise` of 10 pixels. Conversely, the [[Element.sub]]
1368
+ element has a `:rise` of -10 pixels.
1369
+
1370
+ ### :scroll » true or false
1371
+
1372
+ For: `flow, stack`.
1373
+
1374
+ Establishes this slot as a scrolling slot. If `scroll: true` is set, the
1375
+ slot will show a scrollbar if any of its contents go past its height. The
1376
+ scrollbar will appear and disappear as needed. It will also appear inside the
1377
+ width of the slot, meaning the slot's width will never change, regardless of
1378
+ whether there is a scrollbar or not.
1379
+
1380
+ ### :secret » true or false
1381
+
1382
+ For: `ask, edit_line`.
1383
+
1384
+ Used for password fields, this setting keeps any characters typed in from
1385
+ becoming visible on the screen. Instead, a replacement character (such as an
1386
+ asterisk) is show for each letter typed.
1387
+
1388
+ ### :size » a number
1389
+
1390
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1391
+ strong, sub, sup, subtitle, tagline, title`.
1392
+
1393
+ Sets the pixel size for the font used inside this text block or text fragment.
1394
+
1395
+ Font size may also be augmented, through use of the following strings:
1396
+
1397
+ * "xx-small" - 57% of present size.
1398
+ * "x-small" - 64% of present size.
1399
+ * "small" - 83% of present size.
1400
+ * "medium" - no change in size.
1401
+ * "large" - 120% of present size.
1402
+ * "x-large" - 143% of present size.
1403
+ * "xx-large" - 173% of present size.
1404
+
1405
+ ### :state » a string
1406
+
1407
+ For: `button, check, edit_box, edit_line, list_box, radio`.
1408
+
1409
+ The `:state` style is for disabling or locking certain controls, if you don't
1410
+ want them to be edited.
1411
+
1412
+ Here are the possible style settings:
1413
+
1414
+ * nil - the control is active and editable.
1415
+ * "readonly" - the control is active but cannot be edited.
1416
+ * "disabled" - the control is not active (grayed out) and cannot be edited.
1417
+
1418
+ ### :stretch » a string
1419
+
1420
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1421
+ strong, sub, sup, subtitle, tagline, title`.
1422
+
1423
+ Sets the font stretching used for a text object.
1424
+
1425
+ Possible settings are:
1426
+
1427
+ * "condensed" - a smaller width of letters.
1428
+ * "normal" - the standard width of letters.
1429
+ * "expanded" - a larger width of letters.
1430
+
1431
+ ### :strikecolor » a Shoes::Color
1432
+
1433
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1434
+ strong, sub, sup, subtitle, tagline, title`.
1435
+
1436
+ The color used to paint any lines stricken through this text.
1437
+
1438
+ ### :strikethrough » a string
1439
+
1440
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1441
+ strong, sub, sup, subtitle, tagline, title`.
1442
+
1443
+ Is this text stricken through? Two options here:
1444
+
1445
+ * "none" - no strikethrough
1446
+ * "single" - a single-line strikethrough.
1447
+
1448
+ ### :stroke » a hex code, a Shoes::Color or a range of either
1449
+
1450
+ For: `arc, arrow, banner, border, caption, code, del, em, flow, image, ins,
1451
+ inscription, line, link, mask, oval, para, rect, shape, span, stack, star,
1452
+ strong, sub, sup, subtitle, tagline, title`.
1453
+
1454
+ The color of the foreground pen. In the case of shapes, this is the color the
1455
+ lines are drawn with. For paragraphs and other text, the letters are printed
1456
+ in this color.
1457
+
1458
+ ### :strokewidth » a number
1459
+
1460
+ For: `arc, arrow, border, flow, image, line, mask, oval, rect, shape, star, stack`.
1461
+
1462
+ The thickness of the stroke, in pixels, of the line defining each of these
1463
+ shapes. For example, the number two would set the strokewidth to 2 pixels.
1464
+
1465
+ ### :text » a string
1466
+
1467
+ For: `button, edit_box, edit_line`.
1468
+
1469
+ Sets the message displayed on a button control, or the contents of an edit_box
1470
+ or edit_line.
1471
+
1472
+ ### :top » a number
1473
+
1474
+ For: `all slots and elements`.
1475
+
1476
+ Sets the top coordinate for an object, relative to its parent slot. If an
1477
+ object is set with `top: 40`, this means the object's top edge will be
1478
+ placed 40 pixels beneath the top edge of the slot that contains it. If no
1479
+ `:top` style is given, the object is automatically placed in the natural flow
1480
+ of its slot.
1481
+
1482
+ You should probably give it a :left, too, if it's acting strange. It likes to have both. :)
1483
+
1484
+ ### :undercolor » a Shoes::Color
1485
+
1486
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1487
+ strong, sub, sup, subtitle, tagline, title`.
1488
+
1489
+ The color used to underline text.
1490
+
1491
+ ### :underline » a string
1492
+
1493
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1494
+ strong, sub, sup, subtitle, tagline, title`.
1495
+
1496
+ Dictates the style of underline used in the text.
1497
+
1498
+ The choices for this setting are:
1499
+
1500
+ * "none" - no underline at all.
1501
+ * "single" - a continuous underline.
1502
+ * "double" - two continuous parallel underlines.
1503
+ * "low" - a lower underline, beneath the font baseline. (This is generally recommended only for single characters, particularly when showing keyboard accelerators.)
1504
+ * "error" - a wavy underline, usually found indicating a misspelling.
1505
+
1506
+ ### :variant » a string
1507
+
1508
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1509
+ strong, sub, sup, subtitle, tagline, title`.
1510
+
1511
+ Vary the font for a group of text. Two choices:
1512
+
1513
+ * "normal" - standard font.
1514
+ * "smallcaps" - font with the lower case characters replaced by smaller variants of the capital characters.
1515
+
1516
+ ### :weight » a string
1517
+
1518
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1519
+ strong, sub, sup, subtitle, tagline, title`.
1520
+
1521
+ Set the boldness of the text. Commonly, this style is set to one of the
1522
+ following strings:
1523
+
1524
+ * "ultralight" - the ultralight weight (= 200)
1525
+ * "light" - the light weight (= 300)
1526
+ * "normal" - the default weight (= 400)
1527
+ * "semibold" - a weight intermediate between normal and bold (= 600)
1528
+ * "bold" - the bold weight (= 700)
1529
+ * "ultrabold" - the ultrabold weight (= 800)
1530
+ * "heavy" - the heavy weight (= 900)
1531
+
1532
+ However, you may also pass in the numerical weight directly.
1533
+
1534
+ ### :width » a number
1535
+
1536
+ For: `all slots and elements`.
1537
+
1538
+ Sets the pixel width for the element. If the number is a decimal, the width is
1539
+ converted to a percentage (with 0.0 being 0% and 1.0 being 100%.) A width of
1540
+ 100% means the object fills its parent slot.
1541
+
1542
+ ### :wrap » a string
1543
+
1544
+ For: `banner, caption, code, del, em, ins, inscription, link, para, span,
1545
+ strong, sub, sup, subtitle, tagline, title`
1546
+
1547
+ How should the text wrap when it fills its width? Possible options are:
1548
+
1549
+ * "word" - Break lines at word breaks.
1550
+ * "char" - Break lines between characters, thus breaking some words.
1551
+ * "trim" - Cut the line off with an ellipsis if it goes too long.
1552
+
1553
+ ## Classes List
1554
+
1555
+ Here is a complete list of all the classes introduced by Shoes. This chart is
1556
+ laid out according to how classes inherits from each other. Subclasses are
1557
+ indented one level to the right, beneath their parent class.
1558
+
1559
+ {INDEX}
1560
+
1561
+ ## Colors List
1562
+
1563
+ The following list of colors can be used throughout Shoes. As background
1564
+ colors or border colors. As stroke and fill colors. Most of these colors come
1565
+ from the X11 and HTML palettes.
1566
+
1567
+ All of these colors can be used by name. (So calling the `tomato` method from
1568
+ inside any slot will get you a nice reddish color.) Below each color, also
1569
+ find the exact numbers which can be used with the [[Built-in.rgb]] method.
1570
+
1571
+ {COLORS}
1572
+
1573
+ # Slots
1574
+
1575
+ Slots are boxes used to lay out images, text and so on. The two most common
1576
+ slots are `stacks` and `flows`. Slots can also be referred to as "boxes" or
1577
+ "canvases" in Shoes terminology.
1578
+
1579
+ Since the mouse wheel and PageUp and PageDown are so pervasive on every
1580
+ platform, vertical scrolling has really become the only overflow that matters.
1581
+ So, in Shoes, just as on the web, width is generally fixed. While height goes
1582
+ on and on.
1583
+
1584
+ Now, you can also just use specific widths and heights for everything, if you
1585
+ want. That'll take some math, but everything could be perfect.
1586
+
1587
+ Generally, I'd suggest using stacks and flows. The idea here is that you want
1588
+ to fill up a certain width with things, then advance down the page, filling up
1589
+ further widths. You can think of these as being analogous to HTML's "block" and
1590
+ "inline" styles.
1591
+
1592
+ #### Stacks
1593
+
1594
+ A stack is simply a vertical stack of elements. Each element in a stack is
1595
+ placed directly under the element preceding it.
1596
+
1597
+ A stack is also shaped like a box. So if a stack is given a width of 250, that
1598
+ stack is itself an element which is 250 pixels wide.
1599
+
1600
+ To create a new stack, use the [[Element.stack]] method, which is available
1601
+ inside any slot. So stacks can contain other stacks and flows.
1602
+
1603
+ #### Flows
1604
+
1605
+ A flow will pack elements in as tightly as it can. A width will be filled, then
1606
+ will wrap beneath those elements. Text elements placed next to each other will
1607
+ appear as a single paragraph. Images and widgets will run together as a series.
1608
+
1609
+ Like the stack, a flow is a box. So stacks and flows can safely be embedded
1610
+ and, without respect to their contents, are identical. They just treat their
1611
+ contents differently.
1612
+
1613
+ Making a flow means calling the [[Element.flow]] method. Flows may contain
1614
+ other flows and stacks.
1615
+
1616
+ Last thing: The Shoes window itself is a flow.
1617
+
1618
+ ## Art for Slots
1619
+
1620
+ Each slot is like a canvas, a blank surface which can be covered with an
1621
+ assortment of colored shapes or gradients.
1622
+
1623
+ Many common shapes can be drawn with methods like `oval` and `rect`. You'll
1624
+ need to set up the paintbrush colors first, though.
1625
+
1626
+ The `stroke` command sets the line color. And the `fill` command sets the
1627
+ color used to paint inside the lines.
1628
+
1629
+ ```ruby
1630
+ #!ruby
1631
+ Shoes.app do
1632
+ stroke red
1633
+ fill blue
1634
+ oval top: 10, left: 10,
1635
+ radius: 100
1636
+ end
1637
+ ```
1638
+
1639
+ That code gives you a blue pie with a red line around it. One-hundred pixels
1640
+ wide, placed just a few pixels southeast of the window's upper left corner.
1641
+
1642
+ The `blue` and `red` methods above are Color objects. See the section on
1643
+ Colors for more on how to mix colors.
1644
+
1645
+ #### Inspiration from Processing and NodeBox
1646
+
1647
+ The artful methods generally come verbatim from NodeBox, a drawing kit for
1648
+ Python. In turn, NodeBox gets much of its ideas from Processing, a Java-like
1649
+ language for graphics and animation. I owe a great debt to the creators of
1650
+ these wonderful programs!
1651
+
1652
+ Shoes does a few things differently from NodeBox and Processing. For example,
1653
+ Shoes has different color methods, including having its own Color objects,
1654
+ though these are very similar to Processing's color methods. And Shoes also
1655
+ allows images and gradients to be used for drawing lines and filling in shapes.
1656
+
1657
+ Shoes also borrows some animation ideas from Processing and will continue to
1658
+ closely consult Processing's methods as it expands.
1659
+
1660
+ ### arc(left, top, width, height, angle1, angle2) » Shoes::Shape
1661
+
1662
+ Draws an arc shape (a section of an oval) at coordinates (left, top). This
1663
+ method just give you a bit more control than [[oval]], by offering the
1664
+ `:angle1` and `:angle2` styles. (In fact, you can mimick the `oval` method by
1665
+ setting `:angle1` to 0 and `:angle2` to `Shoes::TWO_PI`.)
1666
+
1667
+ ### arrow(left, top, width) » Shoes::Shape
1668
+
1669
+ Draws an arrow at coordinates (left, top) with a pixel `width`.
1670
+
1671
+ ### cap(:curve or :rect or :project) » self
1672
+
1673
+ Sets the line cap, which is the shape at the end of every line you draw. If
1674
+ set to `:curve`, the end is rounded. The default is `:rect`, a line which ends
1675
+ abruptly flat. The `:project` cap is also fat, but sticks out a bit longer.
1676
+
1677
+ ### fill(pattern) » pattern
1678
+
1679
+ Sets the fill bucket to a specific color (or pattern.) Patterns can be colors,
1680
+ gradients or images. So, once the fill bucket is set, you can draw shapes and
1681
+ they will be colored in with the pattern you've chosen.
1682
+
1683
+ To draw a star with an image pattern:
1684
+
1685
+ ```ruby
1686
+ #!ruby
1687
+ Shoes.app do
1688
+ fill "static/avatar.png"
1689
+ star 200, 200, 5
1690
+ end
1691
+ ```
1692
+
1693
+ To clear the fill bucket, use `nofill`. And to set the line color (the border
1694
+ of the star,) use the `stroke` method.
1695
+
1696
+ ### nofill() » self
1697
+
1698
+ Blanks the fill color, so that any shapes drawn will not be filled in.
1699
+ Instead, shapes will have only a lining, leaving the middle transparent.
1700
+
1701
+ ### nostroke() » self
1702
+
1703
+ Empties the line color. Shapes drawn will have no outer line. If `nofill` is
1704
+ also set, shapes drawn will not be visible.
1705
+
1706
+ ### line(left, top, x2, y2) » Shoes::Shape
1707
+
1708
+ Draws a line using the current line color (aka "stroke") starting at
1709
+ coordinates (left, top) and ending at coordinates (x2, y2).
1710
+
1711
+ ### oval(left, top, radius) » Shoes::Shape
1712
+
1713
+ Draws a circular form at pixel coordinates (left, top) with a width and height
1714
+ of `radius` pixels. The line and fill colors are used to draw the shape. By
1715
+ default, the coordinates are for the oval's leftmost, top corner, but this can
1716
+ be changed by calling the [[Art.transform]] method or by using the `:center`
1717
+ style on the next method below.
1718
+
1719
+ ```ruby
1720
+ #!ruby
1721
+ Shoes.app do
1722
+ stroke blue
1723
+ strokewidth 4
1724
+ fill black
1725
+ oval 10, 10, 50
1726
+ end
1727
+ ```
1728
+
1729
+ To draw an oval of varied proportions, you may also use the syntax: `oval(left, top, width, height)`.
1730
+
1731
+ ### oval(styles) » Shoes::Shape
1732
+
1733
+ Draw circular form using a style hash. The following styles are supported:
1734
+
1735
+ * `top`: the y-coordinate for the oval pen.
1736
+ * `left`: the x-coordinate for the oval pen.
1737
+ * `radius`: the width and height of the circle.
1738
+ * `width`: a specific pixel width for the oval.
1739
+ * `height`: a specific pixel height for the oval.
1740
+ * `center`: do the coordinates specific the oval's center? (true or false)
1741
+
1742
+ These styles may also be altered using the `style` method on the Shape object.
1743
+
1744
+ ### rect(top, left, width, height, corners = 0) » Shoes::Shape
1745
+
1746
+ Draws a rectangle starting from coordinates (top, left) with dimensions of
1747
+ width x height. Optionally, you may give the rectangle rounded corners with a
1748
+ fifth argument: the radius of the corners in pixels.
1749
+
1750
+ As with all other shapes, the rectangle is drawn using the stroke and fill colors.
1751
+
1752
+ ```ruby
1753
+ #!ruby
1754
+ Shoes.app do
1755
+ stroke rgb(0.5, 0.5, 0.7)
1756
+ fill rgb(1.0, 1.0, 0.9)
1757
+ rect 10, 10, self.width - 20, self.height - 20
1758
+ end
1759
+ ```
1760
+
1761
+ The above sample draws a rectangle which fills the area of its parent box,
1762
+ leaving a margin of 10 pixels around the edge. Also see the `background`
1763
+ method for a rectangle which defaults to filling its parent box.
1764
+
1765
+ ### rect(styles) » Shoes::Shape
1766
+
1767
+ Draw a rectangle using a style hash. The following styles are supported:
1768
+
1769
+ * `top`: the y-coordinate for the rectangle.
1770
+ * `left`: the x-coordinate for the rectangle.
1771
+ * `curve`: the pixel radius of the rectangle's corners.
1772
+ * `width`: a specific pixel width for the rectangle.
1773
+ * `height`: a specific pixel height for the rectangle.
1774
+ * `center`: do the coordinates specific the rectangle's center? (true or false)
1775
+
1776
+ These styles may also be altered using the `style` method on the Shape object.
1777
+
1778
+ ### rotate(degrees: a number) » self
1779
+
1780
+ Rotates the pen used for drawing by a certain number of `degrees`, so that any
1781
+ shapes will be drawn at that angle.
1782
+
1783
+ In this example below, the rectangle drawn at (30, 30) will be rotated 45 degrees.
1784
+
1785
+ ```ruby
1786
+ #!ruby
1787
+ Shoes.app do
1788
+ fill "#333"
1789
+ rotate 45
1790
+ rect 30, 30, 40, 40
1791
+ end
1792
+ ```
1793
+
1794
+ ### shape(left, top) { ... } » Shoes::Shape
1795
+
1796
+ Describes an arbitrary shape to draw, beginning at coordinates (left, top) and
1797
+ continued by calls to `line_to`, `move_to`, `curve_to` and `arc_to` inside the
1798
+ block. You can look at it as sketching a shape with a long line that curves
1799
+ and arcs and bends.
1800
+
1801
+ ```ruby
1802
+ #!ruby
1803
+ Shoes.app do
1804
+ fill red(0.2)
1805
+ shape do
1806
+ move_to(90, 55)
1807
+ arc_to(50, 55, 50, 50, 0, PI/2)
1808
+ arc_to(50, 55, 60, 60, PI/2, PI)
1809
+ arc_to(50, 55, 70, 70, PI, TWO_PI-PI/2)
1810
+ arc_to(50, 55, 80, 80, TWO_PI-PI/2, TWO_PI)
1811
+ end
1812
+ end
1813
+ ```
1814
+
1815
+ A shape can also contain other shapes. So, you can place an [[Art.oval]], a
1816
+ [[Art.rect]], a [[Art.line]], a [[Art.star]] or an [[Art.arrow]] (and all of
1817
+ the other methods in this [[Art]] section) inside a shape, but they will not be
1818
+ part of the line. They will be more like a group of shapes are all drawn as
1819
+ one.
1820
+
1821
+ ### star(left, top, points = 10, outer = 100.0, inner = 50.0) » Shoes::Shape
1822
+
1823
+ Draws a star using the stroke and fill colors. The star is positioned with its
1824
+ center point at coordinates (left, top) with a certain number of `points`. The
1825
+ `outer` width defines the full radius of the star; the `inner` width specifies
1826
+ the radius of the star's middle, where points stem from.
1827
+
1828
+ ### stroke(pattern) » pattern
1829
+
1830
+ Set the active line color for this slot. The `pattern` may be a color, a
1831
+ gradient or an image, all of which are categorized as "patterns." The line
1832
+ color is then used to draw the borders of any subsequent shape.
1833
+
1834
+ So, to draw an arrow with a red line around it:
1835
+
1836
+ ```ruby
1837
+ #!ruby
1838
+ Shoes.app do
1839
+ stroke red
1840
+ arrow 0, 100, 10
1841
+ end
1842
+ ```
1843
+
1844
+ To clear the line color, use the `nostroke` method.
1845
+
1846
+ ### strokewidth(a number) » self
1847
+
1848
+ Sets the line size for all drawing within this slot. Whereas the `stroke`
1849
+ method alters the line color, the `strokewidth` method alters the line size in
1850
+ pixels. Calling `strokewidth(4)` will cause lines to be drawn 4 pixels wide.
1851
+
1852
+ ### transform(:center or :corner) » self
1853
+
1854
+ Should transformations (such as `skew` and `rotate`) be performed around the
1855
+ center of the shape? Or the corner of the shape? Shoes defaults to `:corner`.
1856
+
1857
+ ### translate(left, top) » self
1858
+
1859
+ Moves the starting point of the drawing pen for this slot. Normally, the pen
1860
+ starts at (0, 0) in the top-left corner, so that all shapes are drawn from that
1861
+ point. With `translate`, if the starting point is moved to (10, 20) and a
1862
+ shape is drawn at (50, 60), then the shape is actually drawn at (60, 80) on the
1863
+ slot.
1864
+
1865
+ ## Element Creation
1866
+
1867
+ Shoes has a wide variety of elements, many cherry-picked from HTML. This page
1868
+ describes how to create these elements in a slot. See the Elements section of
1869
+ the manual for more on how to modify and use these elements after they have
1870
+ been placed.
1871
+
1872
+ ### animate(fps) { |frame| ... } » Shoes::Animation
1873
+
1874
+ Starts an animation timer, which runs parallel to the rest of the app. The
1875
+ `fps` is a number, the frames per seconds. This number dictates how many times
1876
+ per second the attached block will be called.
1877
+
1878
+ The block is given a `frame` number. Starting with zero, the `frame` number
1879
+ tells the block how many frames of the animation have been shown.
1880
+
1881
+ ```ruby
1882
+ #!ruby
1883
+ Shoes.app do
1884
+ @counter = para "STARTING"
1885
+ animate(24) do |frame|
1886
+ @counter.replace "FRAME #{frame}"
1887
+ end
1888
+ end
1889
+ ```
1890
+
1891
+ The above animation is shown 24 times per second. If no number is given, the
1892
+ `fps` defaults to 10.
1893
+
1894
+ ### background(pattern) » Shoes::Background
1895
+
1896
+ Draws a Background element with a specific color (or pattern.) Patterns can be
1897
+ colors, gradients or images. Colors and images will tile across the
1898
+ background. Gradients stretch to fill the background.
1899
+
1900
+ `'PLEASE NOTE:`' Backgrounds are actual elements, not styles. HTML treats
1901
+ backgrounds like styles. Which means every box can only have one background.
1902
+ Shoes layers background elements.
1903
+
1904
+ ```ruby
1905
+ #!ruby
1906
+ Shoes.app do
1907
+ background black
1908
+ background white, width: 50
1909
+ end
1910
+ ```
1911
+
1912
+ The above example paints two backgrounds. First, a black background is painted
1913
+ over the entire app's surface area. Then a 50 pixel white stripe is painted
1914
+ along the left side.
1915
+
1916
+ ### banner(text) » Shoes::Banner
1917
+
1918
+ Creates a Banner text block. Shoes automatically styles this text to 48 pixels high.
1919
+
1920
+ ### border(text, strokewidth: a number) » Shoes::Border
1921
+
1922
+ Draws a Border element using a specific color (or pattern.) Patterns can be
1923
+ colors, gradients or images. Colors and images will tile across the border.
1924
+ Gradients stretch to fill the border.
1925
+
1926
+ `'PLEASE NOTE:`' Like Backgrounds, Borders are actual elements, not styles.
1927
+ HTML treats backgrounds and borders like styles. Which means every box can
1928
+ only have one borders. Shoes layers border and background elements, along with
1929
+ text blocks, images, and everything else.
1930
+
1931
+ ### button(text) { ... } » Shoes::Button
1932
+
1933
+ Adds a push button with the message `text` written across its surface. An
1934
+ optional block can be attached, which is called if the button is pressed.
1935
+
1936
+ ### caption(text) » Shoes::Caption
1937
+
1938
+ Creates a Caption text block. Shoes styles this text to 14 pixels high.
1939
+
1940
+ ### check() » Shoes::Check
1941
+
1942
+ Adds a check box.
1943
+
1944
+ ### code(text) » Shoes::Code
1945
+
1946
+ Create a Code text fragment. This text defaults to a monospaced font.
1947
+
1948
+ ### del(text) » Shoes::Del
1949
+
1950
+ Creates a Del text fragment (short for "deleted") which defaults to text with a
1951
+ single strikethrough in its middle.
1952
+
1953
+ ### dialog(styles) { ... } » Shoes::App
1954
+
1955
+ Opens a new app window (just like the [[Element.window]] method does,) but the
1956
+ window is given a dialog box look.
1957
+
1958
+ ### edit_box(text) » Shoes::EditBox
1959
+
1960
+ Adds a large, multi-line textarea to this slot. The `text` is optional and
1961
+ should be a string that will start out the box. An optional block can be
1962
+ attached here which is called any type the user changes the text in the box.
1963
+
1964
+ ```ruby
1965
+ #!ruby
1966
+ Shoes.app do
1967
+ edit_box
1968
+ edit_box "HORRAY EDIT ME"
1969
+ edit_box "small one", width: 100, height: 160
1970
+ end
1971
+ ```
1972
+
1973
+ ### edit_line(text) » Shoes::EditLine
1974
+
1975
+ Adds a single-line text box to this slot. The `text` is optional and should be
1976
+ a string that will start out the box. An optional block can be attached here
1977
+ which is called any type the user changes the text in the box.
1978
+
1979
+ ### em(text) » Shoes::Em
1980
+
1981
+ Creates an Em text fragment (short for "emphasized") which, by default, is
1982
+ styled with italics.
1983
+
1984
+ ### every(seconds) { |count| ... } » Shoes::Every
1985
+
1986
+ A timer similar to the `animation` method, but much slower. This timer fires a
1987
+ given number of seconds, running the block attached. So, for example, if you
1988
+ need to check a web site every five minutes, you'd call `every(300)` with a
1989
+ block containing the code to actually ping the web site.
1990
+
1991
+ ### flow(styles) { ... } » Shoes::Flow
1992
+
1993
+ A flow is an invisible box (or "slot") in which you place Shoes elements. Both
1994
+ flows and stacks are explained in great detail on the main [[Slots]] page.
1995
+
1996
+ Flows organize elements horizontally. Where one would use a [[Element.stack]]
1997
+ to keep things stacked vertically, a flow places its contents end-to-end across
1998
+ the page. Once the end of the page is reached, the flow starts a new line of
1999
+ elements.
2000
+
2001
+ ### image(path) » Shoes::Image
2002
+
2003
+ Creates an [[Image]] element for displaying a picture. PNG, JPEG and GIF
2004
+ formats are allowed.
2005
+
2006
+ The `path` can be a file path or a URL. All images loaded are temporarily
2007
+ cached in memory, but remote images are also cached locally in the user's
2008
+ personal Shoes directory. Remote images are loaded in the background; as with
2009
+ browsers, the images will not appear right away, but will be shown when they
2010
+ are loaded.
2011
+
2012
+ ### imagesize(path) » [width, height]
2013
+
2014
+ Quickly grab the width and height of an image. The image won't be loaded into
2015
+ the cache or displayed.
2016
+
2017
+ URGENT NOTE: This method cannot be used with remote images (loaded from HTTP,
2018
+ rather than the hard drive.)
2019
+
2020
+ ### ins(text) » Shoes::Ins
2021
+
2022
+ Creates an Ins text fragment (short for "inserted") which Shoes styles with a
2023
+ single underline.
2024
+
2025
+ ### inscription(text) » Shoes::Inscription
2026
+
2027
+ Creates an Inscription text block. Shoes styles this text at 10 pixels high.
2028
+
2029
+ ### link(text, click: proc or string) » Shoes::Link
2030
+
2031
+ Creates a Link text block, which Shoes styles with a single underline and
2032
+ colors with a #06E (blue) colored stroke.
2033
+
2034
+ The default LinkHover style is also single-underlined with a #039 (dark blue) stroke.
2035
+
2036
+ ### list_box(items: [strings, ...]) » Shoes::ListBox
2037
+
2038
+ Adds a drop-down list box containing entries for everything in the `items`
2039
+ array. An optional block may be attached, which is called if anything in the
2040
+ box becomes selected by the user.
2041
+
2042
+ ```ruby
2043
+ #!ruby
2044
+ Shoes.app do
2045
+ stack margin: 10 do
2046
+ para "Pick a card:"
2047
+ list_box items: ["Jack", "Ace", "Joker"]
2048
+ end
2049
+ end
2050
+ ```
2051
+
2052
+ Call `ListBox#text` to get the selected string. See the `ListBox` section
2053
+ under `Native` controls for more help.
2054
+
2055
+ ### progress() » Shoes::Progress
2056
+
2057
+ Adds a progress bar.
2058
+
2059
+ ### para(text) » Shoes::Para
2060
+
2061
+ Create a Para text block (short for "paragraph") which Shoes styles at 12
2062
+ pixels high.
2063
+
2064
+ ### radio(group name: a string or symbol) » Shoes::Radio
2065
+
2066
+ Adds a radio button. If a `group name` is given, the radio button is
2067
+ considered part of a group. Among radio buttons in the same group, only one
2068
+ may be checked. (If no group name is given, the radio button is grouped with
2069
+ any other radio buttons in the same slot.)
2070
+
2071
+ ### span(text) » Shoes::Span
2072
+
2073
+ Creates a Span text fragment, unstyled by default.
2074
+
2075
+ ### stack(styles) { ... } » Shoes::Stack
2076
+
2077
+ Creates a new stack. A stack is a type of slot. (See the main [[Slots]] page
2078
+ for a full explanation of both stacks and flows.)
2079
+
2080
+ In short, stacks are an invisible box (a "slot") for placing stuff. As you add
2081
+ things to the stack, such as buttons or images, those things pile up
2082
+ vertically. Yes, they stack up!
2083
+
2084
+ ### strong(text) » Shoes::Strong
2085
+
2086
+ Creates a Strong text fragment, styled in bold by default.
2087
+
2088
+ ### sub(text) » Shoes::Sub
2089
+
2090
+ Creates a Sub text fragment (short for "subscript") which defaults to lowering
2091
+ the text by 10 pixels and styling it in an x-small font.
2092
+
2093
+ ### subtitle(text) » Shoes::Subtitle
2094
+
2095
+ Creates a Subtitle text block. Shoes styles this text to 26 pixels high.
2096
+
2097
+ ### sup(text) » Shoes::Sup
2098
+
2099
+ Creates a Sup text fragment (short for "superscript") which defaults to raising
2100
+ the text by 10 pixels and styling it in an x-small font.
2101
+
2102
+ ### tagline(text) » Shoes::Tagline
2103
+
2104
+ Creates a Tagline text block. Shoes styles this text to 18 pixels high.
2105
+
2106
+ ### timer(seconds) { ... } » Shoes::Timer
2107
+
2108
+ A one-shot timer. If you want to schedule to run some code in a few seconds
2109
+ (or minutes, hours) you can attach the code as a block here.
2110
+
2111
+ To display an alert box five seconds from now:
2112
+
2113
+ ```ruby
2114
+ #!ruby
2115
+ Shoes.app do
2116
+ timer(5) do
2117
+ alert("Your five seconds are up.")
2118
+ end
2119
+ end
2120
+ ```
2121
+
2122
+ ### title(text) » Shoes::Title
2123
+
2124
+ Creates a Title text block. Shoes styles these elements to 34 pixels high.
2125
+
2126
+ ### video(path or url) » Shoes::Video
2127
+
2128
+ Embeds a movie in this slot.
2129
+
2130
+ ### window(styles) { ... } » Shoes::App
2131
+
2132
+ Opens a new app window. This method is almost identical to the
2133
+ [[App.Shoes.app]] method used to start an app in the first place. The
2134
+ difference is that the `window` method sets the new window's [[App.owner]]
2135
+ property. (A normal Shoes.app has its `owner` set to `nil`.)
2136
+
2137
+ So, the new window's `owner` will be set to the Shoes::App which launched the
2138
+ window. This way the child window can call the parent.
2139
+
2140
+ ```ruby
2141
+ #!ruby
2142
+ Shoes.app title: "The Owner" do
2143
+ button "Pop up?" do
2144
+ window do
2145
+ para "Okay, popped up from #{owner}"
2146
+ end
2147
+ end
2148
+ end
2149
+ ```
2150
+
2151
+ ## Events
2152
+
2153
+ Wondering how to catch stray mouse clicks or keyboard typing? Events are sent
2154
+ to a slot whenever a mouse moves inside the slot. Or whenever a key is
2155
+ pressed. Even when the slot is created or destroyed. You can attach a block
2156
+ to each of these events.
2157
+
2158
+ Mouse events include `motion`, `click`, `hover` and `leave`. Keyboard typing
2159
+ is represented by the `keypress` event. And the `start` and `finish` events
2160
+ indicate when a canvas comes into play or is discarded.
2161
+
2162
+ So, let's say you want to change the background of a slot whenever the mouse
2163
+ floats over it. We can use the `hover` event to change the background when the
2164
+ mouse comes inside the slot. And `leave` to change back when the mouse floats
2165
+ away.
2166
+
2167
+ ```ruby
2168
+ #!ruby
2169
+ Shoes.app do
2170
+ s = stack width: 200, height: 200 do
2171
+ background red
2172
+ hover do
2173
+ s.clear { background blue }
2174
+ end
2175
+ leave do
2176
+ s.clear { background red }
2177
+ end
2178
+ end
2179
+ end
2180
+ ```
2181
+
2182
+ ### click { |button, left, top| ... } » self
2183
+
2184
+ The click block is called when a mouse button is clicked. The `button` is the
2185
+ number of the mouse button which has been pressed. The `left` and `top` are
2186
+ the mouse coordinates at which the click happened.
2187
+
2188
+ To catch the moment when the mouse is unclicked, see the [[Events.release]] event.
2189
+
2190
+ ### finish { |self| ... } » self
2191
+
2192
+ When a slot is removed, it's finish event occurs. The finish block is
2193
+ immediately handed `self`, the slot object which has been removed.
2194
+
2195
+ ### hover { |self| ... } » self
2196
+
2197
+ The hover event happens when the mouse enters the slot. The block gets `self`,
2198
+ meaning the object which was hovered over.
2199
+
2200
+ To catch the mouse exiting the slot, check out the [[Events.leave]] event.
2201
+
2202
+ ### keypress { |key| ... } » self
2203
+
2204
+ Whenever a key (or combination of keys) is pressed, the block gets called. The
2205
+ block is sent a `key` which is a string representing the character (such as the
2206
+ letter or number) on the key. For special keys and key combos, a Ruby symbol
2207
+ is sent, rather than a string.
2208
+
2209
+ So, for example, if `Shift-a` is pressed, the block will get the string `"A"`.
2210
+
2211
+ However, if the F1 key is pressed, the `:f1` symbol is received. For
2212
+ `Shift-F1`, the symbol would be `:shift_f1`.
2213
+
2214
+ The modifier keys are `control`, `shift` and `alt`. They appear in that order.
2215
+ If `Shift-Control-Alt-PgUp` is pressed, the symbol will be
2216
+ `:control_shift_alt_page_up`.
2217
+
2218
+ One thing about the shift key. You won't see the shift key on most keys. On
2219
+ US keyboards, `Shift-7` is an ampersand. So you'll get the string `"&"` rather
2220
+ than `:shift_5`. And, if you press `Shift-Alt-7` on such a keyboard, you'll
2221
+ get the symbol: `:alt_&`. You'll only see the shift modifier on the special
2222
+ keys listed a few paragraphs down.
2223
+
2224
+ ```ruby
2225
+ #!ruby
2226
+ Shoes.app do
2227
+ @info = para "NO KEY is PRESSED."
2228
+ keypress do |k|
2229
+ @info.replace "#{k.inspect} was PRESSED."
2230
+ end
2231
+ end
2232
+ ```
2233
+
2234
+ Keep in mind that Shoes itself uses a few hotkeys. Alt-Period (`:alt_.`),
2235
+ Alt-Question (`:alt_?`) and Alt-Slash (`:alt_/`) are reserved for Shoes.
2236
+
2237
+ The list of special keys is as follows: `:escape`, `:delete`, `:backspace`,
2238
+ `:tab`, `:page_up`, `:page_down`, `:home`, `:end`, `:left`, `:up`, `:right`,
2239
+ `:down`, `:f1`, `:f2`, `:f3`, `:f4`, `:f5`, `:f6`, `:f7`, `:f8`, `:f9`, `:f10`,
2240
+ `:f11` and `:f12`.
2241
+
2242
+ One caveat to all of those rules: normally the Return key gives you a string
2243
+ `"\n"`. When pressed with modifier keys, however, you end up with
2244
+ `:control_enter`, `:control_alt_enter`, `:shift_alt_enter` and the like.
2245
+
2246
+ ### leave { |self| ... } » self
2247
+
2248
+ The leave event takes place when the mouse cursor exits a slot. The moment it
2249
+ no longer is inside the slot's edges. When that takes place, the block is
2250
+ called with `self`, the slot object which is being left.
2251
+
2252
+ Also see [[Events.hover]] if you'd like to detect the mouse entering a slot.
2253
+
2254
+ ### motion { |left, top| ... } » self
2255
+
2256
+ The motion block gets called every time the mouse moves around inside the slot.
2257
+ The block is handed the cursor's `left` and `top` coordinates.
2258
+
2259
+ ```ruby
2260
+ #!ruby
2261
+ Shoes.app width: 200, height: 200 do
2262
+ background black
2263
+ fill white
2264
+ @circ = oval 0, 0, 100, 100
2265
+
2266
+ motion do |top, left|
2267
+ @circ.move top - 50, left - 50
2268
+ end
2269
+ end
2270
+ ```
2271
+
2272
+ ### release { |button, left, top| ... } » self
2273
+
2274
+ The release block runs whenever the mouse is unclicked (on mouse up). When the
2275
+ finger is lifted. The `button` is the number of the button that was depressed.
2276
+ The `left` and `top` are the coordinates of the mouse at the time the button
2277
+ was released.
2278
+
2279
+ To catch the actual mouse click, use the [[Events.click]] event.
2280
+
2281
+ ### start { |self| ... } » self
2282
+
2283
+ The first time the slot is drawn, the start event fires. The block is handed
2284
+ `self`, the slot object which has just been drawn.
2285
+
2286
+ ## Manipulation Blocks
2287
+
2288
+ The manipulation methods below make quick work of shifting around slots and
2289
+ inserting new elements.
2290
+
2291
+ ### append() { ... } » self
2292
+
2293
+ Adds elements to the end of a slot.
2294
+
2295
+ ```ruby
2296
+ #!ruby
2297
+ Shoes.app do
2298
+ @slot = stack { para 'Good Morning' }
2299
+ timer 3 do
2300
+ @slot.append do
2301
+ title "Breaking News"
2302
+ tagline "Astronauts arrested for space shuttle DUI."
2303
+ end
2304
+ end
2305
+ end
2306
+ ```
2307
+
2308
+ The `title` and `tagline` elements will be added to the end of the `@slot`.
2309
+
2310
+ ### after(element) { ... } » self
2311
+
2312
+ Adds elements to a specific place in a slot, just after the `element` which is
2313
+ a child of the slot.
2314
+
2315
+ ### before(element) { ... } » self
2316
+
2317
+ Adds elements to a specific place in a slot, just before the `element` which is
2318
+ a child of the slot.
2319
+
2320
+ ### clear() » self
2321
+
2322
+ Empties the slot of any elements, timers and nested slots. This is effectively
2323
+ identical to looping through the contents of the slot and calling each
2324
+ element's `remove` method.
2325
+
2326
+ ### clear() { ... } » self
2327
+
2328
+ The clear method also takes an optional block. The block will be used to
2329
+ replace the contents of the slot.
2330
+
2331
+ ```ruby
2332
+ #!ruby
2333
+ Shoes.app do
2334
+ @slot = stack { para "Old text" }
2335
+ timer 3 do
2336
+ @slot.clear { para "Brand new text" }
2337
+ end
2338
+ end
2339
+ ```
2340
+
2341
+ In this example, the "Old text" paragraph will be cleared out, replaced by the
2342
+ "Brand new text" paragraph.
2343
+
2344
+ ### prepend() { ... } » self
2345
+
2346
+ Adds elements to the beginning of a slot.
2347
+
2348
+ ```ruby
2349
+ #!ruby
2350
+ Shoes.app do
2351
+ @slot = stack { para 'Good Morning' }
2352
+ timer 3 do
2353
+ @slot.prepend { para "Your car is ready." }
2354
+ end
2355
+ end
2356
+ ```
2357
+
2358
+ The `para` element is added to the beginning of the `@slot`.
2359
+
2360
+ ## Position of a Slot
2361
+
2362
+ Like any other element, slots can be styled and customized when they are created.
2363
+
2364
+ To set the width of a stack to 150 pixels:
2365
+
2366
+ ```ruby
2367
+ #!ruby
2368
+ Shoes.app do
2369
+ stack(width: 150) { para "Now that's precision." }
2370
+ end
2371
+ ```
2372
+
2373
+ Each style setting also has a method, which can be used to grab that particular
2374
+ setting. (So, like, the `width` method returns the width of the slot in
2375
+ pixels.)
2376
+
2377
+ ### displace(left: a number, top: a number) » self
2378
+
2379
+ A shortcut method for setting the :displace_left and :displace_top styles.
2380
+ Displacing is a handy way of moving a slot without altering the layout. In
2381
+ fact, the `top` and `left` methods will not report displacement at all. So,
2382
+ generally, displacement is only for temporary animations. For example,
2383
+ jiggling a button in place.
2384
+
2385
+ The `left` and `top` numbers sent to `displace` are added to the slot's own
2386
+ top-left coordinates. To subtract from the top-left coordinate, use negative
2387
+ numbers.
2388
+
2389
+ ### gutter() » a number
2390
+
2391
+ The size of the scrollbar area. When Shoes needs to show a scrollbar, the
2392
+ scrollbar may end up covering up some elements that touch the edge of the
2393
+ window. The `gutter` tells you how many pixels to expect the scrollbar to
2394
+ cover.
2395
+
2396
+ This is commonly used to pad elements on the right, like so:
2397
+
2398
+ ```ruby
2399
+ #!ruby
2400
+ Shoes.app do
2401
+ stack margin_right: 20 + gutter do
2402
+ para "Insert fat and ratified declaration of independence here..."
2403
+ end
2404
+ end
2405
+ ```
2406
+
2407
+ ### height() » a number
2408
+
2409
+ The vertical size of the viewable slot in pixels. So, if this is a scrolling
2410
+ slot, you'll need to use `scroll_height()` to get the full size of the slot.
2411
+
2412
+ ### hide() » self
2413
+
2414
+ Hides the slot, so that it can't be seen. See also [[Position.show]] and [[Position.toggle]].
2415
+
2416
+ ### left() » a number
2417
+
2418
+ The left pixel location of the slot. Also known as the x-axis coordinate.
2419
+
2420
+ ### move(left, top) » self
2421
+
2422
+ Moves the slot to specific coordinates, the (left, top) being the upper left
2423
+ hand corner of the slot.
2424
+
2425
+ ### remove() » self
2426
+
2427
+ Removes the slot. It will no longer be displayed and will not be listed in its
2428
+ parent's contents. It's gone.
2429
+
2430
+ ### scroll() » true or false
2431
+
2432
+ Is this slot allowed to show a scrollbar? True or false. The scrollbar will
2433
+ only appear if the height of the slot is also fixed.
2434
+
2435
+ ### scroll_height() » a number
2436
+
2437
+ The vertical size of the full slot, including any of it which is hidden by scrolling.
2438
+
2439
+ ### scroll_max() » a number
2440
+
2441
+ The top coordinate which this slot can be scrolled down to. The top coordinate
2442
+ of a scroll bar is always zero. The bottom coordinate is the full height of
2443
+ the slot minus one page of scrolling. This bottom coordinate is what
2444
+ `scroll_max` returns.
2445
+
2446
+ This is basically a shortcut for writing `slot.scroll_height - slot.height`.
2447
+
2448
+ To scroll to the bottom of a slot, use `slot.scroll_top = slot.scroll_max`.
2449
+
2450
+ ### scroll_top() » a number
2451
+
2452
+ The top coordinate which this slot is scrolled down to. So, if the slot is
2453
+ scrolled down twenty pixels, this method will return `20`.
2454
+
2455
+ ### scroll_top = a number
2456
+
2457
+ Scrolls the slot to a certain coordinate. This must be between zero and
2458
+ `scroll_max`.
2459
+
2460
+ ### show() » self
2461
+
2462
+ Reveals the slot, if it is hidden. See also [[Position.hide]] and
2463
+ [[Position.toggle]].
2464
+
2465
+ ### style() » styles
2466
+
2467
+ Calling the `style` method with no arguments returns a hash of the styles
2468
+ presently applied to this slot.
2469
+
2470
+ While methods such as `height` and `width` return the true pixel dimensions of
2471
+ the slot, you can use `style[:height]` or `style[:width]` to get the dimensions
2472
+ originally requested.
2473
+
2474
+ ```ruby
2475
+ #!ruby
2476
+ Shoes.app do
2477
+ @s = stack width: "100%"
2478
+ para @s.style[:width]
2479
+ end
2480
+ ```
2481
+
2482
+ In this example, the paragraph under the stack will display the string "100%".
2483
+
2484
+ ### style(styles) » styles
2485
+
2486
+ Alter the slot using a hash of style settings. Any of the methods on this page
2487
+ (aside from this method, of course) can be used as a style setting. So, for
2488
+ example, there is a `width` method, thus there is also a `width` style.
2489
+
2490
+ ```ruby
2491
+ #!ruby
2492
+ Shoes.app do
2493
+ @s = stack { background green }
2494
+ @s.style(width: 400, height: 200)
2495
+ end
2496
+ ```
2497
+
2498
+ ### toggle() » self
2499
+
2500
+ Hides the slot, if it is shown. Or shows the slot, if it is hidden.
2501
+
2502
+ ### top() » a number
2503
+
2504
+ The top pixel location of the slot. Also known as the y-axis coordinate.
2505
+
2506
+ ### width() » a number
2507
+
2508
+ The horizontal size of the slot in pixels.
2509
+
2510
+ ## Traversing the Page
2511
+
2512
+ You may find yourself needing to loop through the elements inside a slot. Or
2513
+ maybe you need to climb the page, looking for a stack that is the parent of an
2514
+ element.
2515
+
2516
+ On any element, you may call the `parent` method to get the slot directly above
2517
+ it. And on slots, you can call the `contents` method to get all of the
2518
+ children. (Some elements, such as text blocks, also have a `contents` method
2519
+ for getting their children.)
2520
+
2521
+ ### contents() » an array of elements
2522
+
2523
+ Lists all elements in a slot.
2524
+
2525
+ ### parent() » a Shoes::Stack or Shoes::Flow
2526
+
2527
+ Gets the object for this element's container.
2528
+
2529
+ # Elements
2530
+
2531
+ Ah, here's the stuff of Shoes. An element can be as simple as an oval shape. Or
2532
+ as complex as a video stream. You've encountered all of these elements before
2533
+ in the Slots section of the manual.
2534
+
2535
+ Shoes has seven native controls: the Button, the EditLine, the EditBox, the
2536
+ ListBox, the Progress meter, the Check box and the Radio. By "native"
2537
+ controls, we mean that each of these seven elements is drawn by the operating
2538
+ system. So, a Progress bar will look one way on Windows and another way on OS
2539
+ X.
2540
+
2541
+ Shoes also has seven basic other types of elements: Background, Border, Image,
2542
+ Shape, TextBlock, Timer and Video. These all should look and act the same on
2543
+ every operating system.
2544
+
2545
+ Once an element is created, you will often still want to change it. To move it
2546
+ or hide it or get rid of it. You'll use the commands in this section to do that
2547
+ sort of stuff. (Especially check out the [[Common Common Methods]] section for
2548
+ commands you can use on any element.)
2549
+
2550
+ So, for example, use the `image` method of a Slot to place a PNG on the screen.
2551
+ The `image` method gives you back an Image object. Use the methods of the Image
2552
+ object to change things up.
2553
+
2554
+ ## Common Methods
2555
+
2556
+ A few methods are shared by every little element in Shoes. Moving, showing,
2557
+ hiding. Removing an element. Basic and very general things. This list
2558
+ encompasses those common commands.
2559
+
2560
+ One of the most general methods of all is the `style` method (which is also
2561
+ covered as the [[Position.style]] method for slots.)
2562
+
2563
+ ```ruby
2564
+ #!ruby
2565
+ Shoes.app do
2566
+ stack do
2567
+ # Background, text and a button: both are elements!
2568
+ @back = background green
2569
+ @text = banner "A Message for You, Rudy"
2570
+ @press = button "Stop your messin about!"
2571
+
2572
+ # And so, both can be styled.
2573
+ @text.style size: 12, stroke: red, margin: 10
2574
+ @press.style width: 400
2575
+ @back.style height: 10
2576
+ end
2577
+ end
2578
+ ```
2579
+
2580
+ For specific commands, see the other links to the left in the Elements section.
2581
+ Like if you want to pause or play a video file, check the [[Video]] section,
2582
+ since pausing and playing is peculiar to videos. No sense pausing a button.
2583
+
2584
+ ### displace(left: a number, top: a number) » self
2585
+
2586
+ Displacing an element moves it. But without changing the layout around it.
2587
+ This is great for subtle animations, especially if you want to reserve a place
2588
+ for an element while it is still animating. Like maybe a quick button shake or
2589
+ a slot sliding into view.
2590
+
2591
+ When you displace an element, it moves relative to the upper-left corner where
2592
+ it was placed. So, if an element is at the coordinates (20, 40) and you
2593
+ displace it 2 pixels left and 6 pixels on top, you end up with the coordinates
2594
+ (22, 46).
2595
+
2596
+ ```ruby
2597
+ #!ruby
2598
+ Shoes.app do
2599
+ flow margin: 12 do
2600
+ # Set up three buttons
2601
+ button "One"
2602
+ @two = button "Two"
2603
+ button "Three"
2604
+
2605
+ # Bounce the second button
2606
+ animate do |i|
2607
+ @two.displace(0, (Math.sin(i) * 6).to_i)
2608
+ end
2609
+ end
2610
+ end
2611
+ ```
2612
+
2613
+ Notice that while the second button bounces, the other two buttons stay put.
2614
+ If we used a normal `move` in this situation, the second button would be moved
2615
+ out of the layout and the buttons would act as if the second button wasn't
2616
+ there at all. (See the [[Common.move]] example.)
2617
+
2618
+ `'Of particular note:`' if you use the `left` and `top` methods to get the
2619
+ coordinates of a displaced element, you'll just get back the normal
2620
+ coordinates. As if there was no displacement. Displacing is just intended for
2621
+ quick animations!
2622
+
2623
+ ### height() » a number
2624
+
2625
+ The vertical screen size of the element in pixels. In the case of images, this
2626
+ is not the full size of the image. This is the height of the element as it is
2627
+ shown right now.
2628
+
2629
+ If you have a 150x150 pixel image and you set the width to 50 pixels, this
2630
+ method will return 50.
2631
+
2632
+ Also see the [[Common.width]] method for an example and some other comments.
2633
+
2634
+ ### hide() » self
2635
+
2636
+ Hides the element, so that it can't be seen. See also [[Common.show]] and
2637
+ [[Common.toggle]].
2638
+
2639
+ ### left() » a number
2640
+
2641
+ Gets you the pixel position of the left edge of the element.
2642
+
2643
+ ### move(left: a number, top: a number) » self
2644
+
2645
+ Moves the element to a specific pixel position within its slot. The element is
2646
+ still inside the slot. But it will no longer be stacked or flowed in with the
2647
+ other stuff in the slot. The element will float freely, now absolutely
2648
+ positioned instead.
2649
+
2650
+ ```ruby
2651
+ #!ruby
2652
+ Shoes.app do
2653
+ flow margin: 12 do
2654
+ # Set up three buttons
2655
+ button "One"
2656
+ @two = button "Two"
2657
+ button "Three"
2658
+
2659
+ # Bounce the second button
2660
+ animate do |i|
2661
+ @two.move(40, 40 + (Math.sin(i) * 6).to_i)
2662
+ end
2663
+ end
2664
+ end
2665
+ ```
2666
+
2667
+ The second button is moved to a specific place, allowing the third button to
2668
+ slide over into its place. If you want to move an element without shifting
2669
+ other pieces, see the [[Common.displace]] method.
2670
+
2671
+ ### parent() » a Shoes::Stack or Shoes::Flow
2672
+
2673
+ Gets the object for this element's container. Also see the slot's
2674
+ [[Traversing.contents]] to do the opposite: get a container's elements.
2675
+
2676
+ ### remove() » self
2677
+
2678
+ Removes the element from its slot. (In other words: throws it in the garbage.)
2679
+ The element will no longer be displayed.
2680
+
2681
+ ### show() » self
2682
+
2683
+ Reveals the element, if it is hidden. See also [[Common.hide]] and
2684
+ [[Common.toggle]].
2685
+
2686
+ ### style() » styles
2687
+
2688
+ Gives you the full set of styles applied to this element, in the form of a
2689
+ Hash. While methods like `width` and `height` and `top` give you back specific
2690
+ pixel dimensions, using `style[:width]` or `style[:top]`, you can get the
2691
+ original setting (things like "100%" for width or "10px" for top.)
2692
+
2693
+ ```ruby
2694
+ #!ruby
2695
+ Shoes.app do
2696
+ # A button which take up the whole page
2697
+ @b = button "All of it", width: 1.0, height: 1.0
2698
+
2699
+ # When clicked, show the styles
2700
+ @b.click { alert(@b.style.inspect) }
2701
+ end
2702
+ ```
2703
+
2704
+ ### style(styles) » styles
2705
+
2706
+ Changes the style of an element. This could include the `:width` and `:height`
2707
+ of an element, the font `:size` of some text, the `:stroke` and `:fill` of a
2708
+ shape. Or any other number of style settings.
2709
+
2710
+ ### toggle() » self
2711
+
2712
+ Hides an element if it is shown. Or shows the element, if it is hidden.
2713
+
2714
+ ### top() » a number
2715
+
2716
+ Gets the pixel position of the top edge of the element.
2717
+
2718
+ ### width() » a number
2719
+
2720
+ Gets the pixel width for the full size of the element. This method always
2721
+ returns an exact pixel size. In the case of images, this is not the full width
2722
+ of the image, just the size it is shown at. See the [[Common.height]] method
2723
+ for more.
2724
+
2725
+ Also, if you create an element with a width of 100% and that element is inside
2726
+ a stack which is 120 pixels wide, you'll get back `120`. However, if you call
2727
+ `style[:width]`, you'll get `"100%"`.
2728
+
2729
+ ```ruby
2730
+ #!ruby
2731
+ Shoes.app do
2732
+ stack width: 120 do
2733
+ @b = button "Click me", width: "100%" do
2734
+ alert "button.width = #{@b.width}\n" +
2735
+ "button.style[:width] = #{@b.style[:width]}"
2736
+ end
2737
+ end
2738
+ end
2739
+ ```
2740
+
2741
+ In order to set the width, you'll have to go through the [[Common.style]]
2742
+ method again. So, to set the button to 150 pixels wide: `@b.style(width: 150)`.
2743
+
2744
+ To let Shoes pick the element's width, go with `@b.style(width: nil)` to
2745
+ empty out the setting.
2746
+
2747
+ ## Background
2748
+
2749
+ A background is a color, a gradient or an image that is painted across an
2750
+ entire slot. Both backgrounds and borders are a type of Shoes::Pattern.
2751
+ ![man-ele-background.png](man-ele-background.png)
2752
+
2753
+ Even though it's called a `background`, you may still place this element in
2754
+ front of other elements. If a background comes after something else painted on
2755
+ the slot (like a `rect` or an `oval`,) the background will be painted over that
2756
+ element.
2757
+
2758
+ The simplest background is just a plain color background, created with the
2759
+ [[Element.background]] method, such as this black background:
2760
+
2761
+ ```ruby
2762
+ #!ruby
2763
+ Shoes.app do
2764
+ background black
2765
+ end
2766
+ ```
2767
+
2768
+ A simple background like that paints the entire slot that contains it. (In
2769
+ this case, the whole window is painted black.)
2770
+
2771
+ You can use styles to cut down the size or move around the background to your liking.
2772
+
2773
+ To paint a black background across the top fifty pixels of the window:
2774
+
2775
+ ```ruby
2776
+ #!ruby
2777
+ Shoes.app do
2778
+ background black, height: 50
2779
+ end
2780
+ ```
2781
+
2782
+ Or, to paint a fifty pixel column on the right-side of the window:
2783
+
2784
+ ```ruby
2785
+ #!ruby
2786
+ Shoes.app do
2787
+ background black, width: 50, right: 50
2788
+ end
2789
+ ```
2790
+
2791
+ Since Backgrounds are normal elements as well, see also the start of the
2792
+ [[Elements]] section for all of its other methods.
2793
+
2794
+ ### to_pattern() » a Shoes::Pattern
2795
+
2796
+ Yanks out the color, gradient or image used to paint this background and places
2797
+ it in a normal Shoes::Pattern object. You can then pass that object to other
2798
+ backgrounds and borders. Reuse it as you like.
2799
+
2800
+ ## Border
2801
+
2802
+ A border is a color, gradient or image painted in a line around the edge of any
2803
+ slot. Like the Background element in the last section, a Border is a kind of
2804
+ Shoes::Pattern. ![man-ele-border.png](man-ele-border.png)
2805
+
2806
+ The first, crucial thing to know about border is that all borders paint a line
2807
+ around the `'inside`' of a slot, not the outside. So, if you have a slot
2808
+ which is fifty pixels wide and you paint a five pixel border on it, that means
2809
+ there is a fourty pixel wide area inside the slot which is surrounded by the
2810
+ border.
2811
+
2812
+ This also means that if you paint a Border on top of a [[Background]], the
2813
+ edges of the background will be painted over by the border.
2814
+
2815
+ Here is just such a slot:
2816
+
2817
+ ```ruby
2818
+ #!ruby
2819
+ Shoes.app do
2820
+ stack width: 50 do
2821
+ border black, strokewidth: 5
2822
+ para "=^.^=", stroke: green
2823
+ end
2824
+ end
2825
+ ```
2826
+
2827
+ If you want to paint a border around the outside of a slot, you'll need to wrap
2828
+ that slot in another slot. Then, place the border in the outside slot.
2829
+
2830
+ ```ruby
2831
+ #!ruby
2832
+ Shoes.app do
2833
+ stack width: 60 do
2834
+ border black, strokewidth: 5
2835
+ stack width: 50 do
2836
+ para "=^.^=", stroke: green
2837
+ end
2838
+ end
2839
+ end
2840
+ ```
2841
+
2842
+ In HTML and many other languages, the border is painted on the outside of the
2843
+ box, thus increasing the overall width of the box. Shoes was designed with
2844
+ consistency in mind, so that if you say that a box is fifty pixels wide, it
2845
+ stays fifty pixels wide regardless of its borders or margins or anything else.
2846
+
2847
+ Please also check out the [[Elements]] section for other methods used on borders.
2848
+
2849
+ ### to_pattern() » a Shoes::Pattern
2850
+
2851
+ Creates a basic pattern object based on the color, gradient or image used to
2852
+ paint this border. The pattern may then be re-used in new borders and
2853
+ backgrounds.
2854
+
2855
+ ## Button
2856
+
2857
+ Buttons are, you know, push buttons. You click them and they do something.
2858
+ Buttons are known to say "OK" or "Are you sure?" And, then, if you're sure,
2859
+ you click the button. ![man-ele-button.png](man-ele-button.png)
2860
+
2861
+ ```ruby
2862
+ #!ruby
2863
+ Shoes.app do
2864
+ button "OK!"
2865
+ button "Are you sure?"
2866
+ end
2867
+ ```
2868
+
2869
+ The buttons in the example above don't do anything when you click them. In
2870
+ order to get them to work, you've got to hook up a block to each button.
2871
+
2872
+ ```ruby
2873
+ #!ruby
2874
+ Shoes.app do
2875
+ button "OK!" do
2876
+ append { para "Well okay then." }
2877
+ end
2878
+ button "Are you sure?" do
2879
+ append { para "Your confidence is inspiring." }
2880
+ end
2881
+ end
2882
+ ```
2883
+
2884
+ So now we've got blocks for the buttons. Each block appends a new paragraph to
2885
+ the page. The more you click, the more paragraphs get added.
2886
+
2887
+ It doesn't go much deeper than that. A button is just a clickable phrase.
2888
+
2889
+ Just to be pedantic, though, here's another way to write that last example.
2890
+
2891
+ ```ruby
2892
+ #!ruby
2893
+ Shoes.app do
2894
+ @b1 = button "OK!"
2895
+ @b1.click { para "Well okay then." }
2896
+ @b2 = button "Are you sure?"
2897
+ @b2.click { para "Your confidence is inspiring." }
2898
+ end
2899
+ ```
2900
+
2901
+ This looks dramatically different, but it does the same thing. The first
2902
+ difference: rather than attaching the block directly to the button, the block
2903
+ is attached later, through the `click` method.
2904
+
2905
+ The second change isn't related to buttons at all. The `append` block was
2906
+ dropped since Shoes allows you to add new elements directly to the slot. So we
2907
+ can just call `para` directly. (This isn't the case with the `prepend`,
2908
+ `before` or `after` methods.)
2909
+
2910
+ Beside the methods below, buttons also inherit all of the methods that are
2911
+ [[Common]].
2912
+
2913
+ ### click() { |self| ... } » self
2914
+
2915
+ When a button is clicked, its `click` block is called. The block is handed
2916
+ `self`. Meaning: the button which was clicked.
2917
+
2918
+ ### focus() » self
2919
+
2920
+ Moves focus to the button. The button will be highlighted and, if the user
2921
+ hits Enter, the button will be clicked.
2922
+
2923
+ ## Check
2924
+
2925
+ Check boxes are clickable square boxes than can be either checked or unchecked.
2926
+ A single checkbox usually asks a "yes" or "no" question. Sets of checkboxes
2927
+ are also seen in to-do lists. ![man-ele-check.png](man-ele-check.png)
2928
+
2929
+ Here's a sample checklist.
2930
+
2931
+ ```ruby
2932
+ #!ruby
2933
+ Shoes.app do
2934
+ stack do
2935
+ flow { check; para "Frances Johnson" }
2936
+ flow { check; para "Ignatius J. Reilly" }
2937
+ flow { check; para "Winston Niles Rumfoord" }
2938
+ end
2939
+ end
2940
+ ```
2941
+
2942
+ You basically have two ways to use a check. You can attach a block to the
2943
+ check and it'll get called when the check gets clicked. And/or you can just
2944
+ use the `checked?` method to go back and see if a box has been checked or not.
2945
+
2946
+ Okay, let's add to the above example.
2947
+
2948
+ ```ruby
2949
+ #!ruby
2950
+ Shoes.app do
2951
+ @list = ['Frances Johnson', 'Ignatius J. Reilly',
2952
+ 'Winston Niles Rumfoord']
2953
+
2954
+ stack do
2955
+ @list.map! do |name|
2956
+ flow { @c = check; para name }
2957
+ [@c, name]
2958
+ end
2959
+
2960
+ button "What's been checked?" do
2961
+ selected = @list.map { |c, name| name if c.checked? }.compact
2962
+ alert("You selected: " + selected.join(', '))
2963
+ end
2964
+ end
2965
+ end
2966
+ ```
2967
+
2968
+ So, when the button gets pressed, each of the checks gets asked for its status,
2969
+ using the `checked?` method.
2970
+
2971
+ Button methods are listed below, but also see the list of [[Common]] methods,
2972
+ which all elements respond to.
2973
+
2974
+ ### checked?() » true or false
2975
+
2976
+ Returns whether the box is checked or not. So, `true` means "yes, the box is checked!"
2977
+
2978
+ ### checked = true or false
2979
+
2980
+ Marks or unmarks the check box. Using `checked = false`, for instance,
2981
+ unchecks the box.
2982
+
2983
+ ### click() { |self| ... } » self
2984
+
2985
+ When the check is clicked, its `click` block is called. The block is handed
2986
+ `self`, which is the check object which was clicked.
2987
+
2988
+ Clicks are sent for both checking and unchecking the box.
2989
+
2990
+ ### focus() » self
2991
+
2992
+ Moves focus to the check. The check will be highlighted and, if the user hits
2993
+ Enter, the check will be toggled between its checked and unchecked states.
2994
+
2995
+ ## EditBox
2996
+
2997
+ Edit boxes are wide, rectangular boxes for entering text. On the web, they
2998
+ call these textareas. These are multi-line edit boxes for entering longer
2999
+ descriptions. Essays, even![man-ele-editbox.png](man-ele-editbox.png)
3000
+
3001
+ Without any other styling, edit boxes are sized 200 pixels by 108 pixels. You
3002
+ can also use `:width` and `:height` styles to set specific sizes.
3003
+
3004
+ ```ruby
3005
+ #!ruby
3006
+ Shoes.app do
3007
+ edit_box
3008
+ edit_box width: 100, height: 100
3009
+ end
3010
+ ```
3011
+
3012
+ Other controls (like [[Button]] and [[Check]]) have only click events, but both
3013
+ [[EditLine]] and EditBox have a `change` event. The `change` block is called
3014
+ every time someone types into or deletes from the box.
3015
+
3016
+ ```ruby
3017
+ #!ruby
3018
+ Shoes.app do
3019
+ edit_box do |e|
3020
+ @counter.text = e.text.size
3021
+ end
3022
+ @counter = strong("0")
3023
+ para @counter, " characters"
3024
+ end
3025
+ ```
3026
+
3027
+ Notice that the example also uses the [[EditBox.text]] method inside the block.
3028
+ That method gives you a string of all the characters typed into the box.
3029
+
3030
+ More edit box methods are listed below, but also see the list of [[Common]]
3031
+ methods, which all elements respond to.
3032
+
3033
+ ### change() { |self| ... } » self
3034
+
3035
+ Each time a character is added to or removed from the edit box, its `change`
3036
+ block is called. The block is given `self`, which is the edit box object which
3037
+ has changed.
3038
+
3039
+ ### focus() » self
3040
+
3041
+ Moves focus to the edit box. The edit box will be highlighted and the user will
3042
+ be able to type into the edit box.
3043
+
3044
+ ### text() » self
3045
+
3046
+ Return a string of characters which have been typed into the box.
3047
+
3048
+ ### text = a string
3049
+
3050
+ Fills the edit box with the characters of `a string`.
3051
+
3052
+ ## EditLine
3053
+
3054
+ Edit lines are a slender, little box for entering text. While the EditBox is
3055
+ multi-line, an edit line is just one. Line, that is. Horizontal, in fact.
3056
+ ![man-ele-editline.png](man-ele-editline.png)
3057
+
3058
+ The unstyled edit line is 200 pixels wide and 28 pixels wide. Roughly. The
3059
+ height may vary on some platforms.
3060
+
3061
+ ```ruby
3062
+ #!ruby
3063
+ Shoes.app do
3064
+ stack do
3065
+ edit_line
3066
+ edit_line width: 400
3067
+ end
3068
+ end
3069
+ ```
3070
+
3071
+ You can change the size by styling both the `:width` and the `:height`.
3072
+ However, you generally only want to style the `:width`, as the height will be
3073
+ sized to fit the font. (And, in current versions of Shoes, the font for edit
3074
+ lines and edit boxes cannot be altered anyway.)
3075
+
3076
+ If a block is given to an edit line, it receives `change` events. Check out the
3077
+ [[EditBox]] page for an example of using a change block. In fact, the edit box
3078
+ has all the same methods as an edit line. Also see the list of [[Common]]
3079
+ methods, which all elements respond to.
3080
+
3081
+ ### change() { |self| ... } » self
3082
+
3083
+ Each time a character is added to or removed from the edit line, its `change`
3084
+ block is called. The block is given `self`, which is the edit line object which
3085
+ has changed.
3086
+
3087
+ ### focus() » self
3088
+
3089
+ Moves focus to the edit line. The edit line will be highlighted and the user
3090
+ will be able to type into the edit line.
3091
+
3092
+ ### text() » self
3093
+
3094
+ Return a string of characters which have been typed into the box.
3095
+
3096
+ ### text = a string
3097
+
3098
+ Fills the edit line with the characters of `a string`.
3099
+
3100
+ ## Image
3101
+
3102
+ An image is a picture in PNG, JPEG or GIF format. Shoes can resize images or
3103
+ flow them in with text. Images can be loaded from a file or directly off the
3104
+ web. ![man-ele-image.png](man-ele-image.png)
3105
+
3106
+ To create an image, use the `image` method in a slot:
3107
+
3108
+ ```ruby
3109
+ #!ruby
3110
+ Shoes.app do
3111
+ para "Nice, nice, very nice. Busy, busy, busy."
3112
+ image "static/shoes-manual-apps.gif"
3113
+ end
3114
+ ```
3115
+
3116
+ When you load any image into Shoes, it is cached in memory. This means that if
3117
+ you load up many image elements from the same file, it'll only really load the
3118
+ file once.
3119
+
3120
+ You can use web URLs directly as well.
3121
+
3122
+ ```ruby
3123
+ #!ruby
3124
+ Shoes.app do
3125
+ image "http://hacketyhack.heroku.com/images/logo.png"
3126
+ end
3127
+ ```
3128
+
3129
+ When an image is loaded from the web, it's cached on the hard drive as well as
3130
+ in memory. This prevents a repeat download unless the image has changed. (In
3131
+ case you're wondering: Shoes keeps track of modification times and etags just
3132
+ like a browser would.)
3133
+
3134
+ Shoes also loads remote images in the background using system threads. So,
3135
+ using remote images will not block Ruby or any intense graphical displays you
3136
+ may have going on.
3137
+
3138
+ ### full_height() » a number
3139
+
3140
+ The full pixel height of the image. Normally, you can just use the
3141
+ [[Common.height]] method to figure out how many pixels high the image is. But
3142
+ if you've resized the image or styled it to be larger or something, then
3143
+ `height` will return the scaled size.
3144
+
3145
+ The `full_height` method gives you the height of image (in pixels) as it was
3146
+ stored in the original file.
3147
+
3148
+ ### full_width() » a number
3149
+
3150
+ The full pixel width of the image. See the [[Image.full_height]] method for an
3151
+ explanation of why you might use this method rather than [[Common.width]].
3152
+
3153
+ ### path() » a string
3154
+
3155
+ The URL or file name of the image.
3156
+
3157
+ ### path = a string
3158
+
3159
+ Swaps the image with a different one, loaded from a file or URL.
3160
+
3161
+ ## ListBox
3162
+
3163
+ List boxes (also called "combo boxes" or "drop-down boxes" or "select boxes" in
3164
+ some places) are a list of options that drop down when you click on the box.
3165
+ ![man-ele-listbox.png](man-ele-listbox.png)
3166
+
3167
+ A list box gets its options from an array. An array (a list) of strings,
3168
+ passed into the `:items` style.
3169
+
3170
+ ```ruby
3171
+ #!ruby
3172
+ Shoes.app do
3173
+ para "Choose a fruit:"
3174
+ list_box items: ["Grapes", "Pears", "Apricots"]
3175
+ end
3176
+ ```
3177
+
3178
+ So, the basic size of a list box is about 200 pixels wide and 28 pixels high.
3179
+ You can adjust this length using the `:width` style.
3180
+
3181
+ ```ruby
3182
+ #!ruby
3183
+ Shoes.app do
3184
+ para "Choose a fruit:"
3185
+ list_box items: ["Grapes", "Pears", "Apricots"],
3186
+ width: 120, choose: "Apricots" do |list|
3187
+ @fruit.text = list.text
3188
+ end
3189
+
3190
+ @fruit = para "No fruit selected"
3191
+ end
3192
+ ```
3193
+
3194
+ Next to the `:width` style, the example uses another useful option. The
3195
+ `:choose` option tells the list box which of the items should be highlighted
3196
+ from the beginning. (There's also a [[ListBox.choose]] method for highlighting
3197
+ an item after the box is created.)
3198
+
3199
+ List boxes also have a [[ListBox.change]] event. In the last example, we've got
3200
+ a block hooked up to the list box. Well, okay, see, that's a `change` block.
3201
+ The block is called each time someone changes the selected item.
3202
+
3203
+ Those are the basics. Might you also be persuaded to look at the [[Common]]
3204
+ methods page, a complete list of the methods that all elements have?
3205
+
3206
+ ### change() { |self| ... } » self
3207
+
3208
+ Whenever someone highlights a new option in the list box (by clicking on an
3209
+ item, for instance,) its `change` block is called. The block is given `self`,
3210
+ which is the list box object which has changed.
3211
+
3212
+ ### choose(item: a string) » self
3213
+
3214
+ Selects the option in the list box that matches the string given by `item`.
3215
+
3216
+ ### focus() » self
3217
+
3218
+ Moves focus to the list box. The list box will be highlighted and, if the user
3219
+ hits the up and down arrow keys, other options in the list will be selected.
3220
+
3221
+ ### items() » an array of strings
3222
+
3223
+ Returns the complete list of strings that the list box presently shows as its options.
3224
+
3225
+ ### items = an array of strings
3226
+
3227
+ Replaces the list box's options with a new list of strings.
3228
+
3229
+ ### text() » a string
3230
+
3231
+ A string containing whatever text is shown highlighted in the list box right
3232
+ now. If nothing is selected, `nil` will be the reply.
3233
+
3234
+ ## Progress
3235
+
3236
+ Progress bars show you how far along you are in an activity. Usually, a
3237
+ progress bar represents a percentage (from 0% to 100%.) Shoes thinks of
3238
+ progress in terms of the decimal numbers 0.0 to 1.0. ![man-ele-progress.png](man-ele-progress.png)
3239
+
3240
+ A simple progress bar is 200 pixels wide, but you can use the `:width` style
3241
+ (as with all Shoes elements) to lengthen it.
3242
+
3243
+ ```ruby
3244
+ Shoes.app do
3245
+ stack margin: 0.1 do
3246
+ title "Progress example"
3247
+ @p = progress width: 1.0
3248
+
3249
+ animate do |i|
3250
+ @p.fraction = (i % 100) / 100.0
3251
+ end
3252
+ end
3253
+ end
3254
+ ```
3255
+
3256
+ Take a look at the [[Common]] methods page for a list of methods found an all
3257
+ elements, including progress bars.
3258
+
3259
+ ### fraction() » a decimal number
3260
+
3261
+ Returns a decimal number from 0.0 to 1.0, indicating how far along the progress bar is.
3262
+
3263
+ ### fraction = a decimal number
3264
+
3265
+ Sets the progress to a decimal number between 0.0 and 1.0.
3266
+
3267
+ ## Radio
3268
+
3269
+ Radio buttons are a group of clickable circles. Click a circle and it'll be
3270
+ marked. Only one radio button can be marked at a time. (This is similar to the
3271
+ ListBox, where only one option can be selected at a time.) ![man-ele-radio.png](man-ele-radio.png)
3272
+
3273
+ So, how do you decide when to use radio buttons and when to use list boxes?
3274
+ Well, list boxes only show one highlighted item unless you click on the box and
3275
+ the drop-down appears. But radio buttons are all shown, regardless of which is
3276
+ marked.
3277
+
3278
+ ```ruby
3279
+ #!ruby
3280
+ Shoes.app do
3281
+ para "Among these films, which do you prefer?\n"
3282
+ radio; para strong("The Taste of Tea"), " by Katsuhito Ishii\n"
3283
+ radio; para strong("Kin-Dza-Dza"), " by Georgi Danelia\n"
3284
+ radio; para strong("Children of Heaven"), " by Majid Majidi\n"
3285
+ end
3286
+ ```
3287
+
3288
+ Only one of these three radios can be checked at a time, since they are grouped
3289
+ together in the same slot (along with a bunch of `para`.)
3290
+
3291
+ If we move them each into their own slot, the example breaks.
3292
+
3293
+ ```ruby
3294
+ #!ruby
3295
+ Shoes.app do
3296
+ stack do
3297
+ para "Among these films, which do you prefer?"
3298
+ flow { radio; para "The Taste of Tea by Katsuhito Ishii" }
3299
+ flow { radio; para "Kin-Dza-Dza by Georgi Danelia" }
3300
+ flow { radio; para "Children of Heaven by Majid Majidi" }
3301
+ end
3302
+ end
3303
+ ```
3304
+
3305
+ This can be fixed, though. You can group together radios from different slots,
3306
+ you just have to give them all the same group name.
3307
+
3308
+ Here, let's group all these radios in the `:films` group.
3309
+
3310
+ ```ruby
3311
+ #!ruby
3312
+ Shoes.app do
3313
+ stack do
3314
+ para "Among these films, which do you prefer?"
3315
+ flow do
3316
+ radio :films
3317
+ para "The Taste of Tea by Katsuhito Ishii"
3318
+ end
3319
+ flow do
3320
+ radio :films
3321
+ para "Kin-Dza-Dza by Georgi Danelia"
3322
+ end
3323
+ flow do
3324
+ radio :films
3325
+ para "Children of Heaven by Majid Majidi"
3326
+ end
3327
+ end
3328
+ end
3329
+ ```
3330
+
3331
+ For more methods beyond those listed below, also look into the [[Common]]
3332
+ methods page. Because you get those methods on every radio as well.
3333
+
3334
+ ### checked?() » true or false
3335
+
3336
+ Returns whether the radio button is checked or not. So, `true` means "yes, it
3337
+ is checked!"
3338
+
3339
+ ### checked = true or false
3340
+
3341
+ Marks or unmarks the radio button. Using `checked = false`, for instance,
3342
+ clears the radio.
3343
+
3344
+ ### click() { |self| ... } » self
3345
+
3346
+ When the radio button is clicked, its `click` block is called. The block is
3347
+ handed `self`, which is an object representing the radio which was clicked.
3348
+
3349
+ Clicks are sent for both marking and unmarking the radio.
3350
+
3351
+ ### focus() » self
3352
+
3353
+ Moves focus to the radio. The radio will be highlighted and, if the user hits
3354
+ Enter, the radio will be toggled between its marked and unmarked states.
3355
+
3356
+ ## Shape
3357
+
3358
+ A shape is a path outline usually created by drawing methods like `oval` and
3359
+ `rect`. ![man-ele-shape.png](man-ele-shape.png)
3360
+
3361
+ See the [[Common]] methods page. Shapes respond to all of those methods.
3362
+
3363
+ ## TextBlock
3364
+
3365
+ The TextBlock object represents a group of text organized as a single element.
3366
+ A paragraph containing bolded text, for example. A caption containing links and
3367
+ bolded text. (So, a `caption` is a TextBlock type. However, `link` and
3368
+ `strong` are TextClass types.) ![man-ele-textblock.png](man-ele-textblock.png)
3369
+
3370
+ All of the various types of TextBlock are found on the [[Element Element
3371
+ Creation]] page.
3372
+
3373
+ * [[Element.banner]], a 48 pixel font.
3374
+ * [[Element.title]], a 34 pixel font.
3375
+ * [[Element.subtitle]], a 26 pixel font.
3376
+ * [[Element.tagline]], an 18 pixel font.
3377
+ * [[Element.caption]], a 14 pixel font.
3378
+ * [[Element.para]], a 12 pixel font.
3379
+ * [[Element.inscription]], a 10 pixel font.
3380
+
3381
+ ### contents() » an array of elements
3382
+
3383
+ Lists all of the strings and styled text objects inside this block.
3384
+
3385
+ ### replace(a string)
3386
+
3387
+ Replaces the text of the entire block with the characters of `a string`.
3388
+
3389
+ ### text() » a string
3390
+
3391
+ Return a string of all of the characters in this text box. This will strip off
3392
+ any style or text classes and just return the actual characters, as if seen on
3393
+ the screen.
3394
+
3395
+ ### text = a string
3396
+
3397
+ Replaces the text of the entire block with the characters of `a string`.
3398
+
3399
+ ### to_s() » a string
3400
+
3401
+ An alias for [[TextBlock.text]]. Returns a flattened string of all of this
3402
+ TextBlock's contents.
3403
+
3404
+ ## Timers
3405
+
3406
+ Shoes contains three timer classes: the Animation class, the Every class and
3407
+ the Timer class. Both Animations and Everies loop over and over after they
3408
+ start. Timers happen once. A one-shot timer.
3409
+
3410
+ Animations and Everies are basically the same thing. The difference is that
3411
+ Animations usually happen many, many times per second. And Everies happen only
3412
+ once every few seconds or rarely.
3413
+
3414
+ ### start() » self
3415
+
3416
+ Both types of timers automatically start themselves, so there's no need to use
3417
+ this normally. But if you [[Timers.stop]] a timer and would like to start it up
3418
+ again, then by all means: use this!
3419
+
3420
+ ### stop() » self
3421
+
3422
+ Pauses the animation or timer. In the case of a one-shot timer that's already
3423
+ happened, it's already stopped and this method will have no effect.
3424
+
3425
+ ### toggle() » self
3426
+
3427
+ If the animation or timer is stopped, it is started. Otherwise, if it is
3428
+ already running, it is stopped.
3429
+
3430
+ ## Video
3431
+
3432
+ Shoes supports embedding of QuickTime, Flash video (FLV), DivX, Xvid and
3433
+ various other popular video formats. This is all thanks to VideoLAN and ffmpeg,
3434
+ two sensational open source libraries. Use the `video` method on a slot to
3435
+ setup a Shoes::Video object. ![man-ele-video.png](man-ele-video.png)
3436
+
3437
+ In addition to video formats, some audio formats are also supported, such as
3438
+ MP3, WAV and Ogg Vorbis.
3439
+
3440
+ Video support is optional in Shoes and some builds do not support video. For
3441
+ example, video support is unavailable for PowerPC. When you download Shoes, the
3442
+ build for your platform will be marked `novideo` in the filename if no video
3443
+ support is available.
3444
+
3445
+ ### hide() » self
3446
+
3447
+ Hides the video. If already playing, the video will continue to play. This just
3448
+ turns off display of the video. One possible use of this method is to collapse
3449
+ the video area when it is playing an audio file, such as an MP3.
3450
+
3451
+ ### length() » a number
3452
+
3453
+ The full length of the video in milliseconds. Returns nil if the video is not
3454
+ yet loaded.
3455
+
3456
+ ### move(left, top) » self
3457
+
3458
+ Moves the video to specific coordinates, the (left, top) being the upper left
3459
+ hand corner of the video.
3460
+
3461
+ ### pause() » self
3462
+
3463
+ Pauses the video, if it is playing.
3464
+
3465
+ ### playing?() » true of false
3466
+
3467
+ Returns true if the video is currently playing. Or, false if the video is
3468
+ paused or stopped.
3469
+
3470
+ ### play() » self
3471
+
3472
+ Starts playing the video, if it isn't already playing. If already playing, the
3473
+ video is restarted from the beginning.
3474
+
3475
+ ### position() » a decimal
3476
+
3477
+ The position of the video as a decimanl number (a Float) between the beginning
3478
+ (0.0) and the end (1.0). For instance, a Float value of 0.5 indicates the
3479
+ halfway point of the video.
3480
+
3481
+ ### position = a decimal
3482
+
3483
+ Sets the position of the video using a Float value. To move the video to its
3484
+ 25% position: `@video.position = 0.25`.
3485
+
3486
+ ### remove() » self
3487
+
3488
+ Removes the video from its slot. This will stop the video as well.
3489
+
3490
+ ### show() » self
3491
+
3492
+ Reveals the video, if it has been hidden by the `hide()` method.
3493
+
3494
+ ### stop() » self
3495
+
3496
+ Stops the video, if it is playing.
3497
+
3498
+ ### time() » a number
3499
+
3500
+ The time position of the video in milliseconds. So, if the video is 10 seconds
3501
+ into play, this method would return the number 10000.
3502
+
3503
+ ### time = a number
3504
+
3505
+ Set the position of the video to a time in milliseconds.
3506
+
3507
+ ### toggle() » self
3508
+
3509
+ Toggles the visibility of the video. If the video can be seen, then `hide` is
3510
+ called. Otherwise, `show` is called.
3511
+
3512
+ # AndSoForth
3513
+
3514
+ A place for some other information.
3515
+
3516
+ ## Sample Apps
3517
+
3518
+ Have fun!
3519
+
3520
+ {SAMPLES}
3521
+
3522
+ ## FAQ
3523
+
3524
+ Hope this helps:
3525
+
3526
+ * You can join [Shoes ML](http://librelist.com/browser/shoes/) and feel free ask your questions.
3527
+ * [Official Current Source Code](http://github.com/shoes/shoes/) is on GitHub.
3528
+ * [Wiki](https://github.com/shoes/shoes/wiki) for Shoes general info.