vedeu 0.7.4 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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