scarpe 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (251) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -1
  3. data/CHANGELOG.md +36 -4
  4. data/Gemfile +2 -1
  5. data/Gemfile.lock +13 -3
  6. data/LICENSE.txt +7 -1
  7. data/README.md +77 -14
  8. data/Rakefile +67 -0
  9. data/examples/Edit_box_Styles.rb +8 -0
  10. data/examples/Kerning.rb +7 -0
  11. data/examples/border.rb +11 -0
  12. data/examples/check.rb +2 -0
  13. data/examples/download_and_show_image.rb +3 -0
  14. data/examples/flags/finland.rb +15 -0
  15. data/examples/flags/italy.rb +11 -0
  16. data/examples/flags/mauritius.rb +14 -0
  17. data/examples/font_family.rb +17 -0
  18. data/examples/font_shorthand.rb +9 -0
  19. data/examples/gen.rb +4 -0
  20. data/examples/legacy/not_checked/shoes-manual/append.rb +10 -0
  21. data/examples/legacy/not_checked/shoes-manual/background_change.rb +12 -0
  22. data/examples/legacy/not_checked/shoes-manual/background_pattern.rb +5 -0
  23. data/examples/legacy/not_checked/shoes-manual/basic_app.rb +8 -0
  24. data/examples/legacy/not_checked/shoes-manual/border.rb +9 -0
  25. data/examples/legacy/not_checked/shoes-manual/builtins/FONTS.rb +5 -0
  26. data/examples/legacy/not_checked/shoes-manual/builtins/ask.rb +2 -0
  27. data/examples/legacy/not_checked/shoes-manual/builtins/ask_color.rb +5 -0
  28. data/examples/legacy/not_checked/shoes-manual/builtins/ask_open_file.rb +5 -0
  29. data/examples/legacy/not_checked/shoes-manual/builtins/ask_save_folder.rb +2 -0
  30. data/examples/legacy/not_checked/shoes-manual/builtins/confirm.rb +4 -0
  31. data/examples/legacy/not_checked/shoes-manual/builtins/debug.rb +2 -0
  32. data/examples/legacy/not_checked/shoes-manual/builtins/info.rb +3 -0
  33. data/examples/legacy/not_checked/shoes-manual/button.rb +9 -0
  34. data/examples/legacy/not_checked/shoes-manual/clear.rb +7 -0
  35. data/examples/legacy/not_checked/shoes-manual/custom_header.rb +13 -0
  36. data/examples/legacy/not_checked/shoes-manual/displace.rb +14 -0
  37. data/examples/legacy/not_checked/shoes-manual/edit_box.rb +8 -0
  38. data/examples/legacy/not_checked/shoes-manual/fill_pattern.rb +5 -0
  39. data/examples/legacy/not_checked/shoes-manual/fonts.rb +7 -0
  40. data/examples/legacy/not_checked/shoes-manual/gutter.rb +6 -0
  41. data/examples/legacy/not_checked/shoes-manual/image_web.rb +4 -0
  42. data/examples/legacy/not_checked/shoes-manual/keypress.rb +7 -0
  43. data/examples/legacy/not_checked/shoes-manual/list_box.rb +10 -0
  44. data/examples/legacy/not_checked/shoes-manual/motion.rb +10 -0
  45. data/examples/legacy/not_checked/shoes-manual/mouse.rb +8 -0
  46. data/examples/legacy/not_checked/shoes-manual/move.rb +14 -0
  47. data/examples/legacy/not_checked/shoes-manual/nested_ovals.rb +8 -0
  48. data/examples/legacy/not_checked/shoes-manual/oval.rb +7 -0
  49. data/examples/legacy/not_checked/shoes-manual/ovals.rb +6 -0
  50. data/examples/legacy/not_checked/shoes-manual/ovals_image.rb +8 -0
  51. data/examples/legacy/not_checked/shoes-manual/prepend.rb +7 -0
  52. data/examples/legacy/not_checked/shoes-manual/progress_bar.rb +10 -0
  53. data/examples/legacy/not_checked/shoes-manual/radio.rb +18 -0
  54. data/examples/legacy/not_checked/shoes-manual/radio_alternative_1.rb +7 -0
  55. data/examples/legacy/not_checked/shoes-manual/radio_alternative_2.rb +9 -0
  56. data/examples/legacy/not_checked/shoes-manual/rotate_rectangle.rb +6 -0
  57. data/examples/legacy/not_checked/shoes-manual/shape.rb +11 -0
  58. data/examples/legacy/not_checked/shoes-manual/static/avatar.png +0 -0
  59. data/examples/legacy/not_checked/shoes-manual/stroke.rb +5 -0
  60. data/examples/legacy/not_checked/shoes-manual/style.rb +3 -0
  61. data/examples/legacy/not_checked/shoes-manual/style_alternative_1.rb +4 -0
  62. data/examples/legacy/not_checked/shoes-manual/style_alternative_2.rb +5 -0
  63. data/examples/legacy/not_checked/shoes-manual/style_length.rb +5 -0
  64. data/examples/legacy/not_checked/shoes-manual/timer.rb +6 -0
  65. data/examples/legacy/not_checked/shoes-manual/trigger_window.rb +8 -0
  66. data/examples/legacy/not_checked/shoes-manual/window_owner.rb +8 -0
  67. data/examples/legacy/working/shoes_manual/alert_button.rb +2 -0
  68. data/examples/legacy/working/shoes_manual/animate.rb +7 -0
  69. data/examples/legacy/working/shoes_manual/background_para.rb +4 -0
  70. data/examples/legacy/working/shoes_manual/button_alternative.rb +7 -0
  71. data/examples/legacy/working/shoes_manual/checkbox.rb +17 -0
  72. data/examples/legacy/working/shoes_manual/download.rb +12 -0
  73. data/examples/legacy/working/shoes_manual/edit_box.rb +6 -0
  74. data/examples/legacy/working/shoes_manual/editline.rb +7 -0
  75. data/examples/legacy/working/shoes_manual/fixed_height.rb +8 -0
  76. data/examples/legacy/working/shoes_manual/fixed_width.rb +12 -0
  77. data/examples/legacy/working/shoes_manual/image.rb +5 -0
  78. data/examples/legacy/working/shoes_manual/instance_variable_check.rb +10 -0
  79. data/examples/legacy/working/shoes_manual/message.rb +18 -0
  80. data/examples/legacy/working/shoes_manual/rectangle.rb +6 -0
  81. data/examples/legacy/working/shoes_manual/save_download.rb +12 -0
  82. data/examples/legacy/working/shoes_manual/self_check.rb +10 -0
  83. data/examples/legacy/working/shoes_manual/stack.rb +7 -0
  84. data/examples/legacy/working/shoes_manual/style_info.rb +8 -0
  85. data/examples/legacy/working/shoes_manual/utf8_support.rb +8 -0
  86. data/examples/legacy/working/shoes_manual/width.rb +4 -0
  87. data/examples/local_assets/multi_image.rb +5 -0
  88. data/examples/local_assets/small.png +0 -0
  89. data/examples/local_fonts.rb +3 -0
  90. data/examples/margin.rb +13 -0
  91. data/examples/margin_check.rb +27 -0
  92. data/examples/oval-with-kwargs.rb +3 -0
  93. data/examples/oval.rb +26 -0
  94. data/examples/para_font_styles.rb +17 -0
  95. data/examples/para_font_variant.rb +6 -0
  96. data/examples/para_fontweight.rb +13 -0
  97. data/examples/parse_xl_funnies.rb +3 -0
  98. data/examples/rect.rb +1 -1
  99. data/examples/scarpe_ext.rb +3 -0
  100. data/examples/shapes/star.rb +1 -3
  101. data/examples/spacing.rb +1 -1
  102. data/examples/span.rb +4 -2
  103. data/lacci/lacci.gemspec +2 -2
  104. data/lacci/lib/lacci/scarpe_cli.rb +0 -1
  105. data/lacci/lib/lacci/version.rb +1 -1
  106. data/lacci/lib/scarpe/niente/display_service.rb +5 -1
  107. data/lacci/lib/scarpe/niente/drawable.rb +2 -0
  108. data/lacci/lib/scarpe/niente/shoes_spec.rb +7 -1
  109. data/lacci/lib/scarpe/niente.rb +14 -2
  110. data/lacci/lib/shoes/app.rb +44 -50
  111. data/lacci/lib/shoes/constants.rb +23 -2
  112. data/lacci/lib/shoes/display_service.rb +43 -4
  113. data/lacci/lib/shoes/drawable.rb +309 -35
  114. data/lacci/lib/shoes/drawables/arc.rb +2 -24
  115. data/lacci/lib/shoes/drawables/arrow.rb +2 -22
  116. data/lacci/lib/shoes/drawables/border.rb +28 -0
  117. data/lacci/lib/shoes/drawables/button.rb +4 -20
  118. data/lacci/lib/shoes/drawables/check.rb +7 -3
  119. data/lacci/lib/shoes/drawables/document_root.rb +4 -4
  120. data/lacci/lib/shoes/drawables/edit_box.rb +6 -5
  121. data/lacci/lib/shoes/drawables/edit_line.rb +5 -4
  122. data/lacci/lib/shoes/drawables/flow.rb +3 -5
  123. data/lacci/lib/shoes/drawables/font_helper.rb +62 -0
  124. data/lacci/lib/shoes/drawables/image.rb +2 -2
  125. data/lacci/lib/shoes/drawables/line.rb +4 -7
  126. data/lacci/lib/shoes/drawables/link.rb +5 -8
  127. data/lacci/lib/shoes/drawables/list_box.rb +8 -5
  128. data/lacci/lib/shoes/drawables/oval.rb +48 -0
  129. data/lacci/lib/shoes/drawables/para.rb +106 -18
  130. data/lacci/lib/shoes/drawables/progress.rb +2 -1
  131. data/lacci/lib/shoes/drawables/radio.rb +5 -3
  132. data/lacci/lib/shoes/drawables/rect.rb +5 -4
  133. data/lacci/lib/shoes/drawables/shape.rb +2 -1
  134. data/lacci/lib/shoes/drawables/slot.rb +99 -8
  135. data/lacci/lib/shoes/drawables/stack.rb +6 -11
  136. data/lacci/lib/shoes/drawables/star.rb +8 -30
  137. data/lacci/lib/shoes/drawables/text_drawable.rb +93 -34
  138. data/lacci/lib/shoes/drawables/video.rb +3 -2
  139. data/lacci/lib/shoes/drawables/widget.rb +8 -3
  140. data/lacci/lib/shoes/drawables.rb +2 -1
  141. data/lacci/lib/shoes/errors.rb +13 -3
  142. data/lacci/lib/shoes/margin_helper.rb +79 -0
  143. data/lacci/lib/shoes.rb +4 -3
  144. data/lacci/test/.gitignore +1 -0
  145. data/lacci/test/test_draw_context.rb +167 -0
  146. data/lacci/test/test_font_helper.rb +57 -0
  147. data/lacci/test/test_helper.rb +31 -4
  148. data/lacci/test/test_lacci.rb +93 -6
  149. data/lacci/test/test_margin_helper.rb +82 -0
  150. data/lacci/test/test_niente_test_infra.rb +26 -0
  151. data/lacci/test/test_oval.rb +82 -0
  152. data/lacci/test/test_parenting.rb +140 -0
  153. data/lacci/test/test_text_drawables.rb +23 -0
  154. data/lib/scarpe/assets.rb +18 -0
  155. data/lib/scarpe/cats_cradle.rb +57 -98
  156. data/lib/scarpe/shoes_spec.rb +22 -43
  157. data/lib/scarpe/version.rb +1 -1
  158. data/lib/scarpe/wv/app.rb +1 -0
  159. data/lib/scarpe/wv/arc.rb +0 -4
  160. data/lib/scarpe/wv/border.rb +15 -0
  161. data/lib/scarpe/wv/control_interface.rb +2 -10
  162. data/lib/scarpe/wv/document_root.rb +2 -2
  163. data/lib/scarpe/wv/drawable.rb +6 -40
  164. data/lib/scarpe/wv/edit_box.rb +4 -1
  165. data/lib/scarpe/wv/edit_line.rb +5 -2
  166. data/lib/scarpe/wv/image.rb +2 -5
  167. data/lib/scarpe/wv/link.rb +4 -2
  168. data/lib/scarpe/wv/oval.rb +13 -0
  169. data/lib/scarpe/wv/para.rb +1 -0
  170. data/lib/scarpe/wv/scarpe_extensions.rb +8 -0
  171. data/lib/scarpe/wv/shape.rb +10 -5
  172. data/lib/scarpe/wv/text_drawable.rb +72 -14
  173. data/lib/scarpe/wv/web_wrangler.rb +33 -11
  174. data/lib/scarpe/wv/webview_local_display.rb +6 -2
  175. data/lib/scarpe/wv.rb +8 -1
  176. data/scarpe-components/Gemfile +4 -1
  177. data/scarpe-components/Gemfile.lock +2 -3
  178. data/scarpe-components/README.md +2 -2
  179. data/scarpe-components/assets/bootstrap-themes/bootstrap-cerulean.css +12229 -0
  180. data/scarpe-components/assets/bootstrap-themes/bootstrap-cosmo.css +11810 -0
  181. data/scarpe-components/assets/bootstrap-themes/bootstrap-cyborg.css +12210 -0
  182. data/scarpe-components/assets/bootstrap-themes/bootstrap-darkly.css +12153 -0
  183. data/scarpe-components/assets/bootstrap-themes/bootstrap-flatly.css +12126 -0
  184. data/scarpe-components/assets/bootstrap-themes/bootstrap-icons.min.css +5 -0
  185. data/scarpe-components/assets/bootstrap-themes/bootstrap-journal.css +12099 -0
  186. data/scarpe-components/assets/bootstrap-themes/bootstrap-litera.css +12211 -0
  187. data/scarpe-components/assets/bootstrap-themes/bootstrap-lumen.css +12369 -0
  188. data/scarpe-components/assets/bootstrap-themes/bootstrap-lux.css +11928 -0
  189. data/scarpe-components/assets/bootstrap-themes/bootstrap-materia.css +13184 -0
  190. data/scarpe-components/assets/bootstrap-themes/bootstrap-minty.css +12177 -0
  191. data/scarpe-components/assets/bootstrap-themes/bootstrap-morph.css +12750 -0
  192. data/scarpe-components/assets/bootstrap-themes/bootstrap-pulse.css +11890 -0
  193. data/scarpe-components/assets/bootstrap-themes/bootstrap-quartz.css +12622 -0
  194. data/scarpe-components/assets/bootstrap-themes/bootstrap-sandstone.css +12201 -0
  195. data/scarpe-components/assets/bootstrap-themes/bootstrap-simplex.css +12186 -0
  196. data/scarpe-components/assets/bootstrap-themes/bootstrap-sketchy.css +12451 -0
  197. data/scarpe-components/assets/bootstrap-themes/bootstrap-slate.css +12492 -0
  198. data/scarpe-components/assets/bootstrap-themes/bootstrap-solar.css +12149 -0
  199. data/scarpe-components/assets/bootstrap-themes/bootstrap-spacelab.css +12266 -0
  200. data/scarpe-components/assets/bootstrap-themes/bootstrap-superhero.css +12216 -0
  201. data/scarpe-components/assets/bootstrap-themes/bootstrap-united.css +12077 -0
  202. data/scarpe-components/assets/bootstrap-themes/bootstrap-vapor.css +12549 -0
  203. data/scarpe-components/assets/bootstrap-themes/bootstrap-yeti.css +12325 -0
  204. data/scarpe-components/assets/bootstrap-themes/bootstrap-zephyr.css +12283 -0
  205. data/scarpe-components/assets/bootstrap-themes/bootstrap.bundle.min.js +7 -0
  206. data/scarpe-components/lib/scarpe/components/asset_server.rb +219 -0
  207. data/scarpe-components/lib/scarpe/components/base64.rb +22 -0
  208. data/scarpe-components/lib/scarpe/components/calzini/{art_widgets.rb → art_drawables.rb} +42 -18
  209. data/scarpe-components/lib/scarpe/components/calzini/border.rb +38 -0
  210. data/scarpe-components/lib/scarpe/components/calzini/button.rb +6 -8
  211. data/scarpe-components/lib/scarpe/components/calzini/misc.rb +7 -17
  212. data/scarpe-components/lib/scarpe/components/calzini/para.rb +213 -11
  213. data/scarpe-components/lib/scarpe/components/calzini/slots.rb +14 -60
  214. data/scarpe-components/lib/scarpe/components/calzini.rb +88 -1
  215. data/scarpe-components/lib/scarpe/components/errors.rb +4 -0
  216. data/scarpe-components/lib/scarpe/components/html.rb +4 -1
  217. data/scarpe-components/lib/scarpe/components/minitest_export_reporter.rb +11 -3
  218. data/scarpe-components/lib/scarpe/components/minitest_result.rb +41 -0
  219. data/scarpe-components/lib/scarpe/components/print_logger.rb +17 -2
  220. data/scarpe-components/lib/scarpe/components/process_helpers.rb +37 -0
  221. data/scarpe-components/lib/scarpe/components/segmented_file_loader.rb +1 -1
  222. data/scarpe-components/lib/scarpe/components/tiranti.rb +42 -100
  223. data/scarpe-components/lib/scarpe/components/unit_test_helpers.rb +3 -1
  224. data/scarpe-components/lib/scarpe/components/version.rb +1 -1
  225. data/scarpe-components/test/assets/big-image.png +0 -0
  226. data/scarpe-components/test/assets/big-stylesheet.css +497 -0
  227. data/scarpe-components/test/assets/little-image.png +0 -0
  228. data/scarpe-components/test/assets/little-stylesheet.css +1 -0
  229. data/scarpe-components/test/calzini/test_calzini_art_drawables.rb +7 -7
  230. data/scarpe-components/test/calzini/test_calzini_button.rb +7 -5
  231. data/scarpe-components/test/calzini/test_calzini_misc.rb +9 -9
  232. data/scarpe-components/test/calzini/test_calzini_para.rb +6 -9
  233. data/scarpe-components/test/calzini/test_calzini_slots.rb +12 -57
  234. data/scarpe-components/test/calzini/test_calzini_text_drawables.rb +83 -18
  235. data/scarpe-components/test/calzini/test_various.rb +133 -0
  236. data/scarpe-components/test/test_asset_server.rb +72 -0
  237. data/scarpe-components/test/test_components.rb +31 -2
  238. data/scarpe-components/test/test_helper.rb +0 -1
  239. data/scarpe-components/test/test_minitest_result.rb +7 -0
  240. data/scarpe-components/test/test_segmented_app_files.rb +2 -0
  241. data/tasks/check_html_fixtures.rb +140 -0
  242. data/tasks/regenerate_html_fixtures.rb +104 -0
  243. data/templates/class_template_with_shapes.erb +0 -11
  244. metadata +180 -32
  245. data/lacci/lib/scarpe/niente/logger.rb +0 -29
  246. data/lacci/lib/shoes/drawables/span.rb +0 -27
  247. data/lacci/lib/shoes/spacing.rb +0 -9
  248. data/lib/scarpe/evented_assertions.rb +0 -121
  249. data/lib/scarpe/wv/span.rb +0 -44
  250. data/scarpe-components/lib/scarpe/components/calzini/text_widgets.rb +0 -65
  251. /data/examples/legacy/{not_checked → working}/shoes3-tests/editline/editline.rb +0 -0
