vedeu 0.6.57 → 0.6.58

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f6b535e5cb8b4ba8c6bc115745981c6934a899e4
4
- data.tar.gz: 448638ef6471487754a32e81594054b6dae011e6
3
+ metadata.gz: d33a3d7e8cd6ab472659549aafd770caeadce867
4
+ data.tar.gz: 7c8de69994fd536b0d42db2d95d09a51610b3eaa
5
5
  SHA512:
6
- metadata.gz: e62418c3701fd759daa1f2fce52692c92ed9d2c8b8c476acfaa1ab1e40d215d5c14247ba3c1e8b2c940a0201e9707fa0bc91e5ac62e58826cfd11106ba044f30
7
- data.tar.gz: 02b5e88a20ee7b1c7e1f04395ba533c34e9325c9a84d7b2b5257f82fd73010fdcf9186e613b13c742c4e815e450273d6569cc86d67e69a39c38c563a28debf62
6
+ metadata.gz: eebb2b6fecc5b82b8f936d5f57732729db7ec0698eace850ab92e9d048e5aea66196757d3c1a65d5a932f4ee15dd2feae3ee63d24f4ad68a5168969f69d4d1a9
7
+ data.tar.gz: 3e11185cf8ae5e7862f4f072ddad207cffc17197b086aae08d403afb02eaa281bf8ca92a5df6c3abc61e0144d7e942780831431e0a0e07ec4c2b085ade3e5863
@@ -26,6 +26,7 @@ require 'vedeu/geometry/dsl'
26
26
  require 'vedeu/geometry/coordinate'
27
27
  require 'vedeu/geometry/geometry'
28
28
  require 'vedeu/geometry/grid'
29
+ require 'vedeu/geometry/move'
29
30
  require 'vedeu/geometry/null'
30
31
  require 'vedeu/geometry/position'
31
32
  require 'vedeu/geometry/repository'
@@ -84,8 +84,8 @@ module Vedeu
84
84
 
85
85
  # @param (see #initialize)
86
86
  # @return (see #initialize)
87
- def self.store(attributes)
88
- new(attributes).store
87
+ def self.store(attributes, &block)
88
+ new(attributes).store(&block)
89
89
  end
90
90
 
91
91
  # Returns a new instance of Vedeu::Geometry::Geometry.
@@ -169,51 +169,6 @@ module Vedeu
169
169
  end
170
170
  end
171
171
 
172
- # Moves the geometry down by one row.
173
- #
174
- # @return [Vedeu::Geometry::Geometry]
175
- def move_down
176
- return self if yn + 1 > Vedeu.height
177
-
178
- move(y: y + 1, yn: yn + 1) { Vedeu.trigger(:_cursor_down_, name) }
179
- end
180
-
181
- # Moves the geometry left by one column.
182
- #
183
- # @return [Vedeu::Geometry::Geometry]
184
- def move_left
185
- return self if x - 1 < 1
186
-
187
- move(x: x - 1, xn: xn - 1) { Vedeu.trigger(:_cursor_left_, name) }
188
- end
189
-
190
- # Moves the geometry to the top left of the terminal.
191
- #
192
- # @return [Vedeu::Geometry::Geometry]
193
- def move_origin
194
- move(x: 1, xn: (xn - x + 1), y: 1, yn: (yn - y + 1)) do
195
- Vedeu.trigger(:_cursor_origin_, name)
196
- end
197
- end
198
-
199
- # Moves the geometry right by one column.
200
- #
201
- # @return [Vedeu::Geometry::Geometry]
202
- def move_right
203
- return self if xn + 1 > Vedeu.width
204
-
205
- move(x: x + 1, xn: xn + 1) { Vedeu.trigger(:_cursor_right_, name) }
206
- end
207
-
208
- # Moves the geometry up by one column.
209
- #
210
- # @return [Vedeu::Geometry::Geometry]
211
- def move_up
212
- return self if y - 1 < 1
213
-
214
- move(y: y - 1, yn: yn - 1) { Vedeu.trigger(:_cursor_up_, name) }
215
- end
216
-
217
172
  # Will unmaximise the named interface geometry. Previously, when
218
173
  # a geometry was maximised, then triggering the unmaximise event
