scarpe 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (240) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -0
  3. data/.yardopts +11 -0
  4. data/Gemfile +3 -0
  5. data/Gemfile.lock +112 -0
  6. data/README.md +31 -24
  7. data/Rakefile +13 -1
  8. data/docs/yard/catscradle.md +44 -0
  9. data/docs/yard/template/default/fulldoc/html/setup.rb +13 -0
  10. data/docs/yard/template/default/layout/html/setup.rb +9 -0
  11. data/examples/background_with_image.rb +16 -0
  12. data/examples/bloopsaphone/working/bronx_army_knife.rb +66 -0
  13. data/examples/bloopsaphone/working/morning_serenity.rb +21 -0
  14. data/examples/bloopsaphone/working/simpsons_theme_song_by_why.rb +6 -4
  15. data/examples/button_go_away.rb +1 -1
  16. data/examples/check.rb +18 -0
  17. data/examples/clear_and_append.rb +24 -0
  18. data/examples/download_and_show_image.rb +28 -0
  19. data/examples/edit_box.rb +3 -5
  20. data/examples/fonts.rb +2 -2
  21. data/examples/get_headers.rb +10 -0
  22. data/examples/highlander.rb +2 -0
  23. data/examples/link.rb +2 -2
  24. data/examples/local_fonts.rb +4 -0
  25. data/examples/local_images.rb +4 -0
  26. data/examples/motion_events.rb +20 -0
  27. data/examples/parse_xl_funnies.rb +58 -0
  28. data/examples/radio/radio.rb +16 -0
  29. data/examples/radio/radio_groups.rb +18 -0
  30. data/examples/radio/radio_same_slot.rb +6 -0
  31. data/examples/ruby_racer.rb +13 -15
  32. data/examples/selfitude.rb +18 -0
  33. data/examples/shapes/shapes_fill.rb +4 -3
  34. data/examples/shoes_school.rb +2 -4
  35. data/examples/show_hide.rb +6 -0
  36. data/examples/skip_ci/change_my_audio_source.rb +21 -0
  37. data/examples/skip_ci/guitar_fretboard.rb +137 -0
  38. data/examples/video.rb +10 -0
  39. data/exe/scarpe +42 -66
  40. data/fonts/Pacifico.ttf +0 -0
  41. data/lacci/Gemfile +22 -0
  42. data/lacci/Gemfile.lock +72 -0
  43. data/lacci/Rakefile +12 -0
  44. data/lacci/lacci.gemspec +37 -0
  45. data/lacci/lib/lacci/scarpe_cli.rb +70 -0
  46. data/lacci/lib/lacci/scarpe_core.rb +21 -0
  47. data/lacci/lib/lacci/version.rb +13 -0
  48. data/lacci/lib/shoes/app.rb +264 -0
  49. data/{lib/scarpe → lacci/lib/shoes}/background.rb +1 -1
  50. data/{lib/scarpe → lacci/lib/shoes}/border.rb +1 -1
  51. data/{lib/scarpe → lacci/lib/shoes}/colors.rb +1 -1
  52. data/lacci/lib/shoes/constants.rb +29 -0
  53. data/{lib/scarpe → lacci/lib/shoes}/display_service.rb +40 -45
  54. data/lacci/lib/shoes/download.rb +123 -0
  55. data/lacci/lib/shoes/log.rb +71 -0
  56. data/lacci/lib/shoes/spacing.rb +9 -0
  57. data/{lib/scarpe → lacci/lib/shoes}/widget.rb +63 -43
  58. data/{lib/scarpe → lacci/lib/shoes/widgets}/alert.rb +3 -3
  59. data/{lib/scarpe → lacci/lib/shoes/widgets}/arc.rb +7 -5
  60. data/{lib/scarpe → lacci/lib/shoes/widgets}/button.rb +3 -3
  61. data/lacci/lib/shoes/widgets/check.rb +28 -0
  62. data/lacci/lib/shoes/widgets/document_root.rb +20 -0
  63. data/{lib/scarpe → lacci/lib/shoes/widgets}/edit_box.rb +10 -5
  64. data/{lib/scarpe → lacci/lib/shoes/widgets}/edit_line.rb +2 -2
  65. data/lacci/lib/shoes/widgets/flow.rb +22 -0
  66. data/lacci/lib/shoes/widgets/font.rb +14 -0
  67. data/{lib/scarpe → lacci/lib/shoes/widgets}/image.rb +3 -7
  68. data/lacci/lib/shoes/widgets/line.rb +18 -0
  69. data/{lib/scarpe → lacci/lib/shoes/widgets}/link.rb +2 -2
  70. data/{lib/scarpe → lacci/lib/shoes/widgets}/list_box.rb +2 -2
  71. data/{lib/scarpe → lacci/lib/shoes/widgets}/para.rb +4 -26
  72. data/lacci/lib/shoes/widgets/radio.rb +35 -0
  73. data/lacci/lib/shoes/widgets/shape.rb +37 -0
  74. data/lacci/lib/shoes/widgets/slot.rb +75 -0
  75. data/{lib/scarpe → lacci/lib/shoes/widgets}/span.rb +2 -2
  76. data/lacci/lib/shoes/widgets/stack.rb +24 -0
  77. data/{lib/scarpe → lacci/lib/shoes/widgets}/star.rb +6 -9
  78. data/lacci/lib/shoes/widgets/subscription_item.rb +60 -0
  79. data/lacci/lib/shoes/widgets/text_widget.rb +51 -0
  80. data/lacci/lib/shoes/widgets/video.rb +15 -0
  81. data/lacci/lib/shoes/widgets.rb +29 -0
  82. data/lacci/lib/shoes.rb +127 -0
  83. data/lacci/test/test_colors.rb +39 -0
  84. data/lacci/test/test_helper.rb +9 -0
  85. data/lacci/test/test_lacci.rb +9 -0
  86. data/lib/scarpe/cats_cradle.rb +249 -0
  87. data/lib/scarpe/evented_assertions.rb +88 -0
  88. data/lib/scarpe/version.rb +1 -1
  89. data/lib/scarpe/wv/alert.rb +3 -2
  90. data/lib/scarpe/wv/app.rb +30 -8
  91. data/lib/scarpe/wv/arc.rb +5 -6
  92. data/lib/scarpe/wv/background.rb +10 -1
  93. data/lib/scarpe/wv/border.rb +5 -3
  94. data/lib/scarpe/wv/button.rb +11 -9
  95. data/lib/scarpe/wv/check.rb +29 -0
  96. data/lib/scarpe/wv/control_interface.rb +14 -20
  97. data/lib/scarpe/wv/control_interface_test.rb +13 -28
  98. data/lib/scarpe/wv/document_root.rb +3 -45
  99. data/lib/scarpe/wv/edit_box.rb +5 -7
  100. data/lib/scarpe/wv/edit_line.rb +2 -2
  101. data/lib/scarpe/wv/flow.rb +10 -20
  102. data/lib/scarpe/wv/font.rb +36 -0
  103. data/lib/scarpe/wv/html.rb +3 -2
  104. data/lib/scarpe/wv/image.rb +7 -2
  105. data/lib/scarpe/wv/line.rb +4 -7
  106. data/lib/scarpe/wv/link.rb +1 -0
  107. data/lib/scarpe/wv/list_box.rb +3 -3
  108. data/lib/scarpe/wv/para.rb +16 -14
  109. data/lib/scarpe/wv/radio.rb +34 -0
  110. data/lib/scarpe/wv/shape.rb +44 -8
  111. data/lib/scarpe/wv/slot.rb +81 -0
  112. data/lib/scarpe/wv/spacing.rb +1 -1
  113. data/lib/scarpe/wv/span.rb +10 -8
  114. data/lib/scarpe/wv/stack.rb +10 -30
  115. data/lib/scarpe/wv/star.rb +11 -12
  116. data/lib/scarpe/wv/subscription_item.rb +50 -0
  117. data/lib/scarpe/wv/video.rb +34 -0
  118. data/lib/scarpe/wv/web_wrangler.rb +238 -58
  119. data/lib/scarpe/wv/webview_local_display.rb +27 -5
  120. data/lib/scarpe/wv/webview_relay_display.rb +18 -119
  121. data/lib/scarpe/wv/webview_relay_util.rb +143 -0
  122. data/lib/scarpe/wv/widget.rb +80 -11
  123. data/lib/scarpe/wv/wv_display_worker.rb +17 -4
  124. data/lib/scarpe/wv.rb +33 -4
  125. data/lib/scarpe/wv_local.rb +1 -1
  126. data/lib/scarpe/wv_relay.rb +1 -1
  127. data/lib/scarpe.rb +3 -32
  128. data/scarpe-components/.gitignore +1 -0
  129. data/scarpe-components/Gemfile +22 -0
  130. data/scarpe-components/README.md +35 -0
  131. data/scarpe-components/Rakefile +12 -0
  132. data/scarpe-components/lib/scarpe/components/base64.rb +29 -0
  133. data/scarpe-components/lib/scarpe/components/file_helpers.rb +65 -0
  134. data/scarpe-components/lib/scarpe/components/modular_logger.rb +113 -0
  135. data/scarpe-components/lib/scarpe/components/print_logger.rb +43 -0
  136. data/{lib/scarpe → scarpe-components/lib/scarpe/components}/promises.rb +102 -35
  137. data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +170 -0
  138. data/scarpe-components/lib/scarpe/components/unit_test_helpers.rb +217 -0
  139. data/scarpe-components/lib/scarpe/components/version.rb +7 -0
  140. data/scarpe-components/scarpe-components.gemspec +38 -0
  141. data/scarpe-components/test/test_components.rb +9 -0
  142. data/scarpe-components/test/test_helper.rb +23 -0
  143. data/scarpe-components/test/test_promises.rb +260 -0
  144. data/scarpe-components/test/test_segmented_app_files.rb +182 -0
  145. data/{lib/scarpe → spikes}/glibui/widget.rb +2 -2
  146. data/{lib/scarpe → spikes}/glibui.rb +1 -1
  147. data/templates/basic_class_template.erb +1 -1
  148. data/templates/class_template_with_event_bind.erb +1 -1
  149. data/templates/class_template_with_shapes.erb +1 -1
  150. data/templates/webview_template.erb +0 -3
  151. metadata +151 -118
  152. data/examples/fill.rb +0 -25
  153. data/examples/legacy/not_checked/shoes-contrib/basic/class-book.yaml +0 -387
  154. data/examples/legacy/not_checked/shoes-contrib/good/good-clock.rb +0 -51
  155. data/examples/legacy/not_checked/shoes-contrib/good/good-follow.rb +0 -26
  156. data/examples/legacy/not_checked/shoes-contrib/good/good-reminder.rb +0 -174
  157. data/examples/legacy/not_checked/shoes-contrib/good/good-vjot.rb +0 -56
  158. data/examples/legacy/not_checked/shoes-contrib/simple/simple-timer.rb +0 -13
  159. data/examples/legacy/not_checked/shoes-dep-samples/good-clock.rb +0 -51
  160. data/examples/legacy/not_checked/shoes-dep-samples/good-follow.rb +0 -26
  161. data/examples/legacy/not_checked/shoes-dep-samples/good-reminder.rb +0 -174
  162. data/examples/legacy/not_checked/shoes-dep-samples/good-vjot.rb +0 -56
  163. data/examples/legacy/not_checked/shoes-dep-samples/simple-accordion.rb +0 -75
  164. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-shapes.rb +0 -17
  165. data/examples/legacy/not_checked/shoes-dep-samples/simple-anim-text.rb +0 -13
  166. data/examples/legacy/not_checked/shoes-dep-samples/simple-arc.rb +0 -23
  167. data/examples/legacy/not_checked/shoes-dep-samples/simple-bounce.rb +0 -24
  168. data/examples/legacy/not_checked/shoes-dep-samples/simple-calc.rb +0 -70
  169. data/examples/legacy/not_checked/shoes-dep-samples/simple-chipmunk.rb +0 -26
  170. data/examples/legacy/not_checked/shoes-dep-samples/simple-control-sizes.rb +0 -24
  171. data/examples/legacy/not_checked/shoes-dep-samples/simple-curve.rb +0 -26
  172. data/examples/legacy/not_checked/shoes-dep-samples/simple-dialogs.rb +0 -29
  173. data/examples/legacy/not_checked/shoes-dep-samples/simple-draw.rb +0 -13
  174. data/examples/legacy/not_checked/shoes-dep-samples/simple-editor.rb +0 -28
  175. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.rb +0 -28
  176. data/examples/legacy/not_checked/shoes-dep-samples/simple-form.shy +0 -0
  177. data/examples/legacy/not_checked/shoes-dep-samples/simple-mask.rb +0 -21
  178. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu.rb +0 -31
  179. data/examples/legacy/not_checked/shoes-dep-samples/simple-menu1.rb +0 -35
  180. data/examples/legacy/not_checked/shoes-dep-samples/simple-rubygems.rb +0 -29
  181. data/examples/legacy/not_checked/shoes-dep-samples/simple-slide.rb +0 -45
  182. data/examples/legacy/not_checked/shoes-dep-samples/simple-sphere.rb +0 -28
  183. data/examples/legacy/not_checked/shoes-dep-samples/simple-sqlite3.rb +0 -13
  184. data/examples/legacy/not_checked/shoes-dep-samples/simple-timer.rb +0 -13
  185. data/examples/legacy/not_checked/shoes-dep-samples/simple-video.rb +0 -13
  186. data/examples/legacy/not_checked/simple/anim-text.rb +0 -13
  187. data/examples/legacy/not_checked/simple/arc.rb +0 -23
  188. data/examples/legacy/not_checked/simple/bounce.rb +0 -24
  189. data/examples/legacy/not_checked/simple/chipmunk.rb +0 -26
  190. data/examples/legacy/not_checked/simple/curve.rb +0 -26
  191. data/examples/legacy/not_checked/simple/dialogs.rb +0 -29
  192. data/examples/legacy/not_checked/simple/downloader.rb +0 -40
  193. data/examples/legacy/not_checked/simple/draw.rb +0 -13
  194. data/examples/legacy/not_checked/simple/mask.rb +0 -21
  195. data/examples/legacy/not_checked/simple/slide.rb +0 -45
  196. data/examples/legacy/not_checked/simple/sphere.rb +0 -28
  197. data/lib/constants.rb +0 -5
  198. data/lib/scarpe/app.rb +0 -78
  199. data/lib/scarpe/document_root.rb +0 -20
  200. data/lib/scarpe/fill.rb +0 -23
  201. data/lib/scarpe/flow.rb +0 -19
  202. data/lib/scarpe/line.rb +0 -25
  203. data/lib/scarpe/logger.rb +0 -155
  204. data/lib/scarpe/shape.rb +0 -19
  205. data/lib/scarpe/spacing.rb +0 -9
  206. data/lib/scarpe/stack.rb +0 -70
  207. data/lib/scarpe/text_widget.rb +0 -42
  208. data/lib/scarpe/unit_test_helpers.rb +0 -163
  209. data/lib/scarpe/widgets.rb +0 -30
  210. data/lib/scarpe/wv/fill.rb +0 -30
  211. data/lib/scarpe/wv/shape_helper.rb +0 -44
  212. data/scarpe-0.2.0.gem +0 -0
  213. /data/{lib/scarpe → spikes}/glibui/README.md +0 -0
  214. /data/{lib/scarpe → spikes}/glibui/alert.rb +0 -0
  215. /data/{lib/scarpe → spikes}/glibui/app.rb +0 -0
  216. /data/{lib/scarpe → spikes}/glibui/background.rb +0 -0
  217. /data/{lib/scarpe → spikes}/glibui/border.rb +0 -0
  218. /data/{lib/scarpe → spikes}/glibui/button.rb +0 -0
  219. /data/{lib/scarpe → spikes}/glibui/dimensions.rb +0 -0
  220. /data/{lib/scarpe → spikes}/glibui/document_root.rb +0 -0
  221. /data/{lib/scarpe → spikes}/glibui/edit_box.rb +0 -0
  222. /data/{lib/scarpe → spikes}/glibui/edit_line.rb +0 -0
  223. /data/{lib/scarpe → spikes}/glibui/flow.rb +0 -0
  224. /data/{lib/scarpe → spikes}/glibui/html.rb +0 -0
  225. /data/{lib/scarpe → spikes}/glibui/image.rb +0 -0
  226. /data/{lib/scarpe → spikes}/glibui/link.rb +0 -0
  227. /data/{lib/scarpe → spikes}/glibui/local_display.rb +0 -0
  228. /data/{lib/scarpe → spikes}/glibui/para.rb +0 -0
  229. /data/{lib/scarpe → spikes}/glibui/spacing.rb +0 -0
  230. /data/{lib/scarpe → spikes}/glibui/stack.rb +0 -0
  231. /data/{lib/scarpe → spikes}/glibui/text_widget.rb +0 -0
  232. /data/{lib/scarpe → spikes}/libui/alert.rb +0 -0
  233. /data/{lib/scarpe → spikes}/libui/button.rb +0 -0
  234. /data/{lib/scarpe → spikes}/libui/colors.rb +0 -0
  235. /data/{lib/scarpe → spikes}/libui/core.rb +0 -0
  236. /data/{lib/scarpe → spikes}/libui/flow.rb +0 -0
  237. /data/{lib/scarpe → spikes}/libui/libui.rb +0 -0
  238. /data/{lib/scarpe → spikes}/libui/notepad.md +0 -0
  239. /data/{lib/scarpe → spikes}/libui/para.rb +0 -0
  240. /data/{lib/scarpe → spikes}/libui/stack.rb +0 -0
