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,121 @@
1
+ require 'vedeu/events/event'
2
+
3
+ module Vedeu
4
+
5
+ module API
6
+
7
+ def_delegators Vedeu::Event, :bind, :trigger, :unbind
8
+
9
+ end
10
+
11
+ # Creates system events which when called provide a variety of core functions
12
+ # and behaviours.
13
+ #
14
+ # @note
15
+ # Unbinding any of these events is likely to cause problems, so I would
16
+ # advise leaving them alone. A safe rule: if the name starts with an
17
+ # underscore, it's probably used by Vedeu internally.
18
+ #
19
+ # :nocov:
20
+ module Bindings
21
+
22
+ # System events needed by Vedeu to run.
23
+ Vedeu.bind(:_clear_) { Vedeu::Terminal.clear }
24
+ Vedeu.bind(:_exit_) { Vedeu::Application.stop }
25
+ Vedeu.bind(:_initialize_) { Vedeu.trigger(:_refresh_) }
26
+ Vedeu.bind(:_keypress_) { |key| Vedeu.keypress(key) }
27
+ Vedeu.bind(:_log_) { |msg| Vedeu.log(msg) }
28
+ Vedeu.bind(:_mode_switch_) { fail ModeSwitch }
29
+ Vedeu.bind(:_resize_, { delay: 0.25 }) { Vedeu.resize }
30
+
31
+ # System events which when called will update the cursor visibility
32
+ # accordingly for the interface in focus, or the named interface. Also
33
+ # includes events to move the cursor in the direction specified; these will
34
+ # update the cursor position according to the interface in focus.
35
+ Vedeu.bind(:_cursor_hide_) do
36
+ ToggleCursor.hide(Vedeu.cursor)
37
+ end
38
+
39
+ Vedeu.bind(:_cursor_show_) do
40
+ ToggleCursor.show(Vedeu.cursor)
41
+ end
42
+
43
+ Vedeu.bind(:_cursor_hide_by_name_) do |name|
44
+ named = Vedeu.cursors.by_name(name)
45
+
46
+ ToggleCursor.hide(named)
47
+ end
48
+
49
+ Vedeu.bind(:_cursor_show_by_name_) do |name|
50
+ named = Vedeu.cursors.by_name(name)
51
+
52
+ ToggleCursor.show(named)
53
+ end
54
+
55
+ Vedeu.bind(:_cursor_down_) do
56
+ interface = Vedeu.interfaces.current
57
+
58
+ MoveCursor.down(Vedeu.cursor, interface)
59
+
60
+ Refresh.by_focus
61
+ end
62
+
63
+ Vedeu.bind(:_cursor_left_) do
64
+ interface = Vedeu.interfaces.current
65
+
66
+ MoveCursor.left(Vedeu.cursor, interface)
67
+
68
+ Refresh.by_focus
69
+ end
70
+
71
+ Vedeu.bind(:_cursor_right_) do
72
+ interface = Vedeu.interfaces.current
73
+
74
+ MoveCursor.right(Vedeu.cursor, interface)
75
+
76
+ Refresh.by_focus
77
+ end
78
+
79
+ Vedeu.bind(:_cursor_up_) do
80
+ interface = Vedeu.interfaces.current
81
+
82
+ MoveCursor.up(Vedeu.cursor, interface)
83
+
84
+ Refresh.by_focus
85
+ end
86
+
87
+ Vedeu.bind(:_cursor_origin_) do
88
+ interface = Vedeu.interfaces.current
89
+
90
+ MoveCursor.origin(Vedeu.cursor, interface)
91
+
92
+ Refresh.by_focus
93
+ end
94
+
95
+ # System events which when called will change which interface is currently
96
+ # focussed. When the interface is brought into focus, its cursor position
97
+ # and visibility is restored.
98
+ Vedeu.bind(:_focus_by_name_) { |name| Vedeu.focus_by_name(name) }
99
+ Vedeu.bind(:_focus_next_) { Vedeu.focus_next }
100
+ Vedeu.bind(:_focus_prev_) { Vedeu.focus_previous }
101
+
102
+ # System events which when called with the appropriate menu name will
103
+ # update the menu accordingly.
104
+ Vedeu.bind(:_menu_bottom_) { |name| Vedeu.menus.find(name).bottom_item }
105
+ Vedeu.bind(:_menu_current_) { |name| Vedeu.menus.find(name).current_item }
106
+ Vedeu.bind(:_menu_deselect_) { |name| Vedeu.menus.find(name).deselect_item }
107
+ Vedeu.bind(:_menu_items_) { |name| Vedeu.menus.find(name).items }
108
+ Vedeu.bind(:_menu_next_) { |name| Vedeu.menus.find(name).next_item }
109
+ Vedeu.bind(:_menu_prev_) { |name| Vedeu.menus.find(name).prev_item }
110
+ Vedeu.bind(:_menu_selected_) { |name| Vedeu.menus.find(name).selected_item }
111
+ Vedeu.bind(:_menu_select_) { |name| Vedeu.menus.find(name).select_item }
112
+ Vedeu.bind(:_menu_top_) { |name| Vedeu.menus.find(name).top_item }
113
+ Vedeu.bind(:_menu_view_) { |name| Vedeu.menus.find(name).view }
114
+
115
+ # System event to refresh all registered interfaces.
116
+ Vedeu.bind(:_refresh_) { Vedeu::Refresh.all }
117
+
118
+ end # Bindings
119
+ # :nocov:
120
+
121
+ end # Vedeu
@@ -0,0 +1,10 @@
1
+ require 'vedeu/buffers/buffer'
2
+ require 'vedeu/buffers/display_buffer'
3
+
4
+ module Vedeu
5
+
6
+ def self.buffers
7
+ @_buffers ||= Vedeu::Repository.new(Vedeu::Buffer)
8
+ end
9
+
10
+ end # Vedeu
@@ -1,3 +1,5 @@
1
+ require 'vedeu/models/model'
2
+
1
3
  module Vedeu
