whirled_peas 0.9.1 → 0.13.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 (255) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/CHANGELOG.md +23 -0
  4. data/README.md +9 -1049
  5. data/doc/application.md +92 -0
  6. data/doc/cli.md +115 -0
  7. data/doc/components.md +51 -0
  8. data/doc/easing.md +257 -0
  9. data/doc/elements.md +69 -0
  10. data/doc/screen_test.md +22 -0
  11. data/doc/settings.md +466 -0
  12. data/doc/template_factory.md +53 -0
  13. data/doc/themes.md +50 -0
  14. data/examples/components.rb +33 -0
  15. data/examples/graph.rb +1 -1
  16. data/examples/scrolling.rb +8 -19
  17. data/lib/data/themes.yaml +15 -0
  18. data/lib/whirled_peas.rb +31 -9
  19. data/lib/whirled_peas/animator/debug_consumer.rb +2 -2
  20. data/lib/whirled_peas/animator/easing.rb +57 -0
  21. data/lib/whirled_peas/animator/frameset.rb +13 -8
  22. data/lib/whirled_peas/animator/producer.rb +7 -8
  23. data/lib/whirled_peas/animator/renderer_consumer.rb +10 -5
  24. data/lib/whirled_peas/command/config_command.rb +3 -3
  25. data/lib/whirled_peas/command/frames.rb +1 -3
  26. data/lib/whirled_peas/command/play.rb +9 -7
  27. data/lib/whirled_peas/command/record.rb +1 -3
  28. data/lib/whirled_peas/command/still.rb +6 -2
  29. data/lib/whirled_peas/command/themes.rb +78 -0
  30. data/lib/whirled_peas/command_line.rb +3 -1
  31. data/lib/whirled_peas/component.rb +35 -0
  32. data/lib/whirled_peas/component/list_with_active.rb +89 -0
  33. data/lib/whirled_peas/config.rb +1 -8
  34. data/lib/whirled_peas/device/null_device.rb +1 -1
  35. data/lib/whirled_peas/device/output_file.rb +2 -2
  36. data/lib/whirled_peas/device/rendered_frame.rb +12 -0
  37. data/lib/whirled_peas/device/screen.rb +7 -8
  38. data/lib/whirled_peas/graphics/box_painter.rb +4 -4
  39. data/lib/whirled_peas/graphics/composer.rb +9 -2
  40. data/lib/whirled_peas/graphics/container_coords.rb +23 -25
  41. data/lib/whirled_peas/graphics/container_dimensions.rb +24 -0
  42. data/lib/whirled_peas/graphics/container_painter.rb +27 -139
  43. data/lib/whirled_peas/graphics/debugger.rb +2 -7
  44. data/lib/whirled_peas/graphics/graph_painter.rb +31 -24
  45. data/lib/whirled_peas/graphics/pixel_grid.rb +81 -0
  46. data/lib/whirled_peas/graphics/renderer.rb +4 -5
  47. data/lib/whirled_peas/graphics/scrollbar_helper.rb +126 -0
  48. data/lib/whirled_peas/null_logger.rb +0 -1
  49. data/lib/whirled_peas/settings/bg_color.rb +5 -1
  50. data/lib/whirled_peas/settings/border.rb +26 -5
  51. data/lib/whirled_peas/settings/color.rb +8 -4
  52. data/lib/whirled_peas/settings/container_settings.rb +14 -7
  53. data/lib/whirled_peas/settings/debugger.rb +3 -1
  54. data/lib/whirled_peas/settings/element_settings.rb +18 -6
  55. data/lib/whirled_peas/settings/graph_settings.rb +1 -1
  56. data/lib/whirled_peas/settings/position.rb +17 -5
  57. data/lib/whirled_peas/settings/text_color.rb +5 -0
  58. data/lib/whirled_peas/settings/text_settings.rb +1 -0
  59. data/lib/whirled_peas/settings/theme.rb +61 -0
  60. data/lib/whirled_peas/settings/theme_library.rb +69 -0
  61. data/lib/whirled_peas/utils/ansi.rb +4 -2
  62. data/lib/whirled_peas/utils/file_handler.rb +14 -9
  63. data/lib/whirled_peas/utils/formatted_string.rb +5 -3
  64. data/lib/whirled_peas/version.rb +1 -1
  65. data/screen_test/components/list_with_active/l2r_position_end.frame +1 -0
  66. data/screen_test/components/list_with_active/l2r_position_end.rb +16 -0
  67. data/screen_test/components/list_with_active/l2r_position_middle.frame +1 -0
  68. data/screen_test/components/list_with_active/l2r_position_middle.rb +16 -0
  69. data/screen_test/components/list_with_active/l2r_position_start.frame +1 -0
  70. data/screen_test/components/list_with_active/l2r_position_start.rb +16 -0
  71. data/screen_test/components/list_with_active/l2r_separator.frame +1 -0
  72. data/screen_test/components/list_with_active/l2r_separator.rb +17 -0
  73. data/screen_test/components/list_with_active/t2b_position_end.frame +1 -0
  74. data/screen_test/components/list_with_active/t2b_position_end.rb +17 -0
  75. data/screen_test/components/list_with_active/t2b_position_middle.frame +1 -0
  76. data/screen_test/components/list_with_active/t2b_position_middle.rb +17 -0
  77. data/screen_test/components/list_with_active/t2b_position_start.frame +1 -0
  78. data/screen_test/components/list_with_active/t2b_position_start.rb +17 -0
  79. data/screen_test/components/list_with_active/t2b_separator.frame +1 -0
  80. data/screen_test/components/list_with_active/t2b_separator.rb +18 -0
  81. data/screen_test/elements/box.frame +1 -1
  82. data/screen_test/elements/box.rb +1 -1
  83. data/screen_test/elements/graph_asc.frame +1 -0
  84. data/screen_test/elements/{graph.rb → graph_asc.rb} +1 -1
  85. data/screen_test/elements/graph_desc.frame +1 -0
  86. data/screen_test/elements/graph_desc.rb +12 -0
  87. data/screen_test/elements/graph_horiz.frame +1 -0
  88. data/screen_test/elements/graph_horiz.rb +12 -0
  89. data/screen_test/elements/graph_sin.frame +1 -0
  90. data/screen_test/elements/graph_sin.rb +12 -0
  91. data/screen_test/elements/grid.frame +1 -1
  92. data/screen_test/elements/grid.rb +1 -1
  93. data/screen_test/elements/screen_overflow_x.frame +1 -1
  94. data/screen_test/elements/screen_overflow_x.rb +1 -1
  95. data/screen_test/elements/screen_overflow_y.frame +1 -1
  96. data/screen_test/elements/screen_overflow_y.rb +1 -1
  97. data/screen_test/elements/text.frame +1 -1
  98. data/screen_test/elements/text.rb +1 -1
  99. data/screen_test/elements/text_multiline.frame +1 -1
  100. data/screen_test/elements/text_multiline.rb +1 -1
  101. data/screen_test/elements/theme.frame +1 -0
  102. data/screen_test/elements/theme.rb +27 -0
  103. data/screen_test/settings/align/box_around.frame +1 -1
  104. data/screen_test/settings/align/box_around.rb +1 -1
  105. data/screen_test/settings/align/box_between.frame +1 -1
  106. data/screen_test/settings/align/box_between.rb +1 -1
  107. data/screen_test/settings/align/box_center.frame +1 -1
  108. data/screen_test/settings/align/box_center.rb +1 -1
  109. data/screen_test/settings/align/box_default.frame +1 -1
  110. data/screen_test/settings/align/box_default.rb +1 -1
  111. data/screen_test/settings/align/box_evenly.frame +1 -1
  112. data/screen_test/settings/align/box_evenly.rb +1 -1
  113. data/screen_test/settings/align/box_left.frame +1 -1
  114. data/screen_test/settings/align/box_left.rb +1 -1
  115. data/screen_test/settings/align/box_right.frame +1 -1
  116. data/screen_test/settings/align/box_right.rb +1 -1
  117. data/screen_test/settings/align/children_center.frame +1 -1
  118. data/screen_test/settings/align/children_center.rb +1 -1
  119. data/screen_test/settings/align/children_left.frame +1 -1
  120. data/screen_test/settings/align/children_left.rb +1 -1
  121. data/screen_test/settings/align/children_right.frame +1 -1
  122. data/screen_test/settings/align/children_right.rb +1 -1
  123. data/screen_test/settings/align/grid_center.frame +1 -1
  124. data/screen_test/settings/align/grid_center.rb +1 -1
  125. data/screen_test/settings/align/grid_default.frame +1 -1
  126. data/screen_test/settings/align/grid_default.rb +1 -1
  127. data/screen_test/settings/align/grid_left.frame +1 -1
  128. data/screen_test/settings/align/grid_left.rb +1 -1
  129. data/screen_test/settings/align/grid_right.frame +1 -1
  130. data/screen_test/settings/align/grid_right.rb +1 -1
  131. data/screen_test/settings/ansi/bold.frame +1 -1
  132. data/screen_test/settings/ansi/bold.rb +1 -1
  133. data/screen_test/settings/ansi/color.frame +1 -1
  134. data/screen_test/settings/ansi/color.rb +1 -1
  135. data/screen_test/settings/ansi/underline.frame +1 -1
  136. data/screen_test/settings/ansi/underline.rb +1 -1
  137. data/screen_test/settings/border.frame +1 -1
  138. data/screen_test/settings/border.rb +1 -1
  139. data/screen_test/settings/content_start/box_bottom.frame +1 -0
  140. data/screen_test/settings/content_start/box_bottom.rb +17 -0
  141. data/screen_test/settings/content_start/box_left.frame +1 -0
  142. data/screen_test/settings/{position → content_start}/box_left.rb +2 -2
  143. data/screen_test/settings/content_start/box_left_negative.frame +1 -0
  144. data/screen_test/settings/{position → content_start}/box_left_negative.rb +2 -2
  145. data/screen_test/settings/content_start/box_right.frame +1 -0
  146. data/screen_test/settings/content_start/box_right.rb +17 -0
  147. data/screen_test/settings/content_start/box_top.frame +1 -0
  148. data/screen_test/settings/{position → content_start}/box_top.rb +2 -2
  149. data/screen_test/settings/content_start/box_top_negative.frame +1 -0
  150. data/screen_test/settings/{position → content_start}/box_top_negative.rb +2 -2
  151. data/screen_test/settings/content_start/grid_left.frame +1 -0
  152. data/screen_test/settings/{position → content_start}/grid_left.rb +2 -2
  153. data/screen_test/settings/content_start/grid_left_negative.frame +1 -0
  154. data/screen_test/settings/{position → content_start}/grid_left_negative.rb +2 -2
  155. data/screen_test/settings/content_start/grid_top.frame +1 -0
  156. data/screen_test/settings/{position → content_start}/grid_top.rb +2 -2
  157. data/screen_test/settings/content_start/grid_top_negative.frame +1 -0
  158. data/screen_test/settings/{position → content_start}/grid_top_negative.rb +2 -2
  159. data/screen_test/settings/flow/box_b2t.frame +1 -1
  160. data/screen_test/settings/flow/box_b2t.rb +1 -1
  161. data/screen_test/settings/flow/box_l2r.frame +1 -1
  162. data/screen_test/settings/flow/box_l2r.rb +1 -1
  163. data/screen_test/settings/flow/box_r2l.frame +1 -1
  164. data/screen_test/settings/flow/box_r2l.rb +1 -1
  165. data/screen_test/settings/flow/box_t2b.frame +1 -1
  166. data/screen_test/settings/flow/box_t2b.rb +1 -1
  167. data/screen_test/settings/flow/grid_b2t.frame +1 -1
  168. data/screen_test/settings/flow/grid_b2t.rb +1 -1
  169. data/screen_test/settings/flow/grid_l2r.frame +1 -1
  170. data/screen_test/settings/flow/grid_l2r.rb +1 -1
  171. data/screen_test/settings/flow/grid_r2l.frame +1 -1
  172. data/screen_test/settings/flow/grid_r2l.rb +1 -1
  173. data/screen_test/settings/flow/grid_t2b.frame +1 -1
  174. data/screen_test/settings/flow/grid_t2b.rb +1 -1
  175. data/screen_test/settings/height/box.frame +1 -1
  176. data/screen_test/settings/height/box.rb +1 -1
  177. data/screen_test/settings/height/box_border_sizing.frame +1 -1
  178. data/screen_test/settings/height/box_border_sizing.rb +1 -1
  179. data/screen_test/settings/height/grid.frame +1 -1
  180. data/screen_test/settings/height/grid.rb +1 -1
  181. data/screen_test/settings/height/overflow_box.frame +1 -1
  182. data/screen_test/settings/height/overflow_box.rb +1 -1
  183. data/screen_test/settings/height/overflow_box_l2r.frame +1 -1
  184. data/screen_test/settings/height/overflow_box_l2r.rb +1 -1
  185. data/screen_test/settings/height/overflow_box_t2b.frame +1 -1
  186. data/screen_test/settings/height/overflow_box_t2b.rb +1 -1
  187. data/screen_test/settings/height/overflow_grid.frame +1 -1
  188. data/screen_test/settings/height/overflow_grid.rb +1 -1
  189. data/screen_test/settings/margin.frame +1 -1
  190. data/screen_test/settings/margin.rb +1 -1
  191. data/screen_test/settings/padding.frame +1 -1
  192. data/screen_test/settings/padding.rb +1 -1
  193. data/screen_test/settings/scroll/horiz_box.frame +1 -1
  194. data/screen_test/settings/scroll/horiz_box.rb +3 -5
  195. data/screen_test/settings/scroll/horiz_box_align_center.rb +3 -5
  196. data/screen_test/settings/scroll/horiz_box_align_right.rb +3 -5
  197. data/screen_test/settings/scroll/vert_box.frame +1 -1
  198. data/screen_test/settings/scroll/vert_box.rb +6 -8
  199. data/screen_test/settings/title_font.frame +1 -1
  200. data/screen_test/settings/title_font.rb +1 -1
  201. data/screen_test/settings/valign/box_around.frame +1 -1
  202. data/screen_test/settings/valign/box_around.rb +1 -1
  203. data/screen_test/settings/valign/box_between.frame +1 -1
  204. data/screen_test/settings/valign/box_between.rb +1 -1
  205. data/screen_test/settings/valign/box_bottom.frame +1 -1
  206. data/screen_test/settings/valign/box_bottom.rb +1 -1
  207. data/screen_test/settings/valign/box_default.frame +1 -1
  208. data/screen_test/settings/valign/box_default.rb +1 -1
  209. data/screen_test/settings/valign/box_evenly.frame +1 -1
  210. data/screen_test/settings/valign/box_evenly.rb +1 -1
  211. data/screen_test/settings/valign/box_middle.frame +1 -1
  212. data/screen_test/settings/valign/box_middle.rb +1 -1
  213. data/screen_test/settings/valign/box_top.frame +1 -1
  214. data/screen_test/settings/valign/box_top.rb +1 -1
  215. data/screen_test/settings/valign/grid_bottom.frame +1 -1
  216. data/screen_test/settings/valign/grid_bottom.rb +1 -1
  217. data/screen_test/settings/valign/grid_default.frame +1 -1
  218. data/screen_test/settings/valign/grid_default.rb +1 -1
  219. data/screen_test/settings/valign/grid_middle.frame +1 -1
  220. data/screen_test/settings/valign/grid_middle.rb +1 -1
  221. data/screen_test/settings/valign/grid_top.frame +1 -1
  222. data/screen_test/settings/valign/grid_top.rb +1 -1
  223. data/screen_test/settings/width/box_border_sizing.frame +1 -1
  224. data/screen_test/settings/width/box_border_sizing.rb +1 -1
  225. data/screen_test/settings/width/box_content.frame +1 -1
  226. data/screen_test/settings/width/box_content.rb +1 -1
  227. data/screen_test/settings/width/box_default.frame +1 -1
  228. data/screen_test/settings/width/box_default.rb +1 -1
  229. data/screen_test/settings/width/grid.frame +1 -1
  230. data/screen_test/settings/width/grid.rb +1 -1
  231. data/screen_test/settings/width/overflow_align_center.frame +1 -1
  232. data/screen_test/settings/width/overflow_align_center.rb +1 -1
  233. data/screen_test/settings/width/overflow_align_right.frame +1 -1
  234. data/screen_test/settings/width/overflow_align_right.rb +1 -1
  235. data/screen_test/settings/width/overflow_box.frame +1 -1
  236. data/screen_test/settings/width/overflow_box.rb +1 -1
  237. data/screen_test/settings/width/overflow_box_l2r.frame +1 -1
  238. data/screen_test/settings/width/overflow_box_l2r.rb +1 -1
  239. data/screen_test/settings/width/overflow_box_t2b.frame +1 -1
  240. data/screen_test/settings/width/overflow_box_t2b.rb +1 -1
  241. data/screen_test/settings/width/overflow_grid.frame +1 -1
  242. data/screen_test/settings/width/overflow_grid.rb +1 -1
  243. data/tools/whirled_peas/tools/screen_tester.rb +21 -3
  244. metadata +67 -22
  245. data/bin/easing +0 -33
  246. data/lib/whirled_peas/graphics/mock_screen.rb +0 -26
  247. data/screen_test/elements/graph.frame +0 -1
  248. data/screen_test/settings/position/box_left.frame +0 -1
  249. data/screen_test/settings/position/box_left_negative.frame +0 -1
  250. data/screen_test/settings/position/box_top.frame +0 -1
  251. data/screen_test/settings/position/box_top_negative.frame +0 -1
  252. data/screen_test/settings/position/grid_left.frame +0 -1
  253. data/screen_test/settings/position/grid_left_negative.frame +0 -1
  254. data/screen_test/settings/position/grid_top.frame +0 -1
  255. data/screen_test/settings/position/grid_top_negative.frame +0 -1
