vedeu 0.7.4 → 0.8.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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -0
  3. data/docs/api.md +5 -1
  4. data/docs/borders.md +2 -26
  5. data/docs/dsl.md +4 -4
  6. data/docs/dsl_elements.md +100 -0
  7. data/docs/events/by_name/action.md +3 -0
  8. data/docs/events/by_name/cursor_hide.md +3 -0
  9. data/docs/events/by_name/cursor_reset.md +3 -0
  10. data/docs/events/by_name/cursor_show.md +3 -0
  11. data/docs/events/by_name/geometry_down.md +3 -0
  12. data/docs/events/by_name/geometry_left.md +3 -0
  13. data/docs/events/by_name/geometry_right.md +3 -0
  14. data/docs/events/by_name/geometry_up.md +3 -0
  15. data/docs/events/by_name/hide_view.md +3 -0
  16. data/docs/events/by_name/set_border_caption.md +13 -0
  17. data/docs/events/by_name/set_border_title.md +13 -0
  18. data/docs/events/by_name/show_view.md +3 -0
  19. data/docs/events/by_name/standalone.md +3 -0
  20. data/docs/events/by_name/toggle_view.md +3 -0
  21. data/docs/events/by_name/view_down.md +4 -0
  22. data/docs/events/by_name/view_left.md +4 -0
  23. data/docs/events/by_name/view_right.md +4 -0
  24. data/docs/events/by_name/view_up.md +4 -0
  25. data/examples/views/empty_template.rb +46 -0
  26. data/examples/views/expected/line.out +1 -0
  27. data/examples/views/expected/lines.out +1 -0
  28. data/examples/views/expected/lines_alignment.out +1 -0
  29. data/examples/views/line.rb +220 -0
  30. data/examples/views/lines.rb +281 -0
  31. data/examples/views/lines_alignment.rb +231 -0
  32. data/examples/views/lines_line_stream.rb +99 -0
  33. data/examples/views/lines_line_streams.rb +73 -0
  34. data/examples/views/lines_line_streams_stream.rb +83 -0
  35. data/examples/views/lines_line_streams_stream_stream.rb +53 -0
  36. data/examples/views/lines_streams.rb +50 -0
  37. data/examples/views/lines_streams_stream.rb +51 -0
  38. data/examples/views/runner.sh +27 -0
  39. data/lib/vedeu/all.rb +6 -2
  40. data/lib/vedeu/application/controller.rb +1 -1
  41. data/lib/vedeu/boolean.rb +35 -0
  42. data/lib/vedeu/borders/border.rb +3 -3
  43. data/lib/vedeu/borders/caption.rb +1 -1
  44. data/lib/vedeu/borders/dsl.rb +1 -20
  45. data/lib/vedeu/borders/title.rb +6 -8
  46. data/lib/vedeu/buffers/buffer.rb +2 -2
  47. data/lib/vedeu/buffers/refresh.rb +1 -1
  48. data/lib/vedeu/cells/border.rb +0 -11
  49. data/lib/vedeu/cells/empty.rb +4 -4
  50. data/lib/vedeu/{geometries/alignment → coercers}/alignment.rb +50 -53
  51. data/lib/vedeu/coercers/all.rb +16 -0
  52. data/lib/vedeu/coercers/colour.rb +78 -0
  53. data/lib/vedeu/coercers/colour_attributes.rb +122 -0
  54. data/lib/vedeu/coercers/horizontal_alignment.rb +28 -0
  55. data/lib/vedeu/coercers/vertical_alignment.rb +27 -0
  56. data/lib/vedeu/colours/all.rb +1 -0
  57. data/lib/vedeu/colours/background.rb +13 -2
  58. data/lib/vedeu/colours/colour.rb +16 -31
  59. data/lib/vedeu/colours/foreground.rb +13 -2
  60. data/lib/vedeu/colours/translator.rb +21 -59
  61. data/lib/vedeu/colours/validator.rb +84 -0
  62. data/lib/vedeu/common.rb +52 -0
  63. data/lib/vedeu/configuration/api.rb +4 -10
  64. data/lib/vedeu/configuration/configuration.rb +4 -4
  65. data/lib/vedeu/cursors/coordinate.rb +1 -1
  66. data/lib/vedeu/cursors/cursor.rb +1 -1
  67. data/lib/vedeu/cursors/dsl.rb +1 -28
  68. data/lib/vedeu/dsl/all.rb +7 -7
  69. data/lib/vedeu/dsl/attributes.rb +224 -0
  70. data/lib/vedeu/dsl/border.rb +127 -0
  71. data/lib/vedeu/dsl/cursors.rb +44 -0
  72. data/lib/vedeu/dsl/dsl.rb +9 -0
  73. data/lib/vedeu/dsl/elements.rb +335 -0
  74. data/lib/vedeu/dsl/geometry.rb +113 -0
  75. data/lib/vedeu/dsl/string/align.rb +127 -0
  76. data/lib/vedeu/dsl/string/all.rb +14 -0
  77. data/lib/vedeu/dsl/string/text.rb +107 -0
  78. data/lib/vedeu/dsl/string/truncate.rb +111 -0
  79. data/lib/vedeu/{output → dsl/string}/wordwrap.rb +10 -6
  80. data/lib/vedeu/dsl/view.rb +124 -248
  81. data/lib/vedeu/dsl/views.rb +244 -0
  82. data/lib/vedeu/editor/cursor.rb +1 -1
  83. data/lib/vedeu/editor/delete.rb +3 -1
  84. data/lib/vedeu/editor/insert.rb +22 -6
  85. data/lib/vedeu/editor/line.rb +15 -9
  86. data/lib/vedeu/editor/lines.rb +27 -18
  87. data/lib/vedeu/esc/actions.rb +73 -26
  88. data/lib/vedeu/esc/all.rb +2 -0
  89. data/lib/vedeu/esc/background.rb +219 -0
  90. data/lib/vedeu/esc/borders.rb +72 -26
  91. data/lib/vedeu/esc/colours.rb +26 -27
  92. data/lib/vedeu/esc/esc.rb +4 -4
  93. data/lib/vedeu/esc/foreground.rb +219 -0
  94. data/lib/vedeu/esc/mouse.rb +16 -13
  95. data/lib/vedeu/events/aliases.rb +2 -2
  96. data/lib/vedeu/events/event.rb +1 -1
  97. data/lib/vedeu/geometries/all.rb +0 -1
  98. data/lib/vedeu/geometries/area/dimension.rb +2 -2
  99. data/lib/vedeu/geometries/dsl/dsl.rb +3 -51
  100. data/lib/vedeu/geometries/dsl/validator.rb +4 -4
  101. data/lib/vedeu/geometries/geometry.rb +10 -10
  102. data/lib/vedeu/geometries/move.rb +4 -4
  103. data/lib/vedeu/groups/dsl.rb +1 -0
  104. data/lib/vedeu/groups/group.rb +1 -1
  105. data/lib/vedeu/input/all.rb +1 -0
  106. data/lib/vedeu/input/capture.rb +14 -10
  107. data/lib/vedeu/input/dsl.rb +20 -26
  108. data/lib/vedeu/input/key.rb +0 -6
  109. data/lib/vedeu/input/keymap.rb +4 -9
  110. data/lib/vedeu/input/keys.rb +13 -0
  111. data/lib/vedeu/input/mapper.rb +29 -14
  112. data/lib/vedeu/input/read.rb +4 -2
  113. data/lib/vedeu/interfaces/dsl.rb +23 -22
  114. data/lib/vedeu/interfaces/interface.rb +2 -2
  115. data/lib/vedeu/logging/debug.rb +33 -0
  116. data/lib/vedeu/logging/log.rb +42 -33
  117. data/lib/vedeu/menus/dsl.rb +7 -18
  118. data/lib/vedeu/menus/menu.rb +1 -1
  119. data/lib/vedeu/models/focus.rb +1 -1
  120. data/lib/vedeu/models/toggleable.rb +4 -4
  121. data/lib/vedeu/null/generic.rb +2 -2
  122. data/lib/vedeu/output/all.rb +0 -2
  123. data/lib/vedeu/output/compressor_cache.rb +1 -1
  124. data/lib/vedeu/output/output.rb +5 -20
  125. data/lib/vedeu/presentation/colour.rb +39 -7
  126. data/lib/vedeu/presentation/style.rb +25 -11
  127. data/lib/vedeu/renderers/html.rb +11 -11
  128. data/lib/vedeu/repositories/assemblage.rb +9 -0
  129. data/lib/vedeu/repositories/collection.rb +1 -0
  130. data/lib/vedeu/repositories/defaults.rb +4 -1
  131. data/lib/vedeu/repositories/model.rb +7 -37
  132. data/lib/vedeu/repositories/parent.rb +6 -6
  133. data/lib/vedeu/repositories/registerable.rb +16 -2
  134. data/lib/vedeu/repositories/repositories.rb +1 -1
  135. data/lib/vedeu/repositories/repository.rb +2 -12
  136. data/lib/vedeu/runtime/flags.rb +1 -1
  137. data/lib/vedeu/terminal/terminal.rb +7 -2
  138. data/lib/vedeu/version.rb +1 -1
  139. data/lib/vedeu/views/all.rb +4 -1
  140. data/lib/vedeu/views/char.rb +5 -4
  141. data/lib/vedeu/views/chars.rb +42 -0
  142. data/lib/vedeu/views/composition.rb +15 -30
  143. data/lib/vedeu/views/default_attributes.rb +74 -0
  144. data/lib/vedeu/views/html_char.rb +2 -2
  145. data/lib/vedeu/views/line.rb +27 -53
  146. data/lib/vedeu/views/lines.rb +31 -0
  147. data/lib/vedeu/views/stream.rb +31 -78
  148. data/lib/vedeu/views/streams.rb +42 -0
  149. data/lib/vedeu/views/value.rb +150 -0
  150. data/lib/vedeu/views/view.rb +32 -36
  151. data/lib/vedeu/views/{view_collection.rb → views.rb} +2 -2
  152. data/test/lib/vedeu/application/application_controller_test.rb +5 -0
  153. data/test/lib/vedeu/application/controller_test.rb +22 -28
  154. data/test/lib/vedeu/boolean_test.rb +57 -0
  155. data/test/lib/vedeu/borders/border_test.rb +130 -36
  156. data/test/lib/vedeu/borders/dsl_test.rb +63 -10
  157. data/test/lib/vedeu/borders/title_test.rb +16 -5
  158. data/test/lib/vedeu/buffers/buffer_test.rb +26 -10
  159. data/test/lib/vedeu/buffers/empty_test.rb +1 -1
  160. data/test/lib/vedeu/cells/border_test.rb +0 -6
  161. data/test/lib/vedeu/cells/clear_test.rb +2 -0
  162. data/test/lib/vedeu/cells/empty_test.rb +12 -2
  163. data/test/lib/vedeu/cells/escape_test.rb +7 -2
  164. data/test/lib/vedeu/{geometries/alignment → coercers}/alignment_test.rb +44 -19
  165. data/test/lib/vedeu/coercers/colour_attributes_test.rb +168 -0
  166. data/test/lib/vedeu/coercers/colour_test.rb +75 -0
  167. data/test/lib/vedeu/{geometries/alignment → coercers}/horizontal_alignment_test.rb +6 -6
  168. data/test/lib/vedeu/{geometries/alignment → coercers}/vertical_alignment_test.rb +6 -6
  169. data/test/lib/vedeu/colours/background_test.rb +17 -1
  170. data/test/lib/vedeu/colours/colour_test.rb +74 -2
  171. data/test/lib/vedeu/colours/foreground_test.rb +17 -1
  172. data/test/lib/vedeu/colours/repository_test.rb +1 -1
  173. data/test/lib/vedeu/colours/translator_test.rb +8 -1
  174. data/test/lib/vedeu/colours/validator_test.rb +60 -0
  175. data/test/lib/vedeu/common_test.rb +138 -0
  176. data/test/lib/vedeu/configuration/api_test.rb +96 -51
  177. data/test/lib/vedeu/cursors/coordinate_test.rb +58 -117
  178. data/test/lib/vedeu/cursors/cursor_test.rb +46 -17
  179. data/test/lib/vedeu/cursors/dsl_test.rb +19 -5
  180. data/test/lib/vedeu/distributed/client_test.rb +8 -3
  181. data/test/lib/vedeu/distributed/server_test.rb +8 -0
  182. data/test/lib/vedeu/distributed/test_application_test.rb +62 -19
  183. data/test/lib/vedeu/distributed/uri_test.rb +4 -2
  184. data/test/lib/vedeu/dsl/attributes_test.rb +212 -0
  185. data/test/lib/vedeu/dsl/border_test.rb +51 -0
  186. data/test/lib/vedeu/dsl/{lines_test.rb → cursors_test.rb} +2 -2
  187. data/test/lib/vedeu/dsl/dsl_test.rb +44 -0
  188. data/test/lib/vedeu/dsl/elements_test.rb +118 -0
  189. data/test/lib/vedeu/dsl/geometry_test.rb +35 -0
  190. data/test/lib/vedeu/dsl/presentation_test.rb +52 -11
  191. data/test/lib/vedeu/dsl/string/align_test.rb +147 -0
  192. data/test/lib/vedeu/dsl/string/text_test.rb +213 -0
  193. data/test/lib/vedeu/dsl/string/truncate_test.rb +97 -0
  194. data/test/lib/vedeu/{output → dsl/string}/wordwrap_test.rb +3 -3
  195. data/test/lib/vedeu/dsl/view_test.rb +30 -42
  196. data/test/lib/vedeu/dsl/views_test.rb +61 -0
  197. data/test/lib/vedeu/editor/cursor_test.rb +30 -12
  198. data/test/lib/vedeu/editor/document_test.rb +18 -10
  199. data/test/lib/vedeu/editor/line_test.rb +4 -1
  200. data/test/lib/vedeu/editor/lines_test.rb +11 -3
  201. data/test/lib/vedeu/esc/actions_test.rb +42 -4
  202. data/test/lib/vedeu/esc/background_test.rb +185 -0
  203. data/test/lib/vedeu/esc/borders_test.rb +37 -9
  204. data/test/lib/vedeu/esc/colours_test.rb +0 -59
  205. data/test/lib/vedeu/esc/foreground_test.rb +185 -0
  206. data/test/lib/vedeu/esc/mouse_test.rb +9 -4
  207. data/test/lib/vedeu/geometries/area/area_test.rb +34 -11
  208. data/test/lib/vedeu/geometries/dsl/dsl_test.rb +52 -61
  209. data/test/lib/vedeu/geometries/geometry_test.rb +62 -18
  210. data/test/lib/vedeu/geometries/position_test.rb +14 -7
  211. data/test/lib/vedeu/groups/dsl_test.rb +24 -15
  212. data/test/lib/vedeu/groups/group_test.rb +18 -8
  213. data/test/lib/vedeu/input/dsl_test.rb +33 -16
  214. data/test/lib/vedeu/input/key_test.rb +8 -1
  215. data/test/lib/vedeu/input/keymap_test.rb +4 -1
  216. data/test/lib/vedeu/input/keys_test.rb +16 -0
  217. data/test/lib/vedeu/interfaces/dsl_test.rb +24 -30
  218. data/test/lib/vedeu/interfaces/interface_test.rb +79 -24
  219. data/test/lib/vedeu/logging/ips_test.rb +10 -1
  220. data/test/lib/vedeu/menus/dsl_test.rb +24 -23
  221. data/test/lib/vedeu/menus/menu_test.rb +18 -8
  222. data/test/lib/vedeu/models/page_test.rb +5 -1
  223. data/test/lib/vedeu/models/row_test.rb +4 -0
  224. data/test/lib/vedeu/models/toggleable_test.rb +10 -6
  225. data/test/lib/vedeu/null/generic_test.rb +90 -1
  226. data/test/lib/vedeu/output/viewport_test.rb +11 -10
  227. data/test/lib/vedeu/plugins/plugin_test.rb +22 -9
  228. data/test/lib/vedeu/presentation/colour_test.rb +2 -1
  229. data/test/lib/vedeu/presentation/presentation_test.rb +13 -8
  230. data/test/lib/vedeu/presentation/style_test.rb +28 -13
  231. data/test/lib/vedeu/renderers/file_test.rb +4 -2
  232. data/test/lib/vedeu/renderers/options_test.rb +1 -1
  233. data/test/lib/vedeu/repositories/assemblage_test.rb +18 -0
  234. data/test/lib/vedeu/repositories/collection_test.rb +34 -10
  235. data/test/lib/vedeu/repositories/defaults_test.rb +6 -0
  236. data/test/lib/vedeu/repositories/model_test.rb +4 -13
  237. data/test/lib/vedeu/repositories/repository_test.rb +12 -5
  238. data/test/lib/vedeu/repositories/store_test.rb +9 -0
  239. data/test/lib/vedeu/runtime/flags_test.rb +6 -4
  240. data/test/lib/vedeu/runtime/launcher_test.rb +1 -1
  241. data/test/lib/vedeu/templating/helpers_test.rb +93 -65
  242. data/test/lib/vedeu/templating/view_template_test.rb +26 -26
  243. data/test/lib/vedeu/views/char_test.rb +36 -11
  244. data/test/lib/vedeu/views/chars_test.rb +71 -0
  245. data/test/lib/vedeu/views/composition_test.rb +17 -16
  246. data/test/lib/vedeu/views/default_attributes_test.rb +97 -0
  247. data/test/lib/vedeu/views/line_test.rb +20 -75
  248. data/test/lib/vedeu/views/lines_test.rb +47 -0
  249. data/test/lib/vedeu/views/stream_test.rb +38 -63
  250. data/test/lib/vedeu/views/streams_test.rb +9 -0
  251. data/test/lib/vedeu/views/value_test.rb +112 -0
  252. data/test/lib/vedeu/views/view_test.rb +67 -45
  253. data/test/lib/vedeu/views/views_test.rb +22 -0
  254. data/test/support/examples/material_colours_app.rb +2 -2
  255. data/test/support/helpers/model_test_class.rb +1 -0
  256. data/test/test_helper.rb +3 -1
  257. data/vedeu.gemspec +2 -2
  258. metadata +124 -58
  259. data/lib/vedeu/dsl/composition.rb +0 -150
  260. data/lib/vedeu/dsl/line.rb +0 -119
  261. data/lib/vedeu/dsl/lines.rb +0 -23
  262. data/lib/vedeu/dsl/shared.rb +0 -85
  263. data/lib/vedeu/dsl/stream.rb +0 -40
  264. data/lib/vedeu/dsl/streams.rb +0 -23
  265. data/lib/vedeu/dsl/text.rb +0 -98
  266. data/lib/vedeu/geometries/alignment/all.rb +0 -11
  267. data/lib/vedeu/geometries/alignment/horizontal_alignment.rb +0 -27
  268. data/lib/vedeu/geometries/alignment/vertical_alignment.rb +0 -27
  269. data/lib/vedeu/output/text.rb +0 -275
  270. data/test/lib/vedeu/dsl/composition_test.rb +0 -67
  271. data/test/lib/vedeu/dsl/line_test.rb +0 -85
  272. data/test/lib/vedeu/dsl/shared_test.rb +0 -66
  273. data/test/lib/vedeu/dsl/stream_test.rb +0 -30
  274. data/test/lib/vedeu/dsl/streams_test.rb +0 -13
  275. data/test/lib/vedeu/dsl/text_test.rb +0 -122
  276. data/test/lib/vedeu/output/text_test.rb +0 -156
  277. data/test/lib/vedeu/views/view_collection_test.rb +0 -13