@@ -3,23 +3,18 @@
3
3
  class Shoes
4
4
  class Stack < Shoes::Slot
5
5
  include Shoes::Background
6
- include Shoes::Border
7
- include Shoes::Spacing
8
6
 
9
- # TODO: sort out various margin and padding properties, including putting stuff into spacing
10
- shoes_styles :width, :height, :scroll
7
+ shoes_styles :scroll
11
8
 
12
- shoes_events # No Stack-specific events yet
13
-
14
- def initialize(width: nil, height: nil, margin: nil, padding: nil, scroll: false, margin_top: nil, margin_bottom: nil, margin_left: nil,
15
- margin_right: nil, **options, &block)
16
-
17
- @options = options
9
+ shoes_events # No Stack-specific events
18
10
 
11
+ def initialize(*args, **kwargs, &block)
19
12
  super
20
13
 
21
14
  create_display_drawable
22
- # Create the display-side drawable *before* running the block, which will add child drawables with their display drawables
15
+
16
+ # Create the display-side drawable *before* running the block.
17
+ # Then child drawables have a parent to add themselves to.
23
18
  Shoes::App.instance.with_slot(self, &block) if block_given?
24
19
  end
25
20
  end
@@ -8,43 +8,21 @@ class Shoes
8
8
  shoes_style(:outer) { |val| convert_to_float(val, "outer") }
