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