@@ -1,19 +1,23 @@
1
1
  module Vedeu
2
2
 
3
- module Output
3
+ module DSL
4
4
 
5
- # Wrap or prune text.
5
+ # Wrap or prune a text value based on given options when building
6
+ # views.
7
+ #
8
+ # @api private
6
9
  #
7
10
  class Wordwrap
8
11
 
9
12
  include Vedeu::Common
10
13
 
11
- # @see Vedeu::Output::Wordwrap#initialize
14
+ # @param (see #initialize)
15
+ # @return (see #content)
12
16
  def self.for(text, options = {})
13
17
  new(text, options).content
14
18
  end
15
19
 
16
- # Returns a new instance of Vedeu::Output::Wordwrap.
20
+ # Returns a new instance of Vedeu::DSL::Wordwrap.
17
21
  #
18
22
  # @param text [String]
19
23
  # @param options [Hash]
@@ -21,7 +25,7 @@ module Vedeu
21
25
  # @option options mode [Symbol] See {#mode}.
22
26
  # @option options name [String|Symbol] See {#name}.
23
27
  # @option options width [Fixnum] See {#width}.
24
- # @return [Vedeu::Output::Wordwrap]
28
+ # @return [Vedeu::DSL::Wordwrap]
25
29
  def initialize(text, options = {})