@@ -5,7 +5,7 @@ module WhirledPeas
5
5
  module Settings
6
6
  class GraphSettings < ElementSettings
7
7
  def axis_color
8
- @_axis_color || color
8
+ @_axis_color || theme.axis_color
9
9
  end
10
10
 
11
11
  def axis_color=(color)
@@ -1,14 +1,26 @@
1
1
  module WhirledPeas
2
2
  module Settings
3
3
  class Position
4
- attr_writer :left, :top
4
+ attr_reader :left, :top, :right, :bottom
5
5
 
6
- def left
7
- @left || 0
6
+ def left=(value)
7
+ @right = nil
8
+ @left = value
8
9
  end
9
10
 
10
- def top
11
- @top || 0
11
+ def top=(value)
12
+ @bottom = nil
13
+ @top = value
14
+ end
15
+
16
+ def right=(value)
17
+ @left = nil
18
+ @right = value
19
+ end
20
+
21
+ def bottom=(value)
22
+ @top = nil
23
+ @bottom = value
12
24
  end
13
25
  end
14
26
  end
@@ -1,5 +1,6 @@
1
1
  require 'whirled_peas/utils/ansi'
2
2
 
3
+ require_relative 'bg_color'
3
4
  require_relative 'color'
4
5
 
5
6
  module WhirledPeas
