whirled_peas 0.5.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (291) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +1 -0
  4. data/CHANGELOG.md +31 -0
  5. data/README.md +748 -137
  6. data/Rakefile +4 -32
  7. data/bin/easing +33 -0
  8. data/bin/reset_cursor +11 -0
  9. data/bin/screen_test +68 -0
  10. data/examples/graph.rb +54 -0
  11. data/examples/intro.rb +52 -0
  12. data/examples/scrolling.rb +54 -0
  13. data/lib/whirled_peas.rb +4 -12
  14. data/lib/whirled_peas/animator.rb +5 -0
  15. data/lib/whirled_peas/animator/debug_consumer.rb +17 -0
  16. data/lib/whirled_peas/animator/easing.rb +72 -0
  17. data/lib/whirled_peas/animator/frame.rb +5 -0
  18. data/lib/whirled_peas/animator/frameset.rb +33 -0
  19. data/lib/whirled_peas/animator/producer.rb +35 -0
  20. data/lib/whirled_peas/animator/renderer_consumer.rb +31 -0
  21. data/lib/whirled_peas/command.rb +5 -0
  22. data/lib/whirled_peas/command/base.rb +86 -0
  23. data/lib/whirled_peas/command/config_command.rb +44 -0
  24. data/lib/whirled_peas/command/debug.rb +21 -0
  25. data/lib/whirled_peas/command/fonts.rb +22 -0
  26. data/lib/whirled_peas/command/frame_command.rb +34 -0
  27. data/lib/whirled_peas/command/frames.rb +24 -0
  28. data/lib/whirled_peas/command/help.rb +38 -0
  29. data/lib/whirled_peas/command/play.rb +108 -0
  30. data/lib/whirled_peas/command/record.rb +57 -0
  31. data/lib/whirled_peas/command/still.rb +29 -0
  32. data/lib/whirled_peas/command_line.rb +22 -220
  33. data/lib/whirled_peas/config.rb +56 -6
  34. data/lib/whirled_peas/device.rb +5 -0
  35. data/lib/whirled_peas/device/null_device.rb +8 -0
  36. data/lib/whirled_peas/device/output_file.rb +19 -0
  37. data/lib/whirled_peas/device/screen.rb +26 -0
  38. data/lib/whirled_peas/graphics.rb +14 -0
  39. data/lib/whirled_peas/graphics/box_painter.rb +48 -47
  40. data/lib/whirled_peas/graphics/canvas.rb +22 -11
  41. data/lib/whirled_peas/graphics/composer.rb +98 -0
  42. data/lib/whirled_peas/graphics/container_coords.rb +24 -13
  43. data/lib/whirled_peas/graphics/container_dimensions.rb +37 -9
  44. data/lib/whirled_peas/graphics/container_painter.rb +283 -36
  45. data/lib/whirled_peas/graphics/content_dimensions.rb +19 -0
  46. data/lib/whirled_peas/graphics/content_painter.rb +20 -0
  47. data/lib/whirled_peas/graphics/debugger.rb +10 -1
  48. data/lib/whirled_peas/graphics/graph_dimensions.rb +12 -0
  49. data/lib/whirled_peas/graphics/graph_painter.rb +95 -0
  50. data/lib/whirled_peas/graphics/grid_painter.rb +25 -15
  51. data/lib/whirled_peas/graphics/mock_screen.rb +1 -1
  52. data/lib/whirled_peas/graphics/painter.rb +15 -6
  53. data/lib/whirled_peas/graphics/renderer.rb +13 -30
  54. data/lib/whirled_peas/graphics/text_painter.rb +11 -13
  55. data/lib/whirled_peas/settings/alignment.rb +24 -0
  56. data/lib/whirled_peas/settings/bg_color.rb +2 -0
  57. data/lib/whirled_peas/settings/border.rb +16 -16
  58. data/lib/whirled_peas/settings/color.rb +13 -14
  59. data/lib/whirled_peas/settings/container_settings.rb +133 -40
  60. data/lib/whirled_peas/settings/debugger.rb +9 -0
  61. data/lib/whirled_peas/settings/display_flow.rb +13 -11
  62. data/lib/whirled_peas/settings/element_settings.rb +8 -3
  63. data/lib/whirled_peas/settings/graph_settings.rb +21 -0
  64. data/lib/whirled_peas/settings/grid_settings.rb +15 -0
  65. data/lib/whirled_peas/settings/scrollbar.rb +15 -0
  66. data/lib/whirled_peas/settings/sizing.rb +19 -0
  67. data/lib/whirled_peas/settings/spacing.rb +34 -0
  68. data/lib/whirled_peas/settings/text_color.rb +2 -0
  69. data/lib/whirled_peas/settings/vert_alignment.rb +24 -0
  70. data/lib/whirled_peas/utils/ansi.rb +13 -0
  71. data/lib/whirled_peas/utils/file_handler.rb +57 -0
  72. data/lib/whirled_peas/utils/title_font.rb +1 -1
  73. data/lib/whirled_peas/version.rb +1 -1
  74. data/screen_test/{rendered/elements → elements}/box.frame +1 -1
  75. data/screen_test/{rendered/elements → elements}/box.rb +0 -0
  76. data/screen_test/elements/graph.frame +1 -0
  77. data/screen_test/elements/graph.rb +12 -0
  78. data/screen_test/elements/grid.frame +1 -0
  79. data/screen_test/{rendered/elements → elements}/grid.rb +0 -0
  80. data/screen_test/elements/screen_overflow_x.frame +1 -0
  81. data/screen_test/{rendered/elements/screen_overflow.rb → elements/screen_overflow_x.rb} +0 -0
  82. data/screen_test/elements/screen_overflow_y.frame +1 -0
  83. data/screen_test/elements/screen_overflow_y.rb +9 -0
  84. data/screen_test/elements/text.frame +1 -0
  85. data/screen_test/{rendered/elements → elements}/text.rb +0 -0
  86. data/screen_test/elements/text_multiline.frame +1 -0
  87. data/screen_test/{rendered/elements → elements}/text_multiline.rb +0 -0
  88. data/screen_test/settings/align/box_around.frame +1 -0
  89. data/screen_test/settings/align/box_around.rb +16 -0
  90. data/screen_test/settings/align/box_between.frame +1 -0
  91. data/screen_test/settings/align/box_between.rb +16 -0
  92. data/screen_test/settings/align/box_center.frame +1 -0
  93. data/screen_test/{rendered/settings/align/box.rb → settings/align/box_center.rb} +5 -4
  94. data/screen_test/settings/align/box_default.frame +1 -0
  95. data/screen_test/{rendered/settings/align/grid.rb → settings/align/box_default.rb} +6 -6
  96. data/screen_test/settings/align/box_evenly.frame +1 -0
  97. data/screen_test/settings/align/box_evenly.rb +16 -0
  98. data/screen_test/settings/align/box_left.frame +1 -0
  99. data/screen_test/settings/align/box_left.rb +21 -0
  100. data/screen_test/settings/align/box_right.frame +1 -0
  101. data/screen_test/settings/align/box_right.rb +21 -0
  102. data/screen_test/settings/align/children_center.frame +1 -0
  103. data/screen_test/settings/align/children_center.rb +15 -0
  104. data/screen_test/settings/align/children_left.frame +1 -0
  105. data/screen_test/settings/align/children_left.rb +15 -0
  106. data/screen_test/settings/align/children_right.frame +1 -0
  107. data/screen_test/settings/align/children_right.rb +15 -0
  108. data/screen_test/settings/align/grid_center.frame +1 -0
  109. data/screen_test/settings/align/grid_center.rb +18 -0
  110. data/screen_test/settings/align/grid_default.frame +1 -0
  111. data/screen_test/settings/align/grid_default.rb +17 -0
  112. data/screen_test/settings/align/grid_left.frame +1 -0
  113. data/screen_test/settings/align/grid_left.rb +18 -0
  114. data/screen_test/settings/align/grid_right.frame +1 -0
  115. data/screen_test/settings/align/grid_right.rb +18 -0
  116. data/screen_test/settings/ansi/bold.frame +1 -0
  117. data/screen_test/{rendered/settings/width/overflow_box_t2b.rb → settings/ansi/bold.rb} +4 -5
  118. data/screen_test/{rendered/settings → settings}/ansi/color.frame +1 -1
  119. data/screen_test/{rendered/settings → settings}/ansi/color.rb +0 -0
  120. data/screen_test/settings/ansi/underline.frame +1 -0
  121. data/screen_test/{rendered/settings → settings}/ansi/underline.rb +4 -5
  122. data/screen_test/{rendered/settings → settings}/border.frame +1 -1
  123. data/screen_test/{rendered/settings → settings}/border.rb +1 -1
  124. data/screen_test/settings/flow/box_b2t.frame +1 -0
  125. data/screen_test/settings/flow/box_b2t.rb +26 -0
  126. data/screen_test/settings/flow/box_l2r.frame +1 -0
  127. data/screen_test/settings/flow/box_l2r.rb +26 -0
  128. data/screen_test/settings/flow/box_r2l.frame +1 -0
  129. data/screen_test/settings/flow/box_r2l.rb +26 -0
  130. data/screen_test/settings/flow/box_t2b.frame +1 -0
  131. data/screen_test/settings/flow/box_t2b.rb +26 -0
  132. data/screen_test/settings/flow/grid_b2t.frame +1 -0
  133. data/screen_test/settings/flow/grid_b2t.rb +14 -0
  134. data/screen_test/settings/flow/grid_l2r.frame +1 -0
  135. data/screen_test/{rendered/settings/margin.rb → settings/flow/grid_l2r.rb} +4 -4
  136. data/screen_test/settings/flow/grid_r2l.frame +1 -0
  137. data/screen_test/settings/flow/grid_r2l.rb +14 -0
  138. data/screen_test/settings/flow/grid_t2b.frame +1 -0
  139. data/screen_test/settings/flow/grid_t2b.rb +14 -0
  140. data/screen_test/settings/height/box.frame +1 -0
  141. data/screen_test/{rendered/settings → settings}/height/box.rb +0 -0
  142. data/screen_test/settings/height/box_border_sizing.frame +1 -0
  143. data/screen_test/settings/height/box_border_sizing.rb +15 -0
  144. data/screen_test/settings/height/grid.frame +1 -0
  145. data/screen_test/{rendered/settings → settings}/height/grid.rb +0 -0
  146. data/screen_test/settings/height/overflow_box.frame +1 -0
  147. data/screen_test/settings/height/overflow_box.rb +13 -0
  148. data/screen_test/settings/height/overflow_box_l2r.frame +1 -0
  149. data/screen_test/settings/height/overflow_box_l2r.rb +17 -0
  150. data/screen_test/settings/height/overflow_box_t2b.frame +1 -0
  151. data/screen_test/settings/height/overflow_box_t2b.rb +16 -0
  152. data/screen_test/settings/height/overflow_grid.frame +1 -0
  153. data/screen_test/{rendered/settings → settings}/height/overflow_grid.rb +0 -0
  154. data/screen_test/settings/margin.frame +1 -0
  155. data/screen_test/settings/margin.rb +16 -0
  156. data/screen_test/settings/padding.frame +1 -0
  157. data/screen_test/settings/padding.rb +13 -0
  158. data/screen_test/settings/position/box_left.frame +1 -0
  159. data/screen_test/{rendered/settings → settings}/position/box_left.rb +2 -2
  160. data/screen_test/settings/position/box_left_negative.frame +1 -0
  161. data/screen_test/{rendered/settings → settings}/position/box_left_negative.rb +2 -2
  162. data/screen_test/settings/position/box_top.frame +1 -0
  163. data/screen_test/{rendered/settings → settings}/position/box_top.rb +1 -1
  164. data/screen_test/settings/position/box_top_negative.frame +1 -0
  165. data/screen_test/{rendered/settings → settings}/position/box_top_negative.rb +2 -2
  166. data/screen_test/settings/position/grid_left.frame +1 -0
  167. data/screen_test/{rendered/settings → settings}/position/grid_left.rb +1 -1
  168. data/screen_test/settings/position/grid_left_negative.frame +1 -0
  169. data/screen_test/{rendered/settings → settings}/position/grid_left_negative.rb +1 -1
  170. data/screen_test/settings/position/grid_top.frame +1 -0
  171. data/screen_test/{rendered/settings → settings}/position/grid_top.rb +1 -1
  172. data/screen_test/settings/position/grid_top_negative.frame +1 -0
  173. data/screen_test/{rendered/settings → settings}/position/grid_top_negative.rb +1 -1
  174. data/screen_test/settings/scroll/horiz_box.frame +1 -0
  175. data/screen_test/settings/scroll/horiz_box.rb +17 -0
  176. data/screen_test/settings/scroll/horiz_box_align_center.rb +18 -0
  177. data/screen_test/settings/scroll/horiz_box_align_right.rb +18 -0
  178. data/screen_test/settings/scroll/vert_box.frame +1 -0
  179. data/screen_test/settings/scroll/vert_box.rb +20 -0
  180. data/screen_test/settings/title_font.frame +1 -0
  181. data/screen_test/{rendered/settings → settings}/title_font.rb +1 -1
  182. data/screen_test/settings/valign/box_around.frame +1 -0
  183. data/screen_test/settings/valign/box_around.rb +17 -0
  184. data/screen_test/settings/valign/box_between.frame +1 -0
  185. data/screen_test/settings/valign/box_between.rb +17 -0
  186. data/screen_test/settings/valign/box_bottom.frame +1 -0
  187. data/screen_test/settings/valign/box_bottom.rb +17 -0
  188. data/screen_test/settings/valign/box_default.frame +1 -0
  189. data/screen_test/settings/valign/box_default.rb +16 -0
  190. data/screen_test/settings/valign/box_evenly.frame +1 -0
  191. data/screen_test/settings/valign/box_evenly.rb +17 -0
  192. data/screen_test/settings/valign/box_middle.frame +1 -0
  193. data/screen_test/settings/valign/box_middle.rb +17 -0
  194. data/screen_test/settings/valign/box_top.frame +1 -0
  195. data/screen_test/settings/valign/box_top.rb +17 -0
  196. data/screen_test/settings/valign/grid_bottom.frame +1 -0
  197. data/screen_test/settings/valign/grid_bottom.rb +15 -0
  198. data/screen_test/settings/valign/grid_default.frame +1 -0
  199. data/screen_test/settings/valign/grid_default.rb +14 -0
  200. data/screen_test/settings/valign/grid_middle.frame +1 -0
  201. data/screen_test/settings/valign/grid_middle.rb +15 -0
  202. data/screen_test/settings/valign/grid_top.frame +1 -0
  203. data/screen_test/settings/valign/grid_top.rb +15 -0
  204. data/screen_test/settings/width/box_border_sizing.frame +1 -0
  205. data/screen_test/settings/width/box_border_sizing.rb +15 -0
  206. data/screen_test/settings/width/box_content.frame +1 -0
  207. data/screen_test/settings/width/box_content.rb +15 -0
  208. data/screen_test/settings/width/box_default.frame +1 -0
  209. data/screen_test/{rendered/settings/width/box.rb → settings/width/box_default.rb} +3 -2
  210. data/screen_test/settings/width/grid.frame +1 -0
  211. data/screen_test/{rendered/settings → settings}/width/grid.rb +2 -2
  212. data/screen_test/settings/width/overflow_align_center.frame +1 -0
  213. data/screen_test/settings/width/overflow_align_center.rb +14 -0
  214. data/screen_test/settings/width/overflow_align_right.frame +1 -0
  215. data/screen_test/settings/width/overflow_align_right.rb +14 -0
  216. data/screen_test/settings/width/overflow_box.frame +1 -0
  217. data/screen_test/settings/width/overflow_box.rb +13 -0
  218. data/screen_test/settings/width/overflow_box_l2r.frame +1 -0
  219. data/screen_test/settings/width/overflow_box_l2r.rb +16 -0
  220. data/screen_test/settings/width/overflow_box_t2b.frame +1 -0
  221. data/screen_test/settings/width/overflow_box_t2b.rb +17 -0
  222. data/screen_test/settings/width/overflow_grid.frame +1 -0
  223. data/screen_test/{rendered/settings → settings}/width/overflow_grid.rb +0 -0
  224. data/tools/whirled_peas/tools/screen_tester.rb +285 -0
  225. metadata +192 -98
  226. data/bin/debug +0 -35
  227. data/lib/whirled_peas/debugger.rb +0 -80
  228. data/lib/whirled_peas/frame.rb +0 -6
  229. data/lib/whirled_peas/frame/consumer.rb +0 -30
  230. data/lib/whirled_peas/frame/debug_consumer.rb +0 -30
  231. data/lib/whirled_peas/frame/event_loop.rb +0 -90
  232. data/lib/whirled_peas/frame/producer.rb +0 -67
  233. data/lib/whirled_peas/graphics/screen.rb +0 -65
  234. data/lib/whirled_peas/graphics/text_dimensions.rb +0 -15
  235. data/lib/whirled_peas/settings/text_align.rb +0 -19
  236. data/lib/whirled_peas/template.rb +0 -5
  237. data/lib/whirled_peas/template/box_element.rb +0 -8
  238. data/lib/whirled_peas/template/composer.rb +0 -68
  239. data/lib/whirled_peas/template/container.rb +0 -28
  240. data/lib/whirled_peas/template/debugger.rb +0 -34
  241. data/lib/whirled_peas/template/element.rb +0 -13
  242. data/lib/whirled_peas/template/grid_element.rb +0 -8
  243. data/lib/whirled_peas/template/text_element.rb +0 -24
  244. data/screen_test/rendered/elements/grid.frame +0 -1
  245. data/screen_test/rendered/elements/text.frame +0 -1
  246. data/screen_test/rendered/elements/text_multiline.frame +0 -1
  247. data/screen_test/rendered/settings/align/box.frame +0 -1
  248. data/screen_test/rendered/settings/align/children_center.frame +0 -1
  249. data/screen_test/rendered/settings/align/children_center.rb +0 -13
  250. data/screen_test/rendered/settings/align/children_left.frame +0 -1
  251. data/screen_test/rendered/settings/align/children_left.rb +0 -13
  252. data/screen_test/rendered/settings/align/children_right.frame +0 -1
  253. data/screen_test/rendered/settings/align/children_right.rb +0 -13
  254. data/screen_test/rendered/settings/align/grid.frame +0 -1
  255. data/screen_test/rendered/settings/ansi/bold.frame +0 -1
  256. data/screen_test/rendered/settings/ansi/bold.rb +0 -15
  257. data/screen_test/rendered/settings/ansi/underline.frame +0 -1
  258. data/screen_test/rendered/settings/flow/l2r.frame +0 -1
  259. data/screen_test/rendered/settings/flow/l2r.rb +0 -24
  260. data/screen_test/rendered/settings/flow/t2b.frame +0 -1
  261. data/screen_test/rendered/settings/flow/t2b.rb +0 -24
  262. data/screen_test/rendered/settings/height/box.frame +0 -1
  263. data/screen_test/rendered/settings/height/grid.frame +0 -1
  264. data/screen_test/rendered/settings/height/overflow_box.frame +0 -1
  265. data/screen_test/rendered/settings/height/overflow_box.rb +0 -13
  266. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +0 -1
  267. data/screen_test/rendered/settings/height/overflow_box_l2r.rb +0 -15
  268. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +0 -1
  269. data/screen_test/rendered/settings/height/overflow_box_t2b.rb +0 -14
  270. data/screen_test/rendered/settings/height/overflow_grid.frame +0 -1
  271. data/screen_test/rendered/settings/margin.frame +0 -1
  272. data/screen_test/rendered/settings/padding.frame +0 -1
  273. data/screen_test/rendered/settings/padding.rb +0 -11
  274. data/screen_test/rendered/settings/position/box_left.frame +0 -1
  275. data/screen_test/rendered/settings/position/box_left_negative.frame +0 -1
  276. data/screen_test/rendered/settings/position/box_top.frame +0 -1
  277. data/screen_test/rendered/settings/position/box_top_negative.frame +0 -1
  278. data/screen_test/rendered/settings/position/grid_left.frame +0 -1
  279. data/screen_test/rendered/settings/position/grid_left_negative.frame +0 -1
  280. data/screen_test/rendered/settings/position/grid_top.frame +0 -1
  281. data/screen_test/rendered/settings/position/grid_top_negative.frame +0 -1
  282. data/screen_test/rendered/settings/title_font.frame +0 -1
  283. data/screen_test/rendered/settings/width/box.frame +0 -1
  284. data/screen_test/rendered/settings/width/grid.frame +0 -1
  285. data/screen_test/rendered/settings/width/overflow_box.frame +0 -1
  286. data/screen_test/rendered/settings/width/overflow_box.rb +0 -11
  287. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +0 -1
  288. data/screen_test/rendered/settings/width/overflow_box_l2r.rb +0 -14
  289. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +0 -1
  290. data/screen_test/rendered/settings/width/overflow_grid.frame +0 -1
  291. data/screen_test/screen_tester.rb +0 -191