26
30
  @text = text
27
31
  @options = defaults.merge!(options)
@@ -201,6 +205,6 @@ module Vedeu
201
205
 
202
206
  end # Wordwrap
203
207
 
204
- end # Output
208
+ end # DSL
205
209
 
206
210
  end # Vedeu
@@ -2,273 +2,149 @@ module Vedeu
2
2
 
3
3
  module DSL
4
4
 
5
- # There are two ways to construct views with Vedeu. You would like
6
- # to draw the view to the screen immediately (immediate render) or
7
- # you want to save a view to be drawn when you trigger a refresh
8
- # event later (deferred view).
5
+ # DSL for creating collections of interfaces.
9
6
  #
10
- # Both of these approaches require that you have defined an
11
- # interface (or 'visible area') first. You can find out how to
12
- # define an interface with Vedeu below or in
13
- # {Vedeu::Interfaces::DSL}. The examples in 'Immediate Render' and
14
- # 'Deferred View' use these interface definitions: (Note: should
15
- # you use these examples, ensure your terminal is at least 70
16
- # characters in width and 5 lines in height.)
17
- #
18
- # Vedeu.interface :main do
19
- # geometry do
20
- # height 4
21
- # width 50
22
- # end
23
- # end
24
- #
25
- # Vedeu.interface :title do
26
- # geometry do
27
- # height 1
28
- # width 50
29
- # x use('main').left
30
- # y use('main').north
31
- # end
32
- # end
33
- #
34
- # Both of these approaches use a concept of Buffers in Vedeu.
35
- # There are three buffers for any defined interface. These are
36
- # imaginatively called: 'back', 'front' and 'previous'.
37
- #
38
- # The 'back' buffer is the content for an interface which will be
39
- # shown next time a refresh event is fired globally or for that
40
- # interface. So, 'back' becomes 'front'.
41
- #
42
- # The 'front' buffer is the content for an interface which is
43
- # currently showing. When a refresh event is fired, again,
44
- # globally or for that interface specifically, the content of this
45
- # 'front' buffer is first copied to the 'previous' buffer, and
46
- # then the current 'back' buffer overwrites this 'front' buffer.
47
- #
48
- # The 'previous' buffer contains what was shown on the 'front'
49
- # before the current 'front'.
50
- #
51
- # You can only write to either the 'front' (you want the content
52
- # to be drawn immediately (immediate render)) or the 'back' (you
53
- # would like the content to be drawn on the next refresh
54
- # (deferred view)).
55
- #
56
- # The basic view DSL methods look like this:
57
- #
58
- # renders/views
59
- # |- view
60
- # |- lines
61
- # | |- line
62
- # | |- streams
63
- # | | |- stream
64
- # | | |- char
65
- # | |
66
- # | |- stream
67
- # | |- char
68
- # |
69
- # |- line
70
- # |- streams
71
- # | |- stream
72
- # | |- char
73
- # |
74
- # |- stream
75
- # |- char
76
- #
77
- # renders/views
78
- # |- view
79
- # |- lines/line
80
- # |- streams/stream
81
- # |- char
7
+ # Views with Vedeu are made up of simple building blocks. These
8
+ # blocks can be arranged in a multitude of ways which I hope is
9
+ # more than sufficient for your design needs.
10
+
11
+ # - A view (`View`) is made up of one or more interfaces.
12
+ # - An interface is an area on the screen where you can take input
13
+ # or direct output. You will define it's colour and style, its
14
+ # dimensions, including position and give it a name. You can
15
+ # then direct the output of a command, or event, to this
16
+ # interface and Vedeu will ensure the content is placed there.
17
+ # - Interfaces (`Interface`) are made up of lines (`Line`), their
18
+ # length being the width of the interface and their number being
19
+ # the height of the interface.
20
+ # - An interface with `width: 12, height: 5` will have five lines,
21
+ # each made of 12 characters- providing 60 cells. Colours and
22
+ # styles are handled by terminal escape sequences and therefore
23
+ # do not consume a cell.
24
+ # - Lines are made up of zero, one or multiple streams which are
25
+ # basically subsets of the line.
26
+ # - An interface, line or stream can have a colour attribute.
27
+ # - An interface, line or stream can have a style attribute.
28
+ # - Interfaces have a position (`y`, `x`) on the screen, and a
29
+ # size. (`width`, `height`)
30
+ # - Interfaces can be placed relative to each other based on their
31
+ # attributes.
32
+ # - An interface has a `top`, `right`, `bottom`, `left`.
33
+ # - An interface also has a `north` and `west` (`top` and `left`
34
+ # minus 1 respectively).
35
+ # - An interface also has a `south` and `east` (`bottom` and
36
+ # `right` plus 1 respectively).
37
+ # - Colours are defined in CSS-style values, i.e. `#ff0000` would
38
+ # be red.
39
+ # - Styles are named. See the table below for supported styles.
82
40
  #