219
174
  # will return it to its usual defined size (terminal size
@@ -259,36 +214,6 @@ module Vedeu
259
214
  }
260
215
  end
261
216
 
262
- # When moving an interface;
263
- # 1) Reset the alignment and maximised states to false;
264
- # it wont be aligned to a side if moved, and cannot be moved
265
- # if maximised.
266
- # 2) Get the current coordinates of the interface, then:
267
- # 3) Override the attributes with the new coordinates for
268
- # desired movement; these are usually +/- 1 of the current
269
- # state, depending on direction.
270
- #
271
- # @param coordinates [Hash<Symbol => Fixnum>]
272
- # @option coordinates x [Fixnum] The starting column/character
273
- # position.
274
- # @option coordinates xn [Fixnum] The ending column/character
275
- # position.
276
- # @option coordinates y [Fixnum] The starting row/line position.
277
- # @option coordinates yn [Fixnum] The ending row/line position.
278
- # @return [Hash<Symbol => Boolean, Fixnum>]
279
- def move(coordinates = {})
280
- attrs = attributes.merge!(horizontal_alignment: :none,
281
- maximised: false,
282
- vertical_alignment: :none)
283
- .merge!(coordinates)
284
-
285
- geometry = Vedeu::Geometry::Geometry.store(attrs)
286
-
287
- yield if block_given?
288
-
289
- geometry
290
- end
291
-
292
217
  # Returns the default options/attributes for this class.
293
218
  #
294
219
  # @return [Hash<Symbol => Boolean|Fixnum|NilClass|String|Symbol|
