whirled_peas 0.6.0 → 0.7.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 (242) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -1
  3. data/README.md +315 -43
  4. data/Rakefile +8 -18
  5. data/lib/whirled_peas/graphics.rb +14 -0
  6. data/lib/whirled_peas/graphics/box_painter.rb +39 -46
  7. data/lib/whirled_peas/graphics/canvas.rb +22 -11
  8. data/lib/whirled_peas/graphics/container_coords.rb +6 -5
  9. data/lib/whirled_peas/graphics/container_dimensions.rb +26 -8
  10. data/lib/whirled_peas/graphics/container_painter.rb +42 -4
  11. data/lib/whirled_peas/graphics/grid_painter.rb +11 -10
  12. data/lib/whirled_peas/graphics/painter.rb +5 -1
  13. data/lib/whirled_peas/graphics/renderer.rb +6 -1
  14. data/lib/whirled_peas/graphics/text_painter.rb +2 -2
  15. data/lib/whirled_peas/settings/alignment.rb +24 -0
  16. data/lib/whirled_peas/settings/bg_color.rb +2 -0
  17. data/lib/whirled_peas/settings/border.rb +16 -16
  18. data/lib/whirled_peas/settings/color.rb +13 -14
  19. data/lib/whirled_peas/settings/container_settings.rb +126 -42
  20. data/lib/whirled_peas/settings/display_flow.rb +13 -11
  21. data/lib/whirled_peas/settings/element_settings.rb +3 -3
  22. data/lib/whirled_peas/settings/grid_settings.rb +5 -1
  23. data/lib/whirled_peas/settings/sizing.rb +19 -0
  24. data/lib/whirled_peas/settings/spacing.rb +34 -0
  25. data/lib/whirled_peas/settings/text_color.rb +2 -0
  26. data/lib/whirled_peas/settings/vert_alignment.rb +24 -0
  27. data/lib/whirled_peas/utils/title_font.rb +1 -1
  28. data/lib/whirled_peas/version.rb +1 -1
  29. data/screen_test/{rendered/elements → elements}/box.frame +1 -1
  30. data/screen_test/{rendered/elements → elements}/box.rb +0 -0
  31. data/screen_test/elements/grid.frame +1 -0
  32. data/screen_test/{rendered/elements → elements}/grid.rb +0 -0
  33. data/screen_test/elements/screen_overflow_x.frame +1 -0
  34. data/screen_test/{rendered/elements/screen_overflow.rb → elements/screen_overflow_x.rb} +0 -0
  35. data/screen_test/elements/screen_overflow_y.frame +1 -0
  36. data/screen_test/elements/screen_overflow_y.rb +9 -0
  37. data/screen_test/elements/text.frame +1 -0
  38. data/screen_test/{rendered/elements → elements}/text.rb +0 -0
  39. data/screen_test/elements/text_multiline.frame +1 -0
  40. data/screen_test/{rendered/elements → elements}/text_multiline.rb +0 -0
  41. data/screen_test/settings/align/box_around.frame +1 -0
  42. data/screen_test/settings/align/box_around.rb +16 -0
  43. data/screen_test/settings/align/box_between.frame +1 -0
  44. data/screen_test/settings/align/box_between.rb +16 -0
  45. data/screen_test/settings/align/box_center.frame +1 -0
  46. data/screen_test/{rendered/settings/align/grid.rb → settings/align/box_center.rb} +7 -6
  47. data/screen_test/settings/align/box_default.frame +1 -0
  48. data/screen_test/settings/align/box_default.rb +20 -0
  49. data/screen_test/settings/align/box_evenly.frame +1 -0
  50. data/screen_test/settings/align/box_evenly.rb +16 -0
  51. data/screen_test/settings/align/box_left.frame +1 -0
  52. data/screen_test/settings/align/box_left.rb +21 -0
  53. data/screen_test/settings/align/box_right.frame +1 -0
  54. data/screen_test/settings/align/box_right.rb +21 -0
  55. data/screen_test/settings/align/children_center.frame +1 -0
  56. data/screen_test/settings/align/children_center.rb +15 -0
  57. data/screen_test/settings/align/children_left.frame +1 -0
  58. data/screen_test/settings/align/children_left.rb +15 -0
  59. data/screen_test/settings/align/children_right.frame +1 -0
  60. data/screen_test/settings/align/children_right.rb +15 -0
  61. data/screen_test/settings/align/grid_center.frame +1 -0
  62. data/screen_test/settings/align/grid_center.rb +18 -0
  63. data/screen_test/settings/align/grid_default.frame +1 -0
  64. data/screen_test/settings/align/grid_default.rb +17 -0
  65. data/screen_test/settings/align/grid_left.frame +1 -0
  66. data/screen_test/settings/align/grid_left.rb +18 -0
  67. data/screen_test/settings/align/grid_right.frame +1 -0
  68. data/screen_test/settings/align/grid_right.rb +18 -0
  69. data/screen_test/settings/ansi/bold.frame +1 -0
  70. data/screen_test/{rendered/settings/height/overflow_box_t2b.rb → settings/ansi/bold.rb} +4 -4
  71. data/screen_test/{rendered/settings → settings}/ansi/color.frame +1 -1
  72. data/screen_test/{rendered/settings → settings}/ansi/color.rb +0 -0
  73. data/screen_test/settings/ansi/underline.frame +1 -0
  74. data/screen_test/{rendered/settings → settings}/ansi/underline.rb +4 -5
  75. data/screen_test/{rendered/settings → settings}/border.frame +1 -1
  76. data/screen_test/{rendered/settings → settings}/border.rb +1 -1
  77. data/screen_test/settings/flow/box_b2t.frame +1 -0
  78. data/screen_test/settings/flow/box_b2t.rb +26 -0
  79. data/screen_test/settings/flow/box_l2r.frame +1 -0
  80. data/screen_test/settings/flow/box_l2r.rb +26 -0
  81. data/screen_test/settings/flow/box_r2l.frame +1 -0
  82. data/screen_test/settings/flow/box_r2l.rb +26 -0
  83. data/screen_test/settings/flow/box_t2b.frame +1 -0
  84. data/screen_test/settings/flow/box_t2b.rb +26 -0
  85. data/screen_test/settings/flow/grid_b2t.frame +1 -0
  86. data/screen_test/{rendered/settings → settings}/flow/grid_b2t.rb +0 -0
  87. data/screen_test/settings/flow/grid_l2r.frame +1 -0
  88. data/screen_test/{rendered/settings → settings}/flow/grid_l2r.rb +0 -0
  89. data/screen_test/settings/flow/grid_r2l.frame +1 -0
  90. data/screen_test/{rendered/settings → settings}/flow/grid_r2l.rb +0 -0
  91. data/screen_test/settings/flow/grid_t2b.frame +1 -0
  92. data/screen_test/{rendered/settings → settings}/flow/grid_t2b.rb +0 -0
  93. data/screen_test/settings/height/box.frame +1 -0
  94. data/screen_test/{rendered/settings → settings}/height/box.rb +0 -0
  95. data/screen_test/settings/height/box_border_sizing.frame +1 -0
  96. data/screen_test/settings/height/box_border_sizing.rb +15 -0
  97. data/screen_test/settings/height/grid.frame +1 -0
  98. data/screen_test/{rendered/settings → settings}/height/grid.rb +0 -0
  99. data/screen_test/settings/height/overflow_box.frame +1 -0
  100. data/screen_test/settings/height/overflow_box.rb +13 -0
  101. data/screen_test/settings/height/overflow_box_l2r.frame +1 -0
  102. data/screen_test/settings/height/overflow_box_l2r.rb +17 -0
  103. data/screen_test/settings/height/overflow_box_t2b.frame +1 -0
  104. data/screen_test/settings/height/overflow_box_t2b.rb +16 -0
  105. data/screen_test/settings/height/overflow_grid.frame +1 -0
  106. data/screen_test/{rendered/settings → settings}/height/overflow_grid.rb +0 -0
  107. data/screen_test/settings/margin.frame +1 -0
  108. data/screen_test/settings/margin.rb +16 -0
  109. data/screen_test/settings/padding.frame +1 -0
  110. data/screen_test/settings/padding.rb +13 -0
  111. data/screen_test/settings/position/box_left.frame +1 -0
  112. data/screen_test/{rendered/settings → settings}/position/box_left.rb +2 -2
  113. data/screen_test/settings/position/box_left_negative.frame +1 -0
  114. data/screen_test/{rendered/settings → settings}/position/box_left_negative.rb +2 -2
  115. data/screen_test/settings/position/box_top.frame +1 -0
  116. data/screen_test/{rendered/settings → settings}/position/box_top.rb +1 -1
  117. data/screen_test/settings/position/box_top_negative.frame +1 -0
  118. data/screen_test/{rendered/settings → settings}/position/box_top_negative.rb +2 -2
  119. data/screen_test/settings/position/grid_left.frame +1 -0
  120. data/screen_test/{rendered/settings → settings}/position/grid_left.rb +1 -1
  121. data/screen_test/settings/position/grid_left_negative.frame +1 -0
  122. data/screen_test/{rendered/settings → settings}/position/grid_left_negative.rb +1 -1
  123. data/screen_test/settings/position/grid_top.frame +1 -0
  124. data/screen_test/{rendered/settings → settings}/position/grid_top.rb +1 -1
  125. data/screen_test/settings/position/grid_top_negative.frame +1 -0
  126. data/screen_test/{rendered/settings → settings}/position/grid_top_negative.rb +1 -1
  127. data/screen_test/settings/scroll/horiz_box.frame +1 -0
  128. data/screen_test/settings/scroll/horiz_box.rb +17 -0
  129. data/screen_test/settings/scroll/horiz_box_align_center.rb +18 -0
  130. data/screen_test/settings/scroll/horiz_box_align_right.rb +18 -0
  131. data/screen_test/settings/scroll/vert_box.frame +1 -0
  132. data/screen_test/settings/scroll/vert_box.rb +20 -0
  133. data/screen_test/settings/title_font.frame +1 -0
  134. data/screen_test/{rendered/settings → settings}/title_font.rb +1 -1
  135. data/screen_test/settings/valign/box_around.frame +1 -0
  136. data/screen_test/settings/valign/box_around.rb +17 -0
  137. data/screen_test/settings/valign/box_between.frame +1 -0
  138. data/screen_test/settings/valign/box_between.rb +17 -0
  139. data/screen_test/settings/valign/box_bottom.frame +1 -0
  140. data/screen_test/settings/valign/box_bottom.rb +17 -0
  141. data/screen_test/settings/valign/box_default.frame +1 -0
  142. data/screen_test/settings/valign/box_default.rb +16 -0
  143. data/screen_test/settings/valign/box_evenly.frame +1 -0
  144. data/screen_test/settings/valign/box_evenly.rb +17 -0
  145. data/screen_test/settings/valign/box_middle.frame +1 -0
  146. data/screen_test/settings/valign/box_middle.rb +17 -0
  147. data/screen_test/settings/valign/box_top.frame +1 -0
  148. data/screen_test/settings/valign/box_top.rb +17 -0
  149. data/screen_test/settings/valign/grid_bottom.frame +1 -0
  150. data/screen_test/settings/valign/grid_bottom.rb +15 -0
  151. data/screen_test/settings/valign/grid_default.frame +1 -0
  152. data/screen_test/settings/valign/grid_default.rb +14 -0
  153. data/screen_test/settings/valign/grid_middle.frame +1 -0
  154. data/screen_test/settings/valign/grid_middle.rb +15 -0
  155. data/screen_test/settings/valign/grid_top.frame +1 -0
  156. data/screen_test/settings/valign/grid_top.rb +15 -0
  157. data/screen_test/settings/width/box_border_sizing.frame +1 -0
  158. data/screen_test/settings/width/box_border_sizing.rb +15 -0
  159. data/screen_test/settings/width/box_content.frame +1 -0
  160. data/screen_test/settings/width/box_content.rb +15 -0
  161. data/screen_test/settings/width/box_default.frame +1 -0
  162. data/screen_test/{rendered/settings/width/box.rb → settings/width/box_default.rb} +3 -2
  163. data/screen_test/settings/width/grid.frame +1 -0
  164. data/screen_test/{rendered/settings → settings}/width/grid.rb +2 -2
  165. data/screen_test/settings/width/overflow_align_center.frame +1 -0
  166. data/screen_test/settings/width/overflow_align_center.rb +14 -0
  167. data/screen_test/settings/width/overflow_align_right.frame +1 -0
  168. data/screen_test/settings/width/overflow_align_right.rb +14 -0
  169. data/screen_test/settings/width/overflow_box.frame +1 -0
  170. data/screen_test/settings/width/overflow_box.rb +13 -0
  171. data/screen_test/settings/width/overflow_box_l2r.frame +1 -0
  172. data/screen_test/settings/width/overflow_box_l2r.rb +16 -0
  173. data/screen_test/settings/width/overflow_box_t2b.frame +1 -0
  174. data/screen_test/settings/width/overflow_box_t2b.rb +17 -0
  175. data/screen_test/settings/width/overflow_grid.frame +1 -0
  176. data/screen_test/{rendered/settings → settings}/width/overflow_grid.rb +0 -0
  177. data/tools/whirled_peas/tools/screen_tester.rb +233 -0
  178. metadata +154 -98
  179. data/lib/whirled_peas/settings/text_align.rb +0 -19
  180. data/screen_test/rendered/elements/grid.frame +0 -1
  181. data/screen_test/rendered/elements/screen_overflow.frame +0 -1
  182. data/screen_test/rendered/elements/text.frame +0 -1
  183. data/screen_test/rendered/elements/text_multiline.frame +0 -1
  184. data/screen_test/rendered/settings/align/box.frame +0 -1
  185. data/screen_test/rendered/settings/align/box.rb +0 -24
  186. data/screen_test/rendered/settings/align/children_center.frame +0 -1
  187. data/screen_test/rendered/settings/align/children_center.rb +0 -13
  188. data/screen_test/rendered/settings/align/children_left.frame +0 -1
  189. data/screen_test/rendered/settings/align/children_left.rb +0 -13
  190. data/screen_test/rendered/settings/align/children_right.frame +0 -1
  191. data/screen_test/rendered/settings/align/children_right.rb +0 -13
  192. data/screen_test/rendered/settings/align/grid.frame +0 -1
  193. data/screen_test/rendered/settings/ansi/bold.frame +0 -1
  194. data/screen_test/rendered/settings/ansi/bold.rb +0 -15
  195. data/screen_test/rendered/settings/ansi/underline.frame +0 -1
  196. data/screen_test/rendered/settings/flow/box_b2t.frame +0 -1
  197. data/screen_test/rendered/settings/flow/box_b2t.rb +0 -24
  198. data/screen_test/rendered/settings/flow/box_l2r.frame +0 -1
  199. data/screen_test/rendered/settings/flow/box_l2r.rb +0 -24
  200. data/screen_test/rendered/settings/flow/box_r2l.frame +0 -1
  201. data/screen_test/rendered/settings/flow/box_r2l.rb +0 -24
  202. data/screen_test/rendered/settings/flow/box_t2b.frame +0 -1
  203. data/screen_test/rendered/settings/flow/box_t2b.rb +0 -24
  204. data/screen_test/rendered/settings/flow/grid_b2t.frame +0 -1
  205. data/screen_test/rendered/settings/flow/grid_l2r.frame +0 -1
  206. data/screen_test/rendered/settings/flow/grid_r2l.frame +0 -1
  207. data/screen_test/rendered/settings/flow/grid_t2b.frame +0 -1
  208. data/screen_test/rendered/settings/height/box.frame +0 -1
  209. data/screen_test/rendered/settings/height/grid.frame +0 -1
  210. data/screen_test/rendered/settings/height/overflow_box.frame +0 -1
  211. data/screen_test/rendered/settings/height/overflow_box.rb +0 -13
  212. data/screen_test/rendered/settings/height/overflow_box_l2r.frame +0 -1
  213. data/screen_test/rendered/settings/height/overflow_box_l2r.rb +0 -15
  214. data/screen_test/rendered/settings/height/overflow_box_t2b.frame +0 -1
  215. data/screen_test/rendered/settings/height/overflow_grid.frame +0 -1
  216. data/screen_test/rendered/settings/margin.frame +0 -1
  217. data/screen_test/rendered/settings/margin.rb +0 -14
  218. data/screen_test/rendered/settings/padding.frame +0 -1
  219. data/screen_test/rendered/settings/padding.rb +0 -11
  220. data/screen_test/rendered/settings/position/box_left.frame +0 -1
  221. data/screen_test/rendered/settings/position/box_left_negative.frame +0 -1
  222. data/screen_test/rendered/settings/position/box_top.frame +0 -1
  223. data/screen_test/rendered/settings/position/box_top_negative.frame +0 -1
  224. data/screen_test/rendered/settings/position/grid_left.frame +0 -1
  225. data/screen_test/rendered/settings/position/grid_left_negative.frame +0 -1
  226. data/screen_test/rendered/settings/position/grid_top.frame +0 -1
  227. data/screen_test/rendered/settings/position/grid_top_negative.frame +0 -1
  228. data/screen_test/rendered/settings/scroll/horiz_box.frame +0 -1
  229. data/screen_test/rendered/settings/scroll/horiz_box.rb +0 -15
  230. data/screen_test/rendered/settings/scroll/vert_box.frame +0 -1
  231. data/screen_test/rendered/settings/scroll/vert_box.rb +0 -18
  232. data/screen_test/rendered/settings/title_font.frame +0 -1
  233. data/screen_test/rendered/settings/width/box.frame +0 -1
  234. data/screen_test/rendered/settings/width/grid.frame +0 -1
  235. data/screen_test/rendered/settings/width/overflow_box.frame +0 -1
  236. data/screen_test/rendered/settings/width/overflow_box.rb +0 -11
  237. data/screen_test/rendered/settings/width/overflow_box_l2r.frame +0 -1
  238. data/screen_test/rendered/settings/width/overflow_box_l2r.rb +0 -14
  239. data/screen_test/rendered/settings/width/overflow_box_t2b.frame +0 -1
  240. data/screen_test/rendered/settings/width/overflow_box_t2b.rb +0 -15
  241. data/screen_test/rendered/settings/width/overflow_grid.frame +0 -1
  242. data/screen_test/screen_tester.rb +0 -201