@@ -0,0 +1,4 @@
1
+ Shoes.app do
2
+ font "fonts/Pacifico.ttf"
3
+ para "Hello yayyy"
4
+ end
@@ -0,0 +1,4 @@
1
+ Shoes.app do
2
+ image "docs/static/man-builds.png"
3
+ end
4
+
@@ -0,0 +1,20 @@
1
+ Shoes.app width: 600, height: 600 do
2
+ stack do
3
+ para "Events and Menus"
4
+ flow do
5
+ @btn1 = button "button 1", width: 75 do
6
+ @eb.append "button 1 clicked\n"
7
+ end
8
+ click do
9
+ @eb.append "flow click\n"
10
+ end
11
+ hover do
12
+ @eb.append "flow hover\n"
13
+ end
14
+ end
15
+ @eb = edit_box width: 500, height: 350
16
+ end
17
+ motion do |x, y, mods|
18
+ @eb.append "motion #{x},#{y} #{mods} "
19
+ end
20
+ end
@@ -0,0 +1,58 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+ require 'tempfile'
4
+
5
+ class Comic
6
+ attr_reader :rss, :title
7
+
8
+ def initialize(file_path)
9
+ @rss = Nokogiri::XML(File.open(file_path))
10
+ @title = @rss.at("//channel/title").text
11
+ end
12
+
13
+ def items
14
+ @rss.search("//channel/item")
15
+ end
16
+
17
+ def latest_image
18
+ item = @rss.at("//channel/item[1]")
19
+ description = item.at("description").text
20
+ image_url = description.match(/src="([^"]+\.\w+)"/)[1]
21
+ title = item.at("title").text
22
+ [title, image_url]
23
+ end
24
+ end
25
+
26
+ Shoes.app width: 800, height: 600 do
27
+ background "#555"
28
+ @title = "Web Funnies"
29
+
30
+ stack margin: 10 do
31
+ title strong(@title), align: "center", stroke: "#DFA", margin: 0
32
+ para "(loaded from RSS feeds)", align: "center", stroke: "#DFA", margin: 0
33
+
34
+ url = "https://xkcd.com/rss.xml"
35
+ rss_string = URI.open(url).read
36
+
37
+ file = Tempfile.new('download')
38
+ file.write(rss_string)
39
+ file.close
40
+ file_path = file.path
41
+
42
+ c = Comic.new(file_path)
43
+
44
+ stack width: "100%", margin: 10, border: 1 do
45
+ stack do
46
+ background "#333", curve: 4
47
+ caption c.title, stroke: "#CD9", margin: 4
48
+ end
49
+
50
+ title, image_url = c.latest_image
51
+
52
+ flow do
53
+ image image_url
54
+ para strong(title), margin: 8, stroke: white
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,16 @@
1
+ Shoes.app do
2
+ stack do
3
+ para "Among these films, which do you prefer?"
4
+ flow { radio; para "The Taste of Tea by Katsuhito Ishii" }
5
+ flow { radio "a"; para "Kin-Dza-Dza by Georgi Danelia" }
6
+ flow { radio; para "Children of Heaven by Majid Majidi" }
7
+ @btn = radio; para "The White Balloon by Jafar Panahi"
8
+ button "Mark me" do
9
+ @btn.checked = true
10
+
11
+ end
12
+ button "unmark me" do
13
+ @btn.checked = false
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,18 @@
1
+ Shoes.app do
2
+ stack do
3
+ para "Among these films, which do you prefer?"
4
+ flow do
5
+ radio :films
6
+ para "The Taste of Tea by Katsuhito Ishii"
7
+ end
8
+ flow do
9
+ radio :films
10
+ para "Kin-Dza-Dza by Georgi Danelia"
11
+ end
12
+ flow do
13
+ radio :films
14
+ para "Children of Heaven by Majid Majidi"
15
+ end
16
+ puts radio(:films).checked?
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+ Shoes.app do
2
+ para "Among these films, which do you prefer?\n"
3
+ radio; para strong("The Taste of Tea"), " by Katsuhito Ishii\n"
4
+ radio; para strong("Kin-Dza-Dza"), " by Georgi Danelia\n"
5
+ radio; para strong("Children of Heaven"), " by Majid Majidi\n"
6
+ end
@@ -1,30 +1,28 @@
1
1
  require "benchmark"