@@ -0,0 +1,223 @@
1
+ module Vedeu
2
+
3
+ module Geometry
4
+
5
+ # Move an interface/view via changing its geometry.
6
+ #
7
+ # When moving an interface/view;
8
+ #
9
+ # 1) Reset the alignment and maximised states to false;
10
+ # it wont be aligned to a side if moved, and cannot be moved
11
+ # if maximised.
12
+ # 2) Get the current coordinates of the interface, then:
13
+ # 3) Override the attributes with the new coordinates for
14
+ # desired movement; these are usually +/- 1 of the current
15
+ # state, depending on direction.
16
+ #
17
+ # @api private
18
+ #
19
+ class Move
20
+
21
+ extend Forwardable
22
+
23
+ def_delegators :geometry,
24
+ :x,
25
+ :xn,
26
+ :y,
27
+ :yn
28
+
29
+ # @param attributes See #initialize
30
+ # @return See #move
31
+ def self.move(attributes = {})
32
+ new(attributes).move
33
+ end
34
+
35
+ # Returns a new instance of Vedeu::Geometry::Move.
36
+ #
37
+ # @param attributes [Hash<Symbol => Boolean|Fixnum|String|
38
+ # Symbol|Vedeu::Geometry::Repository]
39
+ # @option attributes name [String|Symbol] The name of the
40
+ # interface/view.
41
+ # @option attributes direction [Symbol] The direction to move;
42
+ # one of: :down, :left, :origin, :right, :up.
43
+ # @option attributes offset [Fixnum] The number of columns or
44
+ # rows to move by.
45
+ # @return [Vedeu::Geometry::Move]
46
+ def initialize(attributes = {})
47
+ defaults.merge!(attributes).each do |key, value|
48
+ instance_variable_set("@#{key}", value || defaults.fetch(key))
49
+ end
50
+ end
51
+
52
+ # @return [FalseClass|Vedeu::Geometry::Geometry]
53
+ def move
54
+ return false unless valid?
55
+
56
+ Vedeu::Geometry::Geometry.store(new_attributes) do
57
+ update_cursor!
58
+ refresh!
59
+ end
60
+ end
61
+
62
+ protected
63
+
64
+ # @!attribute [r] direction
65
+ # @return [Symbol]
66
+ attr_reader :direction
67
+
68
+ # @!attribute [r] name
69
+ # @return [String|Symbol]
70
+ attr_reader :name
71
+
72
+ # @!attribute [r] offset
73
+ # @return [Symbol]
74
+ attr_reader :offset
75
+
76
+ private
77
+
78
+ # @return [Hash<Symbol => Fixnum|String|Symbol>]
79
+ def defaults
80
+ {
81
+ direction: :none,
82
+ name: '',
83
+ offset: 1,
84
+ }
85
+ end
86
+
87
+ # @return [Boolean]
88
+ def direction?
89
+ direction != :none
90
+ end
91
+
92
+ # Moves the geometry down by the offset.
93
+ #
94
+ # @return [Hash<Symbol => Fixnum]
95
+ def down
96
+ {
97
+ y: y + offset,
98
+ yn: yn + offset,
99
+ }
100
+ end
101
+
102
+ # @return [Hash<Symbol => Symbol>]
103
+ def event
104
+ {
105
+ down: :_cursor_down_,
106
+ left: :_cursor_left_,
107
+ origin: :_cursor_origin_,
108
+ right: :_cursor_right_,
109
+ up: :_cursor_up_,
110
+ }[direction]
111
+ end
112
+
113
+ # @return [Vedeu::Geometry::Geometry]
114
+ def geometry
115
+ Vedeu.geometries.by_name(name)
116
+ end
117
+
118
+ # Moves the geometry left by the offset.
119
+ #
120
+ # @return [Hash<Symbol => Fixnum]
121
+ def left
122
+ {
123
+ x: x - offset,
124
+ xn: xn - offset,
125
+ }
126
+ end
127
+
128
+ # @return [Hash<Symbol => Boolean|String|Symbol>]
129
+ def new_attributes
130
+ geometry.attributes.merge!(unalign_unmaximise).merge!(send(direction))
131
+ end
132
+
133
+ # Moves the geometry to the top left of the terminal.
134
+ #
135
+ # @return [Hash<Symbol => Fixnum]
136
+ def origin
137
+ {
138
+ x: 1,
139
+ xn: (xn - x + 1),
140
+ y: 1,
141
+ yn: (yn - y + 1),
142
+ }
143
+ end
144
+
145
+ # Refresh the screen after moving.
146
+ #
147
+ # @return [void]
148
+ def refresh!
149
+ Vedeu.trigger(:_movement_refresh_, name)
150
+ end
151
+
152
+ # Moves the geometry right by the offset.
153
+ #
154
+ # @return [Hash<Symbol => Fixnum]
155
+ def right
156
+ {
157
+ x: x + offset,
158
+ xn: xn + offset,
159
+ }
160
+ end
161
+
162
+ # @return [Hash<Symbol => Boolean|Symbol]
163
+ def unalign_unmaximise
164
+ {
165
+ horizontal_alignment: :none,
166
+ maximised: false,
167
+ vertical_alignment: :none,
168
+ }
169
+ end
170
+
171
+ # Moves the geometry up by the offset.
172
+ #
173
+ # @return [Hash<Symbol => Fixnum]
174
+ def up
175
+ {
176
+ y: y - offset,
177
+ yn: yn - offset,
178
+ }
179
+ end
180
+
181
+ # Refresh the cursor after moving.
182
+ #
183
+ # @return [void]
184
+ def update_cursor!
185
+ Vedeu.trigger(event, name)
186
+ end
187
+
188
+ # @return [Boolean]
189
+ def valid?
190
+ {
191
+ down: valid_down?,
192
+ left: valid_left?,
193
+ origin: true,
194
+ right: valid_right?,
195
+ up: valid_up?,
196
+ }.fetch(direction, false)
197
+ end
198
+
199
+ # @return [Boolean]
200
+ def valid_down?
201
+ yn + offset <= Vedeu.height
202
+ end
203
+
204
+ # @return [Boolean]
205
+ def valid_left?
206
+ x - offset >= 1
207
+ end
208
+
209
+ # @return [Boolean]
210
+ def valid_right?
211
+ xn + offset <= Vedeu.width
212
+ end
213
+
214
+ # @return [Boolean]
215
+ def valid_up?
216
+ y - offset >= 1
217
+ end
218
+
219
+ end # Move
220
+
221
+ end # Geometry
222
+
223
+ end # Vedeu
@@ -46,15 +46,15 @@ module Vedeu
46
46
  Vedeu.geometries.by_name(name).unmaximise
47
47
  end
48
48
 