data/Rakefile CHANGED
@@ -5,37 +5,27 @@ RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  def screen_test(file, method)
7
7
  raise ArgumentError, 'Missing argument: file' unless file
8
-
9
- require 'bundler/setup'
10
- require 'whirled_peas'
11
- require_relative 'screen_test/screen_tester'
12
-
13
- WhirledPeas::ScreenTester.new(file).send(method)
8
+ require_relative 'tools/whirled_peas/tools/screen_tester'
9
+ WhirledPeas::Tools::ScreenTester.new(file).send(method)
14
10
  end
15
11
 
16
12
  namespace :screen_test do
17
- %i[template view run save debug].each do |t|
13
+ %i[template view run save update debug].each do |t|
18
14
  task t, [:file] do |_, args|
19
15
  screen_test(args[:file], t)
20
16
  end
21
17
  end
22
18
 
23
19
  task :update_all do
24
- require 'bundler/setup'
25
- require 'whirled_peas'
26
- require_relative 'screen_test/screen_tester'
27
-
28
- WhirledPeas::ScreenTester.update_all
20
+ require_relative 'tools/whirled_peas/tools/screen_tester'
21
+ WhirledPeas::Tools::ScreenTester.update_all
29
22
  end
30
23
  end
31
24
 
32
25
  task :screen_test do