2
4
 
3
5
  # The Buffer object represents the states of display for an interface. The
@@ -12,49 +14,45 @@ module Vedeu
12
14
  #
13
15
  class Buffer
14
16
 
15
- include Model
17
+ include Vedeu::Model
16
18
 
17
- attr_reader :back, :front, :name, :previous
18
- alias_method :current, :front
19
+ attr_accessor :back, :front, :previous
20
+ attr_reader :name, :repository
19
21
 
20
22
  # Return a new instance of Buffer.
21
23
  #
22
- # @param attributes [Hash]
24
+ # @param name [String] The name of the interface for which the buffer
25
+ # belongs.
26
+ # @param back [Interface]
27
+ # @param front [Interface]
28
+ # @param previous [Interface]
23
29
  # @return [Buffer]
24
- def initialize(attributes = {})
25
- @attributes = defaults.merge(attributes)
26
-
27
- @name = @attributes[:name]
28
- @back = @attributes[:back]
29
- @front = @attributes[:front]
30
- @previous = @attributes[:previous]
30
+ def initialize(name, back = nil, front = nil, previous = nil, repository = nil)
31
+ @name = name
32
+ @back = back
33
+ @front = front
34
+ @previous = previous
35
+ @repository = repository || Vedeu.buffers
31
36
  end
32
37
 
33
- # Add the content to the back buffer, then update the repository. Returns
34
- # boolean indicating that the repository was updated.
38
+ # Returns log friendly output.
35
39
  #
36
- # @param content [Hash]
37
- # @return [Boolean]
38
- def add(content = {})
39
- self.back = content
40
-
41
- store
42
-
43
- true
40
+ # @return [String]
41
+ def inspect
42
+ "<#{self.class.name} ( " \
43
+ "back?:#{content_for?(:back)} " \
44
+ "front?:#{content_for?(:front)} " \
45
+ "previous?:#{content_for?(:previous)} " \
46
+ ")>"
44
47
  end
45
48
 
46
- # Return a boolean indicating content was swapped between buffers. It also
47
- # resets the offsets (i.e. scroll/cursor position).
49
+ # Add the content to the back buffer, then update the repository. Returns
50
+ # boolean indicating that the repository was updated.
48
51
  #
52
+ # @param content [Interface]
49
53
  # @return [Boolean]
50
- def swap
51
- return false unless content_for?(:back)
52
-
53
- # Offsets.update({ name: name })
54
-
55
- self.previous = front
56
- self.front = back
57
- self.back = {}
54
+ def add(content)
55
+ @back = content
58
56
 
59
57
  store
60
58
 
@@ -70,14 +68,14 @@ module Vedeu
70
68
  # buffer and display that.
71
69
  # - If there is no new content, and the front buffer is empty, display the
72
70
  # 'previous' buffer.
73
- # - If the 'previous' buffer is empty, return an empty hash.
71
+ # - If the 'previous' buffer is empty, return an empty collection.
74
72
  #
75
73
  # @return [Array<Hash>]
