vedeu 0.4.8 → 0.4.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/README.md +3 -1
- data/docs/object_graph.md +14 -0
- data/examples/borders_app.rb +19 -19
- data/lib/vedeu/api.rb +134 -22
- data/lib/vedeu/buffers/buffer.rb +11 -8
- data/lib/vedeu/cursor/cursor.rb +2 -1
- data/lib/vedeu/dsl/shared/colour.rb +1 -1
- data/lib/vedeu/geometry/area.rb +25 -20
- data/lib/vedeu/geometry/canvas.rb +12 -2
- data/lib/vedeu/geometry/dimension.rb +68 -21
- data/lib/vedeu/geometry/geometry.rb +70 -224
- data/lib/vedeu/geometry/position.rb +1 -6
- data/lib/vedeu/models/cell.rb +1 -6
- data/lib/vedeu/models/char.rb +1 -6
- data/lib/vedeu/output/compositor.rb +3 -3
- data/lib/vedeu/output/viewport.rb +6 -0
- data/test/lib/vedeu/distributed/server_test.rb +4 -0
- data/test/lib/vedeu/dsl/components/geometry_test.rb +4 -0
- data/test/lib/vedeu/geometry/area_test.rb +95 -7
- data/test/lib/vedeu/geometry/canvas_test.rb +10 -2
- data/test/lib/vedeu/geometry/dimension_test.rb +112 -33
- data/test/lib/vedeu/geometry/geometry_test.rb +71 -240
- data/test/lib/vedeu/geometry/position_test.rb +5 -9
- data/test/lib/vedeu/models/cell_test.rb +1 -15
- data/test/lib/vedeu/models/char_test.rb +14 -0
- data/test/lib/vedeu/output/colour_test.rb +16 -0
- data/test/lib/vedeu/output/compositor_test.rb +3 -1
- data/vedeu.gemspec +1 -1
- metadata +4 -3
@@ -32,13 +32,13 @@ module Vedeu
|
|
32
32
|
|
33
33
|
# @return [Fixnum]
|
34
34
|
def cy
|
35
|
-
(
|
35
|
+
(height / 2) + y
|
36
36
|
end
|
37
37
|
alias_method :centre_y, :cy
|
38
38
|
|
39
39
|
# @return [Fixnum]
|
40
40
|
def cx
|
41
|
-
(
|
41
|
+
(width / 2) + x
|
42
42
|
end
|
43
43
|
alias_method :centre_x, :cx
|
44
44
|
|
@@ -48,6 +48,16 @@ module Vedeu
|
|
48
48
|
end
|
49
49
|
alias_method :origin, :o
|
50
50
|
|
51
|
+
# @return [Fixnum]
|
52
|
+
def height
|
53
|
+
(y..yn).size
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [Fixnum]
|
57
|
+
def width
|
58
|
+
(x..xn).size
|
59
|
+
end
|
60
|
+
|
51
61
|
# @return [Fixnum]
|
52
62
|
def y
|
53
63
|
1
|
@@ -15,17 +15,19 @@ module Vedeu
|
|
15
15
|
# @option attributes dn [Fixnum|NilClass] The ending value (yn or xn).
|
16
16
|
# @option attributes d_dn [Fixnum|NilClass] A width or a height.
|
17
17
|
# @option attributes default [Fixnum|NilClass] The terminal width or height.
|
18
|
+
# @option attributes options [Hash]
|
18
19
|
# @return [Vedeu::Dimension]
|
19
20
|
def initialize(attributes = {})
|
20
21
|
@d = attributes[:d]
|
21
22
|
@dn = attributes[:dn]
|
22
23
|
@d_dn = attributes[:d_dn]
|
23
24
|
@default = attributes[:default]
|
25
|
+
@options = attributes.fetch(:options, {})
|
24
26
|
end
|
25
27
|
|
26
28
|
# @return [Fixnum]
|
27
29
|
def d1
|
28
|
-
dimension.first
|
30
|
+
dimension.first < 1 ? 1 : dimension.first
|
29
31
|
end
|
30
32
|
|
31
33
|
# @return [Fixnum]
|
@@ -40,26 +42,6 @@ module Vedeu
|
|
40
42
|
|
41
43
|
private
|
42
44
|
|
43
|
-
# @return [Array<Fixnum>]
|
44
|
-
def dimension
|
45
|
-
@dimension ||= if @d && @dn
|
46
|
-
[@d, @dn]
|
47
|
-
|
48
|
-
elsif @d && @d_dn
|
49
|
-
[@d, (@d + @d_dn)]
|
50
|
-
|
51
|
-
elsif @d_dn
|
52
|
-
[1, @d_dn]
|
53
|
-
|
54
|
-
elsif @d
|
55
|
-
[@d, @default]
|
56
|
-
|
57
|
-
else
|
58
|
-
[1, @default]
|
59
|
-
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
45
|
# @!attribute [r] d
|
64
46
|
# @return [Fixnum]
|
65
47
|
attr_reader :d
|
@@ -76,6 +58,71 @@ module Vedeu
|
|
76
58
|
# @return [Fixnum]
|
77
59
|
attr_reader :default
|
78
60
|
|
61
|
+
# @return [Array<Fixnum>]
|
62
|
+
def dimension
|
63
|
+
@dimension ||= if centred? && length?
|
64
|
+
[(default / 2) - (length / 2), (default / 2) + (length / 2)]
|
65
|
+
|
66
|
+
elsif d && dn
|
67
|
+
[d, dn]
|
68
|
+
|
69
|
+
elsif d && d_dn
|
70
|
+
[d, (d + d_dn)]
|
71
|
+
|
72
|
+
elsif d_dn
|
73
|
+
[1, d_dn]
|
74
|
+
|
75
|
+
elsif d
|
76
|
+
[d, default]
|
77
|
+
|
78
|
+
elsif dn
|
79
|
+
[1, dn]
|
80
|
+
|
81
|
+
else
|
82
|
+
[1, default]
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [Boolean]
|
88
|
+
def length?
|
89
|
+
!!(default) && !!(length)
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Fixnum|NilClass]
|
93
|
+
def length
|
94
|
+
if d && dn
|
95
|
+
(d..dn).size
|
96
|
+
|
97
|
+
elsif d_dn
|
98
|
+
d_dn
|
99
|
+
|
100
|
+
elsif default
|
101
|
+
default
|
102
|
+
|
103
|
+
else
|
104
|
+
nil
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
# @return [Boolean]
|
110
|
+
def centred?
|
111
|
+
options[:centred]
|
112
|
+
end
|
113
|
+
|
114
|
+
# @return [Hash<Symbol => Boolean>]
|
115
|
+
def options
|
116
|
+
defaults.merge!(@options)
|
117
|
+
end
|
118
|
+
|
119
|
+
# @return [Hash<Symbol => Boolean>]
|
120
|
+
def defaults
|
121
|
+
{
|
122
|
+
centred: false,
|
123
|
+
}
|
124
|
+
end
|
125
|
+
|
79
126
|
end # Dimension
|
80
127
|
|
81
128
|
end # Vedeu
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'vedeu/dsl/components/all'
|
2
2
|
require 'vedeu/repositories/model'
|
3
3
|
|
4
|
-
require 'vedeu/geometry/
|
5
|
-
require 'vedeu/geometry/
|
4
|
+
require 'vedeu/geometry/area'
|
5
|
+
require 'vedeu/geometry/dimension'
|
6
6
|
require 'vedeu/support/terminal'
|
7
7
|
|
8
8
|
module Vedeu
|
@@ -32,38 +32,53 @@ module Vedeu
|
|
32
32
|
extend Forwardable
|
33
33
|
include Vedeu::Model
|
34
34
|
|
35
|
+
def_delegators :area, :north,
|
36
|
+
:east,
|
37
|
+
:south,
|
38
|
+
:west,
|
39
|
+
:top,
|
40
|
+
:right,
|
41
|
+
:bottom,
|
42
|
+
:left,
|
43
|
+
:y,
|
44
|
+
:xn,
|
45
|
+
:yn,
|
46
|
+
:x,
|
47
|
+
:height,
|
48
|
+
:width
|
49
|
+
|
35
50
|
# @!attribute [rw] centred
|
36
51
|
# @return [Boolean]
|
37
52
|
attr_accessor :centred
|
38
53
|
|
39
|
-
# @!attribute [rw] height
|
40
|
-
# @return [Fixnum]
|
41
|
-
attr_accessor :height
|
42
|
-
|
43
54
|
# @!attribute [rw] name
|
44
55
|
# @return [String]
|
45
56
|
attr_accessor :name
|
46
57
|
|
47
|
-
# @!attribute [rw] width
|
48
|
-
# @return [Fixnum]
|
49
|
-
attr_accessor :width
|
50
|
-
|
51
58
|
# @!attribute [r] attributes
|
52
59
|
# @return [Hash]
|
53
60
|
attr_reader :attributes
|
54
61
|
|
55
|
-
# @!attribute [w]
|
62
|
+
# @!attribute [w] height
|
56
63
|
# @return [Fixnum]
|
57
|
-
attr_writer :
|
64
|
+
attr_writer :height
|
58
65
|
|
59
|
-
# @!attribute [w]
|
66
|
+
# @!attribute [w] width
|
60
67
|
# @return [Fixnum]
|
61
|
-
attr_writer :
|
68
|
+
attr_writer :width
|
69
|
+
|
70
|
+
# @!attribute [w] x
|
71
|
+
# @return [Fixnum]
|
72
|
+
attr_writer :x
|
62
73
|
|
63
74
|
# @!attribute [w] xn
|
64
75
|
# @return [Fixnum]
|
65
76
|
attr_writer :xn
|
66
77
|
|
78
|
+
# @!attribute [w] y
|
79
|
+
# @return [Fixnum]
|
80
|
+
attr_writer :y
|
81
|
+
|
67
82
|
# @!attribute [w] yn
|
68
83
|
# @return [Fixnum]
|
69
84
|
attr_writer :yn
|
@@ -81,240 +96,71 @@ module Vedeu
|
|
81
96
|
# @option attributes yn [Fixnum]
|
82
97
|
# @return [Geometry]
|
83
98
|
def initialize(attributes = {})
|
84
|
-
@attributes =
|
85
|
-
|
86
|
-
@
|
87
|
-
@
|
88
|
-
@
|
89
|
-
@
|
90
|
-
@
|
91
|
-
@
|
92
|
-
@
|
93
|
-
@yn = @attributes[:yn]
|
99
|
+
@attributes = attributes
|
100
|
+
@centred = @attributes[:centred]
|
101
|
+
@height = @attributes[:height]
|
102
|
+
@name = @attributes[:name]
|
103
|
+
@width = @attributes[:width]
|
104
|
+
@x = @attributes[:x]
|
105
|
+
@xn = @attributes[:xn]
|
106
|
+
@y = @attributes[:y]
|
107
|
+
@yn = @attributes[:yn]
|
94
108
|
@repository = Vedeu.geometries
|
95
109
|
end
|
96
110
|
|
97
|
-
|
98
|
-
#
|
99
|
-
# @return [Fixnum]
|
100
|
-
def y
|
101
|
-
if @y.is_a?(Proc)
|
102
|
-
@y.call
|
103
|
-
|
104
|
-
else
|
105
|
-
@y
|
106
|
-
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# Returns the row/line end position for the interface.
|
111
|
-
#
|
112
|
-
# @return [Fixnum]
|
113
|
-
def yn
|
114
|
-
if @yn.is_a?(Proc)
|
115
|
-
@yn.call
|
116
|
-
|
117
|
-
else
|
118
|
-
@yn
|
119
|
-
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
# Returns the column/character start position for the interface.
|
124
|
-
#
|
125
|
-
# @return [Fixnum]
|
126
|
-
def x
|
127
|
-
if @x.is_a?(Proc)
|
128
|
-
@x.call
|
129
|
-
|
130
|
-
else
|
131
|
-
@x
|
132
|
-
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
# Returns the column/character end position for the interface.
|
137
|
-
#
|
138
|
-
# @return [Fixnum]
|
139
|
-
def xn
|
140
|
-
if @xn.is_a?(Proc)
|
141
|
-
@xn.call
|
142
|
-
|
143
|
-
else
|
144
|
-
@xn
|
145
|
-
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
149
|
-
# Returns a dynamic value calculated from the current terminal dimensions,
|
150
|
-
# combined with the desired start point.
|
151
|
-
#
|
152
|
-
# If the interface is `centred` then if the terminal resizes, this value
|
153
|
-
# should attempt to accommodate that.
|
154
|
-
#
|
155
|
-
# For uncentred interfaces, when the terminal resizes, then this will help
|
156
|
-
# Vedeu render the view to ensure the content is not off-screen.
|
157
|
-
#
|
158
|
-
# @return [Fixnum]
|
159
|
-
def width
|
160
|
-
Vedeu::Limit.apply(x, @width, Vedeu::Terminal.width, Vedeu::Terminal.origin)
|
161
|
-
end
|
162
|
-
|
163
|
-
# @see Vedeu::Geometry#width
|
164
|
-
def height
|
165
|
-
Vedeu::Limit.apply(y, @height, Vedeu::Terminal.height, Vedeu::Terminal.origin)
|
166
|
-
end
|
167
|
-
|
168
|
-
# Returns the top coordinate of the interface, a fixed or dynamic value
|
169
|
-
# depending on whether the interface is centred or not.
|
170
|
-
#
|
171
|
-
# @note
|
172
|
-
# Division which results in a non-integer will be rounded down.
|
173
|
-
#
|
174
|
-
# @return [Fixnum]
|
175
|
-
def top
|
176
|
-
if centred
|
177
|
-
Vedeu::Terminal.centre_y - (height / 2)
|
178
|
-
|
179
|
-
else
|
180
|
-
y
|
181
|
-
|
182
|
-
end
|
183
|
-
end
|
111
|
+
private
|
184
112
|
|
185
|
-
#
|
186
|
-
|
187
|
-
|
188
|
-
# `top` is 4.
|
189
|
-
#
|
190
|
-
# north # => 3
|
191
|
-
# north(2) # => 2
|
192
|
-
# north(-4) # => 8
|
193
|
-
#
|
194
|
-
# @param value [Fixnum]
|
195
|
-
# @return [Fixnum]
|
196
|
-
def north(value = 1)
|
197
|
-
top - value
|
113
|
+
# @return [Vedeu::Area]
|
114
|
+
def area
|
115
|
+
@area ||= Vedeu::Area.from_dimensions(y_yn: y_yn, x_xn: x_xn)
|
198
116
|
end
|
199
117
|
|
200
|
-
#
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
if centred
|
209
|
-
Vedeu::Terminal.centre_x - (width / 2)
|
210
|
-
|
211
|
-
else
|
212
|
-
x
|
213
|
-
|
214
|
-
end
|
118
|
+
# @return [Array<Fixnum>]
|
119
|
+
def x_xn
|
120
|
+
@x_xn ||= Vedeu::Dimension.pair({ d: _x,
|
121
|
+
dn: _xn,
|
122
|
+
d_dn: @width,
|
123
|
+
default: Vedeu::Terminal.width,
|
124
|
+
options: { centred: centred }
|
125
|
+
})
|
215
126
|
end
|
216
127
|
|
217
|
-
#
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
#
|
226
|
-
# @param value [Fixnum]
|
227
|
-
# @return [Fixnum]
|
228
|
-
def west(value = 1)
|
229
|
-
left - value
|
128
|
+
# @return [Array<Fixnum>]
|
129
|
+
def y_yn
|
130
|
+
@y_yn ||= Vedeu::Dimension.pair({ d: _y,
|
131
|
+
dn: _yn,
|
132
|
+
d_dn: @height,
|
133
|
+
default: Vedeu::Terminal.height,
|
134
|
+
options: { centred: centred }
|
135
|
+
})
|
230
136
|
end
|
231
137
|
|
232
|
-
# Returns the
|
233
|
-
# depending on the value of {#top}.
|
138
|
+
# Returns the row/line start position for the interface.
|
234
139
|
#
|
235
140
|
# @return [Fixnum]
|
236
|
-
def
|
237
|
-
|
141
|
+
def _y
|
142
|
+
@y.is_a?(Proc) ? @y.call : @y
|
238
143
|
end
|
239
144
|
|
240
|
-
# Returns the row
|
241
|
-
#
|
242
|
-
# @example
|
243
|
-
# `bottom` is 12.
|
244
|
-
#
|
245
|
-
# south # => 13
|
246
|
-
# south(2) # => 14
|
247
|
-
# south(-4) # => 8
|
145
|
+
# Returns the row/line end position for the interface.
|
248
146
|
#
|
249
|
-
# @param value [Fixnum]
|
250
147
|
# @return [Fixnum]
|
251
|
-
def
|
252
|
-
|
148
|
+
def _yn
|
149
|
+
@yn.is_a?(Proc) ? @yn.call : @yn
|
253
150
|
end
|
254
151
|
|
255
|
-
# Returns the
|
256
|
-
# depending on the value of {#left}.
|
152
|
+
# Returns the column/character start position for the interface.
|
257
153
|
#
|
258
154
|
# @return [Fixnum]
|
259
|
-
def
|
260
|
-
|
155
|
+
def _x
|
156
|
+
@x.is_a?(Proc) ? @x.call : @x
|
261
157
|
end
|
262
158
|
|
263
|
-
# Returns the column
|
264
|
-
#
|
265
|
-
# @example
|
266
|
-
# `right` is 19.
|
267
|
-
#
|
268
|
-
# east # => 20
|
269
|
-
# east(2) # => 21
|
270
|
-
# east(-4) # => 15
|
159
|
+
# Returns the column/character end position for the interface.
|
271
160
|
#
|
272
|
-
# @param value [Fixnum]
|
273
161
|
# @return [Fixnum]
|
274
|
-
def
|
275
|
-
|
276
|
-
end
|
277
|
-
|
278
|
-
# def_delegators :area, :north, :east, :south, :west
|
279
|
-
|
280
|
-
private
|
281
|
-
|
282
|
-
# @return [Vedeu::Area]
|
283
|
-
def area
|
284
|
-
@area ||= Vedeu::Area.from_dimensions(y_yn, x_xn)
|
285
|
-
end
|
286
|
-
|
287
|
-
# @return [Array<Fixnum>]
|
288
|
-
def x_xn
|
289
|
-
@x_xn ||= Vedeu::Dimension.pair({ v: @x,
|
290
|
-
vn: @xn,
|
291
|
-
v_vn: @width,
|
292
|
-
default: Vedeu::Terminal.width })
|
293
|
-
end
|
294
|
-
|
295
|
-
# @return [Array<Fixnum>]
|
296
|
-
def y_yn
|
297
|
-
@y_yn ||= Vedeu::Dimension.pair({ v: @y,
|
298
|
-
vn: @yn,
|
299
|
-
v_vn: @height,
|
300
|
-
default: Vedeu::Terminal.height })
|
301
|
-
end
|
302
|
-
|
303
|
-
# The default values for a new instance of this class.
|
304
|
-
#
|
305
|
-
# @return [Hash]
|
306
|
-
def defaults
|
307
|
-
{
|
308
|
-
centred: false,
|
309
|
-
client: nil,
|
310
|
-
height: Vedeu::Terminal.height,
|
311
|
-
name: '',
|
312
|
-
width: Vedeu::Terminal.width,
|
313
|
-
x: 1,
|
314
|
-
xn: Vedeu::Terminal.width,
|
315
|
-
y: 1,
|
316
|
-
yn: Vedeu::Terminal.height,
|
317
|
-
}
|
162
|
+
def _xn
|
163
|
+
@xn.is_a?(Proc) ? @xn.call : @xn
|
318
164
|
end
|
319
165
|
|
320
166
|
end # Geometry
|