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
@@ -8,6 +8,30 @@ module Vedeu
8
8
  #
9
9
  class Viewport
10
10
 
11
+ extend Forwardable
12
+
13
+ def_delegators :interface,
14
+ :border,
15
+ :border?,
16
+ :geometry,
17
+ :lines,
18
+ :lines?,
19
+ :cursor
20
+
21
+ def_delegators :border,
22
+ :bottom?,
23
+ :left?,
24
+ :right?,
25
+ :top?
26
+
27
+ def_delegators :cursor,
28
+ :ox,
29
+ :oy
30
+
31
+ def_delegators :geometry,
32
+ :height,
33
+ :width
34
+
11
35
  # @see Viewport#show
12
36
  def self.show(interface)
13
37
  new(interface).show
@@ -19,8 +43,6 @@ module Vedeu
19
43
  # @return [Viewport]
20
44
  def initialize(interface)
21
45
  @interface = interface
22
- @top = 0
23
- @left = 0
24
46
  end
25
47
 
26
48
  # Returns the visible content for the interface.
@@ -32,14 +54,18 @@ module Vedeu
32
54
  #
33
55
  # @return [Array]
34
56
  def show
35
- line_adjustment
36
- column_adjustment
37
-
38
- return [] unless content?
57
+ return [] unless lines?
39
58
 
40
59
  line_pad.map { |line| column_pad(line) }.compact
41
60
  end
42
61
 
62
+ # Returns a string representation of the viewport.
63
+ #
64
+ # @return [String]
65
+ def to_s
66
+ show.map(&:join).join("\n")
67
+ end
68
+
43
69
  private
44
70
 
45
71
  attr_reader :interface
@@ -49,13 +75,13 @@ module Vedeu
49
75
  #
50
76
  # @return [Array<Array<String>>]
51
77
  def line_pad
52
- cl = content[lines] || []
78
+ visible_lines = lines[rows] || []
53
79
 
54
- if cl.size < (height + 1)
55
- cl + [" "] * ((height + 1) - cl.size)
80
+ if visible_lines.size < height
81
+ visible_lines + [" "] * (height - visible_lines.size)
56
82
 
57
83
  else
58
- cl
84
+ visible_lines
59
85
 
60
86
  end
61
87
  end
@@ -66,123 +92,81 @@ module Vedeu
66
92
  # @param line [Array<String>]
67
93
  # @return [Array<String>]
68
94
  def column_pad(line)
69
- chars = line.chars[columns] || [" "]
95
+ visible_columns = line.chars[columns] || []
70
96
 
71
- if chars.size < width
72
- chars + [" "] * (width - chars.size)
97
+ if visible_columns.size < width
98
+ visible_columns + [" "] * (width - visible_columns.size)
73
99
 
74
100
  else
75
- chars
101
+ visible_columns
76
102
 
77
103
  end
78
104
  end
79
105
 
80
- # Scrolls the content vertically when the stored y offset for the interface
81
- # is outside of the visible area.
106
+ # Using the current cursor's x position, return a range of visible lines.
107
+ #
108
+ # Scrolls the content horizontally when the stored cursor's x position for
109
+ # the interface is outside of the visible area.
82
110
  #
83
111
  # @note
84
- # @top = [value, 0].max # this allows us to set a top that is greater than
85
- # # the content height.
112
+ # [value, 0].max # this allows us to set a left that is greater
113
+ # # than the content width.
86
114
  #
87
- # @top = [[value, (content_height - height)].min, 0].max
88
- # # this does not allow us to have an offset greater
89
- # # than the content height.
115
+ # [[value, (content_width - width)].min, 0].max
116
+ # # this does not allow us to have a position
117
+ # # greater than the content width.
90
118
  #
91
- # @return [Fixnum]
92
- def line_adjustment
93
- if offset.y < 0
94
- @top = [offset.y, 0].max
119
+ # @return [Range]
120
+ def rows
121
+ top = if oy >= bordered_height
122
+ [(oy - bordered_height), 0].max
95
123
 
