vedeu 0.6.4 → 0.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.codeclimate.yml +40 -0
- data/README.md +1 -0
- data/docs/dsl.md +24 -24
- data/lib/vedeu/all.rb +21 -44
- data/lib/vedeu/api.rb +13 -13
- data/lib/vedeu/application/application_controller.rb +2 -0
- data/lib/vedeu/bindings/movement.rb +53 -18
- data/lib/vedeu/bindings/refresh.rb +1 -1
- data/lib/vedeu/bindings/system.rb +2 -2
- data/lib/vedeu/bindings/visibility.rb +3 -3
- data/lib/vedeu/borders/all.rb +13 -0
- data/lib/vedeu/borders/border.rb +209 -202
- data/lib/vedeu/{dsl/border.rb → borders/dsl.rb} +15 -15
- data/lib/vedeu/{null/border.rb → borders/null.rb} +9 -9
- data/lib/vedeu/borders/render.rb +347 -0
- data/lib/vedeu/borders/repository.rb +19 -0
- data/lib/vedeu/buffers/all.rb +13 -0
- data/lib/vedeu/buffers/buffer.rb +182 -176
- data/lib/vedeu/{null/buffer.rb → buffers/null.rb} +8 -8
- data/lib/vedeu/buffers/repository.rb +24 -0
- data/lib/vedeu/buffers/virtual_buffer.rb +2 -2
- data/lib/vedeu/cursors/all.rb +11 -0
- data/lib/vedeu/cursors/cursor.rb +276 -0
- data/lib/vedeu/cursors/refresh.rb +84 -0
- data/lib/vedeu/cursors/repository.rb +34 -0
- data/lib/vedeu/dsl/interface.rb +9 -9
- data/lib/vedeu/dsl/shared.rb +11 -11
- data/lib/vedeu/{exceptions.rb → error.rb} +2 -2
- data/lib/vedeu/esc/esc.rb +1 -1
- data/lib/vedeu/geometry/all.rb +18 -0
- data/lib/vedeu/geometry/area.rb +170 -160
- data/lib/vedeu/geometry/coordinate.rb +61 -39
- data/lib/vedeu/geometry/dimension.rb +139 -132
- data/lib/vedeu/{dsl/geometry.rb → geometry/dsl.rb} +11 -11
- data/lib/vedeu/geometry/generic_coordinate.rb +159 -153
- data/lib/vedeu/geometry/geometry.rb +310 -212
- data/lib/vedeu/geometry/grid.rb +73 -69
- data/lib/vedeu/{null/geometry.rb → geometry/null.rb} +10 -10
- data/lib/vedeu/geometry/position.rb +124 -120
- data/lib/vedeu/geometry/repository.rb +19 -0
- data/lib/vedeu/input/editor/document.rb +2 -2
- data/lib/vedeu/internal_api.rb +8 -8
- data/lib/vedeu/models/escape.rb +2 -2
- data/lib/vedeu/models/interface.rb +1 -1
- data/lib/vedeu/models/page.rb +89 -0
- data/lib/vedeu/models/row.rb +66 -0
- data/lib/vedeu/models/toggleable.rb +1 -1
- data/lib/vedeu/models/views/char.rb +7 -6
- data/lib/vedeu/models/views/line.rb +1 -1
- data/lib/vedeu/models/views/view.rb +2 -2
- data/lib/vedeu/options.rb +19 -0
- data/lib/vedeu/output/clear/named_interface.rb +1 -1
- data/lib/vedeu/output/direct.rb +1 -1
- data/lib/vedeu/output/presentation.rb +2 -1
- data/lib/vedeu/output/viewport.rb +3 -3
- data/lib/vedeu/repositories/model.rb +9 -1
- data/lib/vedeu/repositories/repository.rb +5 -0
- data/lib/vedeu/terminal/terminal.rb +3 -3
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/borders/border_test.rb +299 -291
- data/test/lib/vedeu/{dsl/border_test.rb → borders/dsl_test.rb} +6 -6
- data/test/lib/vedeu/{null/border_test.rb → borders/null_test.rb} +6 -6
- data/test/lib/vedeu/borders/render_test.rb +125 -0
- data/test/lib/vedeu/borders/repository_test.rb +17 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +116 -112
- data/test/lib/vedeu/{null/buffer_test.rb → buffers/null_test.rb} +5 -5
- data/test/lib/vedeu/buffers/repository_test.rb +18 -0
- data/test/lib/vedeu/cursors/cursor_test.rb +370 -0
- data/test/lib/vedeu/cursors/refresh_test.rb +69 -0
- data/test/lib/vedeu/cursors/repository_test.rb +41 -0
- data/test/lib/vedeu/dsl/interface_test.rb +5 -5
- data/test/lib/vedeu/{exceptions_test.rb → error_test.rb} +0 -0
- data/test/lib/vedeu/geometry/area_test.rb +141 -137
- data/test/lib/vedeu/geometry/coordinate_test.rb +93 -89
- data/test/lib/vedeu/geometry/dimension_test.rb +137 -133
- data/test/lib/vedeu/{dsl/geometry_test.rb → geometry/dsl_test.rb} +17 -17
- data/test/lib/vedeu/geometry/generic_coordinate_test.rb +32 -28
- data/test/lib/vedeu/geometry/geometry_test.rb +282 -157
- data/test/lib/vedeu/geometry/grid_test.rb +35 -31
- data/test/lib/vedeu/{null/geometry_test.rb → geometry/null_test.rb} +5 -5
- data/test/lib/vedeu/geometry/position_test.rb +146 -142
- data/test/lib/vedeu/geometry/repository_test.rb +19 -0
- data/test/lib/vedeu/input/editor/document_test.rb +1 -1
- data/test/lib/vedeu/models/escape_test.rb +1 -1
- data/test/lib/vedeu/models/interface_test.rb +2 -2
- data/test/lib/vedeu/models/page_test.rb +235 -0
- data/test/lib/vedeu/models/row_test.rb +111 -0
- data/test/lib/vedeu/models/views/char_test.rb +3 -3
- data/test/lib/vedeu/options_test.rb +57 -0
- data/test/lib/vedeu/output/clear/named_interface_test.rb +1 -1
- data/test/lib/vedeu/output/renderers/json_test.rb +1 -1
- data/test/lib/vedeu/output/viewport_test.rb +15 -9
- data/test/lib/vedeu/refresh/refresh_buffer_test.rb +12 -12
- data/test/lib/vedeu/repositories/repositories_test.rb +1 -1
- data/test/lib/vedeu/repositories/repository_test.rb +7 -0
- data/test/lib/vedeu/terminal/terminal_test.rb +1 -1
- data/test/test_helper.rb +1 -1
- data/vedeu.gemspec +2 -2
- metadata +57 -63
- data/lib/vedeu/borders/borders.rb +0 -15
- data/lib/vedeu/borders/render_border.rb +0 -331
- data/lib/vedeu/buffers/buffers.rb +0 -20
- data/lib/vedeu/cursor/cursor.rb +0 -174
- data/lib/vedeu/cursor/cursors.rb +0 -30
- data/lib/vedeu/cursor/move.rb +0 -239
- data/lib/vedeu/cursor/reposition.rb +0 -78
- data/lib/vedeu/geometry/geometries.rb +0 -15
- data/lib/vedeu/refresh/refresh_cursor.rb +0 -92
- data/test/lib/vedeu/borders/borders_test.rb +0 -13
- data/test/lib/vedeu/borders/render_border_test.rb +0 -121
- data/test/lib/vedeu/buffers/buffers_test.rb +0 -14
- data/test/lib/vedeu/cursor/cursor_test.rb +0 -246
- data/test/lib/vedeu/cursor/cursors_test.rb +0 -37
- data/test/lib/vedeu/cursor/move_test.rb +0 -301
- data/test/lib/vedeu/cursor/reposition_test.rb +0 -63
- data/test/lib/vedeu/geometry/geometries_test.rb +0 -15
- data/test/lib/vedeu/refresh/refresh_cursor_test.rb +0 -65
data/lib/vedeu/dsl/interface.rb
CHANGED
@@ -53,17 +53,17 @@ module Vedeu
|
|
53
53
|
# registered, and also adds interface's name to list of focussable
|
54
54
|
# interfaces.
|
55
55
|
#
|
56
|
-
# @see Vedeu::Buffer
|
57
|
-
# @return [
|
56
|
+
# @see Vedeu::Buffers::Buffer
|
57
|
+
# @return [Vedeu::Buffers::Buffer]
|
58
58
|
def add_buffers!(name)
|
59
|
-
Vedeu::Buffer.new(name: name).store
|
59
|
+
Vedeu::Buffers::Buffer.new(name: name).store
|
60
60
|
end
|
61
61
|
|
62
62
|
# Registers a new cursor for the interface unless already registered.
|
63
63
|
#
|
64
|
-
# @return [
|
64
|
+
# @return [Vedeu::Cursors::Cursor]
|
65
65
|
def add_cursor!(name)
|
66
|
-
Vedeu::Cursor.new(name: name).store
|
66
|
+
Vedeu::Cursors::Cursor.new(name: name).store
|
67
67
|
end
|
68
68
|
|
69
69
|
# Registers interface name in focus list unless already registered.
|
@@ -120,16 +120,16 @@ module Vedeu
|
|
120
120
|
# # ... # is rendered.
|
121
121
|
# end
|
122
122
|
#
|
123
|
-
# @return [Vedeu::Cursor]
|
123
|
+
# @return [Vedeu::Cursors::Cursor]
|
124
124
|
def cursor(value = true)
|
125
125
|
boolean = value ? true : false
|
126
126
|
|
127
|
-
Vedeu::Cursor.new(name: model.name, visible: boolean).store
|
127
|
+
Vedeu::Cursors::Cursor.new(name: model.name, visible: boolean).store
|
128
128
|
end
|
129
129
|
|
130
130
|
# Set the cursor to visible for the interface.
|
131
131
|
#
|
132
|
-
# @return [Vedeu::Cursor]
|
132
|
+
# @return [Vedeu::Cursors::Cursor]
|
133
133
|
def cursor!
|
134
134
|
cursor(true)
|
135
135
|
end
|
@@ -214,7 +214,7 @@ module Vedeu
|
|
214
214
|
|
215
215
|
# Set the cursor to invisible for the interface.
|
216
216
|
#
|
217
|
-
# @return [Vedeu::Cursor]
|
217
|
+
# @return [Vedeu::Cursors::Cursor]
|
218
218
|
def no_cursor!
|
219
219
|
cursor(false)
|
220
220
|
end
|
data/lib/vedeu/dsl/shared.rb
CHANGED
@@ -12,17 +12,17 @@ module Vedeu
|
|
12
12
|
# @example
|
13
13
|
# Vedeu.interface 'my_interface' do
|
14
14
|
# border do
|
15
|
-
# # ... see Vedeu::DSL
|
15
|
+
# # ... see Vedeu::Borders::DSL for DSL methods for borders.
|
16
16
|
# end
|
17
17
|
# end
|
18
18
|
#
|
19
19
|
# @param name [String] The name of the interface; this is already provided
|
20
20
|
# when we define the interface or view, setting it here is just
|
21
|
-
# mirroring functionality of {Vedeu::DSL
|
21
|
+
# mirroring functionality of {Vedeu::Borders::DSL.border}.
|
22
22
|
# @param block [Proc]
|
23
23
|
# @raise [Vedeu::Error::InvalidSyntax] The required block was not given.
|
24
|
-
# @return [Vedeu::Border]
|
25
|
-
# @see Vedeu::DSL
|
24
|
+
# @return [Vedeu::Borders::Border]
|
25
|
+
# @see Vedeu::Borders::DSL
|
26
26
|
def border(name = nil, &block)
|
27
27
|
fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
|
28
28
|
|
@@ -31,7 +31,7 @@ module Vedeu
|
|
31
31
|
border_attrs = attributes.merge!(enabled: true,
|
32
32
|
name: model_name)
|
33
33
|
|
34
|
-
Vedeu::Border.build(border_attrs, &block).store
|
34
|
+
Vedeu::Borders::Border.build(border_attrs, &block).store
|
35
35
|
end
|
36
36
|
|
37
37
|
# Applies the default border to the interface.
|
@@ -43,7 +43,7 @@ module Vedeu
|
|
43
43
|
# # ... some code
|
44
44
|
# end
|
45
45
|
#
|
46
|
-
# @return [Vedeu::Border]
|
46
|
+
# @return [Vedeu::Borders::Border]
|
47
47
|
def border!
|
48
48
|
border do
|
49
49
|
# adds default border
|
@@ -55,23 +55,23 @@ module Vedeu
|
|
55
55
|
# @example
|
56
56
|
# Vedeu.interface 'my_interface' do
|
57
57
|
# geometry do
|
58
|
-
# # ... see Vedeu::DSL
|
58
|
+
# # ... see Vedeu::Geometry::DSL for DSL methods for geometries.
|
59
59
|
# end
|
60
60
|
# end
|
61
61
|
#
|
62
62
|
# @param name [String] The name of the interface; this is already provided
|
63
63
|
# when we define the interface or view, setting it here is just
|
64
|
-
# mirroring functionality of {Vedeu::DSL
|
64
|
+
# mirroring functionality of {Vedeu::Geometry::DSL.geometry}.
|
65
65
|
# @param block [Proc]
|
66
66
|
# @raise [Vedeu::Error::InvalidSyntax] The required block was not given.
|
67
|
-
# @return [Vedeu::Geometry]
|
68
|
-
# @see Vedeu::DSL
|
67
|
+
# @return [Vedeu::Geometry::Geometry]
|
68
|
+
# @see Vedeu::Geometry::DSL
|
69
69
|
def geometry(name = nil, &block)
|
70
70
|
fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
|
71
71
|
|
72
72
|
model_name = name ? name : model.name
|
73
73
|
|
74
|
-
Vedeu::Geometry.build(name: model_name, &block).store
|
74
|
+
Vedeu::Geometry::Geometry.build(name: model_name, &block).store
|
75
75
|
end
|
76
76
|
|
77
77
|
end # Shared
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
-
# Custom exceptions which Vedeu will raise in certain circumstances.
|
3
|
+
# Custom exceptions/errors which Vedeu will raise in certain circumstances.
|
4
4
|
#
|
5
5
|
module Error
|
6
6
|
|
@@ -73,7 +73,7 @@ module Vedeu
|
|
73
73
|
# Raised when trying to access an interface column less than 1 or greater
|
74
74
|
# than 12. Vedeu is hard-wired to a 12-column layout for the time being.
|
75
75
|
#
|
76
|
-
# @see Vedeu::Grid
|
76
|
+
# @see Vedeu::Geometry::Grid
|
77
77
|
#
|
78
78
|
class OutOfRange < StandardError
|
79
79
|
|
data/lib/vedeu/esc/esc.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module Geometry
|
4
|
+
|
5
|
+
end # Geometry
|
6
|
+
|
7
|
+
end # Vedeu
|
8
|
+
|
9
|
+
require 'vedeu/geometry/area'
|
10
|
+
require 'vedeu/geometry/coordinate'
|
11
|
+
require 'vedeu/geometry/dimension'
|
12
|
+
require 'vedeu/geometry/dsl'
|
13
|
+
require 'vedeu/geometry/generic_coordinate'
|
14
|
+
require 'vedeu/geometry/geometry'
|
15
|
+
require 'vedeu/geometry/grid'
|
16
|
+
require 'vedeu/geometry/null'
|
17
|
+
require 'vedeu/geometry/position'
|
18
|
+
require 'vedeu/geometry/repository'
|
data/lib/vedeu/geometry/area.rb
CHANGED
@@ -1,166 +1,176 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
-
|
4
|
-
#
|
5
|
-
class Area
|
6
|
-
|
7
|
-
# @!attribute [r] y
|
8
|
-
# @return [Fixnum] Returns the top coordinate of the interface.
|
9
|
-
attr_reader :y
|
10
|
-
alias_method :top, :y
|
11
|
-
|
12
|
-
# @!attribute [r] yn
|
13
|
-
# @return [Fixnum] Returns the bottom coordinate of the interface.
|
14
|
-
attr_reader :yn
|
15
|
-
alias_method :bottom, :yn
|
16
|
-
|
17
|
-
# @!attribute [r] x
|
18
|
-
# @return [Fixnum] Returns the left coordinate of the interface.
|
19
|
-
attr_reader :x
|
20
|
-
alias_method :left, :x
|
21
|
-
|
22
|
-
# @!attribute [r] xn
|
23
|
-
# @return [Fixnum] Returns the right coordinate of the interface.
|
24
|
-
attr_reader :xn
|
25
|
-
alias_method :right, :xn
|
26
|
-
|
27
|
-
# @param attributes [Hash]
|
28
|
-
# @option attributes y [Fixnum]
|
29
|
-
# @option attributes yn [Fixnum]
|
30
|
-
# @option attributes y_yn [Fixnum]
|
31
|
-
# @option attributes y_default [Fixnum]
|
32
|
-
# @option attributes x [Fixnum]
|
33
|
-
# @option attributes xn [Fixnum]
|
34
|
-
# @option attributes x_xn [Fixnum]
|
35
|
-
# @option attributes x_default [Fixnum]
|
36
|
-
# @option attributes options [Hash<Symbol => Boolean>]
|
37
|
-
# @return [Vedeu::Area]
|
38
|
-
def self.from_attributes(attributes = {})
|
39
|
-
y_yn = Vedeu::Dimension.pair(d: attributes[:y],
|
40
|
-
dn: attributes[:yn],
|
41
|
-
d_dn: attributes[:y_yn],
|
42
|
-
default: attributes[:y_default],
|
43
|
-
maximised: attributes[:maximised],
|
44
|
-
centred: attributes[:centred])
|
45
|
-
x_xn = Vedeu::Dimension.pair(d: attributes[:x],
|
46
|
-
dn: attributes[:xn],
|
47
|
-
d_dn: attributes[:x_xn],
|
48
|
-
default: attributes[:x_default],
|
49
|
-
maximised: attributes[:maximised],
|
50
|
-
centred: attributes[:centred])
|
51
|
-
|
52
|
-
new(y: y_yn[0], yn: y_yn[-1], x: x_xn[0], xn: x_xn[-1])
|
53
|
-
end
|
54
|
-
|
55
|
-
# Returns a new instance of Vedeu::Area.
|
56
|
-
#
|
57
|
-
# @param y [Fixnum] The starting row/line position.
|
58
|
-
# @param yn [Fixnum] The ending row/line position.
|
59
|
-
# @param x [Fixnum] The starting column/character position.
|
60
|
-
# @param xn [Fixnum] The ending column/character position.
|
61
|
-
# @return [Vedeu::Area]
|
62
|
-
def initialize(y:, yn:, x:, xn:)
|
63
|
-
@y = y
|
64
|
-
@yn = yn
|
65
|
-
@x = x
|
66
|
-
@xn = xn
|
67
|
-
end
|
68
|
-
|
69
|
-
# An object is equal when its values are the same.
|
70
|
-
#
|
71
|
-
# @param other [Vedeu::Area]
|
72
|
-
# @return [Boolean]
|
73
|
-
def eql?(other)
|
74
|
-
self.class == other.class && y == other.y && yn == other.yn &&
|
75
|
-
x == other.x && xn == other.xn
|
76
|
-
end
|
77
|
-
alias_method :==, :eql?
|
78
|
-
|
79
|
-
# @return [Array<Fixnum>]
|
80
|
-
def centre
|
81
|
-
[centre_y, centre_x]
|
82
|
-
end
|
83
|
-
|
84
|
-
# @return [Fixnum]
|
85
|
-
def centre_y
|
86
|
-
(height / 2) + y
|
87
|
-
end
|
88
|
-
|
89
|
-
# @return [Fixnum]
|
90
|
-
def centre_x
|
91
|
-
(width / 2) + x
|
92
|
-
end
|
93
|
-
|
94
|
-
# @return [Fixnum]
|
95
|
-
def height
|
96
|
-
(y..yn).size
|
97
|
-
end
|
98
|
-
|
99
|
-
# @return [Fixnum]
|
100
|
-
def width
|
101
|
-
(x..xn).size
|
102
|
-
end
|
103
|
-
|
104
|
-
# Returns the row above the top by default.
|
105
|
-
#
|
106
|
-
# @example
|
107
|
-
# `top` or `y` is 4.
|
108
|
-
#
|
109
|
-
# north # => 3
|
110
|
-
# north(2) # => 2 (positive goes north)
|
111
|
-
# north(-4) # => 8 (negative goes south)
|
112
|
-
#
|
113
|
-
# @param offset [Fixnum]
|
114
|
-
# @return [Fixnum]
|
115
|
-
def north(offset = 1)
|
116
|
-
y - offset
|
117
|
-
end
|
118
|
-
|
119
|
-
# Returns the column after right by default.
|
120
|
-
#
|
121
|
-
# @example
|
122
|
-
# `right` or `xn` is 19.
|
123
|
-
#
|
124
|
-
# east # => 20
|
125
|
-
# east(2) # => 21 (positive goes east)
|
126
|
-
# east(-4) # => 15 (negative goes west)
|
127
|
-
#
|
128
|
-
# @param offset [Fixnum]
|
129
|
-
# @return [Fixnum]
|
130
|
-
def east(offset = 1)
|
131
|
-
xn + offset
|
132
|
-
end
|
133
|
-
|
134
|
-
# Returns the row below the bottom by default.
|
135
|
-
#
|
136
|
-
# @example
|
137
|
-
# `bottom` or `yn` is 12.
|
138
|
-
#
|
139
|
-
# south # => 13
|
140
|
-
# south(2) # => 14 (positive goes south)
|
141
|
-
# south(-4) # => 8 (negative goes north)
|
142
|
-
#
|
143
|
-
# @param offset [Fixnum]
|
144
|
-
# @return [Fixnum]
|
145
|
-
def south(offset = 1)
|
146
|
-
yn + offset
|
147
|
-
end
|
3
|
+
module Geometry
|
148
4
|
|
149
|
-
#
|
150
|
-
#
|
151
|
-
# @example
|
152
|
-
# `left` or `x` is 8.
|
5
|
+
# Define an area from dimensions or points.
|
153
6
|
#
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
7
|
+
class Area
|
8
|
+
|
9
|
+
# @!attribute [r] y
|
10
|
+
# @return [Fixnum] Returns the top coordinate of the interface.
|
11
|
+
attr_reader :y
|
12
|
+
alias_method :top, :y
|
13
|
+
|
14
|
+
# @!attribute [r] yn
|
15
|
+
# @return [Fixnum] Returns the bottom coordinate of the interface.
|
16
|
+
attr_reader :yn
|
17
|
+
alias_method :bottom, :yn
|
18
|
+
|
19
|
+
# @!attribute [r] x
|
20
|
+
# @return [Fixnum] Returns the left coordinate of the interface.
|
21
|
+
attr_reader :x
|
22
|
+
alias_method :left, :x
|
23
|
+
|
24
|
+
# @!attribute [r] xn
|
25
|
+
# @return [Fixnum] Returns the right coordinate of the interface.
|
26
|
+
attr_reader :xn
|
27
|
+
alias_method :right, :xn
|
28
|
+
|
29
|
+
# @param attributes [Hash]
|
30
|
+
# @option attributes y [Fixnum]
|
31
|
+
# @option attributes yn [Fixnum]
|
32
|
+
# @option attributes y_yn [Fixnum]
|
33
|
+
# @option attributes y_default [Fixnum]
|
34
|
+
# @option attributes x [Fixnum]
|
35
|
+
# @option attributes xn [Fixnum]
|
36
|
+
# @option attributes x_xn [Fixnum]
|
37
|
+
# @option attributes x_default [Fixnum]
|
38
|
+
# @option attributes options [Hash<Symbol => Boolean>]
|
39
|
+
# @return [Vedeu::Geometry::Area]
|
40
|
+
def self.from_attributes(attributes = {})
|
41
|
+
y_attributes = {
|
42
|
+
d: attributes[:y],
|
43
|
+
dn: attributes[:yn],
|
44
|
+
d_dn: attributes[:y_yn],
|
45
|
+
default: attributes[:y_default],
|
46
|
+
maximised: attributes[:maximised],
|
47
|
+
centred: attributes[:centred],
|
48
|
+
}
|
49
|
+
x_attributes = {
|
50
|
+
d: attributes[:x],
|
51
|
+
dn: attributes[:xn],
|
52
|
+
d_dn: attributes[:x_xn],
|
53
|
+
default: attributes[:x_default],
|
54
|
+
maximised: attributes[:maximised],
|
55
|
+
centred: attributes[:centred],
|
56
|
+
}
|
57
|
+
y_yn = Vedeu::Geometry::Dimension.pair(y_attributes)
|
58
|
+
x_xn = Vedeu::Geometry::Dimension.pair(x_attributes)
|
59
|
+
|
60
|
+
new(y: y_yn[0], yn: y_yn[-1], x: x_xn[0], xn: x_xn[-1])
|
61
|
+
end
|
62
|
+
|
63
|
+
# Returns a new instance of Vedeu::Area.
|
64
|
+
#
|
65
|
+
# @param y [Fixnum] The starting row/line position.
|
66
|
+
# @param yn [Fixnum] The ending row/line position.
|
67
|
+
# @param x [Fixnum] The starting column/character position.
|
68
|
+
# @param xn [Fixnum] The ending column/character position.
|
69
|
+
# @return [Vedeu::Geometry::Area]
|
70
|
+
def initialize(y:, yn:, x:, xn:)
|
71
|
+
@y = y
|
72
|
+
@yn = yn
|
73
|
+
@x = x
|
74
|
+
@xn = xn
|
75
|
+
end
|
76
|
+
|
77
|
+
# An object is equal when its values are the same.
|
78
|
+
#
|
79
|
+
# @param other [Vedeu::Geometry::Area]
|
80
|
+
# @return [Boolean]
|
81
|
+
def eql?(other)
|
82
|
+
self.class == other.class && y == other.y && yn == other.yn &&
|
83
|
+
x == other.x && xn == other.xn
|
84
|
+
end
|
85
|
+
alias_method :==, :eql?
|
86
|
+
|
87
|
+
# @return [Array<Fixnum>]
|
88
|
+
def centre
|
89
|
+
[centre_y, centre_x]
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Fixnum]
|
93
|
+
def centre_y
|
94
|
+
(height / 2) + y
|
95
|
+
end
|
96
|
+
|
97
|
+
# @return [Fixnum]
|
98
|
+
def centre_x
|
99
|
+
(width / 2) + x
|
100
|
+
end
|
101
|
+
|
102
|
+
# @return [Fixnum]
|
103
|
+
def height
|
104
|
+
(y..yn).size
|
105
|
+
end
|
106
|
+
|
107
|
+
# @return [Fixnum]
|
108
|
+
def width
|
109
|
+
(x..xn).size
|
110
|
+
end
|
111
|
+
|
112
|
+
# Returns the row above the top by default.
|
113
|
+
#
|
114
|
+
# @example
|
115
|
+
# `top` or `y` is 4.
|
116
|
+
#
|
117
|
+
# north # => 3
|
118
|
+
# north(2) # => 2 (positive goes north)
|
119
|
+
# north(-4) # => 8 (negative goes south)
|
120
|
+
#
|
121
|
+
# @param offset [Fixnum]
|
122
|
+
# @return [Fixnum]
|
123
|
+
def north(offset = 1)
|
124
|
+
y - offset
|
125
|
+
end
|
126
|
+
|
127
|
+
# Returns the column after right by default.
|
128
|
+
#
|
129
|
+
# @example
|
130
|
+
# `right` or `xn` is 19.
|
131
|
+
#
|
132
|
+
# east # => 20
|
133
|
+
# east(2) # => 21 (positive goes east)
|
134
|
+
# east(-4) # => 15 (negative goes west)
|
135
|
+
#
|
136
|
+
# @param offset [Fixnum]
|
137
|
+
# @return [Fixnum]
|
138
|
+
def east(offset = 1)
|
139
|
+
xn + offset
|
140
|
+
end
|
141
|
+
|
142
|
+
# Returns the row below the bottom by default.
|
143
|
+
#
|
144
|
+
# @example
|
145
|
+
# `bottom` or `yn` is 12.
|
146
|
+
#
|
147
|
+
# south # => 13
|
148
|
+
# south(2) # => 14 (positive goes south)
|
149
|
+
# south(-4) # => 8 (negative goes north)
|
150
|
+
#
|
151
|
+
# @param offset [Fixnum]
|
152
|
+
# @return [Fixnum]
|
153
|
+
def south(offset = 1)
|
154
|
+
yn + offset
|
155
|
+
end
|
156
|
+
|
157
|
+
# Returns the column before left by default.
|
158
|
+
#
|
159
|
+
# @example
|
160
|
+
# `left` or `x` is 8.
|
161
|
+
#
|
162
|
+
# west # => 7
|
163
|
+
# west(2) # => 6 (positive goes west)
|
164
|
+
# west(-4) # => 12 (negative goes east)
|
165
|
+
#
|
166
|
+
# @param offset [Fixnum]
|
167
|
+
# @return [Fixnum]
|
168
|
+
def west(offset = 1)
|
169
|
+
x - offset
|
170
|
+
end
|
171
|
+
|
172
|
+
end # Area
|
173
|
+
|
174
|
+
end # Geometry
|
165
175
|
|
166
176
|
end # Vedeu
|