33
- require 'bundler/setup'
34
- require 'whirled_peas'
35
- require_relative 'screen_test/screen_tester'
36
-
37
- WhirledPeas::ScreenTester.run_all
26
+ require_relative 'tools/whirled_peas/tools/screen_tester'
27
+ WhirledPeas::Tools::ScreenTester.run_all
38
28
  end
39
29
 
40
30
  task default: :ci
41
- task ci: [:screen_test, :spec]
31
+ task ci: %i[spec screen_test]
@@ -1,5 +1,19 @@
1
1
  module WhirledPeas
2
2
  module Graphics
3
+ class << self
4
+ attr_accessor :debug
5
+
6
+ def debugger(string_or_proc)
7
+ return unless @debug
8
+ @debugger ||= Logger.new(STDOUT, level: Logger::DEBUG)
9
+ if string_or_proc.is_a?(Proc)
10
+ string = string_or_proc.call
11
+ else
12
+ string = string_or_proc
13
+ end
14
+ @debugger.debug(string)
15
+ end
16
+ end
3
17
  end
4
18
  private_constant :Graphics
5
19
  end
@@ -4,13 +4,20 @@ require_relative 'container_dimensions'
4
4
  module WhirledPeas
5
5
  module Graphics
6
6
  class BoxPainter < ContainerPainter