@@ -1,47 +1,92 @@
1
+ require_relative 'alignment'
1
2
  require_relative 'border'
2
3
  require_relative 'display_flow'
3
4
  require_relative 'element_settings'
4
5
  require_relative 'margin'
5
6
  require_relative 'padding'
6
7
  require_relative 'position'
8
+ require_relative 'scrollbar'
9
+ require_relative 'sizing'
10
+ require_relative 'vert_alignment'
7
11
 
8
12
  module WhirledPeas
9
13
  module Settings
10
14
  class ContainerSettings < ElementSettings
11
- attr_accessor :width, :height
12
-
13
15
  def align
14
- @_align || TextAlign::LEFT
16
+ @_align || Alignment::DEFAULT
15
17
  end
16
18
 
17
19
  def align_left?
18
- align == TextAlign::LEFT
20
+ align == Alignment::LEFT
19
21
  end
20
22
 
21
23
  def align_center?
22
- align == TextAlign::CENTER
24
+ align == Alignment::CENTER
23
25
  end
24
26
 
25
27
  def align_right?
26
- align == TextAlign::RIGHT
28
+ align == Alignment::RIGHT
29
+ end
30
+
31
+ def align_between?
32
+ align == Alignment::BETWEEN
33
+ end
34
+
35
+ def align_around?
36
+ align == Alignment::AROUND
37
+ end
38
+
39
+ def align_evenly?
40
+ align == Alignment::EVENLY
27
41
  end