@@ -16,6 +17,10 @@ module WhirledPeas
16
17
  GRAY = BLACK.bright
17
18
 
18
19
  DEFAULT = nil # Use system defined default
20
+
21
+ def as_bg_color
22
+ BgColor.new(code + BgColor::BG_OFFSET, bright?)
23
+ end
19
24
  end
20
25
  end
21
26
  end
@@ -8,6 +8,7 @@ module WhirledPeas
8
8
  attr_reader :title_font
9
9
 
10
10
  def title_font=(font)
11
+ font = theme.title_font if font == :theme
11
12
  @title_font = Utils::TitleFont.validate!(font)
12
13
  end
13
14
  end
@@ -0,0 +1,61 @@
1
+ require 'whirled_peas/utils/title_font'
2
+
3
+ require_relative 'bg_color'
4
+ require_relative 'border'
5
+ require_relative 'text_color'
6
+
7
+ module WhirledPeas
8
+ module Settings
9
+ class Theme
10
+ attr_reader :bg_color, :border_style, :color, :title_font
11
+
12
+ def axis_color=(value)
13
+ @axis_color = TextColor.validate!(value)
14
+ end
15
+
16
+ def axis_color
17
+ @axis_color || border_color
18
+ end
19
+
20
+ def bg_color=(value)
21
+ @bg_color = BgColor.validate!(value)
22
+ end
23
+
24
+ def border_color=(value)
25
+ @border_color = TextColor.validate!(value)
26
+ end
27
+
28
+ def border_color
29
+ @border_color || color
30
+ end
31
+
32
+ def border_style=(value)
33
+ @border_style = Border::Styles.validate!(value)
34
+ end
35
+
36
+ def color=(value)
37
+ @color = TextColor.validate!(value)
38
+ end
39
+
40
+ def highlight_bg_color=(value)
41
+ @highlight_bg_color = BgColor.validate!(value)
42
+ end
43
+
44
+ def highlight_bg_color
45
+ @highlight_bg_color || color.as_bg_color
46
+ end
47
+
48
+ def highlight_color=(value)
49
+ @highlight_color = TextColor.validate!(value)
50
+ end
51
+
52
+ def highlight_color
53
+ @highlight_color || bg_color.as_text_color
54
+ end
55
+
56
+ def title_font=(value)
57
+ @title_font = Utils::TitleFont.validate!(value)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,69 @@
1
+ require 'yaml'
2
+
3
+ require_relative 'theme'
4
+
5
+ module WhirledPeas
6
+ module Settings
7
+ module ThemeLibrary
8
+ CONFIG_FILE = File.join(File.dirname(File.dirname(File.dirname(__FILE__))), 'data', 'themes.yaml')
9
+
10
+ class << self
11
+ def theme_names
12
+ themes.keys
13
+ end
14
+
15
+ def add(name, theme)
16
+ themes[name] = theme
17
+ end
18
+
19
+ def get(name)
20
+ unless themes.key?(name)
21
+ expected = themes.keys.map(&:inspect).join(', ')
22
+ raise ArgumentError, "Unknown theme: #{name.inspect}, expecting one of #{expected}"
23
+ end
24
+ themes[name]
25
+ end
26
+
27
+ def default_name
28
+ themes.keys.first
29
+ end
30
+
31
+ private
32
+
33
+ def themes
34
+ return @themes if @themes
35
+ @themes = {}
36
+ config = YAML.load_file(CONFIG_FILE)
37
+ config.each do |name, settings|
38
+ name = name.to_sym
39
+ theme = Theme.new
40
+ settings.each do |key, value|
41
+ case key
42
+ when 'axis_color'
43
+ theme.axis_color = value
44
+ when 'bg_color'
45
+ theme.bg_color = value
46
+ when 'border_color'
47
+ theme.border_color = value
48
+ when 'border_style'
49
+ theme.border_style = value
50
+ when 'color'
51
+ theme.color = value
52
+ when 'highlight_bg_color'
53
+ theme.highlight_bg_color = value
54
+ when 'highlight_color'
55
+ theme.highlight_color = value
56
+ when 'title_font'
57
+ theme.title_font = value
58
+ else
59
+ raise ArgumentError, "Unexpected theme setting: #{key} in #{CONFIG_FILE}"
60
+ end
61
+ end
62
+ @themes[name] = theme
63
+ end
64
+ @themes
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
@@ -33,15 +33,17 @@ module WhirledPeas
33
33
  unless width && height