9
9
  shoes_style(:inner) { |val| convert_to_float(val, "inner") }
10
10
 
11
- shoes_events # No Star-specific events yet
11
+ Shoes::Drawable.drawable_default_styles[Shoes::Star][:points] = 10
12
+ Shoes::Drawable.drawable_default_styles[Shoes::Star][:outer] = 100
13
+ Shoes::Drawable.drawable_default_styles[Shoes::Star][:inner] = 50
12
14
 
13
- def initialize(left, top, points = 10, outer = 100, inner = 50)
15
+ shoes_events # No Star-specific events
16
+
17
+ init_args :left, :top
18
+ opt_init_args :points, :outer, :inner
19
+ def initialize(*args, **kwargs)
14
20
  super
15
- self.left = left
16
- self.top = top
17
- self.points = points
18
- self.outer = outer
19
- self.inner = inner
20
21
 
21
22
  @draw_context = Shoes::App.instance.current_draw_context
22
23
 
23
24
  create_display_drawable
24
25
  end
25
26
 
26
- def self.convert_to_integer(value, attribute_name)
27
- begin
28
- value = Integer(value)
29
- raise Shoes::Errors::InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
30
-
31
- value
32
- rescue ArgumentError
33
- error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
34
- raise Shoes::Errors::InvalidAttributeValueError, error_message
35
- end
36
- end
37
-
38
- def self.convert_to_float(value, attribute_name)
39
- begin
40
- value = Float(value)
41
- raise Shoes::Errors::InvalidAttributeValueError, "Negative num '#{value}' not allowed for attribute '#{attribute_name}'" if value < 0
42
-
43
- value
44
- rescue ArgumentError
45
- error_message = "Invalid value '#{value}' provided for attribute '#{attribute_name}'. The value should be a number."
46
- raise Shoes::Errors::InvalidAttributeValueError, error_message
47
- end
48
- end
49
27
  end