28
42
 
29
43
  def align=(align)
30
- @_align = TextAlign.validate!(align)
44
+ @_align = Alignment.validate!(align)
45
+ end
46
+
47
+ def valign
48
+ @_valign || VertAlignment::DEFAULT
49
+ end
50
+
51
+ def valign_top?
52
+ valign == VertAlignment::TOP
53
+ end
54
+
55
+ def valign_middle?
56
+ valign == VertAlignment::MIDDLE
57
+ end
58
+
59
+ def valign_bottom?
60
+ valign == VertAlignment::BOTTOM
61
+ end
62
+
63
+ def valign_between?
64
+ valign == VertAlignment::BETWEEN
65
+ end
66
+
67
+ def valign_around?
68
+ valign == VertAlignment::AROUND
69
+ end
70
+
71
+ def valign_evenly?
72
+ valign == VertAlignment::EVENLY
73
+ end
74
+
75
+ def valign=(valign)
76
+ @_valign = VertAlignment.validate!(valign)
31
77
  end
32
78
 
33
79
  def set_border(
34
80
  left: nil, top: nil, right: nil, bottom: nil, inner_horiz: nil, inner_vert: nil, style: nil, color: nil
35
81
  )
36
- @_border = Border.new unless @_border
37
- @_border.left = left unless left.nil?
38
- @_border.top = top unless top.nil?
39
- @_border.right = right unless right.nil?
40
- @_border.bottom = bottom unless bottom.nil?
41
- @_border.inner_horiz = inner_horiz unless inner_horiz.nil?
42
- @_border.inner_vert = inner_vert unless inner_vert.nil?
43
- @_border.style = style unless style.nil?
44
- @_border.color = color unless color.nil?
82
+ border.left = left unless left.nil?
83
+ border.top = top unless top.nil?
84
+ border.right = right unless right.nil?
85
+ border.bottom = bottom unless bottom.nil?
86
+ border.inner_horiz = inner_horiz unless inner_horiz.nil?
87
+ border.inner_vert = inner_vert unless inner_vert.nil?
88
+ border.style = style unless style.nil?
89
+ border.color = color unless color.nil?
45
90
  end
