vedeu 0.2.12 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/Guardfile +13 -0
  4. data/README.md +11 -9
  5. data/Rakefile +10 -1
  6. data/bin/vedeu_test +14 -0
  7. data/config/cucumber.yml +8 -0
  8. data/docs/api.md +45 -16
  9. data/docs/events.md +21 -9
  10. data/docs/getting_started.md +16 -0
  11. data/docs/views.md +158 -0
  12. data/examples/borders_app.rb +236 -110
  13. data/examples/colour_support.sh +98 -0
  14. data/examples/colours_app.rb +41 -0
  15. data/examples/configuration_app.rb +11 -6
  16. data/examples/cursor_app.rb +60 -61
  17. data/examples/focus_app.rb +72 -34
  18. data/examples/hello_world.rb +13 -8
  19. data/examples/lines_app.rb +37 -28
  20. data/features/start_stop.feature +27 -0
  21. data/features/support/env.rb +14 -0
  22. data/lib/vedeu/all.rb +29 -0
  23. data/lib/vedeu/api.rb +39 -0
  24. data/lib/vedeu/application.rb +15 -7
  25. data/lib/vedeu/bindings.rb +121 -0
  26. data/lib/vedeu/buffers/all.rb +10 -0
  27. data/lib/vedeu/{repositories/models → buffers}/buffer.rb +47 -64
  28. data/lib/vedeu/buffers/display_buffer.rb +118 -0
  29. data/lib/vedeu/configuration/all.rb +6 -0
  30. data/lib/vedeu/configuration/api.rb +3 -1
  31. data/lib/vedeu/configuration/cli.rb +3 -1
  32. data/lib/vedeu/configuration/configuration.rb +23 -2
  33. data/lib/vedeu/cursor/all.rb +23 -0
  34. data/lib/vedeu/cursor/cursor.rb +116 -0
  35. data/lib/vedeu/cursor/move_cursor.rb +137 -0
  36. data/lib/vedeu/cursor/toggle_cursor.rb +53 -0
  37. data/lib/vedeu/dsl/all.rb +28 -0
  38. data/lib/vedeu/dsl/components/all.rb +7 -0
  39. data/lib/vedeu/dsl/components/border.rb +104 -0
  40. data/lib/vedeu/dsl/components/geometry.rb +153 -0
  41. data/lib/vedeu/dsl/components/keymap.rb +93 -0
  42. data/lib/vedeu/dsl/components/menu.rb +82 -0
  43. data/lib/vedeu/dsl/composition.rb +72 -0
  44. data/lib/vedeu/dsl/interface.rb +210 -0
  45. data/lib/vedeu/dsl/line.rb +135 -0
  46. data/lib/vedeu/dsl/shared/all.rb +7 -0
  47. data/lib/vedeu/dsl/shared/colour.rb +85 -0
  48. data/lib/vedeu/dsl/shared/style.rb +38 -0
  49. data/lib/vedeu/dsl/shared/text.rb +102 -0
  50. data/lib/vedeu/dsl/shared/use.rb +47 -0
  51. data/lib/vedeu/dsl/stream.rb +49 -0
  52. data/lib/vedeu/dsl/view.rb +136 -0
  53. data/lib/vedeu/events/all.rb +10 -0
  54. data/lib/vedeu/{repositories/models → events}/event.rb +97 -8
  55. data/lib/vedeu/events/trigger.rb +58 -0
  56. data/lib/vedeu/exceptions.rb +34 -0
  57. data/lib/vedeu/input/all.rb +29 -0
  58. data/lib/vedeu/input/input.rb +26 -0
  59. data/lib/vedeu/{models → input}/key.rb +21 -11
  60. data/lib/vedeu/input/keymap.rb +130 -0
  61. data/lib/vedeu/input/keys.rb +8 -0
  62. data/lib/vedeu/input/mapper.rb +112 -0
  63. data/lib/vedeu/launcher.rb +7 -4
  64. data/lib/vedeu/models/all.rb +12 -0
  65. data/lib/vedeu/models/collection.rb +71 -0
  66. data/lib/vedeu/{repositories → models}/focus.rb +63 -21
  67. data/lib/vedeu/models/geometry.rb +100 -259
  68. data/lib/vedeu/{repositories/models → models}/group.rb +16 -14
  69. data/lib/vedeu/{repositories/models → models}/menu.rb +85 -22
  70. data/lib/vedeu/models/model.rb +51 -0
  71. data/lib/vedeu/models/view/all.rb +12 -0
  72. data/lib/vedeu/models/view/char.rb +84 -0
  73. data/lib/vedeu/models/view/chars.rb +8 -0
  74. data/lib/vedeu/models/view/composition.rb +101 -0
  75. data/lib/vedeu/models/view/interface.rb +215 -0
  76. data/lib/vedeu/models/view/interfaces.rb +8 -0
  77. data/lib/vedeu/models/view/line.rb +134 -0
  78. data/lib/vedeu/models/view/lines.rb +8 -0
  79. data/lib/vedeu/models/view/stream.rb +144 -0
  80. data/lib/vedeu/models/view/streams.rb +8 -0
  81. data/lib/vedeu/output/all.rb +8 -0
  82. data/lib/vedeu/output/border.rb +387 -0
  83. data/lib/vedeu/output/compositor.rb +41 -30
  84. data/lib/vedeu/output/output.rb +6 -13
  85. data/lib/vedeu/output/viewport.rb +78 -94
  86. data/lib/vedeu/output/writer.rb +29 -0
  87. data/lib/vedeu/presentation/all.rb +9 -0
  88. data/lib/vedeu/{colours → presentation}/background.rb +1 -9
  89. data/lib/vedeu/{colours → presentation}/colour.rb +21 -8
  90. data/lib/vedeu/{colours → presentation}/foreground.rb +5 -9
  91. data/lib/vedeu/presentation/presentation.rb +91 -0
  92. data/lib/vedeu/presentation/style.rb +47 -0
  93. data/lib/vedeu/{colours → presentation}/translator.rb +11 -5
  94. data/lib/vedeu/repositories/all.rb +5 -0
  95. data/lib/vedeu/repositories/menus.rb +5 -42
  96. data/lib/vedeu/{support → repositories}/repository.rb +78 -41
  97. data/lib/vedeu/support/all.rb +22 -0
  98. data/lib/vedeu/support/bounding_area.rb +2 -1
  99. data/lib/vedeu/support/coercions.rb +18 -1
  100. data/lib/vedeu/support/console.rb +73 -0
  101. data/lib/vedeu/support/content_geometry.rb +69 -0
  102. data/lib/vedeu/support/coordinate.rb +246 -0
  103. data/lib/vedeu/support/esc.rb +29 -2
  104. data/lib/vedeu/support/log.rb +36 -2
  105. data/lib/vedeu/support/node.rb +61 -0
  106. data/lib/vedeu/support/position.rb +28 -13
  107. data/lib/vedeu/support/position_validator.rb +79 -0
  108. data/lib/vedeu/support/read.rb +65 -0
  109. data/lib/vedeu/support/refresh.rb +8 -32
  110. data/lib/vedeu/support/terminal.rb +34 -4
  111. data/lib/vedeu/support/text.rb +104 -0
  112. data/lib/vedeu/support/trace.rb +11 -23
  113. data/lib/vedeu/support/visible.rb +75 -0
  114. data/lib/vedeu/support/write.rb +85 -0
  115. data/lib/vedeu/traps.rb +18 -0
  116. data/lib/vedeu.rb +41 -101
  117. data/test/integration/dsl/compositions_test.rb +27 -0
  118. data/test/integration/dsl/interfaces_test.rb +261 -0
  119. data/test/integration/dsl/keymaps_test.rb +42 -0
  120. data/test/integration/dsl/lines_test.rb +146 -0
  121. data/test/integration/dsl/menus_test.rb +59 -0
  122. data/test/integration/dsl/streams_test.rb +129 -0
  123. data/test/integration/dsl/views_test.rb +63 -0
  124. data/test/lib/vedeu/api_test.rb +163 -0
  125. data/test/lib/vedeu/application_test.rb +19 -10
  126. data/test/lib/vedeu/bindings_test.rb +54 -0
  127. data/test/lib/vedeu/buffers/all_test.rb +11 -0
  128. data/test/lib/vedeu/buffers/buffer_test.rb +196 -0
  129. data/test/lib/vedeu/buffers/display_buffer_test.rb +58 -0
  130. data/test/lib/vedeu/configuration/api_test.rb +42 -58
  131. data/test/lib/vedeu/configuration/cli_test.rb +4 -4
  132. data/test/lib/vedeu/configuration/configuration_test.rb +11 -29
  133. data/test/lib/vedeu/cursor/all_test.rb +33 -0
  134. data/test/lib/vedeu/cursor/cursor_test.rb +85 -0
  135. data/test/lib/vedeu/cursor/move_cursor_test.rb +212 -0
  136. data/test/lib/vedeu/cursor/toggle_cursor_test.rb +63 -0
  137. data/test/lib/vedeu/dsl/components/border_test.rb +414 -0
  138. data/test/lib/vedeu/dsl/components/geometry_test.rb +231 -0
  139. data/test/lib/vedeu/dsl/components/keymap_test.rb +80 -0
  140. data/test/lib/vedeu/dsl/components/menu_test.rb +115 -0
  141. data/test/lib/vedeu/dsl/composition_test.rb +41 -0
  142. data/test/lib/vedeu/dsl/interface_test.rb +470 -0
  143. data/test/lib/vedeu/dsl/line_test.rb +60 -0
  144. data/test/lib/vedeu/dsl/shared/colour_test.rb +100 -0
  145. data/test/lib/vedeu/dsl/shared/style_test.rb +22 -0
  146. data/test/lib/vedeu/dsl/shared/text_test.rb +15 -0
  147. data/test/lib/vedeu/dsl/shared/use_test.rb +27 -0
  148. data/test/lib/vedeu/dsl/stream_test.rb +26 -0
  149. data/test/lib/vedeu/dsl/view_test.rb +73 -0
  150. data/test/lib/vedeu/events/all_test.rb +11 -0
  151. data/test/lib/vedeu/events/event_test.rb +109 -0
  152. data/test/lib/vedeu/events/trigger_test.rb +60 -0
  153. data/test/lib/vedeu/input/all_test.rb +11 -0
  154. data/test/lib/vedeu/input/input_test.rb +7 -3
  155. data/test/lib/vedeu/input/key_test.rb +72 -0
  156. data/test/lib/vedeu/input/keymap_test.rb +89 -0
  157. data/test/lib/vedeu/input/mapper_test.rb +94 -0
  158. data/test/lib/vedeu/launcher_test.rb +19 -20
  159. data/test/lib/vedeu/models/collection_test.rb +114 -0
  160. data/test/lib/vedeu/{repositories → models}/focus_test.rb +46 -13
  161. data/test/lib/vedeu/models/geometry_test.rb +35 -39
  162. data/test/lib/vedeu/models/group_test.rb +100 -0
  163. data/test/lib/vedeu/models/menu_test.rb +288 -0
  164. data/test/lib/vedeu/models/model_test.rb +31 -0
  165. data/test/lib/vedeu/models/view/char_test.rb +166 -0
  166. data/test/lib/vedeu/models/view/chars_test.rb +18 -0
  167. data/test/lib/vedeu/models/view/composition_test.rb +41 -0
  168. data/test/lib/vedeu/models/view/interface_test.rb +128 -0
  169. data/test/lib/vedeu/models/view/interfaces_test.rb +18 -0
  170. data/test/lib/vedeu/models/view/line_test.rb +214 -0
  171. data/test/lib/vedeu/models/view/lines_test.rb +18 -0
  172. data/test/lib/vedeu/models/view/stream_test.rb +106 -0
  173. data/test/lib/vedeu/models/view/streams_test.rb +18 -0
  174. data/test/lib/vedeu/output/border_test.rb +357 -0
  175. data/test/lib/vedeu/output/compositor_test.rb +61 -15
  176. data/test/lib/vedeu/output/output_test.rb +25 -84
  177. data/test/lib/vedeu/output/viewport_test.rb +171 -45
  178. data/test/lib/vedeu/output/writer_test.rb +45 -0
  179. data/test/lib/vedeu/{colours → presentation}/background_test.rb +0 -0
  180. data/test/lib/vedeu/{colours → presentation}/colour_test.rb +5 -5
  181. data/test/lib/vedeu/{colours → presentation}/foreground_test.rb +0 -0
  182. data/test/lib/vedeu/presentation/presentation_test.rb +56 -0
  183. data/test/lib/vedeu/presentation/style_test.rb +69 -0
  184. data/test/lib/vedeu/presentation/translator_test.rb +63 -0
  185. data/test/lib/vedeu/repositories/all_test.rb +7 -0
  186. data/test/lib/vedeu/repositories/menus_test.rb +3 -156
  187. data/test/lib/vedeu/repositories/repository_test.rb +271 -0
  188. data/test/lib/vedeu/support/bounding_area_test.rb +3 -3
  189. data/test/lib/vedeu/support/coercions_test.rb +39 -0
  190. data/test/lib/vedeu/support/common_test.rb +31 -16
  191. data/test/lib/vedeu/support/console_test.rb +85 -0
  192. data/test/lib/vedeu/support/content_geometry_test.rb +107 -0
  193. data/test/lib/vedeu/support/coordinate_test.rb +190 -0
  194. data/test/lib/vedeu/support/esc_test.rb +18 -0
  195. data/test/lib/vedeu/support/grid_test.rb +15 -10
  196. data/test/lib/vedeu/support/log_test.rb +3 -0
  197. data/test/lib/vedeu/support/position_test.rb +22 -2
  198. data/test/lib/vedeu/support/position_validator_test.rb +11 -0
  199. data/test/lib/vedeu/support/read_test.rb +88 -0
  200. data/test/lib/vedeu/support/refresh_test.rb +44 -12
  201. data/test/lib/vedeu/support/sentence_test.rb +6 -4
  202. data/test/lib/vedeu/support/terminal_test.rb +81 -70
  203. data/test/lib/vedeu/support/text_test.rb +93 -0
  204. data/test/lib/vedeu/support/trace_test.rb +21 -9
  205. data/test/lib/vedeu/support/visible_test.rb +148 -0
  206. data/test/lib/vedeu/support/write_test.rb +136 -0
  207. data/test/lib/vedeu/traps_test.rb +11 -0
  208. data/test/lib/vedeu_test.rb +2 -0
  209. data/test/support/helpers/all.rb +7 -0
  210. data/test/support/helpers/dsl_model_test_class.rb +25 -0
  211. data/test/support/{test_classes → helpers}/helpers.rb +0 -2
  212. data/test/support/helpers/misc.rb +15 -0
  213. data/test/support/helpers/model_test_class.rb +34 -0
  214. data/test/support/{test_classes → helpers}/presentation.rb +0 -0
  215. data/test/support/{test_classes → helpers}/repositories.rb +3 -3
  216. data/test/support/{test_modules/repository.rb → helpers/repository_test_module.rb} +5 -1
  217. data/test/test_helper.rb +19 -22
  218. data/vedeu.gemspec +11 -6
  219. metadata +322 -181
  220. data/lib/vedeu/api/api.rb +0 -239
  221. data/lib/vedeu/api/composition.rb +0 -38
  222. data/lib/vedeu/api/defined.rb +0 -52
  223. data/lib/vedeu/api/helpers.rb +0 -161
  224. data/lib/vedeu/api/interface.rb +0 -287
  225. data/lib/vedeu/api/keymap.rb +0 -75
  226. data/lib/vedeu/api/line.rb +0 -107
  227. data/lib/vedeu/api/menu.rb +0 -111
  228. data/lib/vedeu/api/stream.rb +0 -96
  229. data/lib/vedeu/models/border.rb +0 -238
  230. data/lib/vedeu/models/char.rb +0 -43
  231. data/lib/vedeu/models/composition.rb +0 -72
  232. data/lib/vedeu/models/line.rb +0 -100
  233. data/lib/vedeu/models/stream.rb +0 -130
  234. data/lib/vedeu/models/style.rb +0 -52
  235. data/lib/vedeu/repositories/buffers.rb +0 -52
  236. data/lib/vedeu/repositories/cursors.rb +0 -64
  237. data/lib/vedeu/repositories/events.rb +0 -147
  238. data/lib/vedeu/repositories/groups.rb +0 -47
  239. data/lib/vedeu/repositories/interfaces.rb +0 -78
  240. data/lib/vedeu/repositories/keymaps.rb +0 -196
  241. data/lib/vedeu/repositories/models/cursor.rb +0 -209
  242. data/lib/vedeu/repositories/models/interface.rb +0 -163
  243. data/lib/vedeu/repositories/models/keymap.rb +0 -111
  244. data/lib/vedeu/repositories/models/offset.rb +0 -91
  245. data/lib/vedeu/repositories/offsets.rb +0 -69
  246. data/lib/vedeu/support/exceptions.rb +0 -34
  247. data/lib/vedeu/support/keymap_validator.rb +0 -100
  248. data/lib/vedeu/support/model.rb +0 -14
  249. data/lib/vedeu/support/presentation.rb +0 -86
  250. data/lib/vedeu/support/registrar.rb +0 -53
  251. data/test/integration/api/api_test.rb +0 -97
  252. data/test/integration/api_dsl/dsl_api_test.rb +0 -4
  253. data/test/integration/api_dsl/dsl_composition_test.rb +0 -4
  254. data/test/integration/api_dsl/dsl_defined_test.rb +0 -4
  255. data/test/integration/api_dsl/dsl_helpers_test.rb +0 -4
  256. data/test/integration/api_dsl/dsl_interface_test.rb +0 -4
  257. data/test/integration/api_dsl/dsl_keymap.rb +0 -4
  258. data/test/integration/api_dsl/dsl_line_test.rb +0 -4
  259. data/test/integration/api_dsl/dsl_menu_test.rb +0 -4
  260. data/test/integration/api_dsl/dsl_stream_test.rb +0 -138
  261. data/test/integration/cursors_test.rb +0 -9
  262. data/test/integration/defining_interfaces_test.rb +0 -26
  263. data/test/integration/run_once_test.rb +0 -26
  264. data/test/integration/views/basic_view_test.rb +0 -807
  265. data/test/lib/vedeu/api/api_test.rb +0 -204
  266. data/test/lib/vedeu/api/composition_test.rb +0 -31
  267. data/test/lib/vedeu/api/defined_test.rb +0 -79
  268. data/test/lib/vedeu/api/helpers_test.rb +0 -111
  269. data/test/lib/vedeu/api/interface_test.rb +0 -410
  270. data/test/lib/vedeu/api/keymap_test.rb +0 -65
  271. data/test/lib/vedeu/api/line_test.rb +0 -83
  272. data/test/lib/vedeu/api/menu_test.rb +0 -85
  273. data/test/lib/vedeu/api/stream_test.rb +0 -59
  274. data/test/lib/vedeu/colours/translator_test.rb +0 -22
  275. data/test/lib/vedeu/models/border_test.rb +0 -197
  276. data/test/lib/vedeu/models/char_test.rb +0 -52
  277. data/test/lib/vedeu/models/composition_test.rb +0 -45
  278. data/test/lib/vedeu/models/key_test.rb +0 -43
  279. data/test/lib/vedeu/models/line_test.rb +0 -123
  280. data/test/lib/vedeu/models/stream_test.rb +0 -233
  281. data/test/lib/vedeu/models/style_test.rb +0 -59
  282. data/test/lib/vedeu/repositories/buffers_test.rb +0 -37
  283. data/test/lib/vedeu/repositories/cursors_test.rb +0 -62
  284. data/test/lib/vedeu/repositories/events_test.rb +0 -57
  285. data/test/lib/vedeu/repositories/groups_test.rb +0 -28
  286. data/test/lib/vedeu/repositories/interfaces_test.rb +0 -51
  287. data/test/lib/vedeu/repositories/keymaps_test.rb +0 -223
  288. data/test/lib/vedeu/repositories/models/buffer_test.rb +0 -174
  289. data/test/lib/vedeu/repositories/models/cursor_test.rb +0 -158
  290. data/test/lib/vedeu/repositories/models/event_test.rb +0 -53
  291. data/test/lib/vedeu/repositories/models/group_test.rb +0 -98
  292. data/test/lib/vedeu/repositories/models/interface_test.rb +0 -130
  293. data/test/lib/vedeu/repositories/models/keymap_test.rb +0 -27
  294. data/test/lib/vedeu/repositories/models/menu_test.rb +0 -246
  295. data/test/lib/vedeu/repositories/models/offset_test.rb +0 -128
  296. data/test/lib/vedeu/repositories/offsets_test.rb +0 -39
  297. data/test/lib/vedeu/support/keymap_validator_test.rb +0 -62
  298. data/test/lib/vedeu/support/model_test.rb +0 -23
  299. data/test/lib/vedeu/support/presentation_test.rb +0 -53
  300. data/test/lib/vedeu/support/registrar_test.rb +0 -94
  301. data/test/lib/vedeu/support/repository_test.rb +0 -208
  302. data/test/support/test_classes/all.rb +0 -5
  303. data/test/support/test_classes/coercions.rb +0 -16
  304. data/test/support/test_classes/model.rb +0 -23
  305. data/test/support/test_modules/all.rb +0 -1