83
41
  class View
84
42
 
85
43
  include Vedeu::DSL
86
- include Vedeu::Cursors::DSL
87
- include Vedeu::DSL::Presentation
88
- include Vedeu::DSL::Shared
89
- include Vedeu::DSL::Text
90
- include Vedeu::DSL::Use
91
-
92
- class << self
93
-
94
- include Vedeu::Common
95
44
 
96
- # Directly write a view buffer to the terminal. Using this
97
- # method means that the refresh event does not need to be
98
- # triggered after creating the views, though can be later
99
- # triggered when needed.
100
- #
101
- # Vedeu.renders do
102
- # view :some_interface do
103
- # line do
104
- # stream do
105
- # left 'Title goes here', width: 35
106
- # end
107
- # stream do
108
- # right Time.now.strftime('%H:%m'), width: 7
109
- # end
110
- # end
111
- # end
112
- # view :other_interface do
113
- # lines do
114
- # line 'This is content for the main interface.'
115
- # line ''
116
- # line 'Pretty easy eh?'
117
- # end
118
- # end
119
- # # ... some code
120
- # end
121
- #
122
- # # or...
123
- #
124
- # Vedeu.render do
125
- # view :my_interface do
126
- # # ... some code
127
- # end
128
- # end
129
- #
130
- # @param block [Proc] The directives you wish to send to
131
- # render. Typically includes `view` with associated
132
- # sub-directives.
133
- # @raise [Vedeu::Error::RequiresBlock]
134
- # @return [Array<View>]
135
- def renders(&block)
136
- fail Vedeu::Error::RequiresBlock unless block_given?
137
-
138
- client = eval('self', block.binding)
139
-
140
- store(:store_immediate, client, &block)
141
- end
142
- alias_method :render, :renders
143
-
144
- # Define a view (content) for an interface.
145
- #
146
- # As you can see by comparing the examples above to these
147
- # below, the immediate render simply wraps what is already
148
- # here in the deferred view.
149
- #
150
- # The views declared within this block are stored in their
151
- # respective interface back buffers until a refresh event
152
- # occurs. When the refresh event is triggered, the back
153
- # buffers are swapped into the front buffers and the content
154
- # here will be rendered to {Vedeu::Terminal#output}.
155
- #
156
- # Vedeu.views do
157
- # view :some_interface do
158
- # line do
159
- # stream do
160
- # left 'Title goes here', width: 35
161
- # end
162
- # stream do
163
- # right Time.now.strftime('%H:%m'), width: 7
164
- # end
165
- # end
166
- # end
167
- # view :other_interface do
168
- # lines do
169
- # line 'This is content for the main interface.'
170
- # line ''
171
- # line 'Pretty easy eh?'
172
- # end
173
- # end
174
- # # ... some code
175
- # end
176
- #
177
- # @param block [Proc] The directives you wish to send to
178
- # render. Typically includes `view` with associated
179
- # sub-directives.
180
- # @raise [Vedeu::Error::RequiresBlock]
181
- # @return [Array<View>]
182
- def views(&block)
183
- fail Vedeu::Error::RequiresBlock unless block_given?
184
-
185
- client = eval('self', block.binding)
186
-
187
- store(:store_deferred, client, &block)
188
- end
189
-
190
- private
191
-
192
- # Returns the client object which called the DSL method.
193
- #
194
- # @param block [Proc]
195
- # @return [Object]
196
- def client(&block)
197
- eval('self', block.binding)
198
- end
199
-
200
- # Creates a new Vedeu::Views::Composition which may contain
201
- # one or more views (Vedeu::Views::View objects).
202
- #
203
- # @param client [Object]
204
- # @param block [Proc]
205
- # @return [Vedeu::Views::Composition]
206
- def composition(client, &block)
207
- attrs = { client: client, colour: Vedeu::Configuration.colour }
208
-
209
- Vedeu::Views::Composition.build(attrs, &block)
210
- end
45
+ # Define a view.
46
+ #
47
+ # A view is just an Interface object.
48
+ #
49
+ # When a view already exists, we take its attributes and use
50
+ # them as the basis for the newly defined view. This way we
51
+ # don't need to specify everything again.
52
+ #
53
+ # @todo More documentation required.
54
+ # @param name [String|Symbol] The name of the interface you are
55
+ # targetting for this view.
56
+ # @param block [Proc] The directives you wish to send to this
57
+ # interface.
58
+ #
59
+ # @example
60
+ # view :my_interface do
61
+ # # ...
62
+ # end
63
+ #
64
+ # @raise [Vedeu::Error::RequiresBlock]
65
+ # @return [Vedeu::Views::Views<Vedeu::Views::View>]
66
+ def view(name = '', &block)
67
+ fail Vedeu::Error::RequiresBlock unless block_given?
211
68
 
