whirled_peas 0.9.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -2
  3. data/CHANGELOG.md +21 -0
  4. data/README.md +9 -1053
  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 +23 -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 +17 -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 +7 -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 +88 -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 +12 -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 -22
  45. data/lib/whirled_peas/graphics/pixel_grid.rb +44 -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 +25 -4
  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 +26 -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 +20 -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
@@ -0,0 +1,92 @@
1
+ ## Application
2
+
3
+ The application is code to be visualized that integrates with Whirled Peas by providing the signature below
4
+
5
+ ```ruby
6
+ # Start the application and pass frame events to the producer to be rendered
7
+ # by the UI
8
+ #
9
+ # @param producer [Producer] frame producer that sends events to the UI
10
+ def start(producer)
11
+ # application code here
12
+ end
13
+ ```
14
+
15
+ The producer provides the following methods
16
+
17
+ ```ruby
18
+ # Add a frame to be displayed
19
+ #
20
+ # @param name [String] (required) application defined name for the frame. The
21
+ # template factory will be provided this name
22
+ # @param duration [Number] (optional) time in seconds this frame should be
23
+ # displayed for (defaults to 1 frame)
24
+ # @param args [Hash<Symbol, Object>] (optional) key/value pairs to send as
25
+ # arguments to the template factory
26
+ def add_frame(name, duration:, args:)
27
+ end
28
+
29
+ # Create and yield a frameset instance that allows applications to add multiple
30
+ # frames to play over the given duration. Adding frames to the yielded frameset
31
+ # will result in playback that is eased by the given `easing` and `effect`
32
+ # arguments (default is `:linear` easing)
33
+ #
34
+ # @param duration [Number] (required) total duration for which all frames in
35
+ # frameset will be displayed
36
+ # @param easing [Symbol] (optional) easing function to be used to transition
37
+ # through all frames (defaults to `:linear`)
38
+ # @param effect [Symbol] (optional) how to apply the easing function (defaults
39
+ # to `:in_out`, also available are `:in` and `:out`)
40
+ # @yield [Frameset] instance that provides `#add_frame(name, args:)`
41
+ def frameset(duration, easing:, effect:, &block)
42
+ end
43
+ ```
44
+
45
+ See the [easing documentation](easing.md) for more details on the various easing functions.
46
+
47
+ A frameset instance provides one method
48
+
49
+ ```ruby
50
+ # Add a frame to be displayed, the duration will be determine by the number of
51
+ # frames in the frameset along with the duration and easing of the frameset
52
+ #
53
+ # @param name [String] (required) application defined name for the frame. The
54
+ # template factory will be provided this name
55
+ # @param args [Hash<Symbol, Object>] (optional) key/value pairs to send as
56
+ # arguments to the template factory
57
+ def add_frame(name, args:)
58
+ end
59
+ ```
60
+
61
+ **IMPORTANT**: the keys in the `args` hash must be symbols!
62
+
63
+ ### Example
64
+
65
+ Simple application that loads a set of numbers and looks for a pair that adds up to 1,000
66
+
67
+ ```ruby
68
+ class Application
69
+ def start(producer)
70
+ numbers = File.readlines('/path/to/numbers.txt').map(&:to_i)
71
+ producer.add_frame('load-numbers', duration: 3, args: { numbers: numbers })
72
+ numbers.sort!
73
+ producer.add_frame('sort-numbers', duration: 3, args: { numbers: numbers })
74
+ low = 0
75
+ high = numbers.length - 1
76
+ while low < high
77
+ sum = numbers[low] + numbers[high]
78
+ if sum == 1000
79
+ producer.add_frame('found-pair', duration: 5, args: { low: low, high: high, sum: sum })
80
+ return
81
+ elsif sum < 1000
82
+ producer.add_frame('too-low', args: { low: low, high: high, sum: sum })
83
+ low += 1
84
+ else
85
+ producer.add_frame('too-high', args: { low: low, high: high, sum: sum })
86
+ high -= 1
87
+ end
88
+ end
89
+ producer.add_frame('no-solution', duration: 5)
90
+ end
91
+ end
92
+ ```
@@ -0,0 +1,115 @@
1
+ ## Full usage
2
+
3
+ ```
4
+ Usage: whirled_peas <command> [command options]
5
+
6
+ Available commands:
7
+
8
+ debug Print template tree for specified frame
9
+ fonts List installed title fonts with sample text
10
+ frames Print out list of frames generated by application
11
+ help Show detailed help for a command
12
+ play Play an animation from an application or prerecorded file
13
+ record Record animation to a file
14
+ still Show the specified still frame
15
+ themes List all themes with sample template rendered in the theme
16
+ ```
17
+
18
+ ### `debug`
19
+
20
+ Print the template tree for specified frame.
21
+
22
+ ```
23
+ # Usage: whirled_peas debug <config file> <frame> [args as a JSON string]
24
+ % whirled_peas debug my_app.rb greeting '{"name":"World"}'
25
+ * WhirledPeas::Graphics::BoxPainter(TEMPLATE)
26
+ - Dimensions(outer=140x27, content=120x15, grid=1x1)
27
+ - Settings
28
+ WhirledPeas::Settings::BoxSettings
29
+ padding: Padding(left: 10, top: 6, right: 10, bottom: 6)
30
+ align: :center
31
+ width: 120
32
+ flow: :t2b
33
+ bold: true
34
+ bg_color: BgColor(code=107, bright=true)
35
+ - Children
36
+ * WhirledPeas::Graphics::BoxPainter(Element-1)
37
+ - Dimensions(outer=64x6, content=64x6, grid=1x1)
38
+ ```
39
+
40
+ ### `fonts`
41
+
42
+ List all installed title fonts with sample text.
43
+
44
+ ```
45
+ # Usage: whirled_peas fonts
46
+ ```
47
+
48
+ ### `frames`
49
+
50
+ Print out list of frames generated by application.
51
+
52
+ ```
53
+ # Usage: whirled_peas frames <config file>
54
+ % whirled_peas frames my_app.rb
55
+ Frame 'intro' displayed for 3 second(s) '{"title":"Foo"}'
56
+ Frame 'greet' displayed for 0.3 second(s)
57
+ ...
58
+ ```
59
+
60
+ ### `help`
61
+
62
+ Print out command-specific help message
63
+
64
+ ```
65
+ Usage: whirled_peas help <command>
66
+ ```
67
+
68
+ ### `play`
69
+
70
+ Play an animation from an application or prerecorded file
71
+
72
+ ```
73
+ # Usage: whirled_peas play <config/wpz file>
74
+
75
+ # Play animation directly from app
76
+ % whirled_peas play my_app.rb
77
+ # Animation plays
78
+
79
+ # Play animation from previously recorded file
80
+ % whirled_peas play my_animation.wpz
81
+ # Animation plays
82
+ ```
83
+
84
+ ### `record`
85
+
86
+ Record animation to a file
87
+
88
+ ```
89
+ # Usage: whirled_peas record <config file> <output file>
90
+ % whirled_peas record my_app.rb my_animation.wpz
91
+ # Record animation to my_animation.wpz
92
+ ```
93
+
94
+ ### `still`
95
+
96
+ Show the specified still frame
97
+
98
+ ```
99
+ # Usage: whirled_peas still <config file> <frame> [args as a JSON string]
100
+ % whirled_peas still my_app.rb greeting '{"name":"World"}'
101
+ # Still frame is displayed
102
+ ```
103
+
104
+ ### `themes`
105
+
106
+ List all themes and display a small sample screen in each. Running this with no extra command line arguments will display all the built-in themes. Adding the path to a Whirled Peas configuration file will inlcude any themes defined in that configuration.
107
+
108
+ ```
109
+ # Usage: whirled_peas themes [config file]
110
+ % whirled_peas themes
111
+ # Display all system themes
112
+
113
+ % whirled_peas themes my_app.rb
114
+ # Display app-defined themes and all system themes
115
+ ```
@@ -0,0 +1,51 @@
1
+ ## Components
2
+
3
+ A component is a composition of the core building blocks. This gem includes a handful of components and third parties can also add components using `WhirledPeas.register_component(name, component_class)` (the convention for `name` is a snake cased symbol). A component class must be constructed with no arguments, though can supply basic setters to allow for customizations. A component must also implement `#compose(composer, settings)`, which should attach elements to the composer. Thus a template can integrate with the component like
4
+
5
+ ```ruby
6
+ WhirledPeas.template do |composer, settings|
7
+ # Attach the component registered with the name `:my_component` to the template
8
+ WhirledPeas.component(composer, settings, :my_component) do |component|
9
+ # Configure the component
10
+ end
11
+ end
12
+ ```
13
+
14
+ ### `:list_with_active`
15
+
16
+ This component presents a list of content (either horizontally of vertically) and places the item specified by `active_index` in the preferred position.
17
+
18
+ ```
19
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
20
+ ┃ green, blue, *indigo*, viole┃
21
+ ┃ ▗▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖ ┃
22
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
23
+ ```
24
+
25
+ Note: in the diagram above, the item specified by the active index is highlighted with `*`s, these are for illustration onlhy. The component can highlight the item with a color and/or background color, but will _not_ add the `*`s.
26
+
27
+ This component takes the following options
28
+
29
+ #### Required
30
+
31
+ - `active_index` - the index of the active item
32
+ - `items` - the array of items to be displayed in the box
33
+
34
+ #### Optional
35
+
36
+ - `flow` - `:l2r` or `:t2b`
37
+ - `separator` - string used to separate items in the list, e.g. `", "` for a horizontal list or `"----"` for a vertical list
38
+ - `viewport_size` - number of characters of the viewport in the flow direction
39
+
40
+ ### Example
41
+
42
+ ```ruby
43
+ WhirledPeas.template do |composer, settings|
44
+ WhirledPeas.component(composer, settings, :list_with_active) do |component|
45
+ component.items = %w[red orange yellow green blue indigo violet]
46
+ component.separator = ', '
47
+ component.active_index = active
48
+ component.viewport_size = 27
49
+ end
50
+ end
51
+ ```
@@ -0,0 +1,257 @@
1
+ ## Easing
2
+
3
+ The duration that a frame within a frameset is displayed is determined by the easing function and effect along with the frames relative position within the frameset. The three effects are
4
+
5
+ - `:in` - apply easing only to the start of the frameset
6
+ - `:out` - apply easing only to the end of the frameset
7
+ - `:in_out` - apply easing to the start and end of the frameset
8
+
9
+ The available easing functions are
10
+
11
+ - `:bezier`
12
+
13
+ ```
14
+ # bezier (in)
15
+ ┃ ▄▀
16
+ ┃ ▄▄▀
17
+ ┃ ▄▀
18
+ ┃ ▄▀▀
19
+ ┃ ▄▄▀
20
+ ┃ ▄▄▀
21
+ ┃ ▄▄▀
22
+ ┃ ▄▀
23
+ ┃ ▄▄▀▀
24
+ ┃ ▄▄▀
25
+ ┃ ▄▀▀
26
+ ┃ ▄▄▀▀
27
+ ┃ ▄▄▀▀▀
28
+ ┃ ▄▄▄▀▀▀
29
+ ┃▄▄▄▄▄▄▄▄▄▄▀▀▀
30
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
31
+ ```
32
+
33
+ ```
34
+ # bezier (out)
35
+ ┃ ▄▄▄▀▀▀▀▀▀▀▀▀
36
+ ┃ ▄▄▄▀▀▀
37
+ ┃ ▄▄▄▀▀
38
+ ┃ ▄▄▀▀
39
+ ┃ ▄▄▀
40
+ ┃ ▄▀▀
41
+ ┃ ▄▄▀▀
42
+ ┃ ▄▀
43
+ ┃ ▄▀▀
44
+ ┃ ▄▀▀
45
+ ┃ ▄▀▀
46
+ ┃ ▄▄▀
47
+ ┃ ▄▀
48
+ ┃ ▄▀▀
49
+ ┃▄▄▀
50
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
51
+ ```
52
+
53
+ ```
54
+ # bezier (in_out)
55
+ ┃ ▄▄▄▀▀▀▀▀▀
56
+ ┃ ▄▄▀▀
57
+ ┃ ▄▀▀
58
+ ┃ ▄▀▀
59
+ ┃ ▄▀▀
60
+ ┃ ▄▀▀
61
+ ┃ ▄▄▀
62
+ ┃ ▄▀
63
+ ┃ ▄▀▀
64
+ ┃ ▄▄▀
65
+ ┃ ▄▄▀
66
+ ┃ ▄▄▀
67
+ ┃ ▄▄▀
68
+ ┃ ▄▄▀▀
69
+ ┃▄▄▄▄▄▄▄▀▀▀
70
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
71
+ ```
72
+
73
+ `:linear`
74
+
75
+ ```
76
+ # linear (in)
77
+ ┃ ▄▄▀
78
+ ┃ ▄▄▀▀
79
+ ┃ ▄▄▀▀
80
+ ┃ ▄▄▀▀
81
+ ┃ ▄▄▀▀
82
+ ┃ ▄▄▀▀
83
+ ┃ ▄▄▀▀
84
+ ┃ ▄▄▀▀
85
+ ┃ ▄▄▀▀
86
+ ┃ ▄▄▀▀
87
+ ┃ ▄▄▀▀
88
+ ┃ ▄▄▀▀
89
+ ┃ ▄▄▀▀
90
+ ┃ ▄▄▀▀
91
+ ┃▄▄▀▀
92
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
93
+ ```
94
+
95
+ ```
96
+ # linear (out)
97
+ ┃ ▄▄▀
98
+ ┃ ▄▄▀▀
99
+ ┃ ▄▄▀▀
100
+ ┃ ▄▄▀▀
101
+ ┃ ▄▄▀▀
102
+ ┃ ▄▄▀▀
103
+ ┃ ▄▄▀▀
104
+ ┃ ▄▄▀▀
105
+ ┃ ▄▄▀▀
106
+ ┃ ▄▄▀▀
107
+ ┃ ▄▄▀▀
108
+ ┃ ▄▄▀▀
109
+ ┃ ▄▄▀▀
110
+ ┃ ▄▄▀▀
111
+ ┃▄▄▀▀
112
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
113
+ ```
114
+
115
+ ```
116
+ # linear (in_out)
117
+ ┃ ▄▄▀
118
+ ┃ ▄▄▀▀
119
+ ┃ ▄▄▀▀
120
+ ┃ ▄▄▀▀
121
+ ┃ ▄▄▀▀
122
+ ┃ ▄▄▀▀
123
+ ┃ ▄▄▀▀
124
+ ┃ ▄▄▀▀
125
+ ┃ ▄▄▀▀
126
+ ┃ ▄▄▀▀
127
+ ┃ ▄▄▀▀
128
+ ┃ ▄▄▀▀
129
+ ┃ ▄▄▀▀
130
+ ┃ ▄▄▀▀
131
+ ┃▄▄▀▀
132
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
133
+ ```
134
+
135
+ `:parametric`
136
+
137
+ ```
138
+ # parametric (in)
139
+ ┃ ▄
140
+ ┃ ▄▀
141
+ ┃ ▄▀
142
+ ┃ ▄▄▀
143
+ ┃ ▄▀
144
+ ┃ ▄▀
145
+ ┃ ▄▀
146
+ ┃ ▄▄▀
147
+ ┃ ▄▀
148
+ ┃ ▄▀▀
149
+ ┃ ▄▀▀
150
+ ┃ ▄▄▀▀
151
+ ┃ ▄▄▄▀▀
152
+ ┃ ▄▄▄▄▀▀
153
+ ┃▄▄▄▄▄▄▄▄▄▄▄▄▄▄▀▀▀▀▀
154
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
155
+ ```
156
+
157
+ ```
158
+ # parametric (out)
159
+ ┃ ▄▄▄▄▄▀▀▀▀▀▀▀▀▀▀▀▀▀
160
+ ┃ ▄▄▀▀▀▀
161
+ ┃ ▄▄▀▀▀
162
+ ┃ ▄▄▀▀
163
+ ┃ ▄▄▀
164
+ ┃ ▄▄▀
165
+ ┃ ▄▀
166
+ ┃ ▄▀▀
167
+ ┃ ▄▀
168
+ ┃ ▄▀
169
+ ┃ ▄▀
170
+ ┃ ▄▀▀
171
+ ┃ ▄▀
172
+ ┃ ▄▀
173
+ ┃▄▀
174
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
175
+ ```
176
+
177
+ ```
178
+ # parametric (in_out)
179
+ ┃ ▄▄▄▀▀▀▀▀▀▀▀▀
180
+ ┃ ▄▄▀▀
181
+ ┃ ▄▀▀
182
+ ┃ ▄▄▀
183
+ ┃ ▄▀
184
+ ┃ ▄▀
185
+ ┃ ▄▀
186
+ ┃ ▄▀
187
+ ┃ ▄▀
188
+ ┃ ▄▀
189
+ ┃ ▄▀
190
+ ┃ ▄▀▀
191
+ ┃ ▄▄▀
192
+ ┃ ▄▄▀▀
193
+ ┃▄▄▄▄▄▄▄▄▄▄▀▀▀
194
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
195
+ ```
196
+
197
+ `:quadratic`
198
+
199
+ ```
200
+ # quadratic (in)
201
+ ┃ ▄▄
202
+ ┃ ▄▀
203
+ ┃ ▄▀
204
+ ┃ ▄▀
205
+ ┃ ▄▀
206
+ ┃ ▄▀▀
207
+ ┃ ▄▀
208
+ ┃ ▄▀▀
209
+ ┃ ▄▀▀
210
+ ┃ ▄▀▀
211
+ ┃ ▄▄▀▀
212
+ ┃ ▄▄▀▀
213
+ ┃ ▄▄▄▀▀
214
+ ┃ ▄▄▄▀▀▀
215
+ ┃▄▄▄▄▄▄▄▄▄▄▄▀▀▀▀▀
216
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
217
+ ```
218
+
219
+ ```
220
+ # quadratic (out)
221
+ ┃ ▄▄▄▄▄▀▀▀▀▀▀▀▀▀▀
222
+ ┃ ▄▄▄▀▀▀
223
+ ┃ ▄▄▀▀▀
224
+ ┃ ▄▄▀▀
225
+ ┃ ▄▄▀▀
226
+ ┃ ▄▄▀
227
+ ┃ ▄▄▀
228
+ ┃ ▄▄▀
229
+ ┃ ▄▀
230
+ ┃ ▄▄▀
231
+ ┃ ▄▀
232
+ ┃ ▄▀
233
+ ┃ ▄▀
234
+ ┃ ▄▀
235
+ ┃▄▀▀
236
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
237
+ ```
238
+
239
+ ```
240
+ # quadratic (in_out)
241
+ ┃ ▄▄▄▀▀▀▀▀▀▀
242
+ ┃ ▄▄▀▀▀
243
+ ┃ ▄▀▀
244
+ ┃ ▄▀▀
245
+ ┃ ▄▄▀
246
+ ┃ ▄▀
247
+ ┃ ▄▀
248
+ ┃ ▄▀
249
+ ┃ ▄▀
250
+ ┃ ▄▀
251
+ ┃ ▄▀▀
252
+ ┃ ▄▄▀
253
+ ┃ ▄▄▀
254
+ ┃ ▄▄▄▀▀
255
+ ┃▄▄▄▄▄▄▄▄▀▀▀
256
+ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
257
+ ```