96
- elsif offset.y > height
97
- @top = [(offset.y - height), 0].max
124
+ else
125
+ 0
98
126
 
99
127
  end
128
+
129
+ top..(top + (height - 1))
100
130
  end
101
131
 
102
- # Scrolls the content horizontally when the stored x offset for the
132
+ # Using the current cursor's y position, return a range of visible columns.
133
+ #
134
+ # Scrolls the content vertically when the stored cursor's y position for the
103
135
  # interface is outside of the visible area.
104
136
  #
105
137
  # @note
106
- # @left = [value, 0].max # this allows us to set a left that is greater
107
- # # than the content width.
108
- #
109
- # @left = [[value, (content_width - width)].min, 0].max
110
- # # this does not allow us to have an offset greater
111
- # # than the content width.
112
- #
113
- # @return [Fixnum]
114
- def column_adjustment
115
- if offset.x < 0
116
- @left = [offset.x, 0].max
117
-
118
- elsif offset.x > width
119
- @left = [(offset.x - width), 0].max
120
-
121
- end
122
- end
123
-
124
- # Using the current x offset, return a range of visible lines.
138
+ # [value, 0].max # this allows us to set a top that is greater than
139
+ # # the content height.
125
140
  #
126
- # @return [Range]
127
- def lines
128
- @top..(@top + height)
129
- end
130
-
131
- # Using the current y offset, return a range of visible columns.
141
+ # [[value, (content_height - height)].min, 0].max
142
+ # # this does not allow us to have a position
143
+ # # greater than the content height.
132
144
  #
133
145
  # @return [Range]
134
146
  def columns
135
- @left..(@left + width)
136
- end
137
-
138
- # Returns the height of the content, or when no content, the visible height
139
- # of the interface.
140
- #
141
- # @return [Fixnum]
142
- def content_height
143
- return height unless content?
147
+ left = if ox >= bordered_width
148
+ [(ox - bordered_width), 0].max
144
149
 
145
- [content.size, height].max
146
- end
150
+ else
151
+ 0
147
152
 
148
- # Returns the width of the content, or when no content, the visible width of
149
- # the interface.
150
- #
151
- # @return [Fixnum]
152
- def content_width
153
- return width unless content?
153
+ end
154
154
 
155
- [content_maximum_line_length, width].max
155
+ left..(left + (width - 1))
156
156
  end
157
157
 
158
- # Returns the character length of the longest line for this interface.
159
- #
160
158
  # @return [Fixnum]
161
- def content_maximum_line_length
162
- content.map { |line| line.size }.max
163
- end
164
-
165
- # Return a boolean indicating whether this interface currently has content.
166
- #
167
- # @return [Boolean]
168
- def content?
169
- content.any?
170
- end
171
-
172
- def content
173
- interface.content
174
- end
159
+ def bordered_width
160
+ return border.width if border?
175
161
 
176
- def offset
177
- interface.offset
162
+ width
178
163
  end
179
164
 
180
- def width
181
- interface.width - 1
182
- end
165
+ # @return [Fixnum]
166
+ def bordered_height
167
+ return border.height if border?
183
168
 
184
- def height
185
- interface.height - 1
169
+ height
186
170
  end
187
171
 
188
172
  end # Viewport
@@ -0,0 +1,29 @@
1
+ module Vedeu
2
+
3
+ class Writer
4
+
5
+ attr_reader :writers
6
+
7
+ def self.[](*args)
8
+ new(args)
9
+ end
10
+
11
+ def initialize(writers)
12
+ @writers = writers
13
+ end
14
+
15
+ def ==(other)
16
+ writers == other.writers
17
+ end
18
+
19
+ def +(other)
20
+ Writer[*(writers + other.writers)]
21
+ end
22
+
23
+ def write(stream)
24
+ @writers.each { |writer| writer.write(stream) }
25
+ end
26
+
27
+ end # Consoles
28
+
29
+ end # Vedeu
@@ -0,0 +1,9 @@
1
+ require 'vedeu/presentation/translator'
2
+ require 'vedeu/presentation/background'
3
+ require 'vedeu/presentation/colour'
4
+ require 'vedeu/presentation/foreground'
5
+ require 'vedeu/presentation/style'
6
+ require 'vedeu/presentation/presentation'
7
+
8
+ module Vedeu
9
+ end # Vedeu
@@ -15,7 +15,7 @@ module Vedeu
15
15
  #
