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
@@ -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
+ ```
data/doc/cli.md ADDED
@@ -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
+ ```
data/doc/components.md ADDED
@@ -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
+ - `items` - the array of items to be displayed in the box
32
+
33
+ #### Optional
34
+
35
+ - `active_index` - the index of the active item, the item at the position will be highlighted and moved to the _preferred_ position. For items in the middle of a long list, the _preferred_ position is roughly 2/3rds to the way to the right in the viewport.
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
+ ```
data/doc/easing.md ADDED
@@ -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
+ ```