2
2
  require "stringio"
3
3
 
4
- Shoes.app(title: "Ruby Racer", debug: true) do
4
+ Shoes.app(title: "Ruby Racer") do
5
5
  racer1 = nil
6
6
  racer2 = nil
7
7
 
8
8
  flow do
9
9
  stack width: 0.45, margin: 5 do
10
10
  para "Racer 1", size: :caption
11
- racer1 = edit_box(width: "100%", height: 100) do
12
- <<~RUBY
13
- for i in 1..10
14
- a = "1"
15
- end
16
- RUBY
17
- end
11
+ code1 = <<~RUBY
12
+ for i in 1..10
13
+ a = "1"
14
+ end
15
+ RUBY
16
+ racer1 = edit_box(code1, width: "100%", height: 100)
18
17
  end
19
18
  stack width: 0.45, margin: 5 do
20
19
  para "Racer 2", size: :caption
21
- racer2 = edit_box(width: "100%", height: 100) do
22
- <<~RUBY
23
- 10.times do
24
- a = "1"
25
- end
26
- RUBY
27
- end
20
+ code2 = <<~RUBY
21
+ 10.times do
22
+ a = "1"
23
+ end
24
+ RUBY
25
+ racer2 = edit_box(code2, width: "100%", height: 100)
28
26
  end