16
16
  # @return [String]
17
17
  def named
18
- ["\e[", background_codes[colour], 'm'].join
18
+ ["\e[", Esc.background_codes[colour], 'm'].join
19
19
  end
20
20
 
21
21
  # Returns an escape sequence.
@@ -38,14 +38,6 @@ module Vedeu
38
38
  end
39
39
  end
40
40
 
41
- # Produces the background named colour escape sequence hash from the
42
- # foreground escape sequence hash.
43
- #
44
- # @return [Hash]
45
- def background_codes
46
- Esc.codes.inject({}) { |h, (k, v)| h.merge(k => v + 10) }
47
- end
48
-
49
41
  end # Background
50
42
 
51
43
  end # Vedeu
@@ -1,3 +1,5 @@
1
+ require 'vedeu/support/coercions'
2
+
1
3
  module Vedeu
2
4
 
3
5
  # Provides a container for terminal escape sequences controlling the
@@ -7,28 +9,39 @@ module Vedeu
7
9
  # @api private
8
10
  class Colour
9
11
 
10
- attr_reader :attributes
12
+ include Vedeu::Coercions
13
+
14
+ attr_reader :attributes,
15
+ :background,
16
+ :foreground
11
17
 
12
18
  # Returns a new instance of Colour.
13
19
  #
14
20
  # @param attributes [Hash]
21
+ # @option attributes background [String]
22
+ # @option attributes foreground [String]
15
23
  # @return [Colour]
16
24
  def initialize(attributes = {})
17
25
  @attributes = defaults.merge(attributes)
26
+
27
+ @background = Background.escape_sequence(@attributes[:background])
28
+ @foreground = Foreground.escape_sequence(@attributes[:foreground])
18
29
  end
19
30
 
20
- # Converts the `:foreground` attribute into a terminal escape sequence.
31
+ # Converts the value into a terminal escape sequence.
21
32
  #
33
+ # @param value [String]
22
34
  # @return [String]
23
- def foreground
24
- @foreground ||= Foreground.escape_sequence(attributes[:foreground])
35
+ def foreground=(value)
36
+ @foreground = Foreground.escape_sequence(value)
25
37
  end
26
38
 
27
- # Converts the `:background` attribute into a terminal escape sequence.
39
+ # Converts the value into a terminal escape sequence.
28
40
  #
41
+ # @param value [String]
29
42
  # @return [String]
30
- def background
31
- @background ||= Background.escape_sequence(attributes[:background])
43
+ def background=(value)
44
+ @background = Background.escape_sequence(value)
32
45
  end
33
46
 
34
47
  # Returns both or either of the converted attributes into a single escape
@@ -41,7 +54,7 @@ module Vedeu
41
54
 
42
55
  private
43
56
 
44
- # The default values for a new instance of Colour.
57
+ # The default values for a new instance of this class.
45
58
  #
46
59
  # @return [Hash]
47
60
  def defaults
@@ -1,3 +1,7 @@
1
+ require 'vedeu/configuration/configuration'
2
+ require 'vedeu/presentation/translator'
3
+ require 'vedeu/support/esc'
4
+
1
5
  module Vedeu
2
6
 
3
7
  # The class represents one half (the other, can be found at
@@ -15,7 +19,7 @@ module Vedeu
15
19
  #
16
20
  # @return [String]
17
21
  def named
18
- ["\e[", foreground_codes[colour], 'm'].join
22
+ ["\e[", Esc.foreground_codes[colour], 'm'].join
19
23
  end
20
24
 
21
25
  # Returns an escape sequence.
@@ -38,14 +42,6 @@ module Vedeu
38
42
  end
39
43
  end
40
44
 