46
91
 
47
92
  def full_border(style: nil, color: nil)
@@ -51,7 +96,7 @@ module WhirledPeas
51
96
  end
52
97
 
53
98
  def border
54
- @_border || Border.new
99
+ @_border ||= Border.new
55
100
  end
56
101
 
57
102
  def flow=(flow)
@@ -59,7 +104,7 @@ module WhirledPeas
59
104
  end
60
105
 
61
106
  def flow
62
- @_flow || DisplayFlow::LEFT_TO_RIGHT
107
+ @_flow || DisplayFlow::DEFAULT
63
108
  end
64
109
 
65
110
  def horizontal_flow?
@@ -78,51 +123,99 @@ module WhirledPeas
78
123
  !forward_flow?
79
124
  end
80
125
 
81
- def set_margin(left: nil, top: nil, right: nil, bottom: nil)
82
- @_margin = Margin.new unless @_margin
83
- @_margin.left = left if left
84
- @_margin.top = top if top
85
- @_margin.right = right if right
86
- @_margin.bottom = bottom if bottom
126
+ def set_margin(left: nil, top: nil, right: nil, bottom: nil, horiz: nil, vert: nil)
127
+ if horiz && (left || right)
128
+ raise ArgumentError, 'Cannot set horizontal margin when setting left/right'
129
+ elsif vert && (top || bottom)
130
+ raise ArgumentError, 'Cannot set vertical margin when setting top/bottom'
131
+ end
132
+
133
+ if horiz
134
+ margin.horiz = horiz
135
+ else
136
+ margin.left = left if left
137
+ margin.right = right if right
138
+ end
139
+
140
+ if vert
141
+ margin.vert = vert
142
+ else
143
+ margin.top = top if top
144
+ margin.bottom = bottom if bottom
145
+ end
87
146
  end
