vedeu 0.8.8 → 0.8.9
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.
- checksums.yaml +4 -4
- data/docs/dsl/by_method/focus_by_name.md +6 -1
- data/docs/dsl/by_method/focus_next.md +7 -0
- data/docs/dsl/by_method/focus_previous.md +7 -0
- data/docs/events/by_name/mouse_event.md +8 -0
- data/lib/vedeu.rb +12 -0
- data/lib/vedeu/all.rb +2 -0
- data/lib/vedeu/application/controller.rb +2 -6
- data/lib/vedeu/buffers/empty.rb +2 -1
- data/lib/vedeu/cells/borders/vertices/bottom_left.rb +1 -1
- data/lib/vedeu/cells/borders/vertices/bottom_right.rb +1 -1
- data/lib/vedeu/cells/borders/vertices/top_left.rb +1 -1
- data/lib/vedeu/cells/borders/vertices/top_right.rb +1 -1
- data/lib/vedeu/cells/char.rb +2 -6
- data/lib/vedeu/cells/cursor.rb +1 -1
- data/lib/vedeu/cells/support/html.rb +6 -18
- data/lib/vedeu/coercers/all.rb +18 -1
- data/lib/vedeu/coercers/chars.rb +29 -0
- data/lib/vedeu/coercers/coercer.rb +59 -0
- data/lib/vedeu/coercers/colour.rb +15 -33
- data/lib/vedeu/coercers/colour_attributes.rb +8 -3
- data/lib/vedeu/coercers/editor_line.rb +36 -0
- data/lib/vedeu/coercers/editor_lines.rb +36 -0
- data/lib/vedeu/coercers/lines.rb +36 -0
- data/lib/vedeu/coercers/page.rb +52 -0
- data/lib/vedeu/coercers/position.rb +69 -0
- data/lib/vedeu/coercers/row.rb +43 -0
- data/lib/vedeu/coercers/streams.rb +29 -0
- data/lib/vedeu/coercers/style.rb +54 -0
- data/lib/vedeu/configuration/api.rb +10 -0
- data/lib/vedeu/configuration/configuration.rb +11 -0
- data/lib/vedeu/cursors/coordinate.rb +41 -66
- data/lib/vedeu/cursors/cursor.rb +4 -4
- data/lib/vedeu/cursors/reposition.rb +3 -3
- data/lib/vedeu/dsl/border.rb +2 -39
- data/lib/vedeu/dsl/elements.rb +5 -6
- data/lib/vedeu/dsl/geometry.rb +3 -12
- data/lib/vedeu/editor/cropper.rb +2 -1
- data/lib/vedeu/error.rb +4 -0
- data/lib/vedeu/geometries/position.rb +14 -27
- data/lib/vedeu/input/mouse.rb +14 -5
- data/lib/vedeu/input/read.rb +1 -11
- data/lib/vedeu/interfaces/clear.rb +2 -1
- data/lib/vedeu/logging/log.rb +1 -1
- data/lib/vedeu/models/page.rb +5 -23
- data/lib/vedeu/models/row.rb +5 -14
- data/lib/vedeu/models/toggleable.rb +2 -7
- data/lib/vedeu/plugins/plugin.rb +1 -0
- data/lib/vedeu/presentation/style.rb +4 -20
- data/lib/vedeu/renderers/all.rb +24 -10
- data/lib/vedeu/repositories/model.rb +2 -8
- data/lib/vedeu/repositories/registerable.rb +4 -9
- data/lib/vedeu/runtime/application.rb +2 -0
- data/lib/vedeu/runtime/flags.rb +2 -0
- data/lib/vedeu/runtime/router.rb +2 -0
- data/lib/vedeu/support/point.rb +9 -7
- data/lib/vedeu/support/x_coordinate.rb +57 -0
- data/lib/vedeu/support/y_coordinate.rb +57 -0
- data/lib/vedeu/terminal/terminal.rb +2 -0
- data/lib/vedeu/version.rb +1 -1
- data/lib/vedeu/views/value.rb +3 -12
- data/test/lib/vedeu/coercers/chars_test.rb +33 -0
- data/test/lib/vedeu/coercers/coercer_test.rb +34 -0
- data/test/lib/vedeu/coercers/colour_test.rb +9 -7
- data/test/lib/vedeu/coercers/editor_line_test.rb +40 -0
- data/test/lib/vedeu/coercers/editor_lines_test.rb +40 -0
- data/test/lib/vedeu/coercers/lines_test.rb +40 -0
- data/test/lib/vedeu/coercers/page_test.rb +150 -0
- data/test/lib/vedeu/coercers/position_test.rb +76 -0
- data/test/lib/vedeu/coercers/row_test.rb +64 -0
- data/test/lib/vedeu/coercers/streams_test.rb +33 -0
- data/test/lib/vedeu/coercers/style_test.rb +62 -0
- data/test/lib/vedeu/cursors/coordinate_test.rb +11 -12
- data/test/lib/vedeu/geometries/position_test.rb +10 -54
- data/test/lib/vedeu/input/capture_test.rb +1 -1
- data/test/lib/vedeu/models/page_test.rb +4 -116
- data/test/lib/vedeu/models/row_test.rb +1 -31
- data/test/lib/vedeu/presentation/style_test.rb +4 -38
- data/test/lib/vedeu/renderers/all_test.rb +6 -0
- data/test/lib/vedeu/support/point_test.rb +13 -1
- data/test/lib/vedeu/support/x_coordinate_test.rb +64 -0
- data/test/lib/vedeu/support/y_coordinate_test.rb +64 -0
- data/test/support/examples/material_colours_app.rb +1 -0
- data/vedeu.gemspec +1 -1
- metadata +41 -4
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Editor::Line}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class EditorLine < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# @return [void]
|
15
|
+
def coerce
|
16
|
+
if coerced?
|
17
|
+
value
|
18
|
+
|
19
|
+
else
|
20
|
+
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# @return [Class]
|
28
|
+
def klass
|
29
|
+
Vedeu::Editor::Line
|
30
|
+
end
|
31
|
+
|
32
|
+
end # EditorLine
|
33
|
+
|
34
|
+
end # Coercers
|
35
|
+
|
36
|
+
end # Vedeu
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Editor::Lines}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class EditorLines < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# @return [void]
|
15
|
+
def coerce
|
16
|
+
if coerced?
|
17
|
+
value
|
18
|
+
|
19
|
+
else
|
20
|
+
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# @return [Class]
|
28
|
+
def klass
|
29
|
+
Vedeu::Editor::Lines
|
30
|
+
end
|
31
|
+
|
32
|
+
end # EditorLines
|
33
|
+
|
34
|
+
end # Coercers
|
35
|
+
|
36
|
+
end # Vedeu
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Views::Lines}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class Lines < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# @return [void]
|
15
|
+
def coerce
|
16
|
+
if coerced?
|
17
|
+
value
|
18
|
+
|
19
|
+
else
|
20
|
+
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
# @return [Class]
|
28
|
+
def klass
|
29
|
+
Vedeu::Views::Lines
|
30
|
+
end
|
31
|
+
|
32
|
+
end # Lines
|
33
|
+
|
34
|
+
end # Coercers
|
35
|
+
|
36
|
+
end # Vedeu
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Models::Page}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class Page < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# @param value
|
15
|
+
# [Vedeu::Models::Page|Vedeu::Models::Row|Array<void>|void]
|
16
|
+
# @macro raise_invalid_syntax
|
17
|
+
# @return [Vedeu::Models::Page]
|
18
|
+
def coerce
|
19
|
+
if coerced?
|
20
|
+
value
|
21
|
+
|
22
|
+
elsif value.is_a?(Vedeu::Models::Row)
|
23
|
+
klass.new([value])
|
24
|
+
|
25
|
+
elsif value.is_a?(Array) && value.empty?
|
26
|
+
klass.new([Vedeu::Models::Row.coerce(value)])
|
27
|
+
|
28
|
+
elsif value.is_a?(Array) || value.is_a?(Vedeu::Buffers::View)
|
29
|
+
values = value.map { |v| Vedeu::Models::Row.coerce(v) }
|
30
|
+
|
31
|
+
klass.new(values)
|
32
|
+
|
33
|
+
else
|
34
|
+
fail Vedeu::Error::InvalidSyntax,
|
35
|
+
"Cannot coerce as value is not an Array, #{klass} " \
|
36
|
+
"or Vedeu::Models::Row. Is a '#{value.class.name}'."
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# @return [Class]
|
44
|
+
def klass
|
45
|
+
Vedeu::Models::Page
|
46
|
+
end
|
47
|
+
|
48
|
+
end # Page
|
49
|
+
|
50
|
+
end # Coercers
|
51
|
+
|
52
|
+
end # Vedeu
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Geometries::Position}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class Position < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# @macro raise_fatal
|
15
|
+
# @return [NilClass|Vedeu::Geometries::Position]
|
16
|
+
def coerce
|
17
|
+
if value.nil? || coerced?
|
18
|
+
value
|
19
|
+
|
20
|
+
elsif tuple?
|
21
|
+
klass.new(*value)
|
22
|
+
|
23
|
+
elsif hash?
|
24
|
+
klass.new(value.fetch(:y, 1), value.fetch(:x, 1))
|
25
|
+
|
26
|
+
elsif fixnum?
|
27
|
+
klass.new(value, 1)
|
28
|
+
|
29
|
+
else
|
30
|
+
fail Vedeu::Error::Fatal,
|
31
|
+
"Vedeu cannot coerce a '#{value.class.name}' into a " \
|
32
|
+
"'#{klass}'."
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
# @return [Boolean]
|
40
|
+
def fixnum?
|
41
|
+
value.is_a?(Fixnum)
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Boolean]
|
45
|
+
def hash?
|
46
|
+
value.is_a?(Hash)
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Class]
|
50
|
+
def klass
|
51
|
+
Vedeu::Geometries::Position
|
52
|
+
end
|
53
|
+
|
54
|
+
# @macro raise_fatal
|
55
|
+
# @return [Boolean]
|
56
|
+
def tuple?
|
57
|
+
return false unless value.is_a?(Array)
|
58
|
+
return true if value.size == 2
|
59
|
+
|
60
|
+
fail Vedeu::Error::Fatal,
|
61
|
+
"A '#{klass}' is made up of two elements. (Provided " \
|
62
|
+
"#{value.size}.)"
|
63
|
+
end
|
64
|
+
|
65
|
+
end # Position
|
66
|
+
|
67
|
+
end # Coercers
|
68
|
+
|
69
|
+
end # Vedeu
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Models::Row}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class Row < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# @param value [Vedeu::Models::Row|Array<void>|void]
|
15
|
+
# @return [Vedeu::Models::Row]
|
16
|
+
def coerce
|
17
|
+
if coerced?
|
18
|
+
value
|
19
|
+
|
20
|
+
elsif value.is_a?(Array)
|
21
|
+
klass.new(value.compact)
|
22
|
+
|
23
|
+
elsif value.nil?
|
24
|
+
klass.new
|
25
|
+
|
26
|
+
else
|
27
|
+
klass.new([value])
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# @return [Class]
|
35
|
+
def klass
|
36
|
+
Vedeu::Models::Row
|
37
|
+
end
|
38
|
+
|
39
|
+
end # Row
|
40
|
+
|
41
|
+
end # Coercers
|
42
|
+
|
43
|
+
end # Vedeu
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Views::Streams}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class Streams < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# @return [void]
|
15
|
+
def coerce
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# @return [Class]
|
21
|
+
def klass
|
22
|
+
Vedeu::Views::Streams
|
23
|
+
end
|
24
|
+
|
25
|
+
end # Streams
|
26
|
+
|
27
|
+
end # Coercers
|
28
|
+
|
29
|
+
end # Vedeu
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module Coercers
|
6
|
+
|
7
|
+
# Provides the mechanism to convert a value into a
|
8
|
+
# {Vedeu::Presentation::Style}.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
#
|
12
|
+
class Style < Vedeu::Coercers::Coercer
|
13
|
+
|
14
|
+
# Produces new objects of the correct class from the value,
|
15
|
+
# ignores objects that have already been coerced.
|
16
|
+
#
|
17
|
+
# @return [Vedeu::Presentation::Style]
|
18
|
+
def coerce
|
19
|
+
if coerced?
|
20
|
+
value
|
21
|
+
|
22
|
+
elsif value.is_a?(Hash)
|
23
|
+
if present?(value[:style])
|
24
|
+
if value[:style].is_a?(klass)
|
25
|
+
value[:style]
|
26
|
+
|
27
|
+
else
|
28
|
+
Vedeu::Coercers::Style.coerce(value[:style])
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
else
|
33
|
+
klass.new
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
else
|
38
|
+
klass.new(value)
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# @return [Class]
|
46
|
+
def klass
|
47
|
+
Vedeu::Presentation::Style
|
48
|
+
end
|
49
|
+
|
50
|
+
end # Style
|
51
|
+
|
52
|
+
end # Coercers
|
53
|
+
|
54
|
+
end # Vedeu
|
@@ -525,6 +525,16 @@ module Vedeu
|
|
525
525
|
end
|
526
526
|
alias terminal_mode= terminal_mode
|
527
527
|
|
528
|
+
# Instructs Vedeu to use threads to perform certain actions.
|
529
|
+
# This can have a performance impact.
|
530
|
+
#
|
531
|
+
# @param boolean [Boolean]
|
532
|
+
# @return [Boolean]
|
533
|
+
def threaded(boolean)
|
534
|
+
options[:threaded] = boolean
|
535
|
+
end
|
536
|
+
alias threaded= threaded
|
537
|
+
|
528
538
|
# Sets the width of the terminal.
|
529
539
|
#
|
530
540
|
# Vedeu.configure do
|
@@ -269,6 +269,16 @@ module Vedeu
|
|
269
269
|
instance.options[:terminal_mode]
|
270
270
|
end
|
271
271
|
|
272
|
+
# Returns a boolean indicating whether Vedeu should use threads
|
273
|
+
# to perform certain actions. This can have a performance
|
274
|
+
# impact.
|
275
|
+
#
|
276
|
+
# @return [Boolean]
|
277
|
+
def threaded?
|
278
|
+
instance.options[:threaded]
|
279
|
+
end
|
280
|
+
alias threaded threaded?
|
281
|
+
|
272
282
|
# Returns the client defined width for the terminal.
|
273
283
|
#
|
274
284
|
# {include:file:docs/dsl/by_method/width.md}
|
@@ -371,6 +381,7 @@ module Vedeu
|
|
371
381
|
stdout: nil,
|
372
382
|
stderr: nil,
|
373
383
|
terminal_mode: :raw,
|
384
|
+
threaded: true,
|
374
385
|
width: nil,
|
375
386
|
}
|
376
387
|
end
|
@@ -10,10 +10,18 @@ module Vedeu
|
|
10
10
|
#
|
11
11
|
class Coordinate
|
12
12
|
|
13
|
+
extend Forwardable
|
14
|
+
|
15
|
+
def_delegators :coordinate,
|
16
|
+
:d,
|
17
|
+
:bd,
|
18
|
+
:bdn,
|
19
|
+
:d_dn
|
20
|
+
|
13
21
|
# Return a new instance of Vedeu::Cursors::Coordinate.
|
14
22
|
#
|
15
23
|
# @param attributes [Hash<Symbol => Fixnum|String|Symbol>]
|
16
|
-
# @option attributes
|
24
|
+
# @option attributes geometry [Vedeu::Geometries::Geometry]
|
17
25
|
# @option attributes type [Symbol]
|
18
26
|
# @option attributes offset [Fixnum]
|
19
27
|
# @return [Vedeu::Cursors::Coordinate]
|
@@ -50,27 +58,16 @@ module Vedeu
|
|
50
58
|
#
|
51
59
|
# @return [Fixnum]
|
52
60
|
def d_position
|
53
|
-
|
54
|
-
d
|
55
|
-
|
56
|
-
elsif offset > dn_index
|
57
|
-
dn_position
|
58
|
-
|
59
|
-
else
|
60
|
-
d_range[offset]
|
61
|
-
|
62
|
-
end
|
63
|
-
|
64
|
-
Vedeu::Point.coerce(value: pos, min: bd, max: bdn).value
|
61
|
+
Vedeu::Point.coerce(value: position, min: bd, max: bdn).value
|
65
62
|
end
|
66
63
|
alias x d_position
|
67
64
|
alias y d_position
|
68
65
|
|
69
66
|
protected
|
70
67
|
|
71
|
-
# @!attribute [r]
|
72
|
-
# @return [
|
73
|
-
attr_reader :
|
68
|
+
# @!attribute [r] geometry
|
69
|
+
# @return [Vedeu::Geometries::Geometry]
|
70
|
+
attr_reader :geometry
|
74
71
|
|
75
72
|
# @!attribute [r] offset
|
76
73
|
# @return [Fixnum]
|
@@ -82,54 +79,16 @@ module Vedeu
|
|
82
79
|
|
83
80
|
private
|
84
81
|
|
85
|
-
# Returns the geometry for the interface.
|
86
|
-
#
|
87
|
-
# @return (see Vedeu::Geometries::Repository#by_name)
|
88
|
-
def geometry
|
89
|
-
@geometry ||= Vedeu.geometries.by_name(name)
|
90
|
-
end
|
91
|
-
|
92
|
-
# Return the :x or :y value from the geometry.
|
93
|
-
#
|
94
|
-
# @return [Fixnum]
|
95
|
-
def d
|
96
|
-
geometry.send(coordinate_type[0])
|
97
|
-
end
|
98
|
-
|
99
|
-
# Return the :bx or :by value from the geometry.
|
100
|
-
#
|
101
|
-
# @return [Fixnum]
|
102
|
-
def bd
|
103
|
-
geometry.send(coordinate_type[1])
|
104
|
-
end
|
105
|
-
|
106
|
-
# Return the :bxn or :byn value from the geometry.
|
107
|
-
#
|
108
|
-
# @return [Fixnum]
|
109
|
-
def bdn
|
110
|
-
geometry.send(coordinate_type[2])
|
111
|
-
end
|
112
|
-
|
113
|
-
# Return the :width or :height value from the geometry.
|
114
|
-
#
|
115
|
-
# @return [Fixnum]
|
116
|
-
def d_dn
|
117
|
-
geometry.send(coordinate_type[3])
|
118
|
-
end
|
119
|
-
|
120
|
-
# Ascertain the correct methods to use for determining the
|
121
|
-
# coordinates.
|
122
|
-
#
|
123
82
|
# @macro raise_invalid_syntax
|
124
|
-
# @return [
|
125
|
-
def
|
126
|
-
@
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
83
|
+
# @return [Vedeu::XCoordinate|Vedeu::YCoordinate]
|
84
|
+
def coordinate
|
85
|
+
@_coordinate ||= case type
|
86
|
+
when :x then Vedeu::XCoordinate.new(geometry)
|
87
|
+
when :y then Vedeu::YCoordinate.new(geometry)
|
88
|
+
else
|
89
|
+
fail Vedeu::Error::InvalidSyntax,
|
90
|
+
'Coordinate type not given, cannot continue.'
|
91
|
+
end
|
133
92
|
end
|
134
93
|
|
135
94
|
# Returns the maximum index for an area.
|
@@ -163,12 +122,28 @@ module Vedeu
|
|
163
122
|
# @return [Hash<Symbol => Fixnum|String|Symbol>]
|
164
123
|
def defaults
|
165
124
|
{
|
166
|
-
|
167
|
-
offset:
|
168
|
-
type:
|
125
|
+
geometry: nil,
|
126
|
+
offset: nil,
|
127
|
+
type: :x,
|
169
128
|
}
|
170
129
|
end
|
171
130
|
|
131
|
+
# Return the position respective of the offset.
|
132
|
+
#
|
133
|
+
# @return [Fixnum]
|
134
|
+
def position
|
135
|
+
if offset <= 0
|
136
|
+
d
|
137
|
+
|
138
|
+
elsif offset > dn_index
|
139
|
+
dn_position
|
140
|
+
|
141
|
+
else
|
142
|
+
d_range[offset]
|
143
|
+
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
172
147
|
end # Coordinate
|
173
148
|
|
174
149
|
end # Cursors
|