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,37 +1,116 @@
1
+ require 'vedeu/dsl/components/geometry'
2
+ require 'vedeu/models/model'
3
+ require 'vedeu/support/esc'
4
+ require 'vedeu/support/terminal'
5
+
1
6
  module Vedeu
2
7
 
8
+ # @todo Consider storing the Terminal size at the time of first creation,
9
+ # this allows us to return the interface to its original dimensions if
10
+ # the terminal resizes back to normal size.
11
+
3
12
  # Calculates and provides interface geometry determined by both the client's
4
13
  # requirements and the terminal's current viewing area.
5
14
  #
6
15
  # Geometry for Vedeu, as the same for ANSI terminals, has the origin at
7
16
  # top-left, y = 1, x = 1. The 'y' coordinate is deliberately first.
8
17
  #
18
+ # x north xn # north: y - 1
19
+ # y +--------------+ # top: y
20
+ # | top | # west: x - 1
21
+ # | | # left: x
22
+ # west | left right | east # right: xn
23
+ # | | # east: xn + 1
24
+ # | bottom | # bottom: yn
25
+ # yn +--------------+ # south: yn + 1
26
+ # south
27
+ #
9
28
  # @api private
10
29
  class Geometry
11
30
 
12
- attr_reader :attributes, :centred
31
+ include Vedeu::Model
32
+
33
+ attr_accessor :centred, :height, :name, :width
34
+ attr_reader :attributes
35
+ attr_writer :x, :y
36
+
37
+ class << self
38
+
39
+ # Build models using a simple DSL when a block is given, otherwise returns
40
+ # a new instance of the class including this module.
41
+ #
42
+ # @see Vedeu::Geometry#initialize
43
+ def build(attributes = {}, &block)
44
+ attributes = defaults.merge(attributes)
45
+
46
+ model = new(attributes)
47
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
48
+ model
49
+ end
50
+
51
+ private
52
+
53
+ # The default values for a new instance of this class.
54
+ #
55
+ # @return [Hash]
56
+ def defaults
57
+ {
58
+ client: nil
59
+ }
60
+ end
61
+
62
+ end
13
63
 
14
64
  # Returns a new instance of Geometry.
15
65
  #
16
66
  # @param attributes [Hash]
67
+ # @option attributes centred [Boolean]
68
+ # @option attributes height [Fixnum]
69
+ # @option attributes name [String]
70
+ # @option attributes width [Fixnum]
71
+ # @option attributes x [Fixnum]
72
+ # @option attributes xn [Fixnum]
73
+ # @option attributes y [Fixnum]
74
+ # @option attributes yn [Fixnum]
17
75
  # @return [Geometry]
18
76
  def initialize(attributes = {})
19
77
  @attributes = defaults.merge(attributes)
20
78
 
21
79
  @centred = @attributes[:centred]
22
80
  @height = @attributes[:height]
81
+ @name = @attributes[:name]
23
82
  @width = @attributes[:width]
83
+ @x = @attributes[:x]
84
+ @xn = @attributes[:xn]
85
+ @y = @attributes[:y]
86
+ @yn = @attributes[:yn]
87
+ @repository = Vedeu.geometries
88
+ end
89
+
90
+ # Returns log friendly output.
91
+ #
92
+ # @note
93
+ # The attribute format is (specified/calculated).
94
+ #
95
+ # @return [String]
96
+ def inspect
97
+ "<#{self.class.name} (height:(#{@height}/#{height}) " \
98
+ "width:(#{@width}/#{width}) " \
99
+ "top:#{top} " \
100
+ "bottom:#{bottom} " \
101
+ "left:#{left} " \
102
+ "right:#{right})>"
24
103
  end
25
104
 
26
105
  # Returns the row/line start position for the interface.
27
106
  #
28
107
  # @return [Fixnum]
29
108
  def y
30
- if attributes[:y].is_a?(Proc)
31
- attributes[:y].call
109
+ if @y.is_a?(Proc)
110
+ @y.call
32
111
 
33
112
  else
34
- attributes[:y]
113
+ @y
35
114
 
36
115
  end
37
116
  end
@@ -40,11 +119,11 @@ module Vedeu
40
119
  #
