vedeu 0.2.3 → 0.2.4

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 (90) hide show
  1. checksums.yaml +4 -4
  2. data/docs/api.md +2 -0
  3. data/docs/events.md +0 -4
  4. data/examples/cursor_app/cursor_app.rb +56 -44
  5. data/lib/vedeu/api/api.rb +4 -6
  6. data/lib/vedeu/api/composition.rb +3 -7
  7. data/lib/vedeu/api/interface.rb +2 -3
  8. data/lib/vedeu/api/menu.rb +5 -3
  9. data/lib/vedeu/api/stream.rb +34 -0
  10. data/lib/vedeu/application.rb +4 -7
  11. data/lib/vedeu/configuration/api.rb +0 -5
  12. data/lib/vedeu/configuration/cli.rb +0 -1
  13. data/lib/vedeu/configuration/configuration.rb +0 -12
  14. data/lib/vedeu/input/input.rb +0 -3
  15. data/lib/vedeu/launcher.rb +0 -1
  16. data/lib/vedeu/models/{attributes/background.rb → background.rb} +0 -4
  17. data/lib/vedeu/models/char.rb +43 -0
  18. data/lib/vedeu/models/colour.rb +0 -1
  19. data/lib/vedeu/models/composition.rb +4 -3
  20. data/lib/vedeu/models/cursor.rb +70 -146
  21. data/lib/vedeu/models/{attributes/foreground.rb → foreground.rb} +0 -4
  22. data/lib/vedeu/models/geometry.rb +19 -20
  23. data/lib/vedeu/models/interface.rb +36 -5
  24. data/lib/vedeu/models/keymap.rb +7 -4
  25. data/lib/vedeu/models/line.rb +31 -11
  26. data/lib/vedeu/models/offset.rb +84 -0
  27. data/lib/vedeu/models/stream.rb +37 -13
  28. data/lib/vedeu/models/style.rb +0 -1
  29. data/lib/vedeu/output/area.rb +284 -0
  30. data/lib/vedeu/output/clear.rb +2 -4
  31. data/lib/vedeu/output/compositor.rb +0 -4
  32. data/lib/vedeu/output/refresh.rb +1 -2
  33. data/lib/vedeu/output/render.rb +12 -163
  34. data/lib/vedeu/output/view.rb +0 -2
  35. data/lib/vedeu/output/viewport.rb +132 -0
  36. data/lib/vedeu/repositories/buffers.rb +11 -22
  37. data/lib/vedeu/repositories/cursors.rb +20 -47
  38. data/lib/vedeu/repositories/events.rb +2 -1
  39. data/lib/vedeu/repositories/focus.rb +16 -16
  40. data/lib/vedeu/repositories/groups.rb +1 -4
  41. data/lib/vedeu/repositories/interfaces.rb +10 -3
  42. data/lib/vedeu/repositories/keymaps.rb +0 -3
  43. data/lib/vedeu/repositories/menus.rb +0 -2
  44. data/lib/vedeu/repositories/offsets.rb +47 -0
  45. data/lib/vedeu/{models/attributes → support}/coercions.rb +0 -0
  46. data/lib/vedeu/{models/attributes → support}/colour_translator.rb +0 -16
  47. data/lib/vedeu/support/esc.rb +0 -22
  48. data/lib/vedeu/support/event.rb +1 -17
  49. data/lib/vedeu/support/exceptions.rb +0 -3
  50. data/lib/vedeu/support/grid.rb +0 -3
  51. data/lib/vedeu/support/log.rb +13 -14
  52. data/lib/vedeu/support/move.rb +50 -0
  53. data/lib/vedeu/support/position.rb +17 -9
  54. data/lib/vedeu/{models/attributes → support}/presentation.rb +1 -4
  55. data/lib/vedeu/support/registrar.rb +2 -2
  56. data/lib/vedeu/support/repository.rb +23 -2
  57. data/lib/vedeu/support/terminal.rb +0 -2
  58. data/lib/vedeu/support/trace.rb +0 -11
  59. data/lib/vedeu.rb +11 -5
  60. data/test/lib/vedeu/api/api_test.rb +14 -5
  61. data/test/lib/vedeu/api/composition_test.rb +9 -26
  62. data/test/lib/vedeu/api/keymap_test.rb +1 -1
  63. data/test/lib/vedeu/api/menu_test.rb +6 -0
  64. data/test/lib/vedeu/api/stream_test.rb +32 -0
  65. data/test/lib/vedeu/models/{attributes/background_test.rb → background_test.rb} +0 -0
  66. data/test/lib/vedeu/models/char_test.rb +46 -0
  67. data/test/lib/vedeu/models/composition_test.rb +7 -0
  68. data/test/lib/vedeu/models/cursor_test.rb +63 -80
  69. data/test/lib/vedeu/models/{attributes/foreground_test.rb → foreground_test.rb} +0 -0
  70. data/test/lib/vedeu/models/geometry_test.rb +8 -10
  71. data/test/lib/vedeu/models/interface_test.rb +26 -21
  72. data/test/lib/vedeu/models/keymap_test.rb +6 -0
  73. data/test/lib/vedeu/models/line_test.rb +82 -3
  74. data/test/lib/vedeu/models/offset_test.rb +121 -0
  75. data/test/lib/vedeu/models/stream_test.rb +107 -8
  76. data/test/lib/vedeu/output/area_test.rb +242 -0
  77. data/test/lib/vedeu/output/compositor_test.rb +12 -3
  78. data/test/lib/vedeu/output/render_test.rb +34 -39
  79. data/test/lib/vedeu/output/viewport_test.rb +36 -0
  80. data/test/lib/vedeu/repositories/cursors_test.rb +32 -9
  81. data/test/lib/vedeu/repositories/focus_test.rb +8 -0
  82. data/test/lib/vedeu/repositories/offsets_test.rb +32 -0
  83. data/test/lib/vedeu/{models/attributes → support}/coercions_test.rb +0 -0
  84. data/test/lib/vedeu/{models/attributes → support}/colour_translator_test.rb +0 -0
  85. data/test/lib/vedeu/support/move_test.rb +35 -0
  86. data/test/lib/vedeu/{models/attributes → support}/presentation_test.rb +0 -0
  87. data/test/lib/vedeu/support/registrar_test.rb +6 -0
  88. data/test/lib/vedeu_test.rb +5 -0
  89. data/vedeu.gemspec +1 -1
  90. metadata +37 -17