41
- # Produces the foreground named colour escape sequence hash from
42
- # {Vedeu::Translator#codes}
43
- #
44
- # @return [Hash]
45
- def foreground_codes
46
- Esc.codes
47
- end
48
-
49
45
  end # Foreground
50
46
 
51
47
  end # Vedeu
@@ -0,0 +1,91 @@
1
+ module Vedeu
2
+
3
+ # This module allows the sharing of presentation concerns between the models:
4
+ # Interface, Line and Stream.
5
+ #
6
+ # @api private
7
+ module Presentation
8
+
9
+ # @return [Vedeu::Colour]
10
+ def colour
11
+ Vedeu::Colour.coerce(@colour)
12
+ end
13
+
14
+ # @return [Vedeu::Colour]
15
+ def colour=(value)
16
+ @colour = Vedeu::Colour.coerce(value)
17
+ end
18
+
19
+ # @return [Vedeu::Style]
20
+ def style
21
+ Vedeu::Style.coerce(@style)
22
+ end
23
+
24
+ # @return [Vedeu::Style]
25
+ def style=(value)
26
+ @style = Vedeu::Style.coerce(value)
27
+ end
28
+
29
+ # Converts the colours and styles to escape sequences, and if the parent
30
+ # model has previously set the colour and style, reverts back to that for
31
+ # consistent formatting.
32
+ #
33
+ # @return [String] An escape sequence with value interpolated.
34
+ def to_s
35
+ render_position { render_colour { render_style { value } } }
36
+ end
37
+
38
+ private
39
+
40
+ def parent_colour
41
+ return '' unless parent
42
+
43
+ parent.colour
44
+ end
45
+
46
+ def parent_style
47
+ return '' unless parent
48
+
49
+ parent.style
50
+ end
51
+
52
+ # Renders the colour attributes of the receiver, yields (to then render the
53
+ # the styles) and once returned, attempts to set the colours back to the
54
+ # those of the receiver's parent.
55
+ #
56
+ # @return [String]
57
+ def render_colour
58
+ [
59
+ colour,
60
+ yield,
61
+ parent_colour
62
+ ].join
63
+ end
64
+
65
+ # @return [String]
66
+ def render_position
67
+ if self.respond_to?(:position) && position.is_a?(Position)
68
+ position.to_s { yield }
69
+
70
+ else
71
+ yield
72
+
73
+ end
74
+ end
75
+
76
+ # Renders the style attributes of the receiver, yields (to then render the
77
+ # next model, or finally, the content) and once returned, attempts to set
78
+ # the style back to that of the receiver's parent.
79
+ #
80
+ # @return [String]
81
+ def render_style
82
+ [
83
+ style,
84
+ yield,
85
+ parent_style
86
+ ].join
87
+ end
88
+
89
+ end # Presentation
90
+
91
+ end # Vedeu
@@ -0,0 +1,47 @@
1
+ require 'vedeu/support/common'
2
+ require 'vedeu/support/coercions'
3
+
4
+ module Vedeu
5
+
6
+ # Converts the style value or value collection into a terminal escape
7
+ # sequence. Unrecognised values are discarded- an empty string is returned.
8
+ #
9
+ # @api private
10
+ class Style
11
+
12
+ include Vedeu::Common
13
+ include Vedeu::Coercions
14
+
15
+ attr_accessor :value
16
+
17
+ # Return a new instance of Style.
18
+ #
19
+ # @param value [Array|Array<String>|Array<Symbol>|String|Symbol]
20
+ # The style value or a collection of values.
21
+ # @return [Style]
22
+ def initialize(value = nil)
23
+ @value = value
24
+ end
25
+
26
+ # Return an attributes hash for this class.
27
+ #
28
+ # @return [Hash]
29
+ def attributes
30
+ {
31
+ style: value
32
+ }
33
+ end
34
+
35
+ # Return the terminal escape sequences after converting the style or styles.
36
+ #
37
+ # @return [String]
38
+ def to_s
39
+ return '' unless defined_value?(value)
40
+
41
+ @_sequences ||= Array(value).flatten.map { |v| Esc.string(v) }.join
42
+ end
43
+ alias_method :escape_sequences, :to_s
44
+
45
+ end # Style
46
+
47
+ end # Vedeu
@@ -1,3 +1,5 @@
1
+ require 'vedeu/support/coercions'
2
+
1
3
  module Vedeu
