vedeu 0.2.12 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Guardfile +13 -0
  4. data/README.md +11 -9
  5. data/Rakefile +10 -1
  6. data/bin/vedeu_test +14 -0
  7. data/config/cucumber.yml +8 -0
  8. data/docs/api.md +45 -16
  9. data/docs/events.md +21 -9
  10. data/docs/getting_started.md +16 -0
  11. data/docs/views.md +158 -0
  12. data/examples/borders_app.rb +236 -110
  13. data/examples/colour_support.sh +98 -0
  14. data/examples/colours_app.rb +41 -0
  15. data/examples/configuration_app.rb +11 -6
  16. data/examples/cursor_app.rb +60 -61
  17. data/examples/focus_app.rb +72 -34
  18. data/examples/hello_world.rb +13 -8
  19. data/examples/lines_app.rb +37 -28
  20. data/features/start_stop.feature +27 -0
  21. data/features/support/env.rb +14 -0
  22. data/lib/vedeu/all.rb +29 -0
  23. data/lib/vedeu/api.rb +39 -0
  24. data/lib/vedeu/application.rb +15 -7
  25. data/lib/vedeu/bindings.rb +121 -0
  26. data/lib/vedeu/buffers/all.rb +10 -0
  27. data/lib/vedeu/{repositories/models → buffers}/buffer.rb +47 -64
  28. data/lib/vedeu/buffers/display_buffer.rb +118 -0
  29. data/lib/vedeu/configuration/all.rb +6 -0
  30. data/lib/vedeu/configuration/api.rb +3 -1
  31. data/lib/vedeu/configuration/cli.rb +3 -1
  32. data/lib/vedeu/configuration/configuration.rb +23 -2
  33. data/lib/vedeu/cursor/all.rb +23 -0
  34. data/lib/vedeu/cursor/cursor.rb +116 -0
  35. data/lib/vedeu/cursor/move_cursor.rb +137 -0
  36. data/lib/vedeu/cursor/toggle_cursor.rb +53 -0
  37. data/lib/vedeu/dsl/all.rb +28 -0
  38. data/lib/vedeu/dsl/components/all.rb +7 -0
  39. data/lib/vedeu/dsl/components/border.rb +104 -0
  40. data/lib/vedeu/dsl/components/geometry.rb +153 -0
  41. data/lib/vedeu/dsl/components/keymap.rb +93 -0
  42. data/lib/vedeu/dsl/components/menu.rb +82 -0
  43. data/lib/vedeu/dsl/composition.rb +72 -0
  44. data/lib/vedeu/dsl/interface.rb +210 -0
  45. data/lib/vedeu/dsl/line.rb +135 -0
  46. data/lib/vedeu/dsl/shared/all.rb +7 -0
  47. data/lib/vedeu/dsl/shared/colour.rb +85 -0
  48. data/lib/vedeu/dsl/shared/style.rb +38 -0
  49. data/lib/vedeu/dsl/shared/text.rb +102 -0
  50. data/lib/vedeu/dsl/shared/use.rb +47 -0
  51. data/lib/vedeu/dsl/stream.rb +49 -0
  52. data/lib/vedeu/dsl/view.rb +136 -0
  53. data/lib/vedeu/events/all.rb +10 -0
  54. data/lib/vedeu/{repositories/models → events}/event.rb +97 -8
  55. data/lib/vedeu/events/trigger.rb +58 -0
  56. data/lib/vedeu/exceptions.rb +34 -0
  57. data/lib/vedeu/input/all.rb +29 -0
  58. data/lib/vedeu/input/input.rb +26 -0
  59. data/lib/vedeu/{models → input}/key.rb +21 -11
  60. data/lib/vedeu/input/keymap.rb +130 -0
  61. data/lib/vedeu/input/keys.rb +8 -0
  62. data/lib/vedeu/input/mapper.rb +112 -0
  63. data/lib/vedeu/launcher.rb +7 -4
  64. data/lib/vedeu/models/all.rb +12 -0
  65. data/lib/vedeu/models/collection.rb +71 -0
  66. data/lib/vedeu/{repositories → models}/focus.rb +63 -21
  67. data/lib/vedeu/models/geometry.rb +100 -259
  68. data/lib/vedeu/{repositories/models → models}/group.rb +16 -14
  69. data/lib/vedeu/{repositories/models → models}/menu.rb +85 -22
  70. data/lib/vedeu/models/model.rb +51 -0
  71. data/lib/vedeu/models/view/all.rb +12 -0
  72. data/lib/vedeu/models/view/char.rb +84 -0
  73. data/lib/vedeu/models/view/chars.rb +8 -0
  74. data/lib/vedeu/models/view/composition.rb +101 -0
  75. data/lib/vedeu/models/view/interface.rb +215 -0
  76. data/lib/vedeu/models/view/interfaces.rb +8 -0
  77. data/lib/vedeu/models/view/line.rb +134 -0
  78. data/lib/vedeu/models/view/lines.rb +8 -0
  79. data/lib/vedeu/models/view/stream.rb +144 -0
  80. data/lib/vedeu/models/view/streams.rb +8 -0
  81. data/lib/vedeu/output/all.rb +8 -0
  82. data/lib/vedeu/output/border.rb +387 -0
  83. data/lib/vedeu/output/compositor.rb +41 -30
  84. data/lib/vedeu/output/output.rb +6 -13
  85. data/lib/vedeu/output/viewport.rb +78 -94
  86. data/lib/vedeu/output/writer.rb +29 -0
  87. data/lib/vedeu/presentation/all.rb +9 -0
  88. data/lib/vedeu/{colours → presentation}/background.rb +1 -9
  89. data/lib/vedeu/{colours → presentation}/colour.rb +21 -8
  90. data/lib/vedeu/{colours → presentation}/foreground.rb +5 -9
  91. data/lib/vedeu/presentation/presentation.rb +91 -0
  92. data/lib/vedeu/presentation/style.rb +47 -0
  93. data/lib/vedeu/{colours → presentation}/translator.rb +11 -5
  94. data/lib/vedeu/repositories/all.rb +5 -0
  95. data/lib/vedeu/repositories/menus.rb +5 -42
  96. data/lib/vedeu/{support → repositories}/repository.rb +78 -41
  97. data/lib/vedeu/support/all.rb +22 -0
  98. data/lib/vedeu/support/bounding_area.rb +2 -1
  99. data/lib/vedeu/support/coercions.rb +18 -1
  100. data/lib/vedeu/support/console.rb +73 -0
  101. data/lib/vedeu/support/content_geometry.rb +69 -0
  102. data/lib/vedeu/support/coordinate.rb +246 -0
  103. data/lib/vedeu/support/esc.rb +29 -2
  104. data/lib/vedeu/support/log.rb +36 -2
  105. data/lib/vedeu/support/node.rb +61 -0
  106. data/lib/vedeu/support/position.rb +28 -13
  107. data/lib/vedeu/support/position_validator.rb +79 -0
  108. data/lib/vedeu/support/read.rb +65 -0
  109. data/lib/vedeu/support/refresh.rb +8 -32
  110. data/lib/vedeu/support/terminal.rb +34 -4
  111. data/lib/vedeu/support/text.rb +104 -0
  112. data/lib/vedeu/support/trace.rb +11 -23
  113. data/lib/vedeu/support/visible.rb +75 -0
  114. data/lib/vedeu/support/write.rb +85 -0
  115. data/lib/vedeu/traps.rb +18 -0
  116. data/lib/vedeu.rb +41 -101
  117. data/test/integration/dsl/compositions_test.rb +27 -0
  118. data/test/integration/dsl/interfaces_test.rb +261 -0
  119. data/test/integration/dsl/keymaps_test.rb +42 -0
  120. data/test/integration/dsl/lines_test.rb +146 -0
  121. data/test/integration/dsl/menus_test.rb +59 -0
  122. data/test/integration/dsl/streams_test.rb +129 -0
  123. data/test/integration/dsl/views_test.rb +63 -0
  124. data/test/lib/vedeu/api_test.rb +163 -0
  125. data/test/lib/vedeu/application_test.rb +19 -10
  126. data/test/lib/vedeu/bindings_test.rb +54 -0
  127. data/test/lib/vedeu/buffers/all_test.rb +11 -0
  128. data/test/lib/vedeu/buffers/buffer_test.rb +196 -0
  129. data/test/lib/vedeu/buffers/display_buffer_test.rb +58 -0
  130. data/test/lib/vedeu/configuration/api_test.rb +42 -58
  131. data/test/lib/vedeu/configuration/cli_test.rb +4 -4
  132. data/test/lib/vedeu/configuration/configuration_test.rb +11 -29
  133. data/test/lib/vedeu/cursor/all_test.rb +33 -0
  134. data/test/lib/vedeu/cursor/cursor_test.rb +85 -0
  135. data/test/lib/vedeu/cursor/move_cursor_test.rb +212 -0
  136. data/test/lib/vedeu/cursor/toggle_cursor_test.rb +63 -0
  137. data/test/lib/vedeu/dsl/components/border_test.rb +414 -0
  138. data/test/lib/vedeu/dsl/components/geometry_test.rb +231 -0
  139. data/test/lib/vedeu/dsl/components/keymap_test.rb +80 -0
  140. data/test/lib/vedeu/dsl/components/menu_test.rb +115 -0
  141. data/test/lib/vedeu/dsl/composition_test.rb +41 -0
  142. data/test/lib/vedeu/dsl/interface_test.rb +470 -0
  143. data/test/lib/vedeu/dsl/line_test.rb +60 -0
  144. data/test/lib/vedeu/dsl/shared/colour_test.rb +100 -0
  145. data/test/lib/vedeu/dsl/shared/style_test.rb +22 -0
  146. data/test/lib/vedeu/dsl/shared/text_test.rb +15 -0
  147. data/test/lib/vedeu/dsl/shared/use_test.rb +27 -0
  148. data/test/lib/vedeu/dsl/stream_test.rb +26 -0
  149. data/test/lib/vedeu/dsl/view_test.rb +73 -0
  150. data/test/lib/vedeu/events/all_test.rb +11 -0
  151. data/test/lib/vedeu/events/event_test.rb +109 -0
  152. data/test/lib/vedeu/events/trigger_test.rb +60 -0
  153. data/test/lib/vedeu/input/all_test.rb +11 -0
  154. data/test/lib/vedeu/input/input_test.rb +7 -3
  155. data/test/lib/vedeu/input/key_test.rb +72 -0
  156. data/test/lib/vedeu/input/keymap_test.rb +89 -0
  157. data/test/lib/vedeu/input/mapper_test.rb +94 -0
  158. data/test/lib/vedeu/launcher_test.rb +19 -20
  159. data/test/lib/vedeu/models/collection_test.rb +114 -0
  160. data/test/lib/vedeu/{repositories → models}/focus_test.rb +46 -13
  161. data/test/lib/vedeu/models/geometry_test.rb +35 -39
  162. data/test/lib/vedeu/models/group_test.rb +100 -0
  163. data/test/lib/vedeu/models/menu_test.rb +288 -0
  164. data/test/lib/vedeu/models/model_test.rb +31 -0
  165. data/test/lib/vedeu/models/view/char_test.rb +166 -0
  166. data/test/lib/vedeu/models/view/chars_test.rb +18 -0
  167. data/test/lib/vedeu/models/view/composition_test.rb +41 -0
  168. data/test/lib/vedeu/models/view/interface_test.rb +128 -0
  169. data/test/lib/vedeu/models/view/interfaces_test.rb +18 -0
  170. data/test/lib/vedeu/models/view/line_test.rb +214 -0
  171. data/test/lib/vedeu/models/view/lines_test.rb +18 -0
  172. data/test/lib/vedeu/models/view/stream_test.rb +106 -0
  173. data/test/lib/vedeu/models/view/streams_test.rb +18 -0
  174. data/test/lib/vedeu/output/border_test.rb +357 -0
  175. data/test/lib/vedeu/output/compositor_test.rb +61 -15
  176. data/test/lib/vedeu/output/output_test.rb +25 -84
  177. data/test/lib/vedeu/output/viewport_test.rb +171 -45
  178. data/test/lib/vedeu/output/writer_test.rb +45 -0
  179. data/test/lib/vedeu/{colours → presentation}/background_test.rb +0 -0
  180. data/test/lib/vedeu/{colours → presentation}/colour_test.rb +5 -5
  181. data/test/lib/vedeu/{colours → presentation}/foreground_test.rb +0 -0
  182. data/test/lib/vedeu/presentation/presentation_test.rb +56 -0
  183. data/test/lib/vedeu/presentation/style_test.rb +69 -0
  184. data/test/lib/vedeu/presentation/translator_test.rb +63 -0
  185. data/test/lib/vedeu/repositories/all_test.rb +7 -0
  186. data/test/lib/vedeu/repositories/menus_test.rb +3 -156
  187. data/test/lib/vedeu/repositories/repository_test.rb +271 -0
  188. data/test/lib/vedeu/support/bounding_area_test.rb +3 -3
  189. data/test/lib/vedeu/support/coercions_test.rb +39 -0
  190. data/test/lib/vedeu/support/common_test.rb +31 -16
  191. data/test/lib/vedeu/support/console_test.rb +85 -0
  192. data/test/lib/vedeu/support/content_geometry_test.rb +107 -0
  193. data/test/lib/vedeu/support/coordinate_test.rb +190 -0
  194. data/test/lib/vedeu/support/esc_test.rb +18 -0
  195. data/test/lib/vedeu/support/grid_test.rb +15 -10
  196. data/test/lib/vedeu/support/log_test.rb +3 -0
  197. data/test/lib/vedeu/support/position_test.rb +22 -2
  198. data/test/lib/vedeu/support/position_validator_test.rb +11 -0
  199. data/test/lib/vedeu/support/read_test.rb +88 -0
  200. data/test/lib/vedeu/support/refresh_test.rb +44 -12
  201. data/test/lib/vedeu/support/sentence_test.rb +6 -4
  202. data/test/lib/vedeu/support/terminal_test.rb +81 -70
  203. data/test/lib/vedeu/support/text_test.rb +93 -0
  204. data/test/lib/vedeu/support/trace_test.rb +21 -9
  205. data/test/lib/vedeu/support/visible_test.rb +148 -0
  206. data/test/lib/vedeu/support/write_test.rb +136 -0
  207. data/test/lib/vedeu/traps_test.rb +11 -0
  208. data/test/lib/vedeu_test.rb +2 -0
  209. data/test/support/helpers/all.rb +7 -0
  210. data/test/support/helpers/dsl_model_test_class.rb +25 -0
  211. data/test/support/{test_classes → helpers}/helpers.rb +0 -2
  212. data/test/support/helpers/misc.rb +15 -0
  213. data/test/support/helpers/model_test_class.rb +34 -0
  214. data/test/support/{test_classes → helpers}/presentation.rb +0 -0
  215. data/test/support/{test_classes → helpers}/repositories.rb +3 -3
  216. data/test/support/{test_modules/repository.rb → helpers/repository_test_module.rb} +5 -1
  217. data/test/test_helper.rb +19 -22
  218. data/vedeu.gemspec +11 -6
  219. metadata +322 -181
  220. data/lib/vedeu/api/api.rb +0 -239
  221. data/lib/vedeu/api/composition.rb +0 -38
  222. data/lib/vedeu/api/defined.rb +0 -52
  223. data/lib/vedeu/api/helpers.rb +0 -161
  224. data/lib/vedeu/api/interface.rb +0 -287
  225. data/lib/vedeu/api/keymap.rb +0 -75
  226. data/lib/vedeu/api/line.rb +0 -107
  227. data/lib/vedeu/api/menu.rb +0 -111
  228. data/lib/vedeu/api/stream.rb +0 -96
  229. data/lib/vedeu/models/border.rb +0 -238
  230. data/lib/vedeu/models/char.rb +0 -43
  231. data/lib/vedeu/models/composition.rb +0 -72
  232. data/lib/vedeu/models/line.rb +0 -100
  233. data/lib/vedeu/models/stream.rb +0 -130
  234. data/lib/vedeu/models/style.rb +0 -52
  235. data/lib/vedeu/repositories/buffers.rb +0 -52
  236. data/lib/vedeu/repositories/cursors.rb +0 -64
  237. data/lib/vedeu/repositories/events.rb +0 -147
  238. data/lib/vedeu/repositories/groups.rb +0 -47
  239. data/lib/vedeu/repositories/interfaces.rb +0 -78
  240. data/lib/vedeu/repositories/keymaps.rb +0 -196
  241. data/lib/vedeu/repositories/models/cursor.rb +0 -209
  242. data/lib/vedeu/repositories/models/interface.rb +0 -163
  243. data/lib/vedeu/repositories/models/keymap.rb +0 -111
  244. data/lib/vedeu/repositories/models/offset.rb +0 -91
  245. data/lib/vedeu/repositories/offsets.rb +0 -69
  246. data/lib/vedeu/support/exceptions.rb +0 -34
  247. data/lib/vedeu/support/keymap_validator.rb +0 -100
  248. data/lib/vedeu/support/model.rb +0 -14
  249. data/lib/vedeu/support/presentation.rb +0 -86
  250. data/lib/vedeu/support/registrar.rb +0 -53
  251. data/test/integration/api/api_test.rb +0 -97
  252. data/test/integration/api_dsl/dsl_api_test.rb +0 -4
  253. data/test/integration/api_dsl/dsl_composition_test.rb +0 -4
  254. data/test/integration/api_dsl/dsl_defined_test.rb +0 -4
  255. data/test/integration/api_dsl/dsl_helpers_test.rb +0 -4
  256. data/test/integration/api_dsl/dsl_interface_test.rb +0 -4
  257. data/test/integration/api_dsl/dsl_keymap.rb +0 -4
  258. data/test/integration/api_dsl/dsl_line_test.rb +0 -4
  259. data/test/integration/api_dsl/dsl_menu_test.rb +0 -4
  260. data/test/integration/api_dsl/dsl_stream_test.rb +0 -138
  261. data/test/integration/cursors_test.rb +0 -9
  262. data/test/integration/defining_interfaces_test.rb +0 -26
  263. data/test/integration/run_once_test.rb +0 -26
  264. data/test/integration/views/basic_view_test.rb +0 -807
  265. data/test/lib/vedeu/api/api_test.rb +0 -204
  266. data/test/lib/vedeu/api/composition_test.rb +0 -31
  267. data/test/lib/vedeu/api/defined_test.rb +0 -79
  268. data/test/lib/vedeu/api/helpers_test.rb +0 -111
  269. data/test/lib/vedeu/api/interface_test.rb +0 -410
  270. data/test/lib/vedeu/api/keymap_test.rb +0 -65
  271. data/test/lib/vedeu/api/line_test.rb +0 -83
  272. data/test/lib/vedeu/api/menu_test.rb +0 -85
  273. data/test/lib/vedeu/api/stream_test.rb +0 -59
  274. data/test/lib/vedeu/colours/translator_test.rb +0 -22
  275. data/test/lib/vedeu/models/border_test.rb +0 -197
  276. data/test/lib/vedeu/models/char_test.rb +0 -52
  277. data/test/lib/vedeu/models/composition_test.rb +0 -45
  278. data/test/lib/vedeu/models/key_test.rb +0 -43
  279. data/test/lib/vedeu/models/line_test.rb +0 -123
  280. data/test/lib/vedeu/models/stream_test.rb +0 -233
  281. data/test/lib/vedeu/models/style_test.rb +0 -59
  282. data/test/lib/vedeu/repositories/buffers_test.rb +0 -37
  283. data/test/lib/vedeu/repositories/cursors_test.rb +0 -62
  284. data/test/lib/vedeu/repositories/events_test.rb +0 -57
  285. data/test/lib/vedeu/repositories/groups_test.rb +0 -28
  286. data/test/lib/vedeu/repositories/interfaces_test.rb +0 -51
  287. data/test/lib/vedeu/repositories/keymaps_test.rb +0 -223
  288. data/test/lib/vedeu/repositories/models/buffer_test.rb +0 -174
  289. data/test/lib/vedeu/repositories/models/cursor_test.rb +0 -158
  290. data/test/lib/vedeu/repositories/models/event_test.rb +0 -53
  291. data/test/lib/vedeu/repositories/models/group_test.rb +0 -98
  292. data/test/lib/vedeu/repositories/models/interface_test.rb +0 -130
  293. data/test/lib/vedeu/repositories/models/keymap_test.rb +0 -27
  294. data/test/lib/vedeu/repositories/models/menu_test.rb +0 -246
  295. data/test/lib/vedeu/repositories/models/offset_test.rb +0 -128
  296. data/test/lib/vedeu/repositories/offsets_test.rb +0 -39
  297. data/test/lib/vedeu/support/keymap_validator_test.rb +0 -62
  298. data/test/lib/vedeu/support/model_test.rb +0 -23
  299. data/test/lib/vedeu/support/presentation_test.rb +0 -53
  300. data/test/lib/vedeu/support/registrar_test.rb +0 -94
  301. data/test/lib/vedeu/support/repository_test.rb +0 -208
  302. data/test/support/test_classes/all.rb +0 -5
  303. data/test/support/test_classes/coercions.rb +0 -16
  304. data/test/support/test_classes/model.rb +0 -23
  305. data/test/support/test_modules/all.rb +0 -1