41
120
  # @return [Fixnum]
42
121
  def yn
43
- if attributes[:yn].is_a?(Proc)
44
- attributes[:yn].call
122
+ if @yn.is_a?(Proc)
123
+ @yn.call
45
124
 
46
125
  else
47
- attributes[:yn]
126
+ @yn
48
127
 
49
128
  end
50
129
  end
@@ -53,11 +132,11 @@ module Vedeu
53
132
  #
54
133
  # @return [Fixnum]
55
134
  def x
56
- if attributes[:x].is_a?(Proc)
57
- attributes[:x].call
135
+ if @x.is_a?(Proc)
136
+ @x.call
58
137
 
59
138
  else
60
- attributes[:x]
139
+ @x
61
140
 
62
141
  end
63
142
  end
@@ -66,11 +145,11 @@ module Vedeu
66
145
  #
67
146
  # @return [Fixnum]
68
147
  def xn
69
- if attributes[:xn].is_a?(Proc)
70
- attributes[:xn].call
148
+ if @xn.is_a?(Proc)
149
+ @xn.call
71
150
 
72
151
  else
73
- attributes[:xn]
152
+ @xn
74
153
 
75
154
  end
76
155
  end
@@ -141,7 +220,6 @@ module Vedeu
141
220
 
142
221
  end
143
222
  end
144
- alias_method :y_min, :top
145
223
 
146
224
  # Returns the row above the top by default.
147
225
  #
@@ -171,7 +249,6 @@ module Vedeu
171
249
 
172
250
  end
173
251
  end
174
- alias_method :x_min, :left
175
252
 
176
253
  # Returns the column before left by default.
177
254
  #
@@ -258,257 +335,21 @@ module Vedeu
258
335
  (left...right).to_a
259
336
  end
260
337
 
261
- # Returns the actual position of y for a given index. Crudely corrects out
262
- # of range values.
263
- #
264
- # @example
265
- # # y_range = [7, 8, 9, 10, 11]
266
- # y_position # => 7
267
- # y_position(-2) # => 7
268
- # y_position(2) # => 9
269
- # y_position(7) # => 11
270
- #
271
- # @param index [Fixnum]
272
- # @return [Fixnum]
273
- def y_position(index = 0)
274
- if index <= 0
275
- y_min
276
-
277
- elsif index >= y_max_index
278
- y_max
279
-
280
- else
281
- y_range[index]
282
-
283
- end
284
- end
285
-
286
- # Returns the actual position of x for a given index. Crudely corrects out
287
- # of range values.
288
- #
289
- # @example
290
- # # x_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
291
- # x_position # => 4
292
- # x_position(-2) # => 4
293
- # x_position(2) # => 6
294
- # x_position(15) # => 13
295
- #
296
- # @param index [Fixnum]
297
- # @return [Fixnum]
298
- def x_position(index = 0)
299
- if index <= 0
300
- x_min
301
-
302
- elsif index >= x_max_index
303
- x_max
304
-
305
- else
306
- x_range[index]
307
-
308
- end
309
- end
310
-
311
- # Provides all the geometry in a convenient hash.
312
- #
313
- # @return [Hash]
314
- def to_h
315
- {
316
- centred: centred,
317
- height: height,
318
- width: width,
319
- x: x,
320
- y: y,
321
- top: top,
322
- right: right,
323
- bottom: bottom,
324
- left: left,
325
- north: north,
326
- east: east,
327
- south: south,
328
- west: west,
329
- virtual_x: virtual_x,
330
- virtual_y: virtual_y,
331
- }
332
- end
333
-
334
338
  private
335
339
 