7
- def paint(canvas, &block)
7
+ def paint(canvas, left, top, &block)
8
8
  super
9
- return unless canvas.writable?
9
+ canvas_coords = coords(left, top)
10
+ content_canvas = canvas.child(
11
+ canvas_coords.content_left,
12
+ canvas_coords.content_top,
13
+ dimensions.content_width,
14
+ dimensions.content_height
15
+ )
16
+ return unless content_canvas.writable?
10
17
  if settings.horizontal_flow?
11
- paint_horizontally(canvas, &block)
18
+ paint_horizontally(content_canvas, canvas_coords, &block)
12
19
  else
13
- paint_vertically(canvas, &block)
20
+ paint_vertically(content_canvas, canvas_coords, &block)
14
21
  end
15
22
  end
16
23
 
@@ -47,59 +54,45 @@ module WhirledPeas
47
54
 
48
55
  private
49
56
 
50
- def paint_horizontally(canvas, &block)
51
- stroke_top = coords(canvas).content_top
52
- stroke_left = coords(canvas).content_left
53
- total_child_width = 0
54
- each_child { |c| total_child_width += c.dimensions.outer_width }
55
- if settings.align_center?
56
- stroke_left += (dimensions.content_width - total_child_width) / 2
57
- elsif settings.align_right?
58
- stroke_left += dimensions.content_width - total_child_width
59
- end
60
- given_width = 0
57
+ def paint_horizontally(canvas, canvas_coords, &block)
58
+ stroke_left = canvas_coords.content_left
59
+ stroke_top = canvas_coords.content_top
60
+ children_width = 0
61
+ each_child { |c| children_width += c.dimensions.outer_width }
62
+ left_offset, spacing_offset = horiz_justify_offset(children_width)
63
+ stroke_left += left_offset
61
64
  each_child do |child|