34
34
  width, height = HighLine.new.terminal.terminal_size
35
35
  end
36
+ output.print cursor_visible(false)
37
+ output.flush
36
38
  yield width, height
37
39
  ensure
38
40
  output.print clear
39
- output.print cursor_pos(top: height - 1)
41
+ output.print cursor_pos(left: 0, top: height - 1)
40
42
  output.print cursor_visible(true)
41
43
  output.flush
42
44
  end
43
45
 
44
- def cursor_pos(top: 0, left: 0)
46
+ def cursor_pos(left:, top:)
45
47
  "#{ESC}[#{top + 1};#{left + 1}H"
46
48
  end
47
49
 
@@ -1,16 +1,19 @@
1
1
  require 'base64'
2
2
  require 'zlib'
3
3
 
4
+ require 'whirled_peas/device/rendered_frame'
5
+
4
6
  module WhirledPeas
5
7
  module Utils
6
8
  module FileHandler
7
9
  module FileWriter
8
10
  VERSION = '1'
9
11
 
10
- def self.write(fp, renders)
11
- fp.puts renders.count
12
- renders.each do |strokes|
13
- encoded = Base64.encode64(strokes)
12
+ def self.write(fp, rendered_frames)
13
+ fp.puts rendered_frames.count
14
+ rendered_frames.each do |rendered_frame|
15
+ fp.puts rendered_frame.duration
16
+ encoded = Base64.encode64(rendered_frame.strokes)
14
17
  fp.puts encoded.count("\n")