336
- # Returns the y coordinate as an offset index in the area's y range. When a
337
- # value is provided, the y coordinate is overridden. Crudely corrects out of
338
- # range values.
339
- #
340
- # @example
341
- # # y_range = [7, 8, 9, 10]
342
- # # y = 8
343
- # y_index # => 1
344
- # y_index(10) # => 3
345
- # y_index(5) # => 0
346
- # y_index(15) # => 3
347
- #
348
- # @param value [Fixnum]
349
- # @return [Fixnum]
350
- def y_index(value = y)
351
- if height <= 0 || value <= y_min
352
- 0
353
-
354
- elsif value >= y_max
355
- y_max_index
356
-
357
- else
358
- y_range.index(value)
359
-
360
- end
361
- end
362
-
363
- # Returns the x coordinate as an offset index in the area's x range. When a
364
- # value is provided, the x coordinate is overridden. Crudely corrects out of
365
- # range values.
366
- #
367
- # @example
368
- # # x_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
369
- # # x = 8
370
- # x_index # => 4
371
- # x_index(11) # => 7
372
- # x_index(2) # => 0
373
- # x_index(15) # => 9
374
- #
375
- # @param value [Fixnum]
376
- # @return [Fixnum]
377
- def x_index(value = x)
378
- if width <= 0 || value <= x_min
379
- 0
380
-
381
- elsif value >= x_max
382
- x_max_index
383
-
384
- else
385
- x_range.index(value)
386
-
387
- end
388
- end
389
-
390
- # Returns the maximum y index for an area.
391
- #
392
- # @example
393
- # # height = 3
394
- # y_max_index # => 2
395
- #
396
- # @return [Fixnum]
397
- def y_max_index
398
- return 0 if y_indices.empty?
399
-
400
- y_indices.last
401
- end
402
-
403
- # Returns the maximum x index for an area.
404
- #
405
- # @example
406
- # # width = 6
407
- # x_max_index # => 5
408
- #
409
- # @return [Fixnum]
410
- def x_max_index
411
- return 0 if x_indices.empty?
412
-
413
- x_indices.last
414
- end
415
-
416
- # Returns the same as #y_range, except as indices of an array.
417
- #
418
- # @example
419
- # # height = 4
420
- # y_indices # => [0, 1, 2, 3]
421
- #
422
- # @return [Array]
423
- def y_indices
424
- (0...height).to_a
425
- end
426
-
427
- # Returns the same as #x_range, except as indices of an array.
428
- #
429
- # @example
430
- # # width = 10
431
- # x_indices # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
432
- #
433
- # @return [Array]
434
- def x_indices
435
- (0...width).to_a
436
- end
437
-
438
- # Returns an array with all coordinates from x to x_max.
439
- #
440
- # @example
441
- # # width = 10
442
- # # x_min = 4
443
- # # x_max = 14
444
- # x_range # => [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
445
- #
446
- # @return [Array]
447
- def x_range
448
- (x_min...x_max).to_a
449
- end
450
-
451
- # Returns an array with all coordinates from y to y_max.
452
- #
453
- # @example
454
- # # height = 4
455
- # # y_min = 7
456
- # # y_max = 11
457
- # y_range # => [7, 8, 9, 10]
458
- #
459
- # @return [Array]
460
- def y_range
461
- (y_min...y_max).to_a
462
- end
463
-
464
- # Returns the maximum y coordinate for an area.
465
- #
466
- # @example
467
- # # y_min = 2
468
- # # height = 4
469
- # y_max # => 6
470
- #
471
- # @return [Fixnum]
472
- def y_max
473
- if height <= 0
474
- 0
475
-
476
- else
477
- y_min + height
478
-
479
- end
480
- end
481
-
482
- # Returns the maximum x coordinate for an area.
483
- #
484
- # @example
485
- # # x_min = 5
486
- # # width = 20
487
- # x_max # => 25
488
- #
489
- # @return [Fixnum]
490
- def x_max
491
- if width <= 0
492
- 0
493
-
494
- else
495
- x_min + width
496
-
497
- end
498
- end
499
-
500
- # The default geometry of an interface- full screen.
340
+ # The default values for a new instance of this class.
501
341
  #
502
342
  # @return [Hash]
503
343
  def defaults
504
344
  {
505
- y: 1,
506
- x: 1,
507
- width: Terminal.width,
508
- height: Terminal.height,
509
345
  centred: false,
510
- yn: nil,
511
- xn: nil,
346
+ height: Terminal.height,
347
+ name: '',
348
+ width: Terminal.width,
349
+ x: 1,
350
+ xn: Terminal.width,
351
+ y: 1,
352
+ yn: Terminal.height,
512
353
  }
513
354
  end
514
355
 
