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
@@ -1,209 +0,0 @@
1
- module Vedeu
2
-
3
- # Each interface has its own Cursor which maintains the position and
4
- # visibility of the cursor within that interface.
5
- #
6
- # @api private
7
- class Cursor
8
-
9
- include Model
10
- extend Forwardable
11
-
12
- def_delegators :interface, :top, :right, :bottom, :left
13
-
14
- attr_reader :name, :state
15
-
16
- # Provides a new instance of Cursor.
17
- #
18
- # @param attributes [Hash] The stored attributes for a cursor.
19
- # @option attributes :name [String] The name of the interface this cursor
20
- # belongs to.
21
- # @option attributes :state [Symbol] The visibility of the cursor, either
22
- # +:hide+ or +:show+.
23
- # @option attributes :x [Fixnum] The terminal x coordinate for the cursor.
24
- # @option attributes :y [Fixnum] The terminal y coordinate for the cursor.
25
- #
26
- # @return [Cursor]
27
- def initialize(attributes = {})
28
- @attributes = defaults.merge(attributes)
29
-
30
- @name = @attributes[:name]
31
- @state = @attributes[:state]
32
- @x = @attributes[:x]
33
- @y = @attributes[:y]
34
- end
35
-
36
- # Returns an attribute hash for the current position and visibility of the
37
- # cursor.
38
- #
39
- # @return [Hash]
40
- def attributes
41
- {
42
- name: name,
43
- state: state,
44
- x: x,
45
- y: y,
46
- }
47
- end
48
- alias_method :refresh, :attributes
49
-
50
- # Returns the x coordinate (column/character) of the cursor. Attempts to
51
- # sensibly reposition the cursor if it is currently outside the interface,
52
- # or outside the visible area of the terminal. If the interface has either a
53
- # left or right border, then the cursor will be repositioned to be inside
54
- # the border not on it.
55
- #
56
- # @return [Fixnum]
57
- def x
58
- @x = 1 if @x <= 1
59
- @x = Terminal.width if @x >= Terminal.width
60
-
61
- if border? && border.left? && @x <= (left + 1)
62
- @x = (left + 1)
63
-
64
- elsif @x <= left
65
- @x = left
66
-
67
- elsif border? && border.right? && @x >= (right - 1)
68
- @x = (right - 2)
69
-
70
- elsif @x >= right
71
- @x = right
72
-
73
- else
74
- @x
75
-
76
- end
77
- end
78
-
79
- # Returns the y coordinate (row/line) of the cursor. Attempts to sensibly
80
- # reposition the cursor if it is currently outside the interface, or outside
81
- # the visible area of the terminal. If the interface has either a top or
82
- # bottom border, then the cursor will be repositioned to be inside the
83
- # border not on it.
84
- #
85
- # @return [Fixnum]
86
- def y
87
- @y = 1 if @y <= 1
88
- @y = Terminal.height if @y >= Terminal.height
89
-
90
- if border? && border.top? && @y <= (top + 1)
91
- @y = (top + 1)
92
-
93
- elsif @y <= top
94
- @y = top
95
-
96
- elsif border? && border.bottom? && @y >= (bottom - 1)
97
- @y = (bottom - 2)
98
-
99
- elsif @y >= bottom
100
- @y = bottom
101
-
102
- else
103
- @y
104
-
105
- end
106
- end
107
-
108
- # Make the cursor visible.
109
- #
110
- # @return [Hash]
111
- def show
112
- @state = :show
113
-
114
- store
115
- end
116
-
117
- # Make the cursor invisible.
118
- #
119
- # @return [Hash]
120
- def hide
121
- @state = :hide
122
-
123
- store
124
- end
125
-
126
- # Returns an escape sequence to position the cursor and set its visibility.
127
- # When passed a block, will position the cursor, yield and return the
128
- # original position.
129
- #
130
- # @param block [Proc]
131
- # @return [String]
132
- def to_s(&block)
133
- if block_given?
134
- [ sequence, yield, sequence ].join
135
-
136
- else
137
- sequence
138
-
139
- end
140
- end
141
-
142
- private
143
-
144
- # @return [Class] The repository class for this model.
145
- def repository
146
- Vedeu::Cursors
147
- end
148
-
149
- # Returns the escape sequence to position the cursor and set its visibility.
150
- #
151
- # @return [String]
152
- def sequence
153
- [ position, visibility ].join
154
- end
155
-
156
- # Returns the escape sequence for setting the position of the cursor.
157
- #
158
- # @return [String]
159
- def position
160
- @_position ||= Position.new(y, x).to_s
161
- end
162
-
163
- # Returns the escape sequence for setting the visibility of the cursor.
164
- #
165
- # @return [String]
166
- def visibility
167
- return Esc.string('show_cursor') if state == :show
168
-
169
- Esc.string('hide_cursor')
170
- end
171
-
172
- # Returns a boolean indicating whether the interface has a border.
173
- #
174
- # @return [Boolean]
175
- def border?
176
- border.enabled?
177
- end
178
-
179
- def border
180
- interface.border
181
- end
182
-
183
- # Returns an instance of the associated interface for this cursor, used to
184
- # ensure that {x} and {y} are still 'inside' the interface. A cursor could
185
- # be 'outside' the interface if the terminal has resized, causing the
186
- # geometry of an interface to change and therefore invalidating the cursor's
187
- # position.
188
- #
189
- # @api private
190
- # @return [Interface]
191
- def interface
192
- @interface ||= Interfaces.build(name)
193
- end
194
-
195
- # The default values for a new instance of Cursor.
196
- #
197
- # @return [Hash]
198
- def defaults
199
- {
200
- name: '',
201
- state: :hide,
202
- x: 1,
203
- y: 1,
204
- }
205
- end
206
-
207
- end # Cursor
208
-
209
- end # Vedeu
@@ -1,163 +0,0 @@
1
- module Vedeu
2
-
3
- # An Interface represents a portion of the terminal defined by
4
- # {Vedeu::Geometry}. It is a container for {Vedeu::Line} and {Vedeu::Stream}
5
- # objects.
6
- #
7
- # @api private
8
- class Interface
9
-
10
- include Coercions
11
- include Common
12
- include Model
13
- include Presentation
14
-
15
- extend Forwardable
16
-
17
- def_delegators :geometry, :north, :east, :south, :west, :top, :right,
18
- :bottom, :left, :width, :height, :origin
19
-
20
- attr_reader :attributes, :delay, :group, :name, :parent
21
-
22
- # Builds up a new Interface object and returns the attributes.
23
- #
24
- # @param attributes [Hash]
25
- # @param block [Proc]
26
- # @return [Hash]
27
- def self.build(attributes = {}, &block)
28
- new(attributes, &block).attributes
29
- end
30
-
31
- # @see Vedeu::API#interface
32
- # @param attributes [Hash]
33
- # @param block [Proc]
34
- # @return []
35
- def self.define(attributes = {}, &block)
36
- new(attributes).define(&block)
37
- end
38
-
39
- # Return a new instance of Interface.
40
- #
41
- # @param attributes [Hash]
42
- # @param block [Proc]
43
- # @return [Interface]
44
- def initialize(attributes = {}, &block)
45
- @attributes = defaults.merge(attributes)
46
-
47
- @cursor = @attributes[:cursor]
48
- @delay = @attributes[:delay]
49
- @group = @attributes[:group]
50
- @name = @attributes[:name]
51
- @parent = @attributes[:parent]
52
-
53
- if block_given?
54
- @self_before_instance_eval = eval('self', block.binding)
55
-
56
- instance_eval(&block)
57
- end
58
- end
59
-
60
- # @see Vedeu::API#interface
61
- # @param block [Proc]
62
- # @return [Interface]
63
- def define(&block)
64
- instance_eval(&block) if block_given?
65
-
66
- Registrar.record(attributes)
67
-
68
- self
69
- end
70
-
71
- # Returns an instance of Border.
72
- #
73
- # @return [Border]
74
- def border
75
- @_border ||= Border.new(self, attributes[:border])
76
- end
77
-
78
- # Returns an instance of Cursor.
79
- #
80
- # @return [Cursor]
81
- def cursor
82
- @_cursor ||= Cursor.new({
83
- name: name,
84
- state: attributes[:cursor],
85
- x: geometry.x_position(offset.x),
86
- y: geometry.y_position(offset.y),
87
- })
88
- end
89
-
90
- # Returns a boolean indicating whether this interface is currently in focus.
91
- #
92
- # @return [Boolean]
93
- def in_focus?
94
- Focus.current?(name)
95
- end
96
-
97
- # Returns a collection of lines associated with this interface.
98
- #
99
- # @return [Array]
100
- def lines
101
- @lines ||= Line.coercer(attributes[:lines])
102
- end
103
- alias_method :content, :lines
104
-
105
- # Returns the position and size of the interface.
106
- #
107
- # @return [Geometry]
108
- def geometry
109
- @geometry ||= Geometry.new(attributes[:geometry])
110
- end
111
-
112
- # Returns the current offset for the content within the interface.
113
- #
114
- # @return [Offset]
115
- def offset
116
- @offset ||= Offsets.find_or_create(name)
117
- end
118
-
119
- # Returns the currently visible area of the interface.
120
- #
121
- # @return [Viewport]
122
- def viewport
123
- @_viewport ||= Viewport.show(self)
124
- end
125
-
126
- private
127
-
128
- # @return [Class] The repository class for this model.
129
- def repository
130
- Vedeu::Interfaces
131
- end
132
-
133
- # The default values for a new instance of Interface.
134
- #
135
- # @return [Hash]
136
- def defaults
137
- {
138
- border: {},
139
- colour: {},
140
- cursor: :hide,
141
- delay: 0.0,
142
- geometry: {},
143
- group: '',
144
- lines: [],
145
- name: '',
146
- parent: nil,
147
- style: '',
148
- }
149
- end
150
-
151
- # @param method [Symbol] The name of the method sought.
152
- # @param args [Array] The arguments which the method was to be invoked with.
153
- # @param block [Proc] The optional block provided to the method.
154
- # @return []
155
- def method_missing(method, *args, &block)
156
- Vedeu.log("Interface#method_missing '#{method}' (args: #{args.inspect})")
157
-
158
- @self_before_instance_eval.send(method, *args, &block) if @self_before_instance_eval
159
- end
160
-
161
- end # Interface
162
-
163
- end # Vedeu
@@ -1,111 +0,0 @@
1
- module Vedeu
2
-
3
- # A Keymap is the binding of a keypress to one or more interfaces; or globally
4
- # to perform a client application defined action.
5
- #
6
- # @api private
7
- class Keymap
8
-
9
- include Common
10
- include Model
11
-
12
- attr_reader :attributes
13
-
14
- # Define actions for keypresses for when specific interfaces are in focus.
15
- # Unless an interface is specified, the key will be assumed to be global,
16
- # meaning its action will happen regardless of the interface in focus.
17
- #
18
- # @param name_or_names [String] The name or names of the interface(s) which
19
- # will handle these keys.
20
- # @param block [Proc]
21
- #
22
- # @example
23
- # keys do # => will be global
24
- # key('s') { :something }
25
- # ...
26
- #
27
- # keys 'my_interface' do # => will only function when 'my_interface'
28
- # ... # is in focus
29
- #
30
- # keys('main', 'other') do # => will function for both 'main' and
31
- # ... # 'other' interfaces
32
- #
33
- # keys do
34
- # interface 'my_interface' # => will only function when 'my_interface'
35
- # ... # is in focus
36
- #
37
- # @raise [InvalidSyntax] When the required block is not given.
38
- # @return [Keymap]
39
- def self.keys(*name_or_names, &block)
40
- fail InvalidSyntax, '`keys` requires a block.' unless block_given?
41
-
42
- define({ interfaces: name_or_names }, &block)
43
- end
44
-
45
- # Define a keymap for an interface or interfaces to perform an action when
46
- # a key is pressed whilst an aforementioned interface is in focus.
47
- #
48
- # @param attributes [Hash] The attributes to register the keymap with.
49
- # @option attributes :interfaces [] the interface(s) which will respond to
50
- # the keypress(es)
51
- # @option attributes :keys [] the keypress/action pairs for this keymap
52
- # @param block [Proc]
53
- # @return [Keymap]
54
- def self.define(attributes = {}, &block)
55
- new(attributes).define(&block)
56
- end
57
-
58
- # Instantiate a new instance of the Keymap model.
59
- #
60
- # @param attributes [Hash]
61
- # @return [Keymap]
62
- def initialize(attributes = {})
63
- @attributes = defaults.merge(attributes)
64
- end
65
-
66
- # Adds the attributes to the Keymaps repository.
67
- #
68
- # @param block [Proc]
69
- # @return [Keymap]
70
- def define(&block)
71
- if block_given?
72
- @self_before_instance_eval = eval('self', block.binding)
73
-
74
- instance_eval(&block)
75
- end
76
-
77
- repository.add(attributes)
78
-
79
- self
80
- end
81
-
82
- private
83
-
84
- # @return [Class] The repository class for this model.
85
- def repository
86
- Vedeu::Keymaps
87
- end
88
-
89
- # The default attributes of the Keymap model.
90
- #
91
- # @return [Hash]
92
- def defaults
93
- {
94
- interfaces: [],
95
- keys: [],
96
- }
97
- end
98
-
99
- # @param method [Symbol] The name of the method sought.
100
- # @param args [Array] The arguments which the method was to be invoked with.
101
- # @param block [Proc] The optional block provided to the method.
102
- # @return []
103
- def method_missing(method, *args, &block)
104
- Vedeu.log("Keymap#method_missing '#{method}' (args: #{args.inspect})")
105
-
106
- @self_before_instance_eval.send(method, *args, &block) if @self_before_instance_eval
107
- end
108
-
109
- end # Keymap
110
-
111
- end # Vedeu
@@ -1,91 +0,0 @@
1
- module Vedeu
2
-
3
- # Offset represents the scroll position of the content for an interface. The
4
- # values herein are relative to the geometry of the interface.
5
- #
6
- # @note (to self) An offset is a position. A cursor resides at a position in
7
- # an interface, ergo we can calculate cursors based from offsets. Also, we
8
- # could rename Offset to Position, then kill Cursor, Cursors, and the old
9
- # Position class.
10
- #
11
- # @api private
12
- class Offset
13
-
14
- include Model
15
-
16
- attr_reader :name
17
-
18
- # Returns a new instance of Offset.
19
- #
20
- # @param attributes [Hash]
21
- # @return [Offset]
22
- def initialize(attributes = {})
23
- @attributes = defaults.merge(attributes)
24
- @name = @attributes[:name]
25
- @y = @attributes[:y]
26
- @x = @attributes[:x]
27
- end
28
-
29
- # Return a convenient hash of the current values of this instance.
30
- #
31
- # @return [Hash]
32
- def attributes
33
- {
34
- name: name,
35
- y: y,
36
- x: x,
37
- }
38
- end
39
-
40
- # Adjusts the offset using the relative values provided, and updates the
41
- # stored attributes. The values passed are -1, 0 or 1.
42
- #
43
- # @param relative_y [Fixnum] Move up (-1), or down (1), or no action (0).
44
- # @param relative_x [Fixnum] Move left (-1), or right (1), or no action (0).
45
- # @return [Offset]
46
- def move(relative_y, relative_x)
47
- @y += relative_y
48
- @x += relative_x
49
-
50
- store
51
- end
52
-
53
- # Returns the current x offset, correcting to 0 if less than 0.
54
- #
55
- # @return [Fixnum]
56
- def x
57
- return @x = 0 if @x <= 0
58
-
59
- @x
60
- end
61
-
62
- # Returns the current y offset, correcting to 0 if less than 0.
63
- #
64
- # @return [Fixnum]
65
- def y
66
- return @y = 0 if @y <= 0
67
-
68
- @y
69
- end
70
-
71
- private
72
-
73
- # @return [Class] The repository class for this model.
74
- def repository
75
- Vedeu::Offsets
76
- end
77
-
78
- # Return the default values for an instance of Offset.
79
- #
80
- # @return [Hash]
81
- def defaults
82
- {
83
- name: '',
84
- y: 0,
85
- x: 0,
86
- }
87
- end
88
-
89
- end # Offset
90
-
91
- end # Vedeu
@@ -1,69 +0,0 @@
1
- module Vedeu
2
-
3
- # Repository for storing and retrieving content offsets; i.e. scroll
4
- # position for a named interface.
5
- #
6
- # @api private
7
- module Offsets
8
-
9
- include Repository
10
- extend self
11
-
12
- # Add or update the offset coordinates.
13
- #
14
- # @param attributes [Hash]
15
- # @return [Offset]
16
- def add(attributes)
17
- validate_attributes!(attributes)
18
-
19
- Vedeu.log("#{action(__callee__)} positional (#{model}): " \
20
- "'#{attributes[:name]}'")
21
-
22
- model.new(attributes).store
23
- end
24
- alias_method :update, :add
25
-
26
- # @return [Array]
27
- def down
28
- move(1, 0)
29
- end
30
-
31
- # @return [Array]
32
- def up
33
- move(-1, 0)
34
- end
35
-
36
- # @return [Array]
37
- def right
38
- move(0, 1)
39
- end
40
-
41
- # @return [Array]
42
- def left
43
- move(0, -1)
44
- end
45
-
46
- private
47
-
48
- # @param y [Fixnum]
49
- # @param x [Fixnum]
50
- # @return [Array]
51
- def move(y, x)
52
- find_or_create(Focus.current).move(y, x)
53
-
54
- Focus.refresh
55
- end
56
-
57
- # @return [Class] The model class for this repository.
58
- def model
59
- Vedeu::Offset
60
- end
61
-
62
- # @return [Hash]
63
- def in_memory
64
- {}
65
- end
66
-
67
- end # Offsets
68
-
69
- end # Vedeu
@@ -1,34 +0,0 @@
1
- module Vedeu
2
-
3
- # Raised with Vedeu attempts to access a named model that does not exist.
4
- ModelNotFound = Class.new(StandardError)
5
-
6
- # Raised when Vedeu attempts to parse a {Vedeu.view} or {Vedeu.interface} and
7
- # encounters a problem.
8
- InvalidSyntax = Class.new(StandardError)
9
-
10
- # Raised when attempting to assign a key which is already in use.
11
- KeyInUse = Class.new(StandardError)
12
-
13
- # Raised when the attributes argument to {Vedeu::Registrar} does not contain
14
- # a required key or the value to that key is nil or empty.
15
- MissingRequired = Class.new(StandardError)
16
-
17
- # Raised intentionally when the client application wishes to switch between
18
- # cooked and raw (or vice versa) terminal modes. Vedeu is hard-wired to use
19
- # the `Escape` key to trigger this change for the time being.
20
- ModeSwitch = Class.new(StandardError)
21
-
22
- # Raised when attempting to reach the currently in focus interface, when no
23
- # interfaces have been defined yet.
24
- NoInterfacesDefined = Class.new(StandardError)
25
-
26
- # Raised to remind me (or client application developers) that the subclass
27
- # implements the functionality sought.
28
- NotImplemented = Class.new(StandardError)
29
-
30
- # Raised when trying to access an interface column less than 1 or greater
31
- # than 12. Vedeu is hard-wired to a 12-column layout for the time being.
32
- OutOfRange = Class.new(StandardError)
33
-
34
- end # Vedeu