88
147
 
89
148
  def margin
90
- @_margin || Margin.new
149
+ @_margin ||= Margin.new
91
150
  end
92
151
 
93
- def set_padding(left: nil, top: nil, right: nil, bottom: nil)
94
- @_padding = Padding.new unless @_padding
95
- @_padding.left = left if left
96
- @_padding.top = top if top
97
- @_padding.right = right if right
98
- @_padding.bottom = bottom if bottom
152
+ def set_padding(left: nil, top: nil, right: nil, bottom: nil, horiz: nil, vert: nil)
153
+ if horiz && (left || right)
154
+ raise ArgumentError, 'Cannot set horizontal padding when setting left/right'
155
+ elsif vert && (top || bottom)
156
+ raise ArgumentError, 'Cannot set vertical padding when setting top/bottom'
157
+ end
158
+
159
+ if horiz
160
+ padding.horiz = horiz
161
+ else
162
+ padding.left = left if left
163
+ padding.right = right if right
164
+ end
165
+
166
+ if vert
167
+ padding.vert = vert
168
+ else
169
+ padding.top = top if top
170
+ padding.bottom = bottom if bottom
171
+ end
99
172
  end
100
173
 
101
174
  def padding
102
- @_padding || Padding.new
175
+ @_padding ||= Padding.new
103
176
  end