50
28
  end
@@ -4,60 +4,119 @@ class Shoes
4
4
  # TextDrawable is the parent class of various classes of
5
5
  # text that can go inside a para. This includes normal
6
6
  # text, but also links, italic text, bold text, etc.
7
+ #
8
+ # In Shoes3 this corresponds to cText, and it would
9
+ # have methods app, contents, children, parent,
10
+ # style, to_s, text, text= and replace.
11
+ #
12
+ # Much of what this does and how is similar to Para.
13
+ # It's a very similar API.
7
14
  class TextDrawable < Shoes::Drawable
8
- class << self
9
- # rubocop:disable Lint/MissingSuper
10
- def inherited(subclass)
11
- Shoes::Drawable.drawable_classes ||= []
12
- Shoes::Drawable.drawable_classes << subclass
13
-
14
- Shoes::Drawable.drawable_default_styles ||= {}
15
- Shoes::Drawable.drawable_default_styles[subclass] = {}
15
+ shoes_styles :text_items, :size, :stroke, :strokewidth, :fill, :undercolor, :font
16
+
17
+ STRIKETHROUGH_VALUES = [nil, "none", "single"]
18
+ shoes_style :strikethrough do |val, _name|
19
+ unless STRIKETHROUGH_VALUES.include?(val)
20
+ raise Shoes::Errors::InvalidAttributeValueError, "Strikethrough must be one of: #{STRIKETHROUGH_VALUES.inspect}!"
21
+ end
22
+ val
23
+ end
24
+
25
+ UNDERLINE_VALUES = [nil, "none", "single", "double", "low", "error"]
26
+ shoes_style :underline do |val, _name|
27
+ unless UNDERLINE_VALUES.include?(val)
28
+ raise Shoes::Errors::InvalidAttributeValueError, "Underline must be one of: #{UNDERLINE_VALUES.inspect}!"
16
29
  end