29
27
  end
30
28
 
@@ -0,0 +1,18 @@
1
+ def printish(msg)
2
+ #$stderr.puts msg
3
+ File.open("/tmp/shoesy_stuff.txt", "a") do |f|
4
+ f.write(msg + "\n")
5
+ end
6
+ end
7
+
8
+ Shoes.app do
9
+ printish "Self top: #{self.inspect}" # It's an instance of Shoes::App, yes
10
+ stack do
11
+ printish "Self in stack: #{self.inspect}" # Yup, here too
12
+ end
13
+ button("Clickity") do
14
+ alert("You clicked me!")
15
+ printish "Self in button handler: #{self.inspect}" # And here too
16
+ end
17
+ end
18
+
@@ -1,10 +1,11 @@
1
1
  Shoes.app do
2
2
  shape do
3
3
  fill "blue"
4
- fill "green"
4
+ stroke "green" # Lines use stroke, not fill, for their color
5
5
  line 0,0, 100, 100
6
+
6
7
  fill "red"
8
+ stroke "black" # Change the stroke back to black for the star
7
9
  star 23, 0, 6, 50, 25
8
10
  end
9
- end
10
-
11
+ end
@@ -1,4 +1,4 @@
1
- Shoes.app(title: "Shoes School", height: 700, width: 1000) do
1
+ Shoes.app(title: "Shoes School", height: 800, width: 1000) do
2
2
  CHAPTERS = [
3
3
  [
4
4
  %(
@@ -37,9 +37,7 @@ Shoes.app(title: "Shoes School", height: 700, width: 1000) do
37
37
  end
38
38
  stack do
39
39
  flow do
40
- IDE = edit_box(height: 300, width: "100%") do
41
- CHAPTERS[current_chapter][0]
42
- end
40
+ IDE = edit_box(CHAPTERS[current_chapter][0], height: 300, width: "100%")
43
41
  end
44
42
  flow do
45
43
  LECTURE = para CHAPTERS[current_chapter][1], size: 30
@@ -0,0 +1,6 @@
1
+ Shoes.app do
2
+ @b1 = button("First")
3
+ @b2 = button("Hide First") { @b1.hide }
4
+ @b3 = button("Show everybody") { @b1.show; @b2.show; @b3.show; @b4.show }
5
+ @b4 = button("Toggle Hide-First") { @b2.toggle }
6
+ end
@@ -0,0 +1,21 @@
1
+ # brew install switchaudio-osx
2
+
3
+ Shoes.app height: 450, width: 450, title: "Change Audio Source 🔊" do
4
+ flow do
5
+ background beige
6
+ border black, strokewidth: 6
7
+ banner "Change Audio Source", align: "center"
8
+ ins "Requires SwitchAudioSource, install with:"
9
+ ins strong "brew install switchaudio-osx"
10
+ end
11
+ current = `SwitchAudioSource -c`.chomp
12
+ @current_source = tagline "Current audio source: #{current}"
13
+ sources = `SwitchAudioSource -a`.split("\n").map do |source|
14
+ flow do
15
+ button source do
16
+ `SwitchAudioSource -s "#{source.chomp}"`
17
+ @current_source.replace "Current audio source: #{source.chomp}"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,137 @@
1
+ require 'bloops'
2
+
3
+ class Fret
4
+ def initialize(string, fret_idx, note, octave)
5
+ @string = string
6
+ @fret_idx = fret_idx
7
+ @note = note
8
+ @octave = octave
9
+ end
10
+
11
+ attr_reader :note
12
+ attr_reader :fret_idx
13
+ attr_reader :string
14
+
15
+ def to_s
16
+ "#{@note}#{@octave}"
17
+ end
18
+ end
19
+
20
+ class GuitarString
21
+ NOTES = %w{a a# b c c# d d# e f f# g g#}
22
+ FRET_COUNT = 23
23
+
24
+ include Enumerable
25
+
26
+ attr_reader :frets
27
+ attr_reader :fret_radios
28
+
29
+ def initialize(idx, open_note, starting_octave)
30
+ @root_note_index = NOTES.index(open_note)
31
+ octave = starting_octave
32
+
33
+
34
+ fret_index = 0
35
+ @frets = NOTES.cycle
36
+ .take(FRET_COUNT + @root_note_index)
37
+ .to_a[@root_note_index..-1]
38
+ .map { |note|
39
+ if note == NOTES.first
40
+ octave +=1
41
+ end
42
+ Fret.new(idx, fret_index, note, octave)
43
+ }
44
+ @fret_radios = {}
45
+ end
46
+
47
+ def render(app)
48
+ frets = @frets
49
+ string = self
50
+
51
+ app.flow(height: "15%") do
52
+ frets.each do |f|
53
+ flow width: "3%" do
54
+ border black, strokewidth: 1
55
+ background linen
56
+ string.fret_radios[f] = radio(f.string)
57
+ caption f.note
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ class Tunings
65
+ STANDARD = %w{ e a d g b e }
66
+ DSTANDARD = %w{ d g c f a d }
67
+ DADGAD = %w{ d a d g a d }
68
+
69
+ def self.get(constname)
70
+ tconst = constname.upcase.gsub(" ", "")
71
+ const_get(tconst).reverse.map.with_index do |n, idx|
72
+ GuitarString.new(idx, n, 2)
73
+ end
74
+ end
75
+ end
76
+
77
+ def bloops
78
+ @bloops ||= Bloops.new
79
+ end
80
+
81
+ def play_chord(notes)
82
+ bloops.clear
83
+ sound = bloops.sound Bloops::SQUARE
84
+ sound.sustain = 0.05
85
+ sound.decay = 0.35
86
+
87
+ notes.each do |n|
88
+ bloops.tune sound, n
89
+ end
90
+
91
+ bloops.play
92
+ end
93
+
94
+ Shoes.app(width: 1280, height: 400) do
95
+ @tuning = "standard"
96
+ @strings = Tunings::get(@tuning)
97
+ @fretboard = []
98
+
99
+ render_strings = ->(app) {
100
+ @strings.each do |string|
101
+ string.render(app)
102
+ end
103
+ }
104
+
105
+ flow do
106
+ @current_tuning = title @tuning
107
+ @fretboard = stack width: "100%", margin: 20, &render_strings
108
+
109
+ stack do
110
+ button "Play" do
111
+ fretted_notes = @strings.flat_map { |s|
112
+ s.fret_radios.select { |k, v| v.checked? }.keys
113
+ }.map(&:to_s)
114
+
115
+ play_chord(fretted_notes)
116
+
117
+ @strings.map do |s|
118
+ s.fret_radios.map { |_, r| r.checked = false }
119
+ end
120
+ end
121
+
122
+ flow do
123
+ caption "Select a tuning:"
124
+ @tuning_select = list_box(
125
+ items: ["d standard", "dadgad", "standard"]
126
+ ).change { |tuning| @tuning = tuning }
127
+
128
+ button "Change Tuning" do
129
+ self.instance_variable_set("@strings", Tunings::get(@tuning))
130
+ @fretboard.clear
131
+ @fretboard.append(&render_strings)
132
+ @current_tuning.replace @tuning
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
data/examples/video.rb ADDED
@@ -0,0 +1,10 @@
1
+ Shoes.app do
2
+ stack do
3
+ para "Video"
4
+ video "http://techslides.com/demos/sample-videos/small.mp4"
5
+ end
6
+ stack do
7
+ para "Video 2"
8
+ video "https://samplelib.com/lib/preview/mp4/sample-5s.mp4"
9
+ end
10
+ end
data/exe/scarpe CHANGED
@@ -1,58 +1,44 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # We need to not use syntactic features of very recent Rubies in this file, so that it parses
4
- # correctly in earlier Rubies and can successfully give the version-check error.
5
- if RUBY_VERSION[0..2] < "3.2"
6
- STDERR.puts("Scarpe requires Ruby 3.2 or higher!")
7
- exit(-1)
8
- end
3
+ # First we need to load Scarpe and Lacci, which means figuring out where from.
9
4
 
10
- def print_usage
11
- puts <<USAGE
12
- Usage: scarpe [OPTIONS] <scarpe app file> # Same as "scarpe run"
13
- scarpe [OPTIONS] run <scarpe app file>
14
- scarpe [OPTIONS] env # print Scarpe environment settings
15
- scarpe -v # print the Scarpe gem version and exit
16
- Options:
17
- --dev Use development local scarpe, not an installed gem
18
- --debug Turn on application debug mode
19
- USAGE
20
- end
5
+ # --dev option applies to all actions
6
+ use_dev = ARGV.delete("--dev") ? true : false
7
+ use_debug = ARGV.delete("--debug") ? true : false
21
8
 
22
- def env_or_default(env_var, default_val)
23
- "#{env_var}: #{ENV[env_var] || default_val}"
9
+ # Default to local webview display if not otherwise given
10
+ ENV['SCARPE_DISPLAY'] ||= 'wv_local'
11
+
12
+ if use_debug
13
+ ENV['SCARPE_DEBUG'] = 'true'
14
+ end
15
+ if use_dev
16
+ dev_path = File.expand_path("../lib", __dir__)
17
+ $LOAD_PATH.prepend dev_path
24
18
  end
25
19
 
26
- def env_or_none(env_var)
27
- env_or_default(env_var, "(none)")
20
+ if use_dev
21
+ require 'bundler/setup'
22
+ Bundler.require(:default)
28
23
  end
24
+ require "scarpe"
25
+ require "lacci/scarpe_cli"
26
+
27
+ include Scarpe::CLI
29
28
 
30
- def print_env
31
- puts <<~SCARPE_ENV
32
- Scarpe environment:
33
- #{env_or_default("SCARPE_DISPLAY_SERVICE", "(default)wv_local")}
34
- #{env_or_default("SCARPE_LOG_CONFIG", "(default)#{Scarpe::Log::DEFAULT_LOG_CONFIG.inspect}")}
35
- Scarpe::WV environment:
36
- #{env_or_none("SCARPE_TEST_CONTROL")}
37
- #{env_or_none("SCARPE_TEST_RESULTS")}
38
- #{env_or_none("SCARPE_DEBUG")}
39
- Ruby and shell environment:
40
- RUBY_DESCRIPTION: #{RUBY_DESCRIPTION.inspect}
41
- RUBY_PLATFORM: #{RUBY_PLATFORM.inspect}
42
- RUBY_ENGINE: #{RUBY_ENGINE.inspect}
43
- #{env_or_none("SHELL")}
44
- #{env_or_none("PATH")}
45
- #{env_or_none("LD_LIBRARY_PATH")}
46
- #{env_or_none("DYLD_LIBRARY_PATH")}
47
- #{env_or_none("GEM_ROOT")}
48
- #{env_or_none("GEM_HOME")}
49
- #{env_or_none("GEM_PATH")}
50
- SCARPE_ENV
29
+ # We need to not use syntactic features of very recent Rubies in this file, so that it parses
30
+ # correctly in earlier Rubies and can successfully give the version-check error.
31
+ version_check
32
+
33
+ def print_usage
34
+ puts DEFAULT_USAGE
51
35
  end
52
36
 
53
- # --dev option applies to all actions
54
- use_dev = ARGV.delete("--dev") ? true : false
55
- use_debug = ARGV.delete("--debug") ? true : false
37
+ add_env_categories("Scarpe::WV" => [
38
+ env_or_default("SCARPE_TEST_CONTROL", "(none)"),
39
+ env_or_default("SCARPE_TEST_RESULTS", "(none)"),
40
+ env_or_default("SCARPE_TEST_DEBUG", "(none)"),
41
+ ])
56
42
 
57
43
  verb = "run"
58
44
  verb_target = nil
@@ -83,26 +69,16 @@ else
83
69
  verb_target = ARGV[0]
84
70
  end
85
71
 
86
- if use_debug
87
- ENV['SCARPE_DEBUG'] = 'true'
88
- end
89
- if use_dev
90
- dev_path = File.expand_path("../lib", __dir__)
91
- $LOAD_PATH.prepend dev_path
92
- end
93
- # We mustn't require Scarpe sooner than this so that the --dev setting is respected
94
- require "scarpe"
95
-
96
- Shoes = Scarpe unless defined?(Shoes)
97
-
98
72
  case verb
99
- when "-v"
100
- puts "Scarpe #{Scarpe::VERSION}"
101
- when "run"
102
- # Run the Scarpe app file
103
- load ARGV[0]
104
- when "env"
105
- print_env
106
- else
107
- raise "Internal error! Unknown ./exe/scarpe verb!"
73
+ when "-v"
74
+ puts "Scarpe #{Scarpe::VERSION}"
75
+ puts "Scarpe-Components #{Scarpe::Components::VERSION}"
76
+ puts "Lacci #{Lacci::VERSION}"
77
+ when "run"
78
+ # Run the Scarpe app file
79
+ Shoes.run_app ARGV[0]
80
+ when "env"
81
+ print_env
82
+ else
83
+ raise "Internal error! Unknown ./exe/scarpe verb!"
108
84
  end
Binary file
data/lacci/Gemfile ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gemspec
6
+
7
+ gem "rake", "~> 13.0"
8
+
9
+ group :test do
10
+ gem "minitest", "~> 5.0"
11
+ gem "minitest-reporters"
12
+ end
13
+
14
+ group :development do
15
+ gem "yard"
16
+ gem "redcarpet"
17
+ gem "debug"
18
+ gem "rubocop", "~> 1.21"
19
+ gem "rubocop-shopify"
20
+ #gem "commonmarker"
21
+ #gem "github-markup"
22
+ end
@@ -0,0 +1,72 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ lacci (0.2.1)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ ansi (1.5.0)
10
+ ast (2.4.2)
11
+ builder (3.2.4)
12
+ debug (1.8.0)
13
+ irb (>= 1.5.0)
14
+ reline (>= 0.3.1)
15
+ io-console (0.6.0)
16
+ irb (1.7.2)
17
+ reline (>= 0.3.6)
18
+ json (2.6.3)
19
+ language_server-protocol (3.17.0.3)
20
+ minitest (5.18.1)
21
+ minitest-reporters (1.6.0)
22
+ ansi
23
+ builder
24
+ minitest (>= 5.0)
25
+ ruby-progressbar
26
+ parallel (1.23.0)
27
+ parser (3.2.2.3)
28
+ ast (~> 2.4.1)
29
+ racc
30
+ racc (1.7.1)
31
+ rainbow (3.1.1)
32
+ rake (13.0.6)
33
+ redcarpet (3.6.0)
34
+ regexp_parser (2.8.1)
35
+ reline (0.3.6)
36
+ io-console (~> 0.5)
37
+ rexml (3.2.5)
38
+ rubocop (1.54.1)
39
+ json (~> 2.3)
40
+ language_server-protocol (>= 3.17.0)
41
+ parallel (~> 1.10)
42
+ parser (>= 3.2.2.3)
43
+ rainbow (>= 2.2.2, < 4.0)
44
+ regexp_parser (>= 1.8, < 3.0)
45
+ rexml (>= 3.2.5, < 4.0)
46
+ rubocop-ast (>= 1.28.0, < 2.0)
47
+ ruby-progressbar (~> 1.7)
48
+ unicode-display_width (>= 2.4.0, < 3.0)
49
+ rubocop-ast (1.29.0)
50
+ parser (>= 3.2.1.0)
51
+ rubocop-shopify (2.14.0)
52
+ rubocop (~> 1.51)
53
+ ruby-progressbar (1.13.0)
54
+ unicode-display_width (2.4.2)
55
+ yard (0.9.34)
56
+
57
+ PLATFORMS
58
+ x86_64-darwin-22
59
+
60
+ DEPENDENCIES
61
+ debug
62
+ lacci!
63
+ minitest (~> 5.0)
64
+ minitest-reporters
65
+ rake (~> 13.0)
66
+ redcarpet
67
+ rubocop (~> 1.21)
68
+ rubocop-shopify
69
+ yard
70
+
71
+ BUNDLED WITH
72
+ 2.4.10
data/lacci/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.libs << "lib"
9
+ t.test_files = FileList["test/**/test_*.rb"]
10
+ end
11
+
12
+ task default: [:test]