76
74
  def content
77
75
  if content_for?(:back)
78
76
  swap
79
77
 
80
- [clear_if_previous, front]
78
+ [front]
81
79
 
82
80
  elsif content_for?(:front)
83
81
  [front]
@@ -86,50 +84,35 @@ module Vedeu
86
84
  [previous]
87
85
 
88
86
  else
89
- [{}]
87
+ []
90
88
 
91
89
  end
92
90
  end
93
91
 
94
- private
95
-
96
- attr_writer :back, :front, :previous
97
-
98
- def clear_if_previous
99
- if content_for?(:previous)
100
- previous
92
+ # Return a boolean indicating content was swapped between buffers.
93
+ #
94
+ # @return [Boolean]
95
+ def swap
96
+ @previous = front
97
+ @front = back
98
+ @back = nil
101
99
 
102
- else
103
- {}
100
+ store
104
101
 
105
- end
102
+ true
106
103
  end
107
104
 
105
+ private
106
+
108
107
  # Return a boolean indicating content presence on the buffer type.
109
108
  #
110
- # @param buffer [Symbol] One of; :back, :current/:front or :previous.
109
+ # @param buffer [Symbol] One of; :back, :front or :previous.
111
110
  # @return [Boolean] Whether the buffer targetted has content.
112
111
  def content_for?(buffer)
113
- public_send(buffer).any? do |k, v|
114
- k == :lines && v && v.any?
115
- end
116
- end
112
+ return false if public_send(buffer).nil? ||
113
+ public_send(buffer).content.empty?
117
114
 
118
- # @return [Class] The repository class for this model.
119
- def repository
120
- Vedeu::Buffers
121
- end
122
-
123
- # Return the default attributes of a Buffer.
124
- #
125
- # @return [Hash]
126
- def defaults
127
- {
128
- name: '',
129
- back: {},
130
- front: {},
131
- previous: {},
132
- }
115
+ true
133
116
  end
134
117
 
135
118
  end # Buffer
@@ -0,0 +1,118 @@
1
+ require 'vedeu/repositories/repository'
2
+
3
+ module Vedeu
4
+
5
+ # This module is included in Vedeu::Interface to provide means to store client
6
+ # application views created with {Vedeu.renders} or {Vedeu.views}.
7
+ #
8
+ module DisplayBuffer
9
+
10
+ include Vedeu::Common
11
+
12
+ # Store the view and immediate refresh it; causing to be pushed to the
13
+ # Terminal.
14
+ #
15
+ # @return [Interface]
16
+ def store_immediate
17
+ store_deferred
18
+
19
+ Vedeu::Refresh.by_name(name)
20
+
21
+ self
22
+ end
23
+
24
+ # Store the view if it has a name. This view will be shown next time the
25
+ # refresh event is triggered for the interface.
26
+ #
27
+ # @return [Interface]
28
+ def store_deferred
29
+ unless defined_value?(name)
30
+ fail InvalidSyntax, 'Cannot store an interface without a name.'
31
+ end
32
+
33
+ store_new_buffer
34
+
35
+ self
36
+ end
37
+
38
+ private
39
+
40
+ # Registers a set of buffers for the interface unless already registered,
41
+ # and also adds interface's name to list of focussable interfaces.
42
+ #
43
+ # @see Vedeu::Buffer
44
+ # @return [Interface]
45
+ def store_new_buffer
46
+ if Vedeu.buffers.registered?(name)
47
+ Vedeu.log("Updating buffer: '#{name}'")
48
+
49
+ Vedeu.buffers.find(name).add(self)
50
+
51
+ else
52
+ Vedeu.log("Registering buffer: '#{name}'")
53
+
54
+ Buffer.new(name, self).store
55
+
56
+ end
57
+
58
+ self
59
+ end
60
+
61
+ # Registers refresh events for the interface unless already registered.
62
+ #
63
+ # @return [Interface]
64
+ def store_refresh_events
65
+ options = { delay: delay }
66
+ event = "_refresh_#{name}_".to_sym
67
+
68
+ unless Vedeu.events.registered?(event)
69
+ Vedeu.bind(event, options) { Vedeu::Refresh.by_name(name) }
70
+ end
71
+
72
+ unless group.nil? || group.empty?
73
+ event = "_refresh_group_#{group}_".to_sym
74
+
75
+ unless Vedeu.events.registered?(event)
76
+ Vedeu.bind(event, options) { Vedeu::Refresh.by_group(group) }
77
+ end
78
+ end
79
+
80
+ self
81
+ end
82
+
83
+ # Registers interface name in focus list unless already registered.
84
+ #
85
+ # @return [Interface]
86
+ def store_focusable
87
+ unless Vedeu.focusable.registered?(name)
88
+ Vedeu.focusable.add(name)
89
+ end
90
+
91
+ self
92
+ end
93
+
94
+ # Registers a new cursor for the interface unless already registered.
95
+ #
96
+ # @return [Interface]
97
+ def store_cursor
98
+ unless Vedeu.cursors.registered?(name)
99
+ Vedeu::Cursor.new({ name: name }).store
100
+ end
101
+
102
+ self
103
+ end
104
+
105
+ # Registers a new group for the interface unless already registered.
106
+ #
107
+ # @return [Interface]
108
+ def store_group
109
+ unless group.nil? || group.empty? || Vedeu.groups.registered?(group)
110
+ Vedeu::Group.new(name, group).store
111
+ end
112
+
113
+ self
114
+ end
115
+
116
+ end # DisplayBuffer
117
+
118
+ end # Vedeu
@@ -0,0 +1,6 @@
1
+ require 'vedeu/configuration/cli'
2
+ require 'vedeu/configuration/api'
3
+ require 'vedeu/configuration/configuration'
4
+
5
+ module Vedeu
6
+ end # Vedeu
@@ -1,3 +1,5 @@
1
+ require 'vedeu/support/common'
2
+
1
3
  module Vedeu