@@ -3,18 +3,22 @@ module Vedeu
3
3
  # Interfaces can be associated with one another by being members of the same
4
4
  # Group. A Group is a collection of interface names.
5
5
  #
6
+ # @api private
6
7
  class Group
7
8
 
9
+ include Vedeu::Model
10
+
8
11
  attr_reader :name
9
12
 
10
13
  # Return a new instance of Group.
11
14
  #
12
15
  # @param name [String] The name of the group.
13
- # @param members [String]
16
+ # @param members [Array]
14
17
  # @return [Group]
15
- def initialize(name, *members)
16
- @name = name
17
- @members = members.to_set
18
+ def initialize(name, members = [])
19
+ @name = name
20
+ @members = Array(members)
21
+ @repository = Vedeu.groups
18
22
  end
19
23
 
20
24
  # Add a member to the group by name.
@@ -22,16 +26,14 @@ module Vedeu
22
26
  # @param member [String]
23
27
  # @return [Group]
24
28
  def add(member)
25
- new_members = @members.add(member)
26
-
27
- Group.new(name, *new_members)
29
+ Group.new(name, members.add(member)).store
28
30
  end
29
31
 
30
- # Returns the members as a collection.
32
+ # Return the members as a Set.
31
33
  #
32
- # @return [Array]
34
+ # @return [Set]
33
35
  def members
34
- @members.to_a
36
+ @members.to_set
35
37
  end
36
38
 
37
39
  # Remove a member from the group by name.
@@ -39,18 +41,18 @@ module Vedeu
39
41
  # @param member [String]
40
42
  # @return [Group]
41
43
  def remove(member)
42
- new_members = @members.delete(member)
43
-
44
- Group.new(name, *new_members)
44
+ Group.new(name, members.delete(member)).store
45
45
  end
46
46
 
47
47
  # Remove all members from the group.
48
48
  #
49
49
  # @return [Group]
50
50
  def reset
51
- Group.new(name)
51
+ Group.new(name).store
52
52
  end
53
53
 
54
+ private
55
+
54
56
  end # Group
55
57
 
56
58
  end # Vedeu
@@ -1,3 +1,6 @@
1
+ require 'vedeu/models/model'
2
+ require 'vedeu/support/common'
3
+
1
4
  module Vedeu
2
5
 
3
6
  # Converts the collection passed into a list of menu items which can be
@@ -6,32 +9,97 @@ module Vedeu
6
9
  # @api private
7
10
  class Menu
8
11
 
9
- include Model
12
+ include Vedeu::Common
13
+ include Vedeu::Model
10
14
 
11
- # Returns a new instance of Menu.
12
- #
13
- # @param collection [Array]
14
- # @param name [String]
15
- # @return [Menu]
16
- def initialize(collection, name = '')
17
- @collection = collection
18
- @name = name
19
- @current = 0
20
- @selected = nil
21
- end
15
+ attr_accessor :collection
22
16
 
23
17
  # Returns the index of the value in the collection which is current.
24
18
  #
25
19
  # @return [Fixnum]
26
- def current
27
- @current
28
- end
20
+ attr_accessor :current
21
+
22
+ attr_accessor :name
29
23
 
30
24
  # Returns the index of the value in the collection which is selected.
31
25
  #
32
26
  # @return [Fixnum]