104
177
 
105
178
  def set_position(left: nil, top: nil)
106
- @_position = Position.new unless @_position
107
- @_position.left = left if left
108
- @_position.top = top if top
179
+ position.left = left if left
180
+ position.top = top if top
109
181
  end
110
182
 
111
183
  def position
112
- @_position || Position.new
184
+ @_position ||= Position.new
185
+ end
186
+
187
+ def set_scrollbar(horiz: nil, vert: nil)
188
+ scrollbar.horiz = horiz unless horiz.nil?
189
+ scrollbar.vert = vert unless vert.nil?
190
+ end
191
+
192
+ def scrollbar
193
+ @_scrollbar ||= Scrollbar.new
194
+ end
195
+
196
+ def sizing
197
+ @_sizing || Sizing::DEFAULT
198
+ end
199
+
200
+ def border_sizing?
201
+ @_sizing == Sizing::BORDER
202
+ end
203
+
204
+ def content_sizing?
205
+ @_sizing == Sizing::CONTENT
206
+ end
207
+
208
+ def sizing=(sizing)
209
+ @_sizing = Sizing.validate!(sizing)
113
210
  end
114
211
 
115
212
  def inherit(parent)
116
213
  super
117
214
  return unless parent.is_a?(ContainerSettings)
118
- @_align = parent._align
119
- @_flow = parent._flow
120
215
  set_border(color: parent.border.color, style: parent.border.style)