62
- child_width = [
63
- child.dimensions.outer_width,
64
- dimensions.content_width - given_width
65
- ].min
65
+ top_offset, _ = vert_justify_offset(child.dimensions.outer_height)
66
+ child_width = child.dimensions.outer_width
66
67
  child_canvas = canvas.child(
67
- stroke_left + given_width,
68
- stroke_top,
68
+ stroke_left,
69
+ stroke_top + top_offset,
69
70
  child_width,
70
- [dimensions.content_height, child.dimensions.outer_height].min
71
+ child.dimensions.outer_height
71
72
  )
72
- child.paint(child_canvas, &block)
73
- given_width += child_width
74
- break if given_width == dimensions.content_width
73
+ child.paint(child_canvas, stroke_left, stroke_top + top_offset, &block)
74
+ stroke_left += child_width + spacing_offset
75
75
  end
76
76
  end
77
77
 
78
- def paint_vertically(canvas, &block)
79
- stroke_top = coords(canvas).content_top
80
- stroke_left = coords(canvas).content_left
81
- given_height = 0
78
+ def paint_vertically(canvas, canvas_coords, &block)
79
+ stroke_left = canvas_coords.content_left
80
+ stroke_top = canvas_coords.content_top
81
+ children_height = 0
82
+ each_child { |c| children_height += c.dimensions.outer_height }
83
+ top_offset, spacing_offset = vert_justify_offset(children_height)
84
+ stroke_top += top_offset
82
85
  each_child do |child|