49
- %w(down left right up).each do |direction|
50
- Vedeu.bind(:"_view_#{direction}_") do |name|
51
- Vedeu.geometries.by_name(name).send("move_#{direction}")
52
-
53
- Vedeu.trigger(:_movement_refresh_, name)
49
+ [:down, :left, :right, :up].each do |direction|
50
+ Vedeu.bind(:"_view_#{direction}_") do |name, offset|
51
+ Vedeu::Geometry::Move.move(direction: direction,
52
+ name: name,
53
+ offset: offset)
54
54
  end
55
55
  end
56
56
 
57
- %w(down left right up).each do |direction|
57
+ [:down, :left, :right, :up].each do |direction|
58
58
  Vedeu.bind_alias(:"_geometry_#{direction}_", :"_view_#{direction}_")
59
59
  end
60
60
 
data/lib/vedeu/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Vedeu
2
2
 
3
3
  # The current version of Vedeu.
4
- VERSION = '0.6.57'.freeze
4
+ VERSION = '0.6.58'.freeze
5
5
 
6
6
  end
@@ -132,121 +132,6 @@ module Vedeu
132
132
  it { subject.maximised.must_equal(true) }
133
133
  end
134
134
 
135
- describe '#move_down' do
136
- let(:x) { 15 }
137
- let(:xn) { 25 }
138
- let(:y) { 4 }
139
- let(:yn) { 8 }
140
-
141
- subject { instance.move_down }
142
-
143
- it { subject.must_be_instance_of(described) }
144
-
145
- it { subject.y.must_equal(5) }
146
- it { subject.yn.must_equal(9) }
147
-
148
- context 'when the move will make the geometry out of bounds' do
149
- let(:x) { 15 }
150
- let(:xn) { 25 }
151
- let(:y) { 8 }
152
- let(:yn) { 12 }
153
-
154
- it { subject.y.must_equal(8) }
155
- it { subject.yn.must_equal(12) }
156
- end
157
- end
158
-
159
- describe '#move_left' do
160
- let(:x) { 15 }
161
- let(:xn) { 25 }
162
- let(:y) { 4 }
163
- let(:yn) { 8 }
164
-
165
- subject { instance.move_left }
166
-
167
- it { subject.must_be_instance_of(described) }
168
-
169
- it { subject.x.must_equal(14) }
170
- it { subject.xn.must_equal(24) }
171
-
172
- context 'when the move will make the geometry out of bounds' do
173
- let(:x) { 1 }
174
- let(:xn) { 11 }
175
- let(:y) { 4 }
176
- let(:yn) { 8 }
177
-
178
- it { subject.x.must_equal(1) }
179
- it { subject.xn.must_equal(11) }
180
- end
181
- end
182
-
183
- describe '#move_origin' do
184
- let(:x) { 15 }
185
- let(:xn) { 25 }
186
- let(:y) { 4 }
187
- let(:yn) { 8 }
188
-
189
- before do
190
- Vedeu.stubs(:trigger)
191
- end
192
-
193
- subject { instance.move_origin }
194
-
195
- it { subject.must_be_instance_of(described) }
196
- it { subject.x.must_equal(1) }
197
- it { subject.xn.must_equal(11) }
198
- it { subject.y.must_equal(1) }
199
- it { subject.yn.must_equal(5) }
200
- end
201
-
202
- describe '#move_right' do
203
- let(:x) { 15 }
204
- let(:xn) { 25 }
205
- let(:y) { 4 }
206
- let(:yn) { 8 }
207
-
208
- subject { instance.move_right }
209
-
210
- it { subject.must_be_instance_of(described) }
211
-
212
- it { subject.x.must_equal(16) }
213
- it { subject.xn.must_equal(26) }
214
-
215
- context 'when the move will make the geometry out of bounds' do
216
- let(:x) { 30 }
217
- let(:xn) { 40 }
218
- let(:y) { 4 }
219
- let(:yn) { 8 }
220
-
221
- it { subject.x.must_equal(30) }
222
- it { subject.xn.must_equal(40) }
223
- end
224
- end
225
-
226
- describe '#move_up' do
227
- let(:x) { 15 }
228
- let(:xn) { 25 }
229
- let(:y) { 4 }
230
- let(:yn) { 8 }
231
-
232
- subject { instance.move_up }
233
-
234
- it { subject.must_be_instance_of(described) }
235
-
236
- it { subject.y.must_equal(3) }
237
- it { subject.yn.must_equal(7) }
238
-
239
- context 'when the move will make the geometry out of bounds' do
240
- let(:x) { 15 }
241
- let(:xn) { 25 }
242
- let(:y) { 1 }
243
- let(:yn) { 5 }
244
-
245
- it { subject.y.must_equal(1) }
246
- it { subject.yn.must_equal(5) }
247
- end
248
- end
249
-
250
135
  describe '#unmaximise' do