17
- # rubocop:enable Lint/MissingSuper
30
+ val
18
31
  end
19
32
 
20
33
  shoes_events # No TextDrawable-specific events yet
21
- end
22
34
 
23
- class << self
24
- def default_text_drawable_with(element)
25
- class_name = element.capitalize
35
+ def initialize(*args, **kwargs)
36
+ # Don't pass text_children args to Drawable#initialize
37
+ super(*[], **kwargs)
26
38
 
27
- drawable_class = Class.new(Shoes::TextDrawable) do
28
- # Can we just change content to text to match the Shoes API?
29
- shoes_style :content
39
+ # Text_children alternates strings and TextDrawables, so we can't just pass
40
+ # it as a Shoes style. It won't serialize.
41
+ update_text_children(args)
30
42
 
31
- def initialize(content)
32
- super
43
+ create_display_drawable
44
+ end
33
45
 
34
- @content = content
46
+ def text_children_to_items(text_children)
47
+ text_children.map { |arg| arg.is_a?(TextDrawable) ? arg.linkable_id : arg.to_s }
48
+ end
35
49
 
36
- create_display_drawable
37
- end
50
+ # Sets the paragraph text to a new value, which can
51
+ # include {TextDrawable}s like em(), strong(), etc.
52
+ #
53
+ # @param children [Array] the arguments can be Strings and/or TextDrawables
54
+ # @return [void]
55
+ def replace(*children)
56
+ update_text_children(children)
57
+ end
38
58
 
39
- def text
40
- self.content
41
- end
59
+ # Set the paragraph text to a single String.
60
+ # To use bold, italics, etc. use {Para#replace} instead.
61
+ #
62
+ # @param child [String] the new text to use for this Para
63
+ # @return [void]
64
+ def text=(*children)
65
+ update_text_children(children)
66
+ end
42
67
 
43
- def to_s
44
- self.content
45
- end
68
+ # Return the text, but not the styling, of the para's
69
+ # contents. For example, if the contents had strong
70
+ # and emphasized text, the bold and emphasized would
71
+ # be removed but the text would be returned.
72
+ #
73
+ # @return [String] the text from this para
74
+ def text
75
+ @text_children.map(&:to_s).join
76
+ end
46
77
 
47
- def text=(new_text)
48
- self.content = new_text
49
- end
50
- end
51
- Shoes.const_set class_name, drawable_class
52
- drawable_class.class_eval do
53
- shoes_style :content
78
+ # Return the text but not styling from the para. This
79
+ # is the same as #text.
80
+ #
81
+ # @return [String] the text from this para
82
+ def to_s
83
+ self.text
84
+ end
85
+
86
+ private
87
+
88
+ # Text_children alternates strings and TextDrawables, so we can't just pass
89
+ # it as a Shoes style. It won't serialize.
90
+ def update_text_children(children)
91
+ @text_children = children.flatten
92
+ # This should signal the display drawable to change
93
+ self.text_items = text_children_to_items(@text_children)
94
+ end
95
+ end
54
96
 
