scarpe 0.2.1 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
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]