251
136
  let(:attributes) {
252
137
  {
@@ -0,0 +1,176 @@
1
+ require 'test_helper'
2
+
3
+ module Vedeu
4
+
5
+ module Geometry
6
+
7
+ describe Move do
8
+
9
+ let(:described) { Vedeu::Geometry::Move }
10
+ let(:instance) { described.new(attributes) }
11
+ let(:direction) {}
12
+ let(:_name) { 'Vedeu::Geometry::Move' }
13
+ let(:offset) {}
14
+ let(:attributes) {
15
+ {
16
+ direction: direction,
17
+ name: _name,
18
+ offset: offset,
19
+ }
20
+ }
21
+ let(:geometry) {
22
+ Vedeu::Geometry::Geometry.new(name: _name, x: 2, xn: 8, y: 2, yn: 8)
23
+ }
24
+
25
+ describe '#initialize' do
26
+ it { instance.must_be_instance_of(described) }
27
+
28
+ context 'when a direction is given' do
29
+ let(:direction) { :left }
30
+
31
+ it {
32
+ instance.instance_variable_get('@direction').must_equal(direction)
33
+ }
34
+ end
35
+
36
+ context 'when a direction is not given' do
37
+ it { instance.instance_variable_get('@direction').must_equal(:none) }
38
+ end
39
+
40
+ context 'when a name is given' do
41
+ it { instance.instance_variable_get('@name').must_equal(_name) }
42
+ end
43
+
44
+ context 'when a name is not given' do
45
+ let(:_name) {}
46
+
47
+ it { instance.instance_variable_get('@name').must_equal('') }
48
+ end
49
+
50
+ context 'when an offset is given' do
51
+ let(:offset) { 2 }
52
+
53
+ it { instance.instance_variable_get('@offset').must_equal(offset) }
54
+ end
55
+
56
+ context 'when an offset is not given' do
57
+ it { instance.instance_variable_get('@offset').must_equal(1) }
58
+ end
59
+ end
60
+
61
+ describe '.move' do
62
+ before do
63
+ Vedeu.geometries.stubs(:by_name).with(_name).returns(geometry)
64
+ Vedeu.stubs(:trigger)
65
+ Vedeu.stubs(:height).returns(10)
66
+ Vedeu.stubs(:width).returns(10)
67
+ end
68
+
69
+ subject { described.move(attributes) }
70
+
71
+ context 'when the direction is :down' do
72
+ let(:direction) { :down }
73
+
74
+ context 'when y + offset > terminal height' do
75
+ let(:offset) { 3 }
76
+
77
+ it { subject.must_equal(false) }
78
+ end
79
+
80
+ context 'when y + offset <= terminal height' do
81
+ it { subject.must_be_instance_of(Vedeu::Geometry::Geometry) }
82
+ it { subject.x.must_equal(2) }
83
+ it { subject.xn.must_equal(8) }
84
+ it { subject.y.must_equal(3) }
85
+ it { subject.yn.must_equal(9) }
86
+ end
87
+ end
88
+
89
+ context 'when the direction is :left' do
90
+ let(:direction) { :left }
91
+
92
+ context 'when x - offset < 1' do
93
+ let(:offset) { 3 }
94
+
95
+ it { subject.must_equal(false) }
96
+ end
97
+
98
+ context 'when x - offset >= 1' do
99
+ it { subject.must_be_instance_of(Vedeu::Geometry::Geometry) }
100
+ it { subject.x.must_equal(1) }
101
+ it { subject.xn.must_equal(7) }
102
+ it { subject.y.must_equal(2) }
103
+ it { subject.yn.must_equal(8) }
104
+ end
105
+ end
106
+
107
+ context 'when the direction is :none' do
108
+ let(:direction) { :none }
109
+ let(:offset) { 1 }
110
+
111
+ it { subject.must_equal(false) }
112
+ end
113
+
114
+ context 'when the direction is :origin' do
115
+ let(:direction) { :origin }
116
+
117
+ it { subject.must_be_instance_of(Vedeu::Geometry::Geometry) }
118
+ it { subject.x.must_equal(1) }
119
+ it { subject.xn.must_equal(7) }
120
+ it { subject.y.must_equal(1) }
121
+ it { subject.yn.must_equal(7) }
122
+ end
123
+
124
+ context 'when the direction is :right' do
125
+ let(:direction) { :right }
126
+
127
+ context 'when xn + offset > terminal width' do
128
+ let(:offset) { 3 }
129
+
130
+ it { subject.must_equal(false) }
131
+ end
132
+
133
+ context 'when xn + offset <= terminal width' do
134
+ it { subject.must_be_instance_of(Vedeu::Geometry::Geometry) }
135
+ it { subject.x.must_equal(3) }
136
+ it { subject.xn.must_equal(9) }
137
+ it { subject.y.must_equal(2) }
138
+ it { subject.yn.must_equal(8) }
139
+ end
140
+ end
141
+
142
+ context 'when the direction is :up' do
143
+ let(:direction) { :up }
144
+
145
+ context 'when y - offset < 1' do
146
+ let(:offset) { 3 }
147
+
148
+ it { subject.must_equal(false) }
149
+ end
150
+
151
+ context 'when y - offset >= 1' do
152
+ it { subject.must_be_instance_of(Vedeu::Geometry::Geometry) }
153
+ it { subject.x.must_equal(2) }
154
+ it { subject.xn.must_equal(8) }
155
+ it { subject.y.must_equal(1) }
156
+ it { subject.yn.must_equal(7) }
157
+ end
158
+ end
159
+
160
+ context 'when the direction is invalid' do
161
+ let(:direction) { :invalid }
162
+ let(:offset) { 1 }
163
+
164
+ it { subject.must_equal(false) }
165
+ end
166
+ end
167
+
168
+ describe '#move' do
169
+ it { instance.must_respond_to(:move) }
170
+ end
171
+
172
+ end # Move
173
+
174
+ end # Geometry
175
+
176
+ end # Vedeu
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vedeu
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.57
4
+ version: 0.6.58
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gavin Laking
@@ -420,6 +420,7 @@ files:
420
420
  - lib/vedeu/geometry/geometry.rb
421
421
  - lib/vedeu/geometry/grid.rb
422
422
  - lib/vedeu/geometry/horizontal_alignment.rb
423
+ - lib/vedeu/geometry/move.rb
423
424
  - lib/vedeu/geometry/null.rb
424
425
  - lib/vedeu/geometry/position.rb
425
426
  - lib/vedeu/geometry/repository.rb
@@ -605,6 +606,7 @@ files:
605
606
  - test/lib/vedeu/geometry/geometry_test.rb
606
607
  - test/lib/vedeu/geometry/grid_test.rb
607
608
  - test/lib/vedeu/geometry/horizontal_alignment_test.rb
609
+ - test/lib/vedeu/geometry/move_test.rb
608
610
  - test/lib/vedeu/geometry/null_test.rb
609
611
  - test/lib/vedeu/geometry/position_test.rb
610
612
  - test/lib/vedeu/geometry/repository_test.rb
@@ -817,6 +819,7 @@ test_files:
817
819
  - test/lib/vedeu/geometry/geometry_test.rb
818
820
  - test/lib/vedeu/geometry/grid_test.rb
819
821
  - test/lib/vedeu/geometry/horizontal_alignment_test.rb
822
+ - test/lib/vedeu/geometry/move_test.rb
820
823
  - test/lib/vedeu/geometry/null_test.rb
821
824
  - test/lib/vedeu/geometry/position_test.rb
822
825
  - test/lib/vedeu/geometry/repository_test.rb