@@ -0,0 +1,84 @@
1
+ require 'vedeu/presentation/presentation'
2
+
3
+ module Vedeu
4
+
5
+ # A Char represents a single character of the terminal. It is a container for
6
+ # the a single character in a {Vedeu::Stream}.
7
+ #
8
+ # Though a multi-character String can be passed as a value, only the first
9
+ # character is returned in the escape sequence.
10
+ #
11
+ # @api private
12
+ class Char
13
+
14
+ include Vedeu::Presentation
15
+
16
+ attr_accessor :parent
17
+ attr_reader :position
18
+
19
+ class << self
20
+ def coerce(value = nil, parent = nil, colour = nil, style = nil, position = nil)
21
+ if value.is_a?(self)
22
+ value
23
+
24
+ elsif value.is_a?(Array)
25
+ if value.first.is_a?(self)
26
+ value
27
+
28
+ elsif value.first.is_a?(String)
29
+ value.map { |char| new(char, parent, colour, style, position) }
30
+
31
+ else
32
+ # ...
33
+
34
+ end
35
+ else
36
+ # ...
37
+
38
+ end
39
+ end
40
+ end
41
+
42
+ # Returns a new instance of Char.
43
+ #
44
+ # @param value [String]
45
+ # @param parent [Line]
46
+ # @param colour [Colour]
47
+ # @param style [Style]
48
+ # @param position [Position]
49
+ # @return [Char]
50
+ def initialize(value = nil, parent = nil, colour = nil, style = nil, position = nil)
51
+ @value = value
52
+ @parent = parent
53
+ @colour = colour
54
+ @style = style
55
+ @position = position
56
+ end
57
+
58
+ # Returns log friendly output.
59
+ #
60
+ # @return [String]
61
+ def inspect
62
+ "<#{self.class.name} (value:#{@value})>"
63
+ end
64
+
65
+ # @return [Boolean]
66
+ def ==(other)
67
+ eql?(other)
68
+ end
69
+
70
+ # @return [Boolean]
71
+ def eql?(other)
72
+ self.class == other.class && value == other.value
73
+ end
74
+
75
+ # @return [String] The character.
76
+ def value
77
+ return '' unless @value
78
+
79
+ @value[0]
80
+ end
81
+
82
+ end # Char
83
+
84
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Chars < Vedeu::Model::Collection
6
+ end
7
+
8
+ end
@@ -0,0 +1,101 @@
1
+ require 'vedeu/dsl/composition'
2
+ require 'vedeu/models/collection'
3
+ require 'vedeu/presentation/presentation'
4
+ require 'vedeu/support/common'
5
+
6
+ require 'vedeu/models/view/interfaces'
7
+ require 'vedeu/models/view/interface'
8
+
9
+ module Vedeu
10
+
11
+ # A composition is a collection of interfaces.
12
+ #
13
+ # @api private
14
+ class Composition
15
+
16
+ include Vedeu::Presentation
17
+ include Vedeu::Model
18
+
19
+ attr_reader :interfaces
20
+ alias_method :value, :interfaces
21
+
22
+ class << self
23
+
24
+ # @param attributes [Hash]
25
+ # @option attributes client []
26
+ # @option attributes colour []
27
+ # @option attributes interfaces []
28
+ # @option attributes style []
29
+ # @param block [Proc]
30
+ # @return [Class]
31
+ def build(attributes = {}, &block)
32
+ attrs = defaults.merge(attributes)
33
+
34
+ model = new(attrs[:interfaces], attrs[:colour], attrs[:style])
35
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
36
+ model
37
+ end
38
+
39
+ private
40
+
41
+ # The default values for a new instance of this class.
42
+ #
43
+ # @return [Hash]
44
+ def defaults
45
+ {
46
+ client: nil,
47
+ colour: nil,
48
+ interfaces: [],
49
+ style: nil,
50
+ }
51
+ end
52
+
53
+ end
54
+
55
+ # Returns a new instance of Composition.
56
+ #
57
+ # @param interfaces [Interfaces]
58
+ # @return [Composition]
59
+ def initialize(interfaces = [], colour = nil, style = nil)
60
+ @interfaces = interfaces
61
+ @colour = colour
62
+ @style = style
63
+ end
64
+
65
+ # @param child []
66
+ # @return []
67
+ def add(child)
68
+ @interfaces = interfaces.add(child)
69
+ end
70
+
71
+ # Returns log friendly output.
72
+ #
73
+ # @return [String]
74
+ def inspect
75
+ "<#{self.class.name} (interfaces:#{interfaces.size})>"
76
+ end
77
+
78
+ # @return [Vedeu::Interfaces]
79
+ def interfaces
80
+ children.coerce(@interfaces, self)
81
+ end
82
+
83
+ private
84
+
85
+ # Return the class name for the children on this model.
86
+ #
87
+ # @return [Class]
88
+ def child
89
+ Vedeu::Interface
90
+ end
91
+
92
+ # Return the class name for the children on this model.
93
+ #
94
+ # @return [Class]
95
+ def children
96
+ Vedeu::Interfaces
97
+ end
98
+
99
+ end # Composition
100
+
101
+ end # Vedeu
@@ -0,0 +1,215 @@
1
+ require 'vedeu/support/common'
2
+ require 'vedeu/support/content_geometry'
3
+ require 'vedeu/models/model'
4
+ require 'vedeu/presentation/presentation'
5
+ require 'vedeu/buffers/display_buffer'
6
+ require 'vedeu/buffers/buffer'
7
+
8
+ require 'vedeu/models/view/lines'
9
+
10
+ module Vedeu
11
+
12
+ # An Interface represents a portion of the terminal defined by
13
+ # {Vedeu::Geometry}. It is a container for {Vedeu::Line} and {Vedeu::Stream}
14
+ # objects.
15
+ #
16
+ # @api private
17
+ class Interface
18
+
19
+ extend Forwardable
20
+
21
+ include Vedeu::Common
22
+ include Vedeu::Model
23
+ include Vedeu::Presentation
24
+ include Vedeu::DisplayBuffer
25
+
26
+ attr_accessor :border,
27
+ :colour,
28
+ :delay,
29
+ :geometry,
30
+ :group,
31
+ :name,
32
+ :parent,
33
+ :style
34
+
35
+ attr_writer :lines
36
+
37
+ def_delegators :geometry,
38
+ :north,
39
+ :east,
40
+ :south,
41
+ :west,
42
+ :top,
43
+ :right,
44
+ :bottom,
45
+ :left,
46
+ :width,
47
+ :height,
48
+ :origin
49
+
50
+ class << self
51
+
52
+ # Build interfaces using a simple DSL.
53
+ # If a name is provided as part of the attributes, we check the repository
54
+ # for an interface of the same name and update it from the new attributes
55
+ # provided, or if a block is given, new parameters set via the DSL.
56
+ #
57
+ # @param attributes [Hash]
58
+ # @option attributes client []
59
+ # @option attributes colour []
60
+ # @option attributes lines []
61
+ # @option attributes name []
62
+ # @option attributes parent []
63
+ # @option attributes style []
64
+ # @param block [Proc]
65
+ # @return [Class]
66
+ def build(attributes = {}, &block)
67
+ attributes = defaults.merge(attributes)
68
+ model = new(attributes[:name],
69
+ attributes[:lines],
70
+ attributes[:parent],
71
+ attributes[:colour],
72
+ attributes[:style])
73
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
74
+ model
75
+ end
76
+
77
+ private
78
+
79
+ # The default values for a new instance of this class.
80
+ #
81
+ # @return [Hash]
82
+ def defaults
83
+ {
84
+ client: nil,
85
+ colour: nil,
86
+ lines: [],
87
+ name: '',
88
+ parent: nil,
89
+ style: nil,
90
+ }
91
+ end
92
+ end
93
+
94
+ # Return a new instance of Interface.
95
+ #
96
+ # @param name [String]
97
+ # @param lines [Vedeu::Lines]
98
+ # @param parent [Vedeu::Composition]
99
+ # @param colour [Vedeu::Colour]
100
+ # @param style [Vedeu::Style]
101
+ # @return [Interface]
102
+ def initialize(name = '', lines = [], parent = nil, colour = nil, style = nil)
103
+ @name = name
104
+ @lines = lines
105
+ @parent = parent
106
+ @colour = colour
107
+ @style = style
108
+
109
+ @border = nil
110
+ @delay = 0.0
111
+ @geometry = nil
112
+ @group = ''
113
+
114
+ @repository = Vedeu.interfaces
115
+ end
116
+
117
+ # @param child []
118
+ # @return []
119
+ def add(child)
120
+ @lines = lines.add(child)
121
+ end
122
+
123
+ # @return [Hash]
124
+ def attributes
125
+ {
126
+ border: border,
127
+ colour: colour,
128
+ delay: delay,
129
+ geometry: geometry,
130
+ group: group,
131
+ name: name,
132
+ parent: parent,
133
+ style: style,
134
+ }
135
+ end
136
+
137
+ # Returns a boolean indicating whether the interface has a border.
138
+ #
139
+ # @return [Boolean]
140
+ def border?
141
+ !!(border)
142
+ end
143
+
144
+ # @return [Vedeu::Cursor]
145
+ def cursor
146
+ Vedeu.cursors.by_name(name)
147
+ end
148
+
149
+ # Returns log friendly output.
150
+ #
151
+ # @return [String]
152
+ def inspect
153
+ "<#{self.class.name} (lines:#{lines.size})>"
154
+ end
155
+
156
+ # @return [Vedeu::Lines]
157
+ def lines
158
+ children.coerce(@lines, self)
159
+ end
160
+ alias_method :content, :lines
161
+ alias_method :value, :lines
162
+
163
+ # Returns a boolean indicating whether the interface has content.
164
+ #
165
+ # @return [Boolean]
166
+ def lines?
167
+ lines.any?
168
+ end
169
+
170
+ # @return []
171
+ def render
172
+ if border
173
+ border.render
174
+
175
+ else
176
+ viewport
177
+
178
+ end
179
+ end
180
+
181
+ # @return [Interface]
182
+ def store
183
+ super
184
+
185
+ store_new_buffer
186
+ store_refresh_events
187
+ store_focusable
188
+ store_cursor
189
+ store_group
190
+ end
191
+
192
+ # return [Array]
193
+ def viewport
194
+ Vedeu::Viewport.show(self)
195
+ end
196
+
197
+ private
198
+
199
+ # Return the class name for the children on this model.
200
+ #
201
+ # @return [Class]
202
+ def child
203
+ Vedeu::Line
204
+ end
205
+
206
+ # Return the class name for the children on this model.
207
+ #
208
+ # @return [Class]
209
+ def children
210
+ Vedeu::Lines
211
+ end
212
+
213
+ end # Interface
214
+
215
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Interfaces < Vedeu::Model::Collection
6
+ end
7
+
8
+ end
@@ -0,0 +1,134 @@
1
+ require 'vedeu/presentation/presentation'
2
+
3
+ require 'vedeu/models/view/streams'
4
+ require 'vedeu/models/view/stream'
5
+
6
+ module Vedeu
7
+
8
+ # A Line represents a single row of the terminal. It is a container for
9
+ # {Vedeu::Stream} objects. A line's width is determined by the
10
+ # {Vedeu::Interface} it belongs to.
11
+ #
12
+ # @api private
13
+ class Line
14
+
15
+ include Vedeu::Model
16
+ include Vedeu::Presentation
17
+
18
+ attr_accessor :parent,
19
+ :streams
20
+
21
+ alias_method :value, :streams
22
+
23
+ class << self
24
+
25
+ # @option attributes streams []
26
+ # @option attributes parent []
27
+ # @option attributes colour []
28
+ # @option attributes style []
29
+ # @option attributes client []
30
+ def build(attributes = {}, &block)
31
+ attributes = defaults.merge(attributes)
32
+
33
+ model = new(attributes[:streams],
34
+ attributes[:parent],
35
+ attributes[:colour],
36
+ attributes[:style])
37
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
38
+ model
39
+ end
40
+
41
+ private
42
+
43
+ # The default values for a new instance of this class.
44
+ #
45
+ # @return [Hash]
46
+ def defaults
47
+ {
48
+ client: nil,
49
+ colour: nil,
50
+ parent: nil,
51
+ streams: [],
52
+ style: nil,
53
+ }
54
+ end
55
+ end
56
+
57
+ # Returns a new instance of Line.
58
+ #
59
+ # @return [Line]
60
+ def initialize(streams = [], parent = nil, colour = nil, style = nil)
61
+ @colour = colour
62
+ @parent = parent
63
+ @streams = streams
64
+ @style = style
65
+ end
66
+
67
+ # @param child []
68
+ # @return []
69
+ def add(child)
70
+ @streams = streams.add(child)
71
+ end
72
+
73
+ # Returns an array of all the characters with formatting for this line.
74
+ #
75
+ # @return [Array]
76
+ # @see Vedeu::Stream
77
+ def chars
78
+ return [] if empty?
79
+
80
+ streams.map(&:chars).flatten
81
+ end
82
+
83
+ # Returns a boolean indicating whether the line has content.
84
+ #
85
+ # @return [Boolean]
86
+ def empty?
87
+ streams.empty?
88
+ end
89
+
90
+ # Returns log friendly output.
91
+ #
92
+ # @return [String]
93
+ def inspect
94
+ "<#{self.class.name} (streams:#{streams.size})>"
95
+ end
96
+
97
+ # Returns the size of the content in characters without formatting.
98
+ #
99
+ # @return [Fixnum]
100
+ def size
101
+ streams.map(&:size).inject(0, :+) { |sum, x| sum += x }
102
+ end
103
+
104
+ # @return [Vedeu::Streams]
105
+ def streams
106
+ children.coerce(@streams, self)
107
+ end
108
+
109
+ # Delegate to Vedeu::Interface#width if available.
110
+ #
111
+ # @return [Fixnum]
112
+ def width
113
+ parent.width if parent
114
+ end
115
+
116
+ private
117
+
118
+ # Return the class name for the children on this model.
119
+ #
120
+ # @return [Class]
121
+ def child
122
+ Vedeu::Stream
123
+ end
124
+
125
+ # Return the class name for the children on this model.
126
+ #
127
+ # @return [Class]
128
+ def children
129
+ Vedeu::Streams
130
+ end
131
+
132
+ end # Line
133
+
134
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Lines < Vedeu::Model::Collection
6
+ end
7
+
8
+ end
@@ -0,0 +1,144 @@
1
+ require 'vedeu/presentation/presentation'
2
+ require 'vedeu/models/view/char'
3
+
4
+ module Vedeu
5
+
6
+ # A Stream can represent a character or collection of characters as part of a
7
+ # {Vedeu::Line} which you wish to colour and style independently of the other
8
+ # characters in that line.
9
+ #
10
+ # @api private
11
+ class Stream
12
+
13
+ include Vedeu::Model
14
+ include Vedeu::Presentation
15
+
16
+ attr_accessor :parent,
17
+ :value
18
+
19
+ alias_method :content, :value
20
+ alias_method :data, :value
21
+ alias_method :text, :value
22
+
23
+ class << self
24
+
25
+ # @option attributes value []
26
+ # @option attributes parent []
27
+ # @option attributes colour []
28
+ # @option attributes style []
29
+ # @option attributes client []
30
+ def build(attributes = {}, &block)
31
+ attributes = defaults.merge(attributes)
32
+
33
+ model = new(attributes[:value],
34
+ attributes[:parent],
35
+ attributes[:colour],
36
+ attributes[:style])
37
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
38
+ model
39
+ end
40
+
41
+ private
42
+
43
+ # The default values for a new instance of this class.
44
+ #
45
+ # @return [Hash]
46
+ def defaults
47
+ {
48
+ client: nil,
49
+ colour: nil,
50
+ parent: nil,
51
+ style: nil,
52
+ value: '',
53
+ }
54
+ end
55
+
56
+ end
57
+
58
+ # Returns a new instance of Stream.
59
+ #
60
+ # @param value [String]
61
+ # @param parent [Vedeu::Line]
62
+ # @param colour [Vedeu::Colour]
63
+ # @param style [Vedeu::Style]
64
+ # @return [Vedeu::Stream]
65
+ def initialize(value = '', parent = nil, colour = nil, style = nil)
66
+ @value = value
67
+ @parent = parent
68
+ @colour = colour
69
+ @style = style
70
+ end
71
+
72
+ # @param child [Vedeu::Stream]
73
+ # @return [Vedeu::Line]
74
+ def add(child)
75
+ parent.add(child)
76
+ end
77
+
78
+ # Returns an array of characters, each element is the escape sequences of
79
+ # colours and styles for this stream, the character itself, and the escape
80
+ # sequences of colours and styles for the parent of the stream
81
+ # ({Vedeu::Line}).
82
+ #
83
+ # @return [Array]
84
+ def chars
85
+ return [] if value.empty?
86
+
87
+ value.chars.map do |char|
88
+ child.new(char, parent, colour, style, nil).to_s
89
+ end
90
+ end
91
+
92
+ # Returns a boolean indicating whether the stream has content.
93
+ #
94
+ # @return [Boolean]
95
+ def empty?
96
+ value.empty?
97
+ end
98
+
99
+ # Returns log friendly output.
100
+ #
101
+ # @return [String]
102
+ def inspect
103
+ "<#{self.class.name} (value:#{value}, size:#{size})>"
104
+ end
105
+
106
+ # Returns the size of the content in characters without formatting.
107
+ #
108
+ # @return [Fixnum]
109
+ def size
110
+ value.size
111
+ end
112
+
113
+ # @return [String]
114
+ def value
115
+ # Vedeu::Char.coerce(@value, parent, colour, style)
116
+ @value
117
+ end
118
+
119
+ # Delegate to Vedeu::Line#width if available.
120
+ #
121
+ # @return [Fixnum]
122
+ def width
123
+ parent.width if parent
124
+ end
125
+
126
+ private
127
+
128
+ # Return the class name for the children on this model.
129
+ #
130
+ # @return [Class]
131
+ def child
132
+ Vedeu::Char
133
+ end
134
+
135
+ # Return the class name for the collection of children on this model.
136
+ #
137
+ # @return [Class]
138
+ def children
139
+ Vedeu::Chars
140
+ end
141
+
142
+ end # Stream
143
+
144
+ end # Vedeu
@@ -0,0 +1,8 @@
1
+ require 'vedeu/models/collection'
2
+
3
+ module Vedeu
4
+
5
+ class Streams < Vedeu::Model::Collection
6
+ end
7
+
8
+ end