212
- # Creates a new Vedeu::Views::Composition which may contain
213
- # one or more views (Vedeu::Views::View objects).
214
- #
215
- # Stores each of the views defined in their respective buffers
216
- # ready to be rendered on next refresh.
217
- #
218
- # @param method [Symbol] An instruction; `:store_immediate` or
219
- # `:store_deferred` which determines whether the view will
220
- # be shown immediately or later respectively.
221
- # @param client [Object] The client class which called the DSL
222
- # object.
223
- # @param block [Proc]
224
- # @return [Array]
225
- def store(method, client, &block)
226
- composition(client, &block).views.map do |view|
227
- view.public_send(method)
228
- end
229
- end
69
+ new_model = Vedeu::Views::View.build(new_attributes(name), &block)
230
70
 
231
- end # Eigenclass
71
+ model.add(new_model)
72
+ end
232
73
 
233
- # Specify multiple lines in a view.
234
- #
235
- # @param block [Proc]
74
+ # Load content from an ERb template.
236
75
  #
237
76
  # @example
238
- # Vedeu.view :my_interface do
239
- # lines do
240
- # # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
241
- # end
77
+ # Vedeu.renders do
78
+ # template_for(:my_interface,
79
+ # '/path/to/template.erb',
80
+ # @some_object, options)
242
81
  # end