2
4
 
3
5
  # Convert a CSS/HTML colour string into a terminal escape sequence.
@@ -22,6 +24,11 @@ module Vedeu
22
24
  # @api private
23
25
  class Translator
24
26
 
27
+ include Vedeu::Coercions
28
+
29
+ attr_reader :colour
30
+ alias_method :value, :colour
31
+
25
32
  # Convert a CSS/HTML colour string into a terminal escape sequence.
26
33
  #
27
34
  # @param colour [Fixnum|String|Symbol]
@@ -58,11 +65,10 @@ module Vedeu
58
65
 
59
66
  end
60
67
  end
68
+ alias_method :to_s, :escape_sequence
61
69
 
62
70
  private
63
71
 
64
- attr_reader :colour
65
-
66
72
  # @return [Boolean]
67
73
  def no_colour?
68
74
  colour.nil? || colour.to_s.empty?
@@ -159,7 +165,7 @@ module Vedeu
159
165
  end
160
166
  end
161
167
 
162
- # Takes the red component of {css_to_rgb} and converts to the correct value
168
+ # Takes the red component of {#css_to_rgb} and converts to the correct value
163
169
  # for setting the terminal red value.
164
170
  #
165
171
  # @return [Fixnum]
@@ -167,7 +173,7 @@ module Vedeu
167
173
  (css_to_rgb[0] / 51) * 36
168
174
  end
169
175
 
170
- # Takes the green component of {css_to_rgb} and converts to the correct value
176
+ # Takes the green component of {#css_to_rgb} and converts to the correct value
171
177
  # for setting the terminal green value.
172
178
  #
173
179
  # @return [Fixnum]
@@ -175,7 +181,7 @@ module Vedeu
175
181
  (css_to_rgb[1] / 51) * 6
176
182
  end
177
183
 
178
- # Takes the blue component of {css_to_rgb} and converts to the correct value
184
+ # Takes the blue component of {#css_to_rgb} and converts to the correct value
179
185
  # for setting the terminal blue value.
180
186
  #
181
187
  # @return [Fixnum]
@@ -0,0 +1,5 @@
1
+ require 'vedeu/repositories/repository'
2
+ require 'vedeu/repositories/menus'
3
+
4
+ module Vedeu
5
+ end # Vedeu
@@ -1,48 +1,11 @@
1
- module Vedeu
2
-
3
- # Repository for storing and retrieving defined menus.
4
- #
5
- # @api private
6
- module Menus
7
-
8
- include Repository
9
- extend self
10
-
11
- # Stores the menu attributes defined by the API.
12
- #
13
- # @param attributes [Hash]
14
- # @return [Hash|MissingRequired]
15
- def add(attributes)
16
- validate_attributes!(attributes)
17
-
18
- Vedeu.log("Registering menu: '#{attributes[:name]}'")
19
-
20
- attributes.merge!({ items: model.new(attributes[:items]) })
1
+ require 'vedeu/repositories/repository'
21
2
 
22
- storage.store(attributes[:name], attributes)
23
- end
24
-
25
- # Access a menu by name.
26
- #
27
- # @param name [String]
28
- # @return [Vedeu::Menu]
29
- def use(name)
30
- find(name).fetch(:items)
31
- end
32
-
33
- private
3
+ module Vedeu
34
4
 
35
- # @return [Class] The model class for this repository.
36
- def model
37
- Vedeu::Menu
38
- end
5
+ class Menus < Repository
39
6
 
40
- # Returns an empty collection ready for the storing of menus by name with
41
- # associated menu instance.
42
- #
43
- # @return [Hash]
44
- def in_memory
45
- {}
7
+ def self.menus
8
+ @_menus ||= Vedeu::Menus.new(Vedeu::Menu)
46
9
  end
47
10
 
48
11
  end # Menus