121
216
  end
122
217
 
123
218
  protected
124
-
125
- attr_accessor :_align, :_flow
126
219
  end
127
220
  end
128
221
  end
@@ -3,6 +3,7 @@ require_relative 'container_settings'
3
3
  require_relative 'margin'
4
4
  require_relative 'padding'
5
5
  require_relative 'position'
6
+ require_relative 'scrollbar'
6
7
 
7
8
  module WhirledPeas
8
9
  module Settings
@@ -41,6 +42,8 @@ module WhirledPeas
41
42
  border_value(value)
42
43
  when Padding
43
44
  padding_value(value)
45
+ when Scrollbar
46
+ scrollbar_value(value)
44
47
  else
45
48
  value.inspect
46
49
  end
@@ -82,6 +85,12 @@ module WhirledPeas
82
85
  return if values == ''
83
86
  "Padding(#{values})"
84
87
  end
88
+
89
+ def scrollbar_value(scrollbar)
90
+ values = non_defaults(scrollbar, Scrollbar.new, %i[horiz? vert?])
91
+ return if values == ''
92
+ "Scrollbar(#{values})"
93
+ end
85
94
  end
86
95
  end
87
96
  end
@@ -6,18 +6,20 @@ module WhirledPeas
6
6
  TOP_TO_BOTTOM = :t2b
7
7
  BOTTOM_TO_TOP = :b2t
8
8
 
9
+ DEFAULT = LEFT_TO_RIGHT
10
+
11
+ VALID = [
12
+ DisplayFlow::LEFT_TO_RIGHT,
13
+ DisplayFlow::RIGHT_TO_LEFT,
14
+ DisplayFlow::TOP_TO_BOTTOM,
15
+ DisplayFlow::BOTTOM_TO_TOP
16
+ ]
17
+ private_constant :VALID
18
+
9
19
  def self.validate!(flow)
10
- return unless flow
11
- if [
12
- DisplayFlow::LEFT_TO_RIGHT,
13
- DisplayFlow::RIGHT_TO_LEFT,
14
- DisplayFlow::TOP_TO_BOTTOM,
15
- DisplayFlow::BOTTOM_TO_TOP
16
- ].include?(flow)
17
- flow
18
- else
19
- raise ArgumentError, "Unsupported display flow: #{flow}"
20
- end
20
+ return if flow.nil?
21
+ return flow if VALID.include?(flow)
22
+ raise ArgumentError, "Unsupported display flow: #{flow.inspect}"
21
23
  end