97
+ class << self
98
+ def default_text_drawable_with(element)
99
+ class_name = element.capitalize
100
+
101
+ drawable_class = Class.new(Shoes::TextDrawable) do
55
102
  shoes_events # No specific events
103
+
104
+ init_args # We're going to pass an empty array to super
56
105
  end
106
+ Shoes.const_set class_name, drawable_class
57
107
  end
58
108
  end
59
109
  end
60
110
 
61
111
  Shoes.default_text_drawable_with(:code)
112
+ Shoes.default_text_drawable_with(:del)
62
113
  Shoes.default_text_drawable_with(:em)
63
114
  Shoes.default_text_drawable_with(:strong)
115
+ Shoes.default_text_drawable_with(:span)
116
+ Shoes.default_text_drawable_with(:sub)
117
+ Shoes.default_text_drawable_with(:sup)
118
+ Shoes.default_text_drawable_with(:ins) # in Shoes3, looks like "ins" is just underline
119
+
120
+ # Defaults must come *after* classes are defined
121
+
122
+ Shoes::Drawable.drawable_default_styles[Shoes::Ins][:underline] = "single"
@@ -5,9 +5,10 @@ class Shoes
5
5
  shoes_styles :url
6
6
  shoes_events # No specific events yet
7
7
 
8
- def initialize(url)
8
+ init_args :url
9
+ def initialize(*args, **kwargs)
9
10
  super
10
- @url = url
11
+
11
12
  create_display_drawable
12
13
  end
13
14
 
@@ -37,11 +37,16 @@
37
37
 
38
38
  class Shoes::Widget < Shoes::Slot
39
39
  include Shoes::Background
40
- include Shoes::Border
41
- include Shoes::Spacing
42
40
 
43
41
  shoes_events
44
42
 
43
+ def self.inherited(subclass)
44
+ super
45
+
46
+ # Widgets are special - we can't know in advance what sort of initialize args they take
47
+ subclass.init_args :any
48
+ end
49
+
45
50
  def self.method_added(name)
46
51
  # We're only looking for the initialize() method, and only on subclasses
47
52
  # of Shoes::Widget, not Shoes::Widget itself.
@@ -57,7 +62,7 @@ class Shoes::Widget < Shoes::Slot
57
62
  @midway_through_adding_initialize = true
58
63
  define_method(:initialize) do |*args, **kwargs, &block|
59
64
  super(*args, **kwargs, &block)
60
- @options = kwargs
65
+ @options = kwargs # Get rid of options?
61
66
  create_display_drawable
62
67
  __widget_initialize(*args, **kwargs, &block)
63
68
 
@@ -15,6 +15,7 @@ require "shoes/drawables/line"
15
15
  require "shoes/drawables/rect"
16
16
  require "shoes/drawables/shape"
17
17
  require "shoes/drawables/star"
18
+ require "shoes/drawables/oval"
18
19
  require "shoes/drawables/arrow"
19
20
 
20
21
  require "shoes/drawables/button"
@@ -26,6 +27,6 @@ require "shoes/drawables/link"
26
27
  require "shoes/drawables/list_box"
27
28
  require "shoes/drawables/para"
28
29
  require "shoes/drawables/radio"
29
- require "shoes/drawables/span"
30
30
  require "shoes/drawables/video"
31
31
  require "shoes/drawables/progress"
32
+ require "shoes/drawables/border"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Shoes; end
4
- class Shoes::Errors
4
+ module Shoes::Errors
5
5
  class InvalidAttributeValueError < Shoes::Error; end
6
6
 
7
7
  class TooManyInstancesError < Shoes::Error; end
@@ -16,13 +16,23 @@ class Shoes::Errors
16
16
 
17
17
  class NoSuchStyleError < Shoes::Error; end
18
18
 
19
- class NoLinkableIdError < Shoes::Error; end
19
+ class NoSuchLinkableIdError < Shoes::Error; end
20
20
 
21
21
  class BadLinkableIdError < Shoes::Error; end
22
22
 
23
- class UnregisteredShoesEvent < Shoes::Error; end
23
+ class UnregisteredShoesEventError < Shoes::Error; end
24
+
25
+ class BadArgumentListError < Shoes::Error; end
24
26
 
25
27
  class SingletonError < Shoes::Error; end
26
28
 
27
29
  class MultipleShoesSpecRunsError < Shoes::Error; end
30
+
31
+ class UnsupportedFeatureError < Shoes::Error; end
32
+
33
+ class BadFilenameError < Shoes::Error; end
34
+
35
+ class UnknownEventsForClassError < Shoes::Error; end
36
+
37
+ class DoubleRegisteredShoesEventError < Shoes::Error; end
28
38
  end