243
82
  #
244
- # Vedeu.view :my_interface do
245
- # line do
246
- # # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
247
- # end
248
- # end
83
+ # @todo More documentation required.
249
84
  #
250
- # @raise [Vedeu::Error::RequiresBlock]
251
- # @return [Vedeu::Views::Line]
252
- def lines(&block)
253
- fail Vedeu::Error::RequiresBlock unless block_given?
85
+ # @param name [String|Symbol] The name of interface for which this
86
+ # template's content belongs to.
87
+ # @param filename [String] The filename (including path) to the
88
+ # template to be used. Yoy can use `File.dirname(__FILE__)` to
89
+ # use relative paths.
90
+ # @param object [Object] The object for which the values of
91
+ # template's variables can be obtained.
92
+ # @param options [Hash<Symbol => void>] See {Vedeu::DSL::Wordwrap}
93
+ # @raise [Vedeu::Error::MissingRequired]
94
+ # @return [Vedeu::Views::Views<Vedeu::Views::View>]
95
+ def template_for(name, filename, object = nil, options = {})
96
+ fail Vedeu::Error::MissingRequired,
97
+ 'Cannot render template without the name of the ' \
98
+ 'view.'.freeze unless name
99
+ fail Vedeu::Error::MissingRequired,
100
+ 'Cannot render template without a filename.'.freeze unless filename
101
+
102
+ options.merge!(name: name)
103
+
104
+ content = Vedeu::Templating::ViewTemplate.parse(object,
105
+ filename,
106
+ options)
107
+
108
+ # lines = Vedeu::DSL::Wordwrap.for(content, options)
109
+
110
+ new_model = Vedeu::Views::View.build(template_attributes(name, content))
111
+
112
+ model.add(new_model)
113
+ end
114
+
115
+ private
116
+
117
+ # @param name [String|Symbol]
118
+ # @param lines [Vedeu::Views::Lines]
119
+ # @return [Hash<Symbol => void>]
120
+ def template_attributes(name, lines)
121
+ new_attributes(name).merge!(value: lines)
122
+ end
254
123
 