15
18
  fp.puts encoded
16
19
  end
@@ -20,10 +23,12 @@ module WhirledPeas
20
23
 
21
24
  class FileReaderV1
22
25
  def self.read(fp)
23
- num_renders = Integer(fp.readline.chomp, 10)
24
- num_renders.times.map do
26
+ num_frames = Integer(fp.readline.chomp, 10)
27
+ num_frames.times.map do
28
+ duration = Float(fp.readline.chomp)
25
29
  num_strokes = Integer(fp.readline.chomp, 10)
26
- Base64.decode64(num_strokes.times.map { fp.readline }.join)
30
+ strokes = Base64.decode64(num_strokes.times.map { fp.readline }.join)
31
+ Device::RenderedFrame.new(strokes, duration)
27
32
  end
28
33
  end
29
34
 
@@ -38,10 +43,10 @@ module WhirledPeas
38
43
  }
39
44
  private_constant :READERS
40
45
 
41
- def self.write(file, renders)
46
+ def self.write(file, rendered_frames)
42
47
  Zlib::GzipWriter.open(file, Zlib::BEST_COMPRESSION) do |gz|
43
48
  gz.puts FileWriter::VERSION
44
- FileWriter.write(gz, renders)
49
+ FileWriter.write(gz, rendered_frames)
45
50
  end