22
24
  end
23
25
  private_constant :DisplayFlow
@@ -1,7 +1,7 @@
1
1
  require 'json'
2
2
 
3
+ require_relative 'alignment'
3
4
  require_relative 'bg_color'
4
- require_relative 'text_align'
5
5
  require_relative 'text_color'
6
6
 
7
7
  module WhirledPeas
@@ -13,8 +13,13 @@ module WhirledPeas
13
13
  child
14
14
  end
15
15
 
16
+ attr_accessor :width, :height
17
+
18
+ def validate!
19
+ end
20
+
16
21
  def bg_color
17
- @_bg_color
22
+ @_bg_color || BgColor::DEFAULT
18
23
  end
19
24
 
20
25
  def bg_color=(color)
@@ -30,7 +35,7 @@ module WhirledPeas
30
35
  end
31
36
 
32
37
  def color
33
- @_color
38
+ @_color || TextColor::DEFAULT
34
39
  end
35
40
 
36
41
  def color=(color)
@@ -0,0 +1,21 @@
1
+ require_relative 'text_color'
2
+ require_relative 'element_settings'
3
+
4
+ module WhirledPeas
5
+ module Settings
6
+ class GraphSettings < ElementSettings
7
+ def axis_color
8
+ @_axis_color || color
9
+ end
10
+
11
+ def axis_color=(color)
12
+ @_axis_color = TextColor.validate!(color)
13
+ end
14
+
15
+ def validate!
16
+ super
17
+ raise SettingsError, "`height` must be set for GraphSettings" if height.nil?
18
+ end
19
+ end
20
+ end
21
+ end
@@ -6,6 +6,21 @@ module WhirledPeas
6
6
  module Settings
7
7
  class GridSettings < ContainerSettings
8
8
  attr_accessor :num_cols
9
+
10
+ def validate!
11
+ super
12
+ if num_cols.nil? || num_cols <= 0
13
+ raise SettingsError, "`num_cols` must be set to a positive number for GridSettings"
14
+ end
15
+ end
16
+
17
+ def set_scrollbar(*)
18
+ raise NotImplementedError, 'Grids do not support scrollbars'
19
+ end
20
+
21
+ def sizing=(*)
22
+ raise NotImplementedError, 'Grids only support the default sizing model'
23
+ end
9
24
  end
10
25
  end
11
26
  end
@@ -0,0 +1,15 @@
1
+ module WhirledPeas
2
+ module Settings
3
+ class Scrollbar
4
+ attr_writer :horiz, :vert
5
+
6
+ def horiz?
7
+ @horiz == true
8
+ end
9
+
10
+ def vert?
11
+ @vert == true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module WhirledPeas
2
+ module Settings
3
+ class Sizing
4
+ CONTENT = :content
5
+ BORDER = :border
6
+
7
+ DEFAULT = CONTENT
8
+
9
+ VALID = [CONTENT, BORDER]
10
+ private_constant :VALID
11
+
12
+ def self.validate!(sizing)
13
+ return if sizing.nil?
14
+ return sizing if VALID.include?(sizing)
15
+ raise ArgumentError, "Unsupported sizing model: #{sizing.inspect}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,21 +3,55 @@ module WhirledPeas
3
3
  class Spacing
4
4
  attr_writer :left, :top, :right, :bottom
5
5
 
6
+ def left=(value)
7
+ @left = validate!(value)
8
+ end
9
+
6
10
  def left
7
11
  @left || 0
8
12
  end
9
13
 
14
+ def top=(value)
15
+ @top = validate!(value)
16
+ end
17
+
10
18
  def top
11
19
  @top || 0
12
20
  end
13
21
 
22
+ def right=(value)
23
+ @right = validate!(value)
24
+ end
25
+
14
26
  def right
15
27
  @right || 0
16
28
  end
17
29
 
30
+ def bottom=(value)
31
+ @bottom = validate!(value)
32
+ end
33
+
18
34
  def bottom
19
35
  @bottom || 0
20
36
  end
37
+
38
+ def horiz=(value)
39
+ self.left = self.right = value
40
+ end
41
+
42
+ def vert=(value)
43
+ self.top = self.bottom = value
44
+ end
45
+
46
+ private
47
+
48
+ def validate!(value)
49
+ if value && value < 0
50
+ raise ArgumentError, "Negative values for #{self.class.name.split('::').last.downcase} are not allowed"
51
+ else
52
+ value
53
+ end
54
+ end
21
55
  end
22
56
  private_constant :Spacing
23
57
  end