255
- model.add(model.member.build(attributes, &block))
124
+ # Return the current attributes combined with the existing
125
+ # interface attributes defined by the interface.
126
+ #
127
+ # @param name [String|Symbol] The name of the interface.
128
+ # @return [Hash<Symbol => void>]
129
+ def new_attributes(name)
130
+ existing_attributes(name).merge!(attributes)
131
+ end
132
+
133
+ # Retrieve the attributes of the interface by name.
134
+ #
135
+ # @param name [String|Symbol] The name of the interface.
136
+ # @return [Hash<Symbol => void>]
137
+ def existing_attributes(name)
138
+ interface(name).attributes
139
+ end
140
+
141
+ # @return [Vedeu::Interfaces::Interface]
142
+ def interface(name)
143
+ Vedeu.interfaces.by_name(name)
256
144
  end
257
- alias_method :line, :lines
258
145
 
259
146
  end # View
260
147
 
261
148
  end # DSL
262
149
 
263
- # @!method render
264
- # @see Vedeu::DSL::View.render
265
- # @!method renders
266
- # @see Vedeu::DSL::View.renders
267
- # @!method views
268
- # @see Vedeu::DSL::View.views
269
- def_delegators Vedeu::DSL::View,
270
- :renders,
271
- :render,
272
- :views
273
-
274
150
  end # Vedeu