@@ -0,0 +1,79 @@
1
+ module MarginHelper
2
+
3
+ def margin_parse(kwargs)
4
+
5
+ if kwargs[:margin]
6
+
7
+ if kwargs[:margin].is_a?(Numeric)
8
+
9
+ if !kwargs[:margin_top]
10
+ kwargs[:margin_top] = kwargs[:margin]
11
+ end
12
+ if !kwargs[:margin_bottom]
13
+ kwargs[:margin_bottom] = kwargs[:margin]
14
+ end
15
+ if !kwargs[:margin_left]
16
+ kwargs[:margin_left] = kwargs[:margin]
17
+ end
18
+ if !kwargs[:margin_right]
19
+ kwargs[:margin_right] = kwargs[:margin]
20
+ end
21
+
22
+ elsif kwargs[:margin].is_a?(Hash)
23
+
24
+ kwargs[:margin].each do |key,value|
25
+ kwargs[:"margin_#{key}"] = value
26
+ end
27
+
28
+ else
29
+ margin_props = kwargs[:margin].is_a?(String) ? kwargs[:margin].split(/\s+|\,|-/) : kwargs[:margin]
30
+ if margin_props.length == 1
31
+
32
+ if !kwargs[:margin_top]
33
+ kwargs[:margin_top] = margin_props[0]
34
+ end
35
+ if !kwargs[:margin_bottom]
36
+ kwargs[:margin_bottom] = margin_props[0]
37
+ end
38
+ if !kwargs[:margin_left]
39
+ kwargs[:margin_left] = margin_props[0]
40
+ end
41
+ if !kwargs[:margin_right]
42
+ kwargs[:margin_right] = margin_props[0]
43
+ end
44
+
45
+ elsif margin_props.length == 2
46
+
47
+ raise(Shoes::Errors::InvalidAttributeValueError, "Margin don't support 2-3 values as Array/string input for using 2-3 input you can use the hash input method like '{left:value, right:value, top:value, bottom:value}'")
48
+
49
+ elsif margin_props.length == 3
50
+
51
+ raise(Shoes::Errors::InvalidAttributeValueError, "Margin don't support 2-3 values as Array/string input for using 2-3 input you can use the hash input method like '{left:value,right:value,top:value,bottom:value}'")
52
+
53
+ else
54
+
55
+ if !kwargs[:margin_top]
56
+ kwargs[:margin_top] = margin_props[1]
57
+ end
58
+ if !kwargs[:margin_bottom]
59
+ kwargs[:margin_bottom] = margin_props[3]
60
+ end
61
+ if !kwargs[:margin_left]
62
+ kwargs[:margin_left] = margin_props[0]
63
+ end
64
+ if !kwargs[:margin_right]
65
+ kwargs[:margin_right] = margin_props[2]
66
+ end
67
+
68
+ end
69
+ end
70
+ kwargs[:margin] = nil
71
+ end
72
+ if kwargs["options"] && !kwargs[:margin] && !kwargs[:margin_left] && !kwargs[:margin_right] && !kwargs[:margin_top] && !kwargs[:margin_bottom]
73
+ kwargs[options].each do |key,value|
74
+ kwargs[key] = value
75
+ end
76
+ end
77
+ kwargs
78
+ end
79
+ end
data/lacci/lib/shoes.rb CHANGED
@@ -37,8 +37,6 @@ require_relative "shoes/colors"
37
37
  require_relative "shoes/builtins"
38
38
 
39
39
  require_relative "shoes/background"
40
- require_relative "shoes/border"
41
- require_relative "shoes/spacing"
42
40
 
43
41
  require_relative "shoes/drawable"
44
42
  require_relative "shoes/app"
@@ -76,6 +74,7 @@ class Shoes
76
74
  # @param width [Integer] The new app window width
77
75
  # @param height [Integer] The new app window height
78
76
  # @param resizable [Boolean] Whether the app window should be resizeable
77
+ # @param features [Symbol,Array<Symbol>] Additional Shoes extensions requested by the app
79
78
  # @return [void]
80
79
  # @see Shoes::App#new
81
80
  def app(
@@ -83,9 +82,11 @@ class Shoes
83
82
  width: 480,
84
83
  height: 420,
85
84
  resizable: true,
85
+ features: [],
86
86
  &app_code_body
87
87
  )
88
- app = Shoes::App.new(title:, width:, height:, resizable:, &app_code_body)
88
+ f = [features].flatten # Make sure this is a list, not a single symbol
89
+ app = Shoes::App.new(title:, width:, height:, resizable:, features: f, &app_code_body)
89
90
  app.init
90
91
  app.run
91
92
  nil