@@ -37,15 +37,24 @@ module Vedeu
37
37
  # This will delete the interfaces themselves, and the client application
38
38
  # will need to either redefine interfaces before using them, or restart.
39
39
  #
40
+ # Note: It also resets repositories which depend on interfaces being
41
+ # registered.
42
+ #
40
43
  # @return [Hash]
41
44
  def reset
42
45
  @_storage = in_memory
46
+
47
+ Vedeu::Buffers.reset
48
+ Vedeu::Cursors.reset
49
+ Vedeu::Focus.reset
50
+ Vedeu::Groups.reset
51
+
52
+ @_storage
43
53
  end
44
54
 
45
55
  private
46
56
 
47
57
  # @see Vedeu::Refresh.register_event
48
- # @api private
49
58
  # @param attributes [Hash]
50
59
  # @return [Boolean]
51
60
  def register_event(attributes)
@@ -55,13 +64,11 @@ module Vedeu
55
64
  Vedeu::Refresh.register_event(:by_name, name, delay)
56
65
  end
57
66
 
58
- # @api private
59
67
  # @return [Hash]
60
68
  def in_memory
61
69
  {}
62
70
  end
63
71
 
64
- # @api private
65
72
  # @param name [String]
66
73
  # @raise [InterfaceNotFound] When the entity cannot be found with this name.
67
74
  # @return [InterfaceNotFound]
@@ -150,7 +150,6 @@ module Vedeu
150
150
 
151
151
  # Registers the key.
152
152
  #