2
4
 
3
5
  module Config
@@ -362,6 +364,6 @@ module Vedeu
362
364
 
363
365
  end # API
364
366
 
365
- end # Configuration
367
+ end # Config
366
368
 
367
369
  end # Vedeu
@@ -1,3 +1,5 @@
1
+ require 'optparse'
2
+
1
3
  module Vedeu
2
4
 
3
5
  module Config
@@ -125,6 +127,6 @@ module Vedeu
125
127
 
126
128
  end # CLI
127
129
 
128
- end # Configuration
130
+ end # Config
129
131
 
130
132
  end # Vedeu
@@ -1,5 +1,16 @@
1
+ require 'singleton'
2
+
3
+ require 'vedeu/support/common'
4
+ require 'vedeu/configuration/api'
5
+ require 'vedeu/configuration/cli'
6
+
1
7
  module Vedeu
2
8
 
9
+ # Namespace for the API configuration and CLI configuration classes.
10
+ #
11
+ module Config
12
+ end
13
+
3
14
  # Allows the customisation of Vedeu's behaviour through the configuration API
4
15
  # or command-line arguments.
5
16
  #
@@ -15,6 +26,8 @@ module Vedeu
15
26
 
16
27
  class << self
17
28
 
29
+ include Vedeu::Common
30
+
18
31
  # Configure Vedeu with sensible defaults. If the client application sets
19
32
  # options, override the defaults with those, and if command-line arguments
20
33
  # are provided at application invocation, override any options with the
@@ -22,11 +35,19 @@ module Vedeu
22
35
  #
23
36
  # @param args [Array]
24
37
  # @param block [Proc]
38
+ # @raise [InvalidSyntax] When the required block is not given.
25
39
  # @return [Hash]
26
40
  def configure(args = [], &block)
27
41
  instance.configure(args, &block)
28
42
  end
29
43
 
44
+ # Returns the configuration singleton.
45
+ #
46
+ # @return [Vedeu::Configuration]
47
+ def configuration
48
+ instance
49
+ end
50
+
30
51
  # Returns the chosen colour mode.
31
52
  #
32
53
  # @return [Fixnum]
@@ -94,7 +115,7 @@ module Vedeu
94
115
  end
95
116
  alias_method :trace, :trace?
96
117
 
97
- # Vedeu's default system keys. Use {#system_keys}.
118
+ # Vedeu's default system keys. Use {Vedeu::Configuration.system_keys}.
98
119
  #
99
120
  # @return [Hash]
100
121
  def default_system_keys
@@ -142,7 +163,7 @@ module Vedeu
142
163
 
143
164
  @options.merge!(Config::CLI.configure(args)) if args.any?
144
165
 
145
- @options
166
+ Configuration
146
167
  end
147
168
 
148
169
  # Reset the configuration to the default values.