@@ -0,0 +1,244 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # There are two ways to construct views with Vedeu. You would like
6
+ # to draw the view to the screen immediately (immediate render) or
7
+ # you want to save a view to be drawn when you trigger a refresh
8
+ # event later (deferred view).
9
+ #
10
+ # Both of these approaches require that you have defined an
11
+ # interface (or 'visible area') first. You can find out how to
12
+ # define an interface with Vedeu below or in
13
+ # {Vedeu::Interfaces::DSL}. The examples in 'Immediate Render' and
14
+ # 'Deferred View' use these interface definitions: (Note: should
15
+ # you use these examples, ensure your terminal is at least 70
16
+ # characters in width and 5 lines in height.)
17
+ #
18
+ # Vedeu.interface :main do
19
+ # geometry do
20
+ # height 4
21
+ # width 50
22
+ # end
23
+ # end
24
+ #
25
+ # Vedeu.interface :title do
26
+ # geometry do
27
+ # height 1
28
+ # width 50
29
+ # x use('main').left
30
+ # y use('main').north
31
+ # end
32
+ # end
33
+ #
34
+ # Both of these approaches use a concept of Buffers in Vedeu.
35
+ # There are three buffers for any defined interface. These are
36
+ # imaginatively called: 'back', 'front' and 'previous'.
37
+ #
38
+ # The 'back' buffer is the content for an interface which will be
39
+ # shown next time a refresh event is fired globally or for that
40
+ # interface. So, 'back' becomes 'front'.
41
+ #
42
+ # The 'front' buffer is the content for an interface which is
43
+ # currently showing. When a refresh event is fired, again,
44
+ # globally or for that interface specifically, the content of this
45
+ # 'front' buffer is first copied to the 'previous' buffer, and
46
+ # then the current 'back' buffer overwrites this 'front' buffer.
47
+ #
48
+ # The 'previous' buffer contains what was shown on the 'front'
49
+ # before the current 'front'.
50
+ #
51
+ # You can only write to either the 'front' (you want the content
52
+ # to be drawn immediately (immediate render)) or the 'back' (you
53
+ # would like the content to be drawn on the next refresh
54
+ # (deferred view)).
55
+ #
56
+ # The basic view DSL methods look like this:
57
+ #
58
+ # renders/views
59
+ # |- view
60
+ # |- lines
61
+ # | |- line
62
+ # | |- streams
63
+ # | | |- stream
64
+ # | | |- char
65
+ # | |
66
+ # | |- stream
67
+ # | |- char
68
+ # |
69
+ # |- line
70
+ # |- streams
71
+ # | |- stream
72
+ # | |- char
73
+ # |
74
+ # |- stream
75
+ # |- char
76
+ #
77
+ # renders/views
78
+ # |- view
79
+ # |- lines/line
80
+ # |- streams/stream
81
+ # |- char
82
+ #
83
+ class Views
84
+
85
+ include Vedeu::DSL
86
+ include Vedeu::DSL::Cursors
87
+ include Vedeu::DSL::Border
88
+ include Vedeu::DSL::Geometry
89
+ include Vedeu::DSL::Use
90
+ include Vedeu::DSL::Elements
91
+
92
+ class << self
93
+
94
+ include Vedeu::Common
95
+
96
+ # Directly write a view buffer to the terminal. Using this
97
+ # method means that the refresh event does not need to be
98
+ # triggered after creating the views, though can be later
99
+ # triggered when needed.
100
+ #
101
+ # Vedeu.renders do
102
+ # view :some_interface do
103
+ # line do
104
+ # stream do
105
+ # left 'Title goes here', width: 35
106
+ # end
107
+ # stream do
108
+ # right Time.now.strftime('%H:%m'), width: 7
109
+ # end
110
+ # end
111
+ # end
112
+ # view :other_interface do
113
+ # lines do
114
+ # line 'This is content for the main interface.'
115
+ # line ''
116
+ # line 'Pretty easy eh?'
117
+ # end
118
+ # end
119
+ # # ... some code
120
+ # end
121
+ #
122
+ # # or...
123
+ #
124
+ # Vedeu.render do
125
+ # view :my_interface do
126
+ # # ... some code
127
+ # end
128
+ # end
129
+ #
130
+ # @param block [Proc] The directives you wish to send to
131
+ # render. Typically includes `view` with associated
132
+ # sub-directives.
133
+ # @raise [Vedeu::Error::RequiresBlock]
134
+ # @return [Array<View>]
135
+ def renders(&block)
136
+ fail Vedeu::Error::RequiresBlock unless block_given?
137
+
138
+ store(:store_immediate, client(&block), &block)
139
+ end
140
+ alias_method :render, :renders
141
+
142
+ # Define a view (content) for an interface.
143
+ #
144
+ # As you can see by comparing the examples above to these
145
+ # below, the immediate render simply wraps what is already
146
+ # here in the deferred view.
147
+ #
148
+ # The views declared within this block are stored in their
149
+ # respective interface back buffers until a refresh event
150
+ # occurs. When the refresh event is triggered, the back
151
+ # buffers are swapped into the front buffers and the content
152
+ # here will be rendered to {Vedeu::Terminal#output}.
153
+ #
154
+ # Vedeu.views do
155
+ # view :some_interface do
156
+ # line do
157
+ # stream do
158
+ # left 'Title goes here', width: 35
159
+ # end
160
+ # stream do
161
+ # right Time.now.strftime('%H:%m'), width: 7
162
+ # end
163
+ # end
164
+ # end
165
+ # view :other_interface do
166
+ # lines do
167
+ # line 'This is content for the main interface.'
168
+ # line ''
169
+ # line 'Pretty easy eh?'
170
+ # end
171
+ # end
172
+ # # ... some code
173
+ # end
174
+ #
175
+ # @param block [Proc] The directives you wish to send to
176
+ # render. Typically includes `view` with associated
177
+ # sub-directives.
178
+ # @raise [Vedeu::Error::RequiresBlock]
179
+ # @return [Array<View>]
180
+ def views(&block)
181
+ fail Vedeu::Error::RequiresBlock unless block_given?
182
+
183
+ store(:store_deferred, client(&block), &block)
184
+ end
185
+
186
+ private
187
+
188
+ # Returns the client object which called the DSL method.
189
+ #
190
+ # @param block [Proc]
191
+ # @return [Object]
192
+ def client(&block)
193
+ eval('self', block.binding)
194
+ end
195
+
196
+ # Creates a new Vedeu::Views::Composition which may contain
197
+ # one or more views (Vedeu::Views::View objects).
198
+ #
199
+ # @param client [Object]
200
+ # @param block [Proc]
201
+ # @return [Vedeu::Views::Composition]
202
+ def composition(client, &block)
203
+ attrs = { client: client, colour: Vedeu::Configuration.colour }
204
+
205
+ Vedeu::Views::Composition.build(attrs, &block)
206
+ end
207
+
208
+ # Creates a new Vedeu::Views::Composition which may contain
209
+ # one or more views (Vedeu::Views::View objects).
210
+ #
211
+ # Stores each of the views defined in their respective buffers
212
+ # ready to be rendered on next refresh.
213
+ #
214
+ # @param method [Symbol] An instruction; `:store_immediate` or
215
+ # `:store_deferred` which determines whether the view will
216
+ # be shown immediately or later respectively.
217
+ # @param client [Object] The client class which called the DSL
218
+ # object.
219
+ # @param block [Proc]
220
+ # @return [Array]
221
+ def store(method, client, &block)
222
+ composition(client, &block).views.map do |view|
223
+ view.public_send(method)
224
+ end
225
+ end
226
+
227
+ end # Eigenclass
228
+
229
+ end # Views
230
+
231
+ end # DSL
232
+
233
+ # @!method render
234
+ # @see Vedeu::DSL::Views.render
235
+ # @!method renders
236
+ # @see Vedeu::DSL::Views.renders
237
+ # @!method views
238
+ # @see Vedeu::DSL::Views.views
239
+ def_delegators Vedeu::DSL::Views,
240
+ :renders,
241
+ :render,
242
+ :views
243
+
244
+ end # Vedeu