46
51
  end
47
52
 
@@ -7,6 +7,8 @@ module WhirledPeas
7
7
  new('')
8
8
  end
9
9
 
10
+ attr_reader :formatting
11
+
10
12
  def initialize(raw, formatting=nil)
11
13
  @raw = raw
12
14
  @formatting = [*formatting]
@@ -16,8 +18,8 @@ module WhirledPeas
16
18
  raw.length
17
19
  end
18
20
 
19
- def [](index_or_range)
20
- self.class.new(raw[index_or_range], foramtting)
21
+ def each_char(&block)
22
+ raw.chars.each(&block)
21
23
  end
22
24
 
23
25
  def blank?
@@ -58,7 +60,7 @@ module WhirledPeas
58
60
 
59
61
  private
60
62
 
61
- attr_reader :raw, :formatting
63
+ attr_reader :raw
62
64
  end
63
65
  end
64
66
  end
@@ -1,3 +1,3 @@
1
1
  module WhirledPeas
2
- VERSION = '0.9.1'
2
+ VERSION = '0.13.0'
3
3
  end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓ ┃QRSTUVWXYZ┃ ┃ ▄▄▄▄┃ ┗━━━━━━━━━━┛                     [?25h
@@ -0,0 +1,16 @@
1
+ require 'whirled_peas'
2
+ require 'whirled_peas/component/list_with_active'
3
+
4
+ class TemplateFactory
5
+ ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
6
+
7
+ def build(*)
8
+ WhirledPeas.template(:test) do |composer, settings|
9
+ WhirledPeas.component(composer, settings, :list_with_active) do |component|
10
+ component.items = ITEMS
11
+ component.active_index = ITEMS.size - 1
12
+ component.viewport_size = 10
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓ ┃HIJKLMNOPQ┃ ┃ ▗▄▄▄▖ ┃ ┗━━━━━━━━━━┛                     [?25h
@@ -0,0 +1,16 @@
1
+ require 'whirled_peas'
2
+ require 'whirled_peas/component/list_with_active'
3
+
4
+ class TemplateFactory
5
+ ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
6
+
7
+ def build(*)
8
+ WhirledPeas.template(:test) do |composer, settings|
9
+ WhirledPeas.component(composer, settings, :list_with_active) do |component|
10
+ component.items = ITEMS
11
+ component.active_index = ITEMS.length / 2
12
+ component.viewport_size = 10
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓ ┃ABCDEFGHIJ┃ ┃▄▄▄▄ ┃ ┗━━━━━━━━━━┛                     [?25h
@@ -0,0 +1,16 @@
1
+ require 'whirled_peas'
2
+ require 'whirled_peas/component/list_with_active'
3
+
4
+ class TemplateFactory
5
+ ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
6
+
7
+ def build(*)
8
+ WhirledPeas.template(:test) do |composer, settings|
9
+ WhirledPeas.component(composer, settings, :list_with_active) do |component|
10
+ component.items = ITEMS
11
+ component.active_index = 0
12
+ component.viewport_size = 10
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━━━━━━━━━┓ ┃L, M, N, O┃ ┃ ▗▄ ┃ ┗━━━━━━━━━━┛                     [?25h
@@ -0,0 +1,17 @@
1
+ require 'whirled_peas'
2
+ require 'whirled_peas/component/list_with_active'
3
+
4
+ class TemplateFactory
5
+ ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
6
+
7
+ def build(*)
8
+ WhirledPeas.template(:test) do |composer, settings|
9
+ WhirledPeas.component(composer, settings, :list_with_active) do |component|
10
+ component.items = ITEMS
11
+ component.active_index = ITEMS.length / 2
12
+ component.viewport_size = 10
13
+ component.separator = ', '
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━┓ ┃Q ┃ ┃R ┃ ┃S ┃ ┃T ┃ ┃U ┃ ┃V ┃ ┃W▐┃ ┃X▐┃ ┃Y▐┃ ┃Z▐┃ ┗━━┛             [?25h
@@ -0,0 +1,17 @@
1
+ require 'whirled_peas'
2
+ require 'whirled_peas/component/list_with_active'
3
+
4
+ class TemplateFactory
5
+ ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
6
+
7
+ def build(*)
8
+ WhirledPeas.template(:test) do |composer, settings|
9
+ WhirledPeas.component(composer, settings, :list_with_active) do |component|
10
+ component.flow = :t2b
11
+ component.items = ITEMS
12
+ component.active_index = ITEMS.size - 1
13
+ component.viewport_size = 10
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━┓ ┃H ┃ ┃I ┃ ┃J▗┃ ┃K▐┃ ┃L▐┃ ┃M▐┃ ┃N▝┃ ┃O ┃ ┃P ┃ ┃Q ┃ ┗━━┛             [?25h
@@ -0,0 +1,17 @@
1
+ require 'whirled_peas'
2
+ require 'whirled_peas/component/list_with_active'
3
+
4
+ class TemplateFactory
5
+ ITEMS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.chars
6
+
7
+ def build(*)
8
+ WhirledPeas.template(:test) do |composer, settings|
9
+ WhirledPeas.component(composer, settings, :list_with_active) do |component|
10
+ component.flow = :t2b
11
+ component.items = ITEMS
12
+ component.active_index = ITEMS.length / 2
13
+ component.viewport_size = 10
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1 @@
1
+ [?25l┏━━┓ ┃A▐┃ ┃B▐┃ ┃C▐┃ ┃D▐┃ ┃E ┃ ┃F ┃ ┃G ┃ ┃H ┃ ┃I ┃ ┃J ┃ ┗━━┛             [?25h