83
- if settings.align_center?
84
- justify_offset = (dimensions.content_width - child.dimensions.outer_width) / 2
85
- elsif settings.align_right?
86
- justify_offset = dimensions.content_width - child.dimensions.outer_width
87
- else
88
- justify_offset = 0
89
- end
90
- child_height = [
91
- child.dimensions.outer_height,
92
- dimensions.content_height - given_height
93
- ].min
86
+ left_offset, _ = horiz_justify_offset(child.dimensions.outer_width)
87
+ child_height = child.dimensions.outer_height
94
88
  child_canvas = canvas.child(
95
- stroke_left + justify_offset,
96
- stroke_top + given_height,
97
- [dimensions.content_width, child.dimensions.outer_width].min,
89
+ stroke_left + left_offset,
90
+ stroke_top ,
91
+ child.dimensions.outer_width,
98
92
  child_height
99
93
  )
100
- child.paint(child_canvas, &block)
101
- given_height += child_height
102
- break if given_height == dimensions.content_height
94
+ child.paint(child_canvas, stroke_left + left_offset, stroke_top, &block)
95
+ stroke_top += child_height + spacing_offset
103
96
  end
104
97
  end
105
98
  end
@@ -4,28 +4,29 @@ module WhirledPeas
4
4
  module Graphics
5
5
  # Canvas represent the area of the screen a painter can paint on.
6
6
  class Canvas
7
- attr_reader :left, :top, :width, :height, :start_left, :start_top
7
+ attr_reader :left, :top, :width, :height
8
8
 
9
9
  def self.unwritable
10
- new(-1, -1, 0, 0, -1, -1)
10
+ new(-1, -1, 0, 0)
11
11
  end
12
12
 
13
- def initialize(left, top, width, height, start_left, start_top)
13
+ def initialize(left, top, width, height)
14
14
  @left = left
15
15
  @top = top
16
16
  @width = width
17
17
  @height = height
18
- @start_left = start_left
19
- @start_top = start_top
20
18
  end
21
19
 
22
20
  def writable?
23
21
  width > 0 || height > 0
24
22
  end
25
23
 
26
- def child(start_left, start_top, child_width, child_height)
27
- child_left = start_left
28
- child_top = start_top
24
+ def child(child_left, child_top, child_width, child_height)
25
+ Graphics.debugger(
26
+ proc do
27
+ "Create child: #{self.inspect}.child(left=#{child_left}, top=#{child_top}, width=#{child_width}, height=#{child_height})"
28
+ end
29
+ )
29
30
  if child_left >= left + width
30
31
  self.class.unwritable
31
32
  elsif child_left + child_width <= left
@@ -45,20 +46,25 @@ module WhirledPeas
45
46
  child_top = top
46
47
  end
47
48
  child_height = [height - (child_top - top), child_height].min