@@ -0,0 +1 @@
1
+ niente_test.json
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+ class TestDrawContext < NienteTest
6
+ # need tests for:
7
+ # default values vs draw context values
8
+ # setting value explicitly w/ positional or keyword arg
9
+
10
+ # Test w/ color string names for now. This reveals a
11
+ # problem - our highly-variable color handling makes it
12
+ # hard to be sure about what comes through in a style.
13
+
14
+ # We do a bunch of wacky stuff with colors. We need some kind of
15
+ # equality check. This is good enough for this test until we
16
+ # have a proper color object backing up what we do in Scarpe.
17
+ def assert_color_equal(c1, c2)
18
+ if c1.nil? && c2.nil?
19
+ raise "Is this an expected use case?"
20
+ end
21
+
22
+ if (c1.is_a?(String) || c1.is_a?(Symbol)) && (c2.is_a?(String) || c2.is_a?(Symbol))
23
+ return assert_equal c1.to_s, c2.to_s, "Expected color #{c1.inspect} to equal #{c2.inspect}"
24
+ end
25
+
26
+ if c1.is_a?(Array) && c2.is_a?(Array)
27
+ return assert_equal c1, c2, "Expected color #{c1.inspect} to equal #{c2.inspect}"
28
+ end
29
+
30
+ raise "Oopsie! We got an unexpected comparison between colors #{c1.inspect}"
31
+ end
32
+
33
+ def test_draw_context_default
34
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
35
+ Shoes.app do
36
+ oval 5, 10, 25 # circle with radius 25 with its upper-left point at 5, 10
37
+ end
38
+ SHOES_APP
39
+ ov = oval()
40
+ assert_equal "black", ov.style["fill"]
41
+ assert_equal "black", ov.style["stroke"]
42
+ SHOES_SPEC
43
+ end
44
+
45
+ def test_draw_context_basic
46
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
47
+ Shoes.app do
48
+ fill darkgreen
49
+ stroke blue
50
+ oval 5, 10, 25 # circle with radius 25 with its upper-left point at 5, 10
51
+ end
52
+ SHOES_APP
53
+ ov = oval()
54
+ assert_equal [0, 100, 0, 255], ov.style["fill"]
55
+ assert_equal [0, 0, 255, 255], ov.style["stroke"]
56
+ SHOES_SPEC
57
+ end
58
+
59
+ def test_draw_context_explicit
60
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
61
+ Shoes.app do
62
+ fill blue
63
+ stroke blue
64
+ oval 5, 10, 25, fill: darkgreen
65
+ end
66
+ SHOES_APP
67
+ ov = oval()
68
+ assert_equal [0, 100, 0, 255], ov.style["fill"]
69
+ assert_equal [0, 0, 255, 255], ov.style["stroke"]
70
+ SHOES_SPEC
71
+ end
72
+
73
+ def test_draw_context_basic_nofill
74
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
75
+ Shoes.app do
76
+ nofill
77
+ oval 5, 10, 25
78
+ end
79
+ SHOES_APP
80
+ ov = oval()
81
+ assert_equal [0, 0, 0, 0], ov.style["fill"]
82
+ SHOES_SPEC
83
+ end
84
+
85
+ def test_draw_context_inherited_nofill
86
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
87
+ Shoes.app do
88
+ nofill
89
+ nostroke
90
+ stack do
91
+ oval 5, 10, 25
92
+ end
93
+ end
94
+ SHOES_APP
95
+ ov = oval()
96
+ assert_equal [0, 0, 0, 0], ov.style["fill"]
97
+ assert_equal [0, 0, 0, 0], ov.style["stroke"]
98
+ SHOES_SPEC
99
+ end
100
+
101
+ def test_draw_context_inherited_no_sibling
102
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
103
+ Shoes.app do
104
+ fill yellow
105
+ stroke yellow
106
+ stack do
107
+ fill blue
108
+ stroke darkgreen
109
+ stack do
110
+ fill aquamarine
111
+ stroke aquamarine
112
+ end
113
+ stack do
114
+ oval 5, 10, 25
115
+ end
116
+ end
117
+ end
118
+ SHOES_APP
119
+ ov = oval()
120
+ assert_equal [0, 0, 255, 255], ov.style["fill"]
121
+ assert_equal [0, 100, 0, 255], ov.style["stroke"]
122
+ SHOES_SPEC
123
+ end
124
+
125
+ def test_draw_context_inherited_nil_props
126
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
127
+ Shoes.app do
128
+ stack do
129
+ fill blue
130
+ stroke darkgreen
131
+ stack do
132
+ fill nil
133
+ stroke nil
134
+ oval 5, 10, 25
135
+ end
136
+ end
137
+ end
138
+ SHOES_APP
139
+ ov = oval()
140
+ assert_equal [0, 0, 255, 255], ov.style["fill"]
141
+ assert_equal [0, 100, 0, 255], ov.style["stroke"]
142
+ SHOES_SPEC
143
+ end
144
+
145
+ def test_draw_context_inherited_cancel_default
146
+ run_test_niente_code(<<~SHOES_APP, app_test_code: <<~SHOES_SPEC)
147
+ Shoes.app do
148
+ stack do
149
+ fill blue
150
+ stroke darkgreen
151
+ stack do
152
+ fill yellow
153
+ stroke yellow
154
+ oval 5, 10, 25
155
+ fill nil
156
+ stroke nil
157
+ @o2 = oval 5, 10, 25
158
+ end
159
+ end
160
+ end
161
+ SHOES_APP
162
+ ov = oval("@o2")
163
+ assert_equal [0, 0, 255, 255], ov.style["fill"]
164
+ assert_equal [0, 100, 0, 255], ov.style["stroke"]
165
+ SHOES_SPEC
166
+ end
167
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "test_helper"
4
+
5
+
6
+ class TestFontHelper < Minitest::Test
7
+ include FontHelper
8
+ def test_parse_full_font
9
+
10
+ string = "Pacifico 20px bold italic small-caps"
11
+
12
+ assert_equal(["italic", "small-caps" , "bold" , "20px" , "Pacifico"],parse_font(string))
13
+
14
+ end
15
+
16
+ def test_parse_quotesFamily
17
+ string = "'Times new roman', serif 20px bold italic small-caps"
18
+
19
+ assert_equal(["italic", "small-caps", "bold", "20px", "'Times new roman', serif"],parse_font(string))
20
+ end
21
+
22
+ def test_parse_empty
23
+ string = ""
24
+
25
+ assert_equal([nil,nil,nil,nil,""],parse_font(string))
26
+ end
27
+
28
+ def test_parse_onlyFamily
29
+ string = "arial"
30
+
31
+ assert_equal([nil,nil,nil,nil,"arial"],parse_font(string))
32
+ end
33
+
34
+ def test_parse_onlySize
35
+ string = "40px"
36
+
37
+ assert_equal([nil,nil,nil,"40px",""],parse_font(string))
38
+ end
39
+
40
+ def test_parse_onlyFontStyle
41
+ string = "italic"
42
+
43
+ assert_equal(["italic",nil,nil,nil,""],parse_font(string))
44
+ end
45
+
46
+ def test_parse_onlyFontVariant
47
+ string = "small-caps"
48
+
49
+ assert_equal([nil,"small-caps",nil,nil,""],parse_font(string))
50
+ end
51
+
52
+ def test_parse_onlyFontWeight
53
+ string = "900"
54
+
55
+ assert_equal([nil,nil,"900",nil,""],parse_font(string))
56
+ end
57
+ end