@@ -0,0 +1,23 @@
1
+ require 'vedeu/repositories/repository'
2
+ require 'vedeu/cursor/cursor'
3
+ require 'vedeu/cursor/move_cursor'
4
+ require 'vedeu/cursor/toggle_cursor'
5
+
6
+ module Vedeu
7
+
8
+ class Cursors < Repository
9
+ end
10
+
11
+ extend self
12
+
13
+ # @return [Cursors]
14
+ def cursors
15
+ @_cursors ||= Vedeu::Cursors.new(Vedeu::Cursor)
16
+ end
17
+
18
+ # @return [Cursor|NilClass]
19
+ def cursor
20
+ cursors.current
21
+ end
22
+
23
+ end # Vedeu
@@ -0,0 +1,116 @@
1
+ require 'vedeu/cursor/all'
2
+ require 'vedeu/models/model'
3
+ require 'vedeu/support/position'
4
+ require 'vedeu/support/visible'
5
+
6
+ module Vedeu
7
+
8
+ # Each interface has its own Cursor which maintains the position and
9
+ # visibility of the cursor within that interface.
10
+ #
11
+ # @api private
12
+ class Cursor
13
+
14
+ extend Forwardable
15
+
16
+ def_delegators :state, :visible?, :invisible?
17
+
18
+ include Vedeu::Model
19
+
20
+ attr_reader :attributes, :name, :ox, :oy, :repository, :state, :x, :y
21
+
22
+ # Provides a new instance of Cursor.
23
+ #
24
+ # @param attributes [Hash]
25
+ # @option attributes name [String] The name of the interface this cursor belongs to.
26
+ # @option attributes ox [Fixnum] The offset x coordinate.
27
+ # @option attributes oy [Fixnum] The offset y coordinate.
28
+ # @option attributes repository [Vedeu::Repository]
29
+ # @option attributes state [Boolean|Symbol] The visibility of the cursor, either +true+
30
+ # or +false+, +:hide+ or +:show+.
31
+ # @option attributes x [Fixnum] The terminal x coordinate for the cursor.
32
+ # @option attributes y [Fixnum] The terminal y coordinate for the cursor.
33
+ #
34
+ # @return [Cursor]
35
+ def initialize(attributes = {})
36
+ # Hack because Repository#by_name creates Cursor objects with just a
37
+ # name.
38
+ if attributes.is_a?(String)
39
+ attributes = { name: attributes }
40
+ end
41
+
42
+ @attributes = defaults.merge(attributes)
43
+
44
+ @name = @attributes.fetch(:name)
45
+ @ox = @attributes.fetch(:ox)
46
+ @oy = @attributes.fetch(:oy)
47
+ @repository = @attributes.fetch(:repository)
48
+ @state = Vedeu::Visible.coerce(@attributes.fetch(:state))
49
+ @x = @attributes.fetch(:x)
50
+ @y = @attributes.fetch(:y)
51
+ end
52
+
53
+ # Returns log friendly output.
54
+ #
55
+ # @return [String]
56
+ def inspect
57
+ "<#{self.class.name} (#{@name}: x:#{@x} y:#{@y} ox:#{@ox} oy:#{@oy})>"
58
+ end
59
+
60
+ # Returns an escape sequence to position the cursor and set its visibility.
61
+ # When passed a block, will position the cursor, yield and return the
62
+ # original position.
63
+ #
64
+ # @param block [Proc]
65
+ # @return [String]
66
+ def to_s(&block)
67
+ if block_given?
68
+ [ sequence, yield, sequence ].join
69
+
70
+ else
71
+ sequence
72
+
73
+ end
74
+ end
75
+
76
+ private
77
+
78
+ # The default values for a new instance of this class.
79
+ #
80
+ # @return [Hash]
81
+ def defaults
82
+ {
83
+ name: '',
84
+ ox: 0,
85
+ oy: 0,
86
+ repository: Vedeu.cursors,
87
+ state: Vedeu::Visible.new(false),
88
+ x: 1,
89
+ y: 1,
90
+ }
91
+ end
92
+
93
+ # Returns the escape sequence to position the cursor and set its visibility.
94
+ #
95
+ # @return [String]
96
+ def sequence
97
+ [ position, visibility ].join
98
+ end
99
+
100
+ # Returns the escape sequence for setting the position of the cursor.
101
+ #
102
+ # @return [String]
103
+ def position
104
+ Vedeu::Position.new(y, x).to_s
105
+ end
106
+
107
+ # Returns the escape sequence for setting the visibility of the cursor.
108
+ #
109
+ # @return [String]
110
+ def visibility
111
+ state.cursor
112
+ end
113
+
114
+ end # Cursor
115
+
116
+ end # Vedeu