33
- def selected
34
- @selected
27
+ attr_accessor :selected
28
+
29
+ class << self
30
+
31
+ # @option attributes collection []
32
+ # @option attributes client []
33
+ # @option attributes name []
34
+ # @option attributes current []
35
+ # @option attributes selected []
36
+ def build(attributes = {}, &block)
37
+ attributes = defaults.merge(attributes)
38
+
39
+ model = new(attributes[:collection],
40
+ attributes[:name],
41
+ attributes[:current],
42
+ attributes[:selected])
43
+ model.deputy(attributes[:client]).instance_eval(&block) if block_given?
44
+ model
45
+ end
46
+
47
+ # Register a menu by name which will display a collection of items for
48
+ # your users to select; and provide interactivity within your application.
49
+ #
50
+ # @param name [String] The name of the menu. Used to reference the
51
+ # menu throughout your application's execution lifetime.
52
+ # @param block [Proc] A set of attributes which define the features of the
53
+ # menu. See {Vedeu::DSL::Menu#items} and {Vedeu::DSL::Menu#name}.
54
+ #
55
+ # @example
56
+ # Vedeu.menu 'my_interface' do
57
+ # items [:item_1, :item_2, :item_3]
58
+ # ...
59
+ #
60
+ # Vedeu.menu do
61
+ # name 'menus_must_have_a_name'
62
+ # items Track.all_my_favourites
63
+ # ...
64
+ #
65
+ # @raise [InvalidSyntax] The required block was not given.
66
+ # @return [API::Menu]
67
+ def menu(name = '', &block)
68
+ fail InvalidSyntax, 'block not given' unless block_given?
69
+
70
+ build({ name: name }, &block).store
71
+ end
72
+
73
+ private
74
+
75
+ # The default values for a new instance of this class.
76
+ #
77
+ # @return [Hash]
78
+ def defaults
79
+ {
80
+ client: nil,
81
+ collection: [],
82
+ current: 0,
83
+ name: '',
84
+ selected: nil,
85
+ }
86
+ end
87
+
88
+ end
89
+
90
+ # Returns a new instance of Menu.
91
+ #
92
+ # @param collection [Array]
93
+ # @param name [String]
94
+ # @param current [Fixnum]
95
+ # @param selected [Fixnum|NilClass]
96
+ # @return [Menu]
97
+ def initialize(collection = [], name = '', current = 0, selected = nil)
98
+ @collection = collection
99
+ @name = name
100
+ @current = current
101
+ @selected = selected
102
+ @repository = Vedeu.menus
35
103
  end
36
104
 
37
105
  # Returns the item from the collection which shares the same index as the
@@ -161,11 +229,6 @@ module Vedeu
161
229
 
162
230
  private
163
231
 
164
- # @return [Class] The repository class for this model.
165
- def repository
166
- Vedeu::Menus
167
- end
168
-
169
232
  end # Menu
170
233
 
171
234
  end # Vedeu
@@ -0,0 +1,51 @@
1
+ module Vedeu
2
+
3
+ # When included into a class, provides the mechanism to store the class in a
4
+ # repository for later retrieval.
5
+ #
6
+ # @api private
7
+ module Model
8
+
9
+ attr_reader :repository
10
+
11
+ # Returns a DSL instance responsible for defining the DSL methods of this
12
+ # model.
13
+ #
14
+ # @param client [Object|NilClass] The client binding represents
15
+ # the client application object that is currently invoking a DSL method.
16
+ # It is required so that we can send messages to the client application
17
+ # object should we need to.
18
+ # @return [void] The DSL instance for this model.
19
+ def deputy(client = nil)
20
+ Object.const_get(dsl_class).new(self, client)
21
+ end
22
+
23
+ # @return [void] The model instance stored in the repository.
24
+ def store
25
+ repository.store(self) # if valid?
26
+ end
27
+
28
+ private
29
+
30
+ # Removes the module part from the expression in the string.
31
+ #
32
+ # @example
33
+ # demodulize('Vedeu::DSL::Interface') # => "Interface"
34
+ #
35
+ # @param klass [Class|String]
36
+ def demodulize(klass)
37
+ klass = klass.to_s
38
+
39
+ klass[(klass.rindex('::') + 2)..-1]
40
+ end
41
+
42
+ # Returns the DSL class name responsible for this model.
43
+ #
44
+ # @return [String]
45
+ def dsl_class
46
+ 'Vedeu::DSL::' + demodulize(self.class.name)
47
+ end
48
+
49
+ end # Model
50
+
51
+ end # Vedeu
@@ -0,0 +1,12 @@
1
+ require 'vedeu/models/view/chars'
2
+ require 'vedeu/models/view/char'
3
+ require 'vedeu/models/view/composition'
4
+ require 'vedeu/models/view/interfaces'
5
+ require 'vedeu/models/view/interface'
6
+ require 'vedeu/models/view/lines'
7
+ require 'vedeu/models/view/line'
8
+ require 'vedeu/models/view/streams'
9
+ require 'vedeu/models/view/stream'
10
+
11
+ module Vedeu
12
+ end # Vedeu