@@ -0,0 +1,137 @@
1
+ require 'vedeu/cursor/cursor'
2
+ require 'vedeu/support/position_validator'
3
+
4
+ module Vedeu
5
+
6
+ # Adjusts the position of the cursor.
7
+ #
8
+ class MoveCursor
9
+
10
+ extend Forwardable
11
+
12
+ def_delegators :@interface, :border,
13
+ :border?,
14
+ :geometry
15
+
16
+ def_delegators :geometry, :left,
17
+ :top,
18
+ :height,
19
+ :width,
20
+ :x,
21
+ :y
22
+
23
+ # @param cursor [Cursor]
24
+ # @param interface [Interface]
25
+ # @param dy [Fixnum] Move up (-1), or down (1), or no action (0).
26
+ # @param dx [Fixnum] Move left (-1), or right (1), or no action (0).
27
+ # @return [MoveCursor]
28
+ def initialize(cursor, interface, dy, dx)
29
+ @cursor = cursor
30
+ @dy = dy
31
+ @dx = dx
32
+ @interface = interface
33
+ end
34
+
35
+ # Moves the cursor down by one row.
36
+ #
37
+ # @return [Cursor]
38
+ def self.down(cursor, interface)
39
+ new(cursor, interface, 1, 0).move
40
+ end
41
+
42
+ # Moves the cursor left by one column.
43
+ #
44
+ # @return [Cursor]
45
+ def self.left(cursor, interface)
46
+ return cursor unless cursor.ox > 0
47
+
48
+ new(cursor, interface, 0, -1).move
49
+ end
50
+
51
+ # Moves the cursor right by one column.
52
+ #
53
+ # @return [Cursor]
54
+ def self.right(cursor, interface)
55
+ new(cursor, interface, 0, 1).move
56
+ end
57
+
58
+ # Moves the cursor up by one row.
59
+ #
60
+ # @return [Cursor]
61
+ def self.up(cursor, interface)
62
+ return cursor unless cursor.oy > 0
63
+
64
+ new(cursor, interface, -1, 0).move
65
+ end
66
+
67
+ # Moves the cursor to the top left coordinate of the interface.
68
+ #
69
+ # @return [Cursor]
70
+ def self.origin(cursor, interface)
71
+ new(cursor, interface, (0 - cursor.y), (0 - cursor.x)).move
72
+ end
73
+
74
+ # Returns a newly positioned and stored Cursor.
75
+ #
76
+ # @return [Cursor]
77
+ def move
78
+ Cursor.new(cursor.attributes.merge(moved_attributes)).store
79
+ end
80
+
81
+ private
82
+
83
+ attr_reader :cursor, :dx, :dy, :interface
84
+
85
+ # @return [Hash]
86
+ def moved_attributes
87
+ {
88
+ x: validator.x,
89
+ y: validator.y,
90
+ ox: ox,
91
+ oy: oy,
92
+ }
93
+ end
94
+
95
+ # @return [PositionValidator]
96
+ def validator
97
+ @validator ||= Vedeu::PositionValidator.validate(interface,
98
+ coordinate.x_position(ox),
99
+ coordinate.y_position(oy))
100
+ end
101
+
102
+ # @return [Fixnum]
103
+ def ox
104
+ ox = cursor.ox + dx
105
+ ox = 0 if ox < 0
106
+ ox
107
+ end
108
+
109
+ # @return [Fixnum]
110
+ def oy
111
+ oy = cursor.oy + dy
112
+ oy = 0 if oy < 0
113
+ oy
114
+ end
115
+
116
+ # @return [Coordinate]
117
+ def coordinate
118
+ @coordinate ||= Coordinate.new(bordered_height, bordered_width, left, top)
119
+ end
120
+
121
+ # @return [Fixnum]
122
+ def bordered_height
123
+ return border.height if border?
124
+
125
+ height
126
+ end
127
+
128
+ # @return [Fixnum]
129
+ def bordered_width
130
+ return border.width if border?
131
+
132
+ width
133
+ end
134
+
135
+ end # MoveCursor
136
+
137
+ end # Vedeu
@@ -0,0 +1,53 @@
1
+ module Vedeu
2
+
3
+ # Adjusts the visibility of the cursor.
4
+ #
5
+ class ToggleCursor
6
+
7
+ # @param cursor [Cursor]
8
+ # @return [ToggleCursor]
9
+ def initialize(cursor)
10
+ @cursor = cursor
11
+ end
12
+
13
+ # Hides the cursor.
14
+ #
15
+ # @param cursor [Cursor]
16
+ # @return [Cursor]
17
+ def self.hide(cursor)
18
+ return cursor if cursor.invisible?
19
+
20
+ new(cursor).hide
21
+ end
22
+
23
+ # Shows the cursor.
24
+ #
25
+ # @param cursor [Cursor]
26
+ # @return [Cursor]
27
+ def self.show(cursor)
28
+ return cursor if cursor.visible?
29
+
30
+ new(cursor).show
31
+ end
32
+
33
+ # Hides the cursor.
34
+ #
35
+ # @return [Cursor]
36
+ def hide
37
+ cursor.class.new(cursor.attributes.merge({ state: false })).store
38
+ end
39
+
40
+ # Shows the cursor.
41
+ #
42
+ # @return [Cursor]
43
+ def show
44
+ cursor.class.new(cursor.attributes.merge({ state: true })).store
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :cursor
50
+
51
+ end # ToggleCursor
52
+
53
+ end # Vedeu
@@ -0,0 +1,28 @@
1
+ require 'vedeu/dsl/components/all'
2
+ require 'vedeu/dsl/shared/all'
3
+
4
+ require 'vedeu/dsl/composition'
5
+ require 'vedeu/dsl/interface'
6
+ require 'vedeu/dsl/line'
7
+ require 'vedeu/dsl/stream'
8
+ require 'vedeu/dsl/view'
9
+
10
+ module Vedeu
11
+
12
+ module DSL
13
+
14
+ # Attempts to find the missing method on the client object.
15
+ #
16
+ # @param method [Symbol] The name of the method sought.
17
+ # @param args [Array] The arguments which the method was to be invoked with.
18
+ # @param block [Proc] The optional block provided to the method.
19
+ # @return []
20
+ def method_missing(method, *args, &block)
21
+ Vedeu.log("!!!method_missing '#{method}'")
22
+
23
+ client.send(method, *args, &block) if client
24
+ end
25
+
26
+ end # DSL
27
+
28
+ end # Vedeu
@@ -0,0 +1,7 @@
1
+ require 'vedeu/dsl/components/border'
2
+ require 'vedeu/dsl/components/geometry'
3
+ require 'vedeu/dsl/components/keymap'
4
+ require 'vedeu/dsl/components/menu'
5
+
6
+ module Vedeu
7
+ end # Vedeu
@@ -0,0 +1,104 @@
1
+ require 'vedeu/dsl/shared/all'
2
+
3
+ module Vedeu
4
+
5
+ module DSL
6
+
7
+ # DSL for creating borders for interfaces.
8
+ #
9
+ # Allows customisation for the border's sides and corners; a custom
10
+ # foreground and background, style, and whether a particular side should be
11
+ # drawn or not.
12
+ class Border
13
+
14
+ include Vedeu::DSL
15
+ include Vedeu::DSL::Colour
16
+ include Vedeu::DSL::Style
17
+
18
+ # Returns an instance of DSL::Border.
19
+ #
20
+ # @param model [Border]
21
+ def initialize(model, client = nil)
22
+ @model = model
23
+ @client = client
24
+ end
25
+
26
+ # @param char [String] Character to be used as the bottom left border
27
+ # character.
28
+ # @return [String]
29
+ def bottom_left(char)
30
+ model.attributes[:bottom_left] = char
31
+ end
32
+
33
+ # @param char [String] Character to be used as the bottom right border
34
+ # character.
35
+ # @return [String]
36
+ def bottom_right(char)
37
+ model.attributes[:bottom_right] = char
38
+ end
39
+
40
+ # @param char [String] Character to be used as the horizontal border
41
+ # character.
42
+ # @return [String]
43
+ def horizontal(char)
44
+ model.attributes[:horizontal] = char
45
+ end
46
+
47
+ # @param boolean [Boolean] All values evaluate as true except nil and
48
+ # false.
49
+ # @return [Boolean]
50
+ def show_bottom(boolean)
51
+ model.attributes[:show_bottom] = !!boolean
52
+ end
53
+
54
+ # @param boolean [Boolean] All values evaluate as true except nil and
55
+ # false.
56
+ # @return [Boolean]
57
+ def show_left(boolean)
58
+ model.attributes[:show_left] = !!boolean
59
+ end
60
+
61
+ # @param boolean [Boolean] All values evaluate as true except nil and
62
+ # false.
63
+ # @return [Boolean]
64
+ def show_right(boolean)
65
+ model.attributes[:show_right] = !!boolean
66
+ end
67
+
68
+ # @param boolean [Boolean] All values evaluate as true except nil and
69
+ # false.
70
+ # @return [Boolean]
71
+ def show_top(boolean)
72
+ model.attributes[:show_top] = !!boolean
73
+ end
74
+
75
+ # @param char [String] Character to be used as the top left border
76
+ # character.
77
+ # @return [String]
78
+ def top_left(char)
79
+ model.attributes[:top_left] = char
80
+ end
81
+
82
+ # @param char [String] Character to be used as the top right border
83
+ # character.
84
+ # @return [String]
85
+ def top_right(char)
86
+ model.attributes[:top_right] = char
87
+ end
88
+
89
+ # @param char [String] Character to be used as the vertical border
90
+ # character.
91
+ # @return [String]
92
+ def vertical(char)
93
+ model.attributes[:vertical] = char
94
+ end
95
+
96
+ private
97
+
98
+ attr_reader :client, :model
99
+
100
+ end # Border
101
+
102
+ end # DSL
103
+
104
+ end # Vedeu
@@ -0,0 +1,153 @@
1
+ require 'vedeu/dsl/shared/use'
2
+
3
+ module Vedeu
4
+
5
+ module DSL
6
+
7
+ # Provide DSL methods for configuring the geometry of an interface.
8
+ #
9
+ class Geometry
10
+
11
+ include Vedeu::DSL
12
+ include Vedeu::DSL::Use
13
+
14
+ class << self
15
+
16
+ def geometry(name, &block)
17
+ fail InvalidSyntax, 'block not given' unless block_given?
18
+
19
+ Vedeu::Geometry.build({ name: name }, &block).store
20
+ end
21
+
22
+ end
23
+
24
+ # Returns an instance of DSL::Geometry.
25
+ #
26
+ # @param model [Geometry]
27
+ def initialize(model, client = nil)
28
+ @model = model
29
+ @client = client
30
+ end
31
+
32
+ # Instructs Vedeu to calculate x and y geometry automatically based on the
33
+ # centre character of the terminal, the width and the height.
34
+ #
35
+ # @param value [Boolean] Any value other than nil or false will evaluate
36
+ # to true.
37
+ #
38
+ # @example
39
+ # interface 'my_interface' do
40
+ # geometry do
41
+ # centred!
42
+ #
43
+ # interface 'my_interface' do
44
+ # geometry do
45
+ # centred false
46
+ # ...
47
+ #
48
+ # @return [Boolean]
49
+ def centred(value = true)
50
+ model.centred = !!value
51
+ end
52
+ alias_method :centred!, :centred
53
+
54
+ # Specify the number of characters/rows/lines tall the interface will be.
55
+ #
56
+ # @param value [Fixnum]
57
+ #
58
+ # @example
59
+ # interface 'my_interface' do
60
+ # geometry do
61
+ # height 8
62
+ # ...
63
+ #
64
+ # @return [Fixnum]
65
+ def height(value)
66
+ model.height = value
67
+ end
68
+
69
+ # Specify the name of the interface for which the geometry belongs.
70
+ #
71
+ # @example
72
+ # interface 'my_interface' do
73
+ # geometry do
74
+ # name 'my_interface'
75
+ # ...
76
+ #
77
+ # @param value [String]
78
+ # @return [String]
79
+ def name(value)
80
+ model.name = value
81
+ end
82
+
83
+ # Specify the number of characters/columns wide the interface will be.
84
+ #
85
+ # @param value [Fixnum]
86
+ #
87
+ # @example
88
+ # interface 'my_interface' do
89
+ # geometry do
90
+ # width 25
91
+ # ...
92
+ #
93
+ # @return [Fixnum]
94
+ def width(value)
95
+ model.width = value
96
+ end
97
+
98
+ # Specify the starting x position (column) of the interface.
99
+ #
100
+ # @param value [Fixnum]
101
+ # @param block [Proc]
102
+ #
103
+ # @example
104
+ # interface 'my_interface' do
105
+ # geometry do
106
+ # x 7 # start on column 7.
107
+ #
108
+ # interface 'other_interface' do
109
+ # geometry do
110
+ # x { use('my_interface').east } # start on column 8, if
111
+ # # `my_interface` changes position,
112
+ # # `other_interface` will too.
113
+ #
114
+ # @return [Fixnum]
115
+ def x(value = 0, &block)
116
+ return model.x = block if block_given?
117
+
118
+ model.x = value
119
+ end
120
+
121
+ # Specify the starting y position (row/line) of the interface.
122
+ #
123
+ # @param value [Fixnum]
124
+ # @param block [Proc]
125
+ #
126
+ # @example
127
+ # interface 'my_interface' do
128
+ # geometry do
129
+ # y 4
130
+ # ...
131
+ #
132
+ # interface 'other_interface' do
133
+ # geometry do
134
+ # y { use('my_interface').north } # start on row/line 3, if
135
+ # ... # `my_interface` changes position,
136
+ # # `other_interface` will too.
137
+ #
138
+ # @return [Fixnum]
139
+ def y(value = 0, &block)
140
+ return model.y = block if block_given?
141
+
142
+ model.y = value
143
+ end
144
+
145
+ private
146
+
147
+ attr_reader :client, :model
148
+
149
+ end # Geometry
150
+
151
+ end # DSL
152
+
153
+ end # Vedeu
@@ -0,0 +1,93 @@
1
+ require 'vedeu/exceptions'
2
+ require 'vedeu/support/common'
3
+ require 'vedeu/input/key'
4
+
5
+ module Vedeu
6
+
7
+ module DSL
8
+
9
+ # Provides methods to be used to define keypress mapped to actions.
10
+ #
11
+ # @api public
12
+ class Keymap
13
+
14
+ include Vedeu::Common
15
+ include Vedeu::DSL
16
+
17
+ # Returns an instance of DSL::Keymap.
18
+ #
19
+ # @param model [Keymap]
20
+ def initialize(model, client = nil)
21
+ @model = model
22
+ @client = client
23
+ end
24
+
25
+ # Define keypress(es) to perform an action.
26
+ #
27
+ # @param value_or_values [Array<String>|Array<Symbol>|String|Symbol]
28
+ # The key(s) pressed. Special keys can be found in
29
+ # {Vedeu::Input#specials}. When more than one key is defined, then the
30
+ # extras are treated as aliases.
31
+ # @param block [Proc] The action to perform when this key is pressed. Can
32
+ # be a method call or event triggered.
33
+ #
34
+ # @example
35
+ # Vedeu.keymap do
36
+ # key('s') { Vedeu.trigger(:save) }
37
+ # key('h', :left) { Vedeu.trigger(:left) }
38
+ # key('j', :down) { Vedeu.trigger(:down) }
39
+ # key('p') do
40
+ # ...
41
+ # end
42
+ # ...
43
+ #
44
+ # @raise [InvalidSyntax] When the required block is not given, the
45
+ # value_or_values parameter is undefined, or when processing the
46
+ # collection, a member is undefined.
47
+ # @return [Array] A collection containing the keypress(es).
48
+ def key(*value_or_values, &block)
49
+ fail InvalidSyntax, 'No action defined for `key`.' unless block_given?
50
+
51
+ unless defined_value?(value_or_values)
52
+ fail InvalidSyntax, 'No keypress(es) defined for `key`.'
53
+ end
54
+
55
+ value_or_values.each do |value|
56
+ unless defined_value?(value)
57
+ fail InvalidSyntax, 'An invalid value for `key` was encountered.'
58
+ end
59
+
60
+ unless model.key_defined?(value)
61
+ model.add(Vedeu::Key.define(value, &block))
62
+ end
63
+ end
64
+ end
65
+
66
+ # Define the name of the keymap.
67
+ #
68
+ # To only allow certain keys to work with specific interfaces, use the
69
+ # same name as the interface.
70
+ #
71
+ # When the name '_global_' is used, all keys in the keymap block will be
72
+ # available to all interfaces. Once a key has been defined in the
73
+ # '_global_' keymap, it cannot be used for a specific interface.
74
+ #
75
+ # @note Using the name of a keymap that already exists will overwrite that
76
+ # keymap. Do not use the name '_system_' as unexpected behaviour may
77
+ # occur.
78
+ #
79
+ # @param value [String]
80
+ # @return [String]
81
+ def name(value)
82
+ model.name = value
83
+ end
84
+
85
+ private
86
+
87
+ attr_reader :client, :model
88
+
89
+ end # Keymap
90
+
91
+ end # DSL
92
+
93
+ end # Vedeu
@@ -0,0 +1,82 @@
1
+ module Vedeu
2
+
3
+ module DSL
4
+
5
+ # Provides the mechanism to create menus within client applications and use
6
+ # events to drive them.
7
+ #
8
+ # @api public
9
+ class Menu
10
+
11
+ include Vedeu::DSL
12
+
13
+ # Return a new instance of DSL::Menu.
14
+ #
15
+ # @param model [Vedeu::Menu]
16
+ # @return [DSL::Menu]
17
+ def initialize(model, client = nil)
18
+ @model = model
19
+ @client = client
20
+ end
21
+
22
+ # Add an individual item to the menu.
23
+ #
24
+ # @param element [Object] An object you wish to add to the collection.
25
+ #
26
+ # @example
27
+ # menu 'my_menu' do
28
+ # item SomeClass.new
29
+ # item SomeClass.new
30
+ #
31
+ # @return [Array]
32
+ def item(element)
33
+ model.collection << element
34
+ end
35
+
36
+ # Define the items for the menu. Most powerful when used with one of your
37
+ # model classes.
38
+ #
39
+ # In the 'my_playlist' example below, your `Track` model may return a
40
+ # collection of tracks to populate the menu.
41
+ #
42
+ # @param collection [Array<Object>] A collection of objects which make up
43
+ # the menu items.
44
+ #
45
+ # @example
46
+ # menu 'my_menu' do
47
+ # items [:item_1, :item_2, :item_3]
48
+ # end
49
+ #
50
+ # menu 'my_playlist' do
51
+ # items Track.all_my_favourites
52
+ # end
53
+ #
54
+ # @return [Array]
55
+ def items(collection = [])
56
+ model.collection = collection
57
+ end
58
+
59
+ # The name of the menu. Used to reference the menu throughout your
60
+ # application's execution lifetime.
61
+ #
62
+ # @param value [String]
63
+ #
64
+ # @example
65
+ # menu do
66
+ # name 'my_menu'
67
+ # ...
68
+ #
69
+ # @return [String]
70
+ def name(value)
71
+ model.name = value
72
+ end
73
+
74
+ private
75
+
76
+ attr_reader :client, :model
77
+
78
+ end # Menu
79
+
80
+ end # DSL
81
+
82
+ end # Vedeu