48
- self.class.new(
49
+ child_canvas = self.class.new(
49
50
  child_left,
50
51
  child_top,
51
52
  child_width,
52
53
  child_height,
53
- start_left,
54
- start_top
55
54
  )
55
+ Graphics.debugger(proc { " -> #{child_canvas.inspect}" })
56
+ child_canvas
56
57
  end
57
58
  end
58
59
 
59
60
  # Yields a single line of formatted characters positioned on the canvas,
60
61
  # verifying only characters within the canvas are included.
61
62
  def stroke(stroke_left, stroke_top, raw, formatting=[], &block)
63
+ Graphics.debugger(
64
+ proc do
65
+ "Stroke: #{self.inspect}.stroke(left=#{stroke_left}, top=#{stroke_top}, length=#{raw.length})"
66
+ end
67
+ )
62
68
  if stroke_left >= left + width
63
69
  # The stroke starts to the right of the canvas
64
70
  fstring = Utils::FormattedString.blank
@@ -88,6 +94,11 @@ module WhirledPeas
88
94
  end_index = start_index + visible_length - 1
89
95
  fstring = Utils::FormattedString.new(raw[start_index..end_index], formatting)
90
96
  end
97
+ Graphics.debugger(
98
+ proc do
99
+ " -> Stroke(left=#{stroke_left}, top=#{stroke_top}, length=#{fstring.length})"
100
+ end
101
+ )
91
102
  yield stroke_left, stroke_top, fstring
92
103
  end
93
104
 
@@ -1,18 +1,19 @@
1
1
  module WhirledPeas
2
2
  module Graphics
3
3
  class ContainerCoords
4
- def initialize(canvas, dimensions, settings)
5
- @canvas = canvas
4
+ def initialize(dimensions, settings, start_left, start_top)
6
5
  @dimensions = dimensions
7
6
  @settings = settings
7
+ @start_left = start_left
8
+ @start_top = start_top
8
9
  end
9
10
 
10
11
  def left
11
- canvas.start_left + settings.position.left
12
+ start_left + settings.position.left
12
13
  end
13
14
 
14
15
  def top
15
- canvas.start_top + settings.position.top
16
+ start_top + settings.position.top
16
17
  end
17
18
 
18
19
  def border_left
@@ -65,7 +66,7 @@ module WhirledPeas
65
66
 
66
67
  private
67
68
 
68
- attr_reader :canvas, :settings, :dimensions
69
+ attr_reader :settings, :dimensions, :start_left, :start_top
69
70
  end
70
71
  end
71
72
  end
@@ -1,11 +1,11 @@
1
1
  module WhirledPeas
2
2
  module Graphics
3
3
  class ContainerDimensions
4
- attr_reader :content_width, :content_height, :children_width, :children_height, :num_cols, :num_rows
4
+ attr_reader :children_width, :children_height, :num_cols, :num_rows
5
5
 
6
6
  def initialize(settings, content_width, content_height, num_cols=1, num_rows=1)
7
- @content_width = settings.width || content_width
8
- @content_height = settings.height || content_height
7
+ @orig_content_width = content_width
8
+ @orig_content_height = content_height
9
9
  @children_width = content_width
10
10
  @children_height = content_height
11
11
  @num_cols = num_cols
@@ -13,17 +13,35 @@ module WhirledPeas
13
13
  @settings = settings
14
14
  end
15
15
 
16
+ def content_width
17
+ return orig_content_width unless settings.width
18
+ if settings.border_sizing?
19
+ settings.width - outer_border_width - scrollbar_width - padding_width
20
+ else
21
+ settings.width
22
+ end
23
+ end
24
+
25
+ def content_height
26
+ return orig_content_height unless settings.height
27
+ if settings.border_sizing?
28
+ settings.height - outer_border_height - scrollbar_height - padding_height
29
+ else
30
+ settings.height
31
+ end
32
+ end
33
+
16
34
  def outer_width
17
35
  @outer_width ||= margin_width +
18
36
  outer_border_width +
19
- num_cols * (padding_width + content_width + vert_scroll_width) +
37
+ num_cols * (padding_width + content_width + scrollbar_width) +
20
38
  (num_cols - 1) * inner_border_width
21
39
  end
22
40
 
23
41
  def outer_height
24
42
  @outer_height ||= margin_height +
25
43
  outer_border_height +
26
- num_rows * (padding_height + content_height + horiz_scroll_height) +
44
+ num_rows * (padding_height + content_height + scrollbar_height) +
27
45
  (num_rows - 1) * inner_border_height
28
46
  end
29
47
 
@@ -59,17 +77,17 @@ module WhirledPeas
59
77
  settings.padding.top + settings.padding.bottom
60
78
  end
61
79
 
62
- def vert_scroll_width
80
+ def scrollbar_width
63
81
  settings.scrollbar.vert? ? 1 : 0
64
82
  end
65
83
 
66
- def horiz_scroll_height
84
+ def scrollbar_height
67
85
  settings.scrollbar.horiz? ? 1 : 0
68
86
  end
69
87
 
70
88
  private
71
89
 
72
- attr_reader :settings
90
+ attr_reader :settings, :orig_content_width, :orig_content_height
73
91
  end
74
92
  end
75
93
  end
@@ -13,10 +13,10 @@ module WhirledPeas
13
13
  @children = []
14
14
  end
15
15
 
16
- def paint(canvas, &block)
16
+ def paint(canvas, left, top, &block)
17
17
  return unless canvas.writable?
18
18
  return unless needs_printing?
19
- canvas_coords = coords(canvas)
19
+ canvas_coords = coords(left, top)
20
20
  stroke_left = canvas_coords.border_left
21
21
  stroke_top = canvas_coords.border_top
22
22
  formatting = [*settings.border.color, *settings.bg_color]
@@ -73,8 +73,46 @@ module WhirledPeas
73
73
  settings.scrollbar.horiz? || settings.scrollbar.vert?
74
74
  end
75
75
 
76
- def coords(canvas)
77
- ContainerCoords.new(canvas, dimensions, settings)
76
+ def coords(left, top)
77
+ ContainerCoords.new(dimensions, settings, left, top)
78
+ end
79
+
80
+ def horiz_justify_offset(containing_width)
81
+ if settings.align_center?
82
+ [(dimensions.content_width - containing_width) / 2, 0]
83
+ elsif settings.align_right?
84
+ [dimensions.content_width - containing_width, 0]
85
+ elsif settings.align_between?
86
+ return [0, 0] if num_children == 1
87
+ [0, (dimensions.content_width - containing_width) / (num_children - 1)]
88
+ elsif settings.align_around?
89
+ full_spacing = (dimensions.content_width - containing_width) / num_children
90
+ [full_spacing / 2, full_spacing]
91
+ elsif settings.align_evenly?
92
+ spacing = (dimensions.content_width - containing_width) / (num_children + 1)
93
+ [spacing, spacing]
94
+ else
95
+ [0, 0]
96
+ end
97
+ end
98
+
99
+ def vert_justify_offset(containing_height)
100
+ if settings.valign_middle?
101
+ [(dimensions.content_height - containing_height) / 2, 0]
102
+ elsif settings.valign_bottom?
103
+ [dimensions.content_height - containing_height, 0]
104
+ elsif settings.valign_between?
105
+ return [0, 0] if num_children == 1
106
+ [0, (dimensions.content_height - containing_height) / (num_children - 1)]
107
+ elsif settings.valign_around?
108
+ full_spacing = (dimensions.content_height - containing_height) / num_children
109
+ [full_spacing / 2, full_spacing]
110
+ elsif settings.valign_evenly?
111
+ spacing = (dimensions.content_height - containing_height) / (num_children + 1)
112
+ [spacing, spacing]
113
+ else
114
+ [0, 0]
115
+ end
78
116
  end
79
117
 
80
118
  def line_stroke(left_border, junc_border, right_border, &block)
@@ -4,24 +4,25 @@ require_relative 'container_painter'
4
4
  module WhirledPeas
5
5
  module Graphics
6
6
  class GridPainter < ContainerPainter
7
- def paint(canvas, &block)
7
+ def paint(canvas, left, top, &block)
8
8
  super
9
9
  return unless canvas.writable?
10
10
  each_child.with_index do |child, index|
11
11
  col_index, row_index = grid_cell(index)
12
- content_left = coords(canvas).content_left(col_index)
13
- if settings.align_center?
14
- content_left += (dimensions.content_width - child.dimensions.outer_width) / 2
15
- elsif settings.align_right?
16
- content_left += dimensions.content_width - child.dimensions.outer_width
17
- end
12
+ left_offset, _ = horiz_justify_offset(child.dimensions.outer_width)
13
+ top_offset, _ = vert_justify_offset(child.dimensions.outer_height)
18
14
  child_canvas = canvas.child(
19
- content_left,
20
- coords(canvas).content_top(row_index),
15
+ coords(left, top).content_left(col_index) + left_offset,
16
+ coords(left, top).content_top(row_index) + top_offset,
21
17
  [dimensions.content_width, child.dimensions.outer_width].min,
22
18
  [dimensions.content_height, child.dimensions.outer_height].min
23
19
  )
24
- child.paint(child_canvas, &block)
20
+ child.paint(
21
+ child_canvas,
22
+ coords(left, top).content_left(col_index) + left_offset,
23
+ coords(left, top).content_top(row_index) + top_offset,
24
+ &block
25
+ )
25
26
  end
26
27
  end
27
28