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,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