153
- # @api private
154
153
  # @param attributes [Hash]
155
154
  # @param interface [String]
156
155
  # @return []
@@ -166,7 +165,6 @@ module Vedeu
166
165
 
167
166
  # Determine which interface to store the key with.
168
167
  #
169
- # @api private
170
168
  # @param interface [String]
171
169
  # @return [String]
172
170
  def namespace(interface = '')
@@ -180,7 +178,6 @@ module Vedeu
180
178
  proc { :noop }
181
179
  end
182
180
 
183
- # @api private
184
181
  # @return [Array]
185
182
  def in_memory
186
183
  { '_global_keymap_' => {} }
@@ -61,13 +61,11 @@ module Vedeu
61
61
  # Returns an empty collection ready for the storing of menus by name with
62
62
  # associated menu instance.
63
63
  #
64
- # @api private
65
64
  # @return [Hash]
66
65
  def in_memory
67
66
  {}
68
67
  end
69
68
 
70
- # @api private
71
69
  # @param name [String]
72
70
  # @raise [MenuNotFound] When the entity cannot be found with this name.
73
71
  # @return [MenuNotFound]
@@ -0,0 +1,47 @@
1
+ module Vedeu
2
+
3
+ # Repository for storing and retrieving content offsets; i.e. scroll
4
+ # position for a named interface.
5
+ #
6
+ # @api private
7
+ module Offsets
8
+
9
+ include Common
10
+ include Repository
11
+ extend self
12
+
13
+ # Add or update the offset coordinates for interface content.
14
+ #
15
+ # @param attributes [Hash]
16
+ # @return [Offset]
17
+ def add(attributes)
18
+ validate_attributes!(attributes)
19
+
20
+ Vedeu.log("#{action(__callee__)} offset: '#{attributes[:name]}'")
21
+
22
+ storage.store(attributes[:name], Offset.new(attributes))
23
+ end
24
+ alias_method :update, :add
25
+
26
+ # @param y [Fixnum]
27
+ # @param x [Fixnum]
28
+ # @return [Offset]
29
+ def move(y, x)
30
+ find_or_create(Focus.current).move(y, x)
31
+ end
32
+
33
+ private
34
+
35
+ # @return [Class]
36
+ def entity
37
+ Offset
38
+ end
39
+
40
+ # @return [Hash]
41
+ def in_memory
42
+ {}
43
+ end
44
+
45
+ end # Offsets
46
+
47
+ end # Vedeu
@@ -63,19 +63,16 @@ module Vedeu
63
63
 
64
64
  attr_reader :colour
65
65
 
66
- # @api private
67
66
  # @return [Boolean]
68
67
  def no_colour?
69
68
  colour.nil? || colour.to_s.empty?
70
69
  end
71
70
 
72
- # @api private
73
71
  # @return [Boolean]
74
72
  def named?
75
73
  colour.is_a?(Symbol) && valid_name?
76
74
  end
77
75
 
78
- # @api private
79
76
  # @raise [NotImplemented] Subclasses of this class must implement this
80
77
  # method.
81
78
  # @return [Exception]
@@ -83,19 +80,16 @@ module Vedeu
83
80
  fail NotImplemented, 'Subclasses implement this.'
84
81
  end
85
82
 
86
- # @api private
87
83
  # @return [Boolean]
88
84
  def valid_name?
89
85
  codes.keys.include?(colour)
90
86
  end
91
87
 
92
- # @api private
93
88
  # @return [Boolean]
94
89
  def numbered?
95
90
  colour.is_a?(Fixnum) && valid_range?
96
91
  end
97
92
 
98
- # @api private
99
93
  # @raise [NotImplemented] Subclasses of this class must implement this
100
94
  # method.
101
95
  # @return [NotImplemented]
@@ -103,19 +97,16 @@ module Vedeu
103
97
  fail NotImplemented, 'Subclasses implement this.'
104
98
  end
105
99
 
106
- # @api private
107
100
  # @return [Boolean]
108
101
  def valid_range?
