vedeu 0.2.12 → 0.3.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 (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,8 @@
1
+ require 'vedeu/output/border'
2
+ require 'vedeu/output/compositor'
3
+ require 'vedeu/output/output'
4
+ require 'vedeu/output/viewport'
5
+ require 'vedeu/output/writer'
6
+
7
+ module Vedeu
8
+ end # Vedeu
@@ -0,0 +1,387 @@
1
+ require 'vedeu/dsl/components/border'
2
+
3
+ module Vedeu
4
+
5
+ # Provides the mechanism to decorate an interface with a border on all edges,
6
+ # or specific edges. The characters which are used for the border parts (e.g.
7
+ # the corners, verticals and horizontals) can be customised as can the colours
8
+ # and styles.
9
+ #
10
+ # @note Refer to UTF-8 U+2500 to U+257F for border characters. More details
11
+ # can be found at: http://en.wikipedia.org/wiki/Box-drawing_character
12
+ #
13
+ class Border
14
+
15
+ include Vedeu::Model
16
+
17
+ attr_accessor :attributes
18
+
19
+ class << self
20
+
21
+ # @see Vedeu::Border#initialize
22
+ def build(attributes = {}, &block)
23
+ attributes = defaults.merge(attributes)
24
+
25
+ model = new(attributes[:interface], attributes)
26
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
27
+ model
28
+ end
29
+
30
+ private
31
+
32
+ # The default values for a new instance of this class.
33
+ #
34
+ # @return [Hash]
35
+ def defaults
36
+ {
37
+ client: nil,
38
+ interface: nil,
39
+ }
40
+ end
41
+
42
+ end
43
+
44
+ # Returns a new instance of Border.
45
+ #
46
+ # @param interface [Interface]
47
+ # @param attributes [Hash]
48
+ # @option attributes colour
49
+ # @option attributes style
50
+ # @option attributes enabled [Boolean]
51
+ # @option attributes show_bottom [Boolean]
52
+ # @option attributes show_left [Boolean]
53
+ # @option attributes show_right [Boolean]
54
+ # @option attributes show_top [Boolean]
55
+ # @option attributes horizontal [String]
56
+ # @option attributes vertical [String]
57
+ # @option attributes bottom_left [String]
58
+ # @option attributes bottom_right [String]
59
+ # @option attributes top_left [String]
60
+ # @option attributes top_right [String]
61
+ # @return [Border]
62
+ def initialize(interface, attributes = {})
63
+ @interface = interface
64
+ @attributes = defaults.merge(attributes)
65
+ @colour = Colour.coerce(@attributes[:colour])
66
+ @style = Style.coerce(@attributes[:style])
67
+ end
68
+
69
+ # Returns the width of the interface determined by whether a left, right,
70
+ # both or neither borders are shown.
71
+ #
72
+ # @return [Fixnum]
73
+ def width
74
+ return interface.width unless enabled?
75
+
76
+ if left? && right?
77
+ interface.width - 2
78
+
79
+ elsif left? || right?
80
+ interface.width - 1
81
+
82
+ else
83
+ interface.width
84
+
85
+ end
86
+ end
87
+
88
+ # Returns the height of the interface determined by whether a top, bottom,
89
+ # both or neither borders are shown.
90
+ #
91
+ # @return [Fixnum]
92
+ def height
93
+ return interface.height unless enabled?
94
+
95
+ if top? && bottom?
96
+ interface.height - 2
97
+
98
+ elsif top? || bottom?
99
+ interface.height - 1
100
+
101
+ else
102
+ interface.height
103
+
104
+ end
105
+ end
106
+
107
+ # Returns the interface with border (if enabled) and the content for the
108
+ # interface.
109
+ #
110
+ # @return [Array<Array<String>>]
111
+ def render
112
+ out = []
113
+
114
+ out << top if top?
115
+
116
+ interface.viewport[0...height].each do |line|
117
+ out << [left, line[0...width], right].flatten
118
+ end
119
+
120
+ out << bottom if bottom?
121
+
122
+ out
123
+ end
124
+
125
+ # Set the border colour.
126
+ #
127
+ # @return []
128
+ def colour=(value)
129
+ @colour = Colour.coerce(value)
130
+ end
131
+
132
+ # Set the border style.
133
+ #
134
+ # @return []
135
+ def style=(value)
136
+ @style = Style.coerce(value)
137
+ end
138
+
139
+ # Returns a boolean indicating whether the border is to be shown for this
140
+ # interface.
141
+ #
142
+ # @return [Boolean]
143
+ def enabled?
144
+ attributes[:enabled]
145
+ end
146
+
147
+ # Returns a boolean indicating whether the bottom border is to be shown.
148
+ #
149
+ # @return [Boolean]
150
+ def bottom?
151
+ attributes[:show_bottom]
152
+ end
153
+
154
+ # Returns a boolean indicating whether the left border is to be shown.
155
+ #
156
+ # @return [Boolean]
157
+ def left?
158
+ attributes[:show_left]
159
+ end
160
+
161
+ # Returns a boolean indicating whether the right border is to be shown.
162
+ #
163
+ # @return [Boolean]
164
+ def right?
165
+ attributes[:show_right]
166
+ end
167
+
168
+ # Returns a boolean indicating whether the top border is to be shown.
169
+ #
170
+ # @return [Boolean]
171
+ def top?
172
+ attributes[:show_top]
173
+ end
174
+
175
+ # Returns a string representation of the border for the interface without
176
+ # content.
177
+ #
178
+ # @return [Boolean]
179
+ def to_s
180
+ render.map { |line| line.flatten.join }.join("\n")
181
+ end
182
+
183
+ private
184
+
185
+ attr_reader :colour, :interface, :style
186
+
187
+ # Renders the bottom border for the interface.
188
+ #
189
+ # @return [String]
190
+ def bottom
191
+ return [] unless bottom?
192
+
193
+ out = []
194
+
195
+ out << bottom_left
196
+ horizontal_border.each do |border|
197
+ out << border
198
+ end
199
+ out << bottom_right
200
+
201
+ out
202
+ end
203
+
204
+ # Renders the left border for the interface.
205
+ #
206
+ # @return [String]
207
+ def left
208
+ return '' unless left?
209
+
210
+ vertical_border
211
+ end
212
+
213
+ # Renders the right border for the interface.
214
+ #
215
+ # @return [String]
216
+ def right
217
+ return '' unless right?
218
+
219
+ vertical_border
220
+ end
221
+
222
+ # Renders the top border for the interface.
223
+ #
224
+ # @return [String]
225
+ def top
226
+ return [] unless top?
227
+
228
+ out = []
229
+ out << top_left
230
+ horizontal_border.each do |border|
231
+ out << border
232
+ end
233
+ out << top_right
234
+
235
+ out
236
+ end
237
+
238
+ # Renders the bottom left border character with escape codes for colour and
239
+ # style for the interface.
240
+ #
241
+ # @return [String]
242
+ def bottom_left
243
+ return '' unless left?
244
+
245
+ [*presentation, on, bl, off, *reset].join
246
+ end
247
+
248
+ # Renders the bottom right border character with escape codes for colour and
249
+ # style for the interface.
250
+ #
251
+ # @return [String]
252
+ def bottom_right
253
+ return '' unless right?
254
+
255
+ [*presentation, on, br, off, *reset].join
256
+ end
257
+
258
+ # Renders the top left border character with escape codes for colour and
259
+ # style for the interface.
260
+ #
261
+ # @return [String]
262
+ def top_left
263
+ return '' unless left?
264
+
265
+ [*presentation, on, tl, off, *reset].join
266
+ end
267
+
268
+ # Renders the top right border character with escape codes for colour and
269
+ # style for the interface.
270
+ #
271
+ # @return [String]
272
+ def top_right
273
+ return '' unless right?
274
+
275
+ [*presentation, on, tr, off, *reset].join
276
+ end
277
+
278
+ # Returns the horizontal border characters with colours and styles.
279
+ #
280
+ # @return [Array<String>]
281
+ def horizontal_border
282
+ [[*presentation, on, h, off, *reset].join] * width
283
+ end
284
+
285
+ # Returns the vertical border characters with colours and styles.
286
+ #
287
+ # @return [String]
288
+ def vertical_border
289
+ [*presentation, on, v, off, *reset].join
290
+ end
291
+
292
+ # Returns the horizontal border character.
293
+ #
294
+ # @return [String]
295
+ def h
296
+ attributes[:horizontal]
297
+ end
298
+
299
+ # Returns the vertical border character.
300
+ #
301
+ # @return [String]
302
+ def v
303
+ attributes[:vertical]
304
+ end
305
+
306
+ # Returns the top right border character.
307
+ #
308
+ # @return [String]
309
+ def tr
310
+ attributes[:top_right]
311
+ end
312
+
313
+ # Returns the top left border character.
314
+ #
315
+ # @return [String]
316
+ def tl
317
+ attributes[:top_left]
318
+ end
319
+
320
+ # Returns the bottom right border character.
321
+ #
322
+ # @return [String]
323
+ def br
324
+ attributes[:bottom_right]
325
+ end
326
+
327
+ # Returns the bottom left border character.
328
+ #
329
+ # @return [String]
330
+ def bl
331
+ attributes[:bottom_left]
332
+ end
333
+
334
+ # Returns the escape sequence to start a border.
335
+ #
336
+ # @return [String]
337
+ def on
338
+ "\e(0"
339
+ end
340
+
341
+ # Returns the escape sequence to end a border.
342
+ #
343
+ # @return [String]
344
+ def off
345
+ "\e(B"
346
+ end
347
+
348
+ # Returns the colour and styles for the border.
349
+ #
350
+ # @return [Array]
351
+ def presentation
352
+ [colour, style]
353
+ end
354
+
355
+ # Returns the colour and styles for the interface; effectively turning off
356
+ # the colours and styles for the border.
357
+ #
358
+ # @return [Array]
359
+ def reset
360
+ [interface.colour, interface.style]
361
+ end
362
+
363
+ # The default values for a new instance of this class.
364
+ #
365
+ # @return [Hash]
366
+ def defaults
367
+ {
368
+ enabled: false,
369
+ show_bottom: true,
370
+ show_left: true,
371
+ show_right: true,
372
+ show_top: true,
373
+ bottom_right: "\x6A", # ┘
374
+ top_right: "\x6B", # ┐
375
+ top_left: "\x6C", # ┌
376
+ bottom_left: "\x6D", # └
377
+ horizontal: "\x71", # ─
378
+ colour: {},
379
+ style: [],
380
+ vertical: "\x78", # │
381
+ interface: nil,
382
+ }
383
+ end
384
+
385
+ end # Border
386
+
387
+ end # Vedeu
@@ -1,65 +1,76 @@
1
+ require 'vedeu/support/common'
2
+
1
3
  module Vedeu
2
4
 
5
+ # Before the content of the buffer can be output to the terminal, if there are
6
+ # any changes to the geometry of the interface (stored in the buffer), then
7
+ # these need to be stored; replacing those already stored. This is our last
8
+ # chance to do this as the terminal may have resized, or the client
9
+ # application may have specified this this view should move to a new location.
10
+
3
11
  # Combines stored interface layout/geometry with an interface view/buffer
4
12
  # to create a single view to be sent to the terminal for output.
5
13
  #
6
14
  # @api private
7
15
  class Compositor
8
16
 
9
- include Common
17
+ include Vedeu::Common
10
18
 
11
19
  # Convenience method to initialize a new Compositor and call its {#compose}
12
20
  # method.
13
21
  #
14
22
  # @return [Compositor]
15
23
  # @see #initialize
16
- def self.compose(interface, buffer)
17
- new(interface, buffer).compose
24
+ def self.compose(name)
25
+ new(name).compose
18
26
  end
19
27
 
20
28
  # Initialize a new Compositor.
21
29
  #
22
- # @param interface [Hash] The attributes of the interface to be refreshed.
23
- # @param buffer [Hash] The atttributes of the buffer to refresh the
24
- # interface with.
30
+ # @param name [String] The name of the buffer.
25
31
  # @return [Compositor]
26
- def initialize(interface, buffer)
27
- @interface = interface
28
- @buffer = buffer
32
+ def initialize(name)
33
+ @name = name
29
34
  end
30
35
 
31
- # Return a new instance of Interface built by combining the buffer content
32
- # attributes with the stored interface attributes.
36
+ # @todo What do we do about resizing terminals. I don't want to overwrite
37
+ # the stored geometry and when the terminal returns to original size not also
38
+ # return the interface back to its originally prescribed dimensions.
39
+ #
40
+ # @note
41
+ # If the buffer has geometry stored, we should check whether this is different
42
+ # to the geometries repository- the client application is wanting to resize
43
+ # or move the interface.
44
+ #
45
+ # If it is different, overwrite the old geometry with the new.
33
46
  #
34
- # @return [Array<Hash>] The updated interface attributes.
47
+ # If the buffer does not have geometry stored, retrieve the geometry for this
48
+ # interface from the geometries repository so we can draw this buffer in the
49
+ # correct place.
50
+ #
51
+ # @return [Array<Interface>]
35
52
  def compose
36
- buffer.content.each do |content|
37
- change_geometry(content)
38
-
39
- interface[:lines] = content[:lines]
40
- change_colour(content)
41
- change_style(content)
53
+ buffer.map do |view|
54
+ view.border = interface.border unless view.border
55
+ view.colour = interface.colour unless view.colour
56
+ view.style = interface.style unless view.style
57
+ view.geometry = interface.geometry unless view.geometry
42
58
 
43
- Output.render(Interface.new(interface))
59
+ Output.render(view)
44
60
  end
45
61
  end
46
62
 
47
63
  private
48
64
 
49
- attr_reader :interface, :buffer
50
-
51
- def change_colour(content)
52
- interface[:colour] = content[:colour] if defined_value?(content[:colour])
53
- end
65
+ attr_reader :name
54
66
 
55
- def change_geometry(content)
56
- content[:geometry].each do |k, v|
57
- interface[:geometry][k] = v if defined_value?(k)
58
- end if defined_value?(content[:geometry])
67
+ def buffer
68
+ Vedeu.buffers.find(name).content
59
69
  end
60
70
 
61
- def change_style(content)
62
- interface[:style] = content[:style] if defined_value?(content[:style])
71
+ # @return [Interface]
72
+ def interface
73
+ @interface ||= Vedeu.interfaces.find(name)
63
74
  end
64
75
 
65
76
  end # Compositor
@@ -1,5 +1,7 @@
1
1
  module Vedeu
2
2
 
3
+ # Sends the interface to the terminal or output device.
4
+ #
3
5
  class Output
4
6
 
5
7
  # Writes content (the provided interface object with associated lines,
@@ -23,7 +25,7 @@ module Vedeu
23
25
  #
24
26
  # @return [Array]
25
27
  def render
26
- Terminal.output(view, Focus.cursor)
28
+ Terminal.output(view, interface.cursor.to_s)
27
29
  end
28
30
 
29
31
  private
@@ -38,21 +40,11 @@ module Vedeu
38
40
  def clear
39
41
  Vedeu.log("Clearing view: '#{interface.name}'")
40
42
 
41
- rows.inject([colours]) do |line, index|
43
+ interface.height.times.inject([interface.colour]) do |line, index|
42
44
  line << interface.origin(index) { ' ' * interface.width }
43
45
  end.join
44
46
  end
45
47
 
46
- # @return [String]
47
- def colours
48
- interface.colour.to_s
49
- end
50
-
51
- # @return [Enumerator]
52
- def rows
53
- interface.height.times
54
- end
55
-
56
48
  # Produces a single string which contains all content and escape sequences
57
49
  # required to render this interface in the terminal window.
58
50
  #
@@ -62,10 +54,11 @@ module Vedeu
62
54
 
63
55
  Vedeu.log("Rendering view: '#{interface.name}'")
64
56
 
65
- interface.border.to_viewport.each_with_index do |line, index|
57
+ interface.render.each_with_index do |line, index|
66
58
  out << interface.origin(index)
67
59
  out << line.join
68
60
  end
61
+
69
62
  out.join
70
63
  end
71
64