109
102
  colour >= 0 && colour <= 255
110
103
  end
111
104
 
112
- # @api private
113
105
  # @return [Boolean]
114
106
  def rgb?
115
107
  colour.is_a?(String) && valid_rgb?
116
108
  end
117
109
 
118
- # @api private
119
110
  # @raise [NotImplemented] Subclasses of this class must implement this
120
111
  # method.
121
112
  # @return [NotImplemented]
@@ -123,13 +114,11 @@ module Vedeu
123
114
  fail NotImplemented, 'Subclasses implement this.'
124
115
  end
125
116
 
126
- # @api private
127
117
  # @return [Boolean]
128
118
  def valid_rgb?
129
119
  !!(colour =~ /^#([A-Fa-f0-9]{6})$/)
130
120
  end
131
121
 
132
- # @api private
133
122
  # @return [Array]
134
123
  def css_to_rgb
135
124
  [
@@ -139,7 +128,6 @@ module Vedeu
139
128
  ]
140
129
  end
141
130
 
142
- # @api private
143
131
  # @return [Fixnum]
144
132
  def css_to_numbered
145
133
  if rgb?
@@ -151,25 +139,21 @@ module Vedeu
151
139
  end
152
140
  end
153
141
 
154
- # @api private
155
142
  # @return [Fixnum]
156
143
  def red
157
144
  (css_to_rgb[0] / 51) * 36
158
145
  end
159
146
 
160
- # @api private
161
147
  # @return [Fixnum]
162
148
  def green
163
149
  (css_to_rgb[1] / 51) * 6
164
150
  end
165
151
 
166
- # @api private
167
152
  # @return [Fixnum]
168
153
  def blue
169
154
  (css_to_rgb[2] / 51) * 1
170
155
  end
171
156
 
172
- # @api private
173
157
  # @return [Hash]
174
158
  def codes
175
159
  {
@@ -65,7 +65,6 @@ module Vedeu
65
65
 
66
66
  private
67
67
 
68
- # @api private
69
68
  # @return [Hash]
70
69
  def sequences
71
70
  {
@@ -93,37 +92,31 @@ module Vedeu
93
92
  }
94
93
  end
95
94
 
96
- # @api private
97
95
  # @return [String]
98
96
  def bg_reset
99
97
  "\e[48;2;49m"
100
98
  end
101
99
 
102
- # @api private
103
100
  # @return [String]
104
101
  def blink
105
102
  "\e[5m"
106
103
  end
107
104
 
108
- # @api private
109
105
  # @return [String]
110
106
  def blink_off
111
107
  "\e[25m"
112
108
  end
113
109
 
114
- # @api private
115
110
  # @return [String]
116
111
  def bold
117
112
  "\e[1m"
118
113
  end
119
114
 
120
- # @api private
121
115
  # @return [String]
122
116
  def bold_off
123
117
  "\e[22m"
124
118
  end
125
119
 
126
- # @api private
127
120
  # @return [String]
128
121
  def clear
129
122
  [ string('fg_reset'),
@@ -131,7 +124,6 @@ module Vedeu
131
124
  "\e[2J" ].join
132
125
  end
133
126
 
134
- # @api private
135
127
  # @return [String]
136
128
  def clear_line
137
129
  [ string('fg_reset'),
@@ -139,45 +131,38 @@ module Vedeu
139
131
  "\e[2K" ].join
140
132
  end
141
133
 
142
- # @api private
143
134
  # @return [String]
144
135
  def clear_last_line
145
136
  [ set_position((Terminal.height - 1), 1),
146
137
  string('clear_line') ].join
147
138
  end
148
139
 
149
- # @api private
150
140
  # @return [String]
151
141
  def colour_reset
152
142
  [ string('fg_reset'),
153
143
  string('bg_reset') ].join
154
144
  end
155
145
 
156
- # @api private
157
146
  # @return [String]
158
147
  def dim
159
148
  "\e[2m"
160
149
  end
161
150
 
162
- # @api private
163
151
  # @return [String]
164
152
  def fg_reset
165
153
  "\e[38;2;39m"
166
154
  end
167
155
 
168
- # @api private
169
156
  # @return [String]
170
157
  def hide_cursor
171
158
  "\e[?25l"
172
159
  end
173
160
 
174
- # @api private
175
161
  # @return [String]
176
162
  def negative
177
163
  "\e[7m"
178
164
  end
179
165
 
180
- # @api private
181
166
  # @return [String]
182
167
  def normal
183
168
  [ string('underline_off'),
@@ -185,19 +170,16 @@ module Vedeu
185
170
  string('positive') ].join
186
171
  end
187
172
 
188
- # @api private
189
173
  # @return [String]
190
174
  def positive
191
175
  "\e[27m"
192
176
  end
193
177
 
194
- # @api private
195
178
  # @return [String]
196
179
  def reset
197
180
  "\e[0m"
198
181
  end
199
182
 
200
- # @api private
201
183
  # @return [String]
202
184
  def screen_init
203
185
  [ string('reset'),
@@ -205,7 +187,6 @@ module Vedeu
205
187
  string('hide_cursor') ].join
206
188
  end
207
189
 
208
- # @api private
209
190
  # @return [String]
210
191
  def screen_exit
211
192
  [ string('show_cursor'),
@@ -213,19 +194,16 @@ module Vedeu
213
194
  string('reset') ].join
214
195
  end
215
196
 
216
- # @api private
217
197
  # @return [String]
218
198
  def show_cursor
219
199
  "\e[?25h"
220
200
  end
221
201
 
222
- # @api private
223
202
  # @return [String]
224
203
  def underline
225
204
  "\e[4m"
226
205
  end
227
206
 
228
- # @api private
229
207
  # @return [String]
230
208
  def underline_off
231
209
  "\e[24m"
@@ -37,7 +37,7 @@ module Vedeu
37
37
 
38
38
  # Execute the code stored in the event closure.
39
39
  #
40
- # @api private
40
+ # @param args []
41
41
  # @return []
42
42
  def execute(*args)
43
43
  reset_deadline
@@ -53,7 +53,6 @@ module Vedeu
53
53
  # event. Setting the delay option to any value greater than 0 will enable
54
54
  # throttling.
55
55
  #
56
- # @api private
57
56
  # @return [Boolean]
58
57
  def throttling?
59
58
  set_time
@@ -63,7 +62,6 @@ module Vedeu
63
62
 
64
63
  # Returns a boolean indicating whether the throttle has expired.
65
64
  #
66
- # @api private
67
65
  # @return [Boolean]
68
66
  def throttle_expired?
69
67
  if elapsed_time > delay
@@ -81,7 +79,6 @@ module Vedeu
81
79
  # event. Setting the debounce option to any value greater than 0 will
82
80
  # enable debouncing.
83
81
  #
84
- # @api private
85
82
  # @return [Boolean]
86
83
  def debouncing?
87
84
  set_time
@@ -93,7 +90,6 @@ module Vedeu
93
90
 
94
91
  # Returns a boolean indicating whether the debounce has expired.
95
92
  #
96
- # @api private
97
93
  # @return [Boolean]
98
94
  def debounce_expired?
99
95
  if set_executed > deadline
@@ -107,43 +103,36 @@ module Vedeu
107
103
  end
108
104
  end
109
105
 
110
- # @api private
111
106
  # @return [Float]
112
107
  def elapsed_time
113
108
  now - @executed_at
114
109
  end
115
110
 
116
- # @api private
117
111
  # @return [Float]
118
112
  def set_executed
119
113
  @executed_at = now
120
114
  end
121
115
 
122
- # @api private
123
116
  # @return [Float]
124
117
  def set_time
125
118
  @now = Time.now.to_f
126
119
  end
127
120
 
128
- # @api private
129
121
  # @return [Fixnum]
130
122
  def reset_time
131
123
  @now = 0
132
124
  end
133
125
 
134
- # @api private
135
126
  # @return [Boolean]
136
127
  def has_deadline?
137
128
  @deadline > 0
138
129
  end
139
130
 
140
- # @api private
141
131
  # @return [Fixnum]
142
132
  def reset_deadline
143
133
  @deadline = 0
144
134
  end
145
135
 
146
- # @api private
147
136
  # @return [NilClass]
148
137
  def set_deadline
149
138
  @deadline = now + debounce
@@ -151,31 +140,26 @@ module Vedeu
151
140
  nil
152
141
  end
153
142
 
154
- # @api private
155
143
  # @return [String]
156
144
  def event_name
157
145
  options[:event_name].to_s
158
146
  end
159
147
 
160
- # @api private
161
148
  # @return [Fixnum|Float]
162
149
  def debounce
163
150
  options[:debounce] || defaults[:debounce]
164
151
  end
165
152
 
166
- # @api private
167
153
  # @return [Fixnum|Float]
168
154
  def delay
169
155
  options[:delay] || defaults[:delay]
170
156
  end
171
157
 
172
- # @api private
173
158
  # @return [Hash]
174
159
  def options
175
160
  defaults.merge!(@options)
176
161
  end
177
162
 
178
- # @api private
179
163
  # @return [Hash]
180
164
  def defaults
181
165
  {
@@ -3,9 +3,6 @@ module Vedeu
3
3
  # Raised when Vedeu attempts to access a named buffer that does not exist.
4
4
  BufferNotFound = Class.new(StandardError)
5
5
 
6
- # Raised when a cursor cannot be found by name.
7
- CursorNotFound = Class.new(StandardError)
8
-
9
6
  # Raised when trying to access a group of interfaces which do not exist by
10
7
  # this name.
11
8
  GroupNotFound = Class.new(StandardError)
@@ -55,19 +55,16 @@ module Vedeu
55
55
 
56
56
  # Returns the width of a single column in characters.
57
57
  #
58
- # @api private
59
58
  # @return [Fixnum]
60
59
  def column
61
60
  actual / 12
62
61
  end
63
62
 
64
- # @api private
65
63
  # @return [Fixnum]
66
64
  def actual
67
65
  Terminal.width
68
66
  end
69
67
 
70
- # @api private
71
68
  # @return [Boolean]
72
69
  def out_of_range?
73
70
  value < 1 || value > 12
@@ -2,9 +2,10 @@ require 'fileutils'
2
2
  require 'time'
3
3
 
4
4
  module Vedeu
5
- # :nocov:
5
+
6
6
  # @api private
7
7
  class MonoLogger < Logger
8
+
8
9
  # Create a trappable Logger instance.
9
10
  #
10
11
  # @param logdev [String|IO] The filename (String) or IO object (typically
@@ -83,6 +84,7 @@ module Vedeu
83
84
  )
84
85
  end
85
86
  end
87
+
86
88
  end
87
89
 
88
90
  # Provides the ability to Log anything to the Vedeu log file which is
@@ -97,28 +99,26 @@ module Vedeu
97
99
  log.formatter = proc do |_, time, _, message|
98
100
  utc_time = time.utc.iso8601
99
101
 
100
- if @last_seen == utc_time
101
- message + "\n"
102
-
103
- else
104
- @last_seen = utc_time
105
-
106
- "\n\e[4m\e[31m" + utc_time + "\e[39m\e[24m\n" + message + "\n"
107
-
108
- end
102
+ [timestamp(utc_time), message, "\n"].join
109
103
  end
110
104
  end
111
105
  end
112
106
 
113
107
  private
114
108
 
115
- # @api private
109
+ def self.timestamp(utc_time)
110
+ return "" if @last_seen == utc_time
111
+
112
+ @last_seen = utc_time
113
+
114
+ "\n\e[4m\e[31m" + utc_time + "\e[39m\e[24m\n"
115
+ end
116
+
116
117
  # @return [String]
117
118
  def self.filename
118
119
  @_filename ||= directory + '/vedeu.log'
119
120
  end
120
121
 
121
- # @api private
122
122
  # @return [String]
123
123
  def self.directory
124
124
  FileUtils.mkdir_p(path) unless File.directory?(path)
@@ -126,12 +126,11 @@ module Vedeu
126
126
  path
127
127
  end
128
128
 
129
- # @api private
130
129
  # @return [String]
131
130
  def self.path
132
131
  Dir.home + '/.vedeu'
133
132
  end
134
133
 
135
134
  end # Log
136
- # :nocov:
135
+
137
136
  end # Vedeu
@@ -0,0 +1,50 @@
1
+ module Vedeu
2
+
3
+ # Facade to access Offsets when a movement action occurs.
4
+ #
5
+ module Move
6
+
7
+ extend self
8
+
9
+ # @return [Array]
10
+ def down
11
+ move(1, 0)
12
+ end
13
+
14
+ # @return [Array]
15
+ def up
16
+ move(-1, 0)
17
+ end
18
+
19
+ # @return [Array]
20
+ def right
21
+ move(0, 1)
22
+ end
23
+
24
+ # @return [Array]
25
+ def left
26
+ move(0, -1)
27
+ end
28
+
29
+ private
30
+
31
+ # @param y [Fixnum]
32
+ # @param x [Fixnum]
33
+ # @return [Array]
34
+ def move(y, x)
35
+ Offsets.move(y, x)
36
+
37
+ Focus.refresh
38
+ end
39
+
40
+ # System events which when called will move in the direction specified;
41
+ # these will update the cursor position or content offset (scrolling)
42
+ # according to the interface in focus.
43
+ Vedeu.event(:_cursor_up_) { up }
44
+ Vedeu.event(:_cursor_right_) { right }
45
+ Vedeu.event(:_cursor_down_) { down }
46
+ Vedeu.event(:_cursor_left_) { left }
47
+
48
+ end # Move
49
+
50
+ end # Vedeu
@@ -1,17 +1,18 @@
1
1
  module Vedeu
2
2
 
3
3
  # Change coordinates into an escape sequence to set the cursor position.
4
+ # Also used as the basis of an Offset.
4
5
  #
5
6
  # @api private
6
- class Position
7
+ class Position < Array
7
8
 
8
9
  # Initializes a new instance of Position.
9
10
  #
10
11
  # @param y [Fixnum]
11
12
  # @param x [Fixnum]
12
13
  # @return [Position]
13
- def initialize(y = 1, x = 1)
14
- @y, @x = y, x
14
+ def initialize(y = 0, x = 0)
15
+ super([y, x])
15
16
  end
16
17
 
17
18
  # Returns an escape sequence to position the cursor. When passed a block,
@@ -31,22 +32,29 @@ module Vedeu
31
32
 
32
33
  private
33
34
 
34
- # @api private
35
+ # Returns the escape sequence to reposition the cursors at the coordinates
36
+ # specified by x and y. If either of these values are 0, then we use 1,
37
+ # as ANSI terminals do not have a 0, 0 coordinate.
38
+ #
35
39
  # @return [String]
36
40
  def sequence
37
- ["\e[", y, ';', x, 'H'].join
41
+ ["\e[", (y == 0 ? 1 : y), ';', (x == 0 ? 1 : x), 'H'].join
38
42
  end
39
43
 
40
- # @api private
44
+ # Returns the y coordinate. Can be 0 as this class may also be used as an
45
+ # Offset.
46
+ #
41
47
  # @return [Fixnum]
42
48
  def y
43
- (@y == 0 || @y == nil) ? 1 : @y
49
+ (first == nil) ? 0 : first
44
50
  end
45
51
 
46
- # @api private
52
+ # Returns the x coordinate. Can be 0 as this class may also be used as an
53
+ # Offset.
54
+ #
47
55
  # @return [Fixnum]
48
56
  def x
49
- (@x == 0 || @x == nil) ? 1 : @x
57
+ (last == nil) ? 0 : last
50
58
  end
51
59
 
52
60
  end # Position