vedeu 0.4.14 → 0.4.15

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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -3
  3. data/README.md +47 -35
  4. data/docs/views.md +1 -1
  5. data/examples/material_colours_app.rb +0 -5
  6. data/lib/vedeu/cursor/cursor.rb +4 -5
  7. data/lib/vedeu/cursor/move.rb +52 -84
  8. data/lib/vedeu/cursor/refresh_cursor.rb +12 -18
  9. data/lib/vedeu/debug.rb +3 -1
  10. data/lib/vedeu/geometry/area.rb +0 -2
  11. data/lib/vedeu/geometry/coordinate.rb +10 -0
  12. data/lib/vedeu/geometry/dimension.rb +34 -18
  13. data/lib/vedeu/geometry/null_geometry.rb +10 -1
  14. data/lib/vedeu/geometry/position.rb +1 -1
  15. data/lib/vedeu/geometry/position_validator.rb +2 -2
  16. data/lib/vedeu/input/mapper.rb +4 -18
  17. data/lib/vedeu/main_loop.rb +1 -3
  18. data/lib/vedeu/models/cell.rb +11 -17
  19. data/lib/vedeu/models/interface.rb +0 -7
  20. data/lib/vedeu/output/border.rb +34 -61
  21. data/lib/vedeu/output/clear.rb +39 -14
  22. data/lib/vedeu/output/colour.rb +15 -15
  23. data/lib/vedeu/output/esc.rb +1 -1
  24. data/lib/vedeu/output/html_char.rb +18 -24
  25. data/lib/vedeu/output/null_border.rb +14 -10
  26. data/lib/vedeu/output/presentation.rb +32 -8
  27. data/lib/vedeu/output/renderers/all.rb +1 -0
  28. data/lib/vedeu/output/renderers/text_renderer.rb +40 -0
  29. data/lib/vedeu/output/translator.rb +2 -4
  30. data/lib/vedeu/output/viewport.rb +22 -13
  31. data/lib/vedeu/output/virtual_terminal.rb +0 -1
  32. data/lib/vedeu/repositories/repositories/borders.rb +3 -4
  33. data/lib/vedeu/repositories/repositories/cursors.rb +13 -1
  34. data/lib/vedeu/repositories/repositories/geometries.rb +1 -1
  35. data/lib/vedeu/support/all.rb +1 -0
  36. data/lib/vedeu/support/options.rb +65 -0
  37. data/lib/vedeu/support/terminal.rb +3 -5
  38. data/test/lib/vedeu/cursor/cursor_test.rb +0 -5
  39. data/test/lib/vedeu/cursor/move_test.rb +87 -92
  40. data/test/lib/vedeu/geometry/null_geometry_test.rb +3 -1
  41. data/test/lib/vedeu/models/cell_test.rb +13 -16
  42. data/test/lib/vedeu/models/interface_test.rb +0 -17
  43. data/test/lib/vedeu/output/border_test.rb +0 -22
  44. data/test/lib/vedeu/output/clear_test.rb +4 -2
  45. data/test/lib/vedeu/output/null_border_test.rb +8 -4
  46. data/test/lib/vedeu/output/renderers/text_renderer_test.rb +24 -0
  47. data/test/lib/vedeu/repositories/repositories/borders_test.rb +1 -13
  48. data/test/lib/vedeu/support/options_test.rb +70 -0
  49. data/vedeu.gemspec +1 -1
  50. metadata +8 -2
@@ -5,6 +5,12 @@ module Vedeu
5
5
  #
6
6
  class RefreshCursor
7
7
 
8
+ extend Forwardable
9
+
10
+ def_delegators :border,
11
+ :height,
12
+ :width
13
+
8
14
  # @param (see #initialize)
9
15
  def self.render(name = Vedeu.focus)
10
16
  new(name).render
@@ -35,7 +41,7 @@ module Vedeu
35
41
 
36
42
  # @return [Boolean]
37
43
  def refresh_view?
38
- new_cursor.ox >= interface_width || new_cursor.oy >= interface_height
44
+ new_cursor.ox >= width || new_cursor.oy >= height
39
45
  end
40
46
 
41
47
  # @return [Vedeu::Cursor]
@@ -53,29 +59,17 @@ module Vedeu
53
59
 
54
60
  # @return [Vedeu::PositionValidator]
55
61
  def validated_position
56
- @position ||= Vedeu::PositionValidator.validate(interface.name,
57
- cursor.x,
58
- cursor.y)
62
+ @position ||= Vedeu::PositionValidator.validate(name, cursor.x, cursor.y)
59
63
  end
60
64
 
61
65
  # @return [Vedeu::Cursor]
62
66
  def cursor
63
- @cursor ||= Vedeu.cursors.find(name)
64
- end
65
-
66
- # @return [Fixnum]
67
- def interface_height
68
- interface.border.height
69
- end
70
-
71
- # @return [Fixnum]
72
- def interface_width
73
- interface.border.width
67
+ @cursor ||= Vedeu.cursors.by_name(name)
74
68
  end
75
69
 
76
- # @return [Vedeu::Interface]
77
- def interface
78
- @interface ||= Vedeu.interfaces.find(name)
70
+ # @return (see Vedeu::Borders#by_name)
71
+ def border
72
+ @border ||= Vedeu.borders.by_name(name)
79
73
  end
80
74
 
81
75
  end # RefreshCursor
@@ -6,7 +6,9 @@ module Vedeu
6
6
  #
7
7
  # @param filename [String]
8
8
  # @param block [Proc]
9
- def self.debug(filename = 'profile.html', &block)
9
+ def self.debug(filename = 'profile.html')
10
+ return nil unless block_given?
11
+
10
12
  require 'ruby-prof'
11
13
 
12
14
  RubyProf.measure_mode = RubyProf::WALL_TIME
@@ -168,8 +168,6 @@ module Vedeu
168
168
  Vedeu::Position[yn, xn]
169
169
  end
170
170
 
171
- private
172
-
173
171
  end # Area
174
172
 
175
173
  end # Vedeu
@@ -244,6 +244,16 @@ module Vedeu
244
244
  (y...yn).to_a
245
245
  end
246
246
 
247
+ private
248
+
249
+ # @!attribute [r] name
250
+ # @return [String]
251
+ attr_reader :name
252
+
253
+ def border
254
+ @border ||= Vedeu.borders.by_name(name)
255
+ end
256
+
247
257
  end # Coordinate
248
258
 
249
259
  end # Vedeu
@@ -63,26 +63,10 @@ module Vedeu
63
63
  # @return [Array<Fixnum>]
64
64
  def dimension
65
65
  @dimension ||= if centred? && length?
66
- [(default / 2) - (length / 2),
67
- (default / 2) + (length / 2)]
68
-
69
- elsif d && dn
70
- [d, dn]
71
-
72
- elsif d && d_dn
73
- [d, ((d + d_dn) - 1)]
74
-
75
- elsif d_dn
76
- [1, d_dn]
77
-
78
- elsif d
79
- [d, default]
80
-
81
- elsif dn
82
- [1, dn]
66
+ [centred_d, centred_dn]
83
67
 
84
68
  else
85
- [1, default]
69
+ [_d, _dn]
86
70
 
87
71
  end
88
72
  end
@@ -111,6 +95,38 @@ module Vedeu
111
95
  options[:centred]
112
96
  end
113
97
 
98
+ # @return [Fixnum]
99
+ def centred_d
100
+ (default / 2) - (length / 2)
101
+ end
102
+
103
+ # @return [Fixnum]
104
+ def centred_dn
105
+ (default / 2) + (length / 2)
106
+ end
107
+
108
+ # @return [Fixnum]
109
+ def _d
110
+ d || 1
111
+ end
112
+
113
+ # @return [Fixnum]
114
+ def _dn
115
+ if dn
116
+ dn
117
+
118
+ elsif d.nil? && d_dn
119
+ d_dn
120
+
121
+ elsif d && d_dn
122
+ (d + d_dn) - 1
123
+
124
+ else
125
+ default
126
+
127
+ end
128
+ end
129
+
114
130
  # @return [Hash<Symbol => Boolean>]
115
131
  def options
116
132
  defaults.merge!(@options)
@@ -26,8 +26,17 @@ module Vedeu
26
26
  :bottom_left,
27
27
  :bottom_right
28
28
 
29
+ # @!attribute [r] name
30
+ # @return [String|NilClass]
31
+ attr_reader :name
32
+
33
+ # Returns a new instance of Vedeu::NullGeometry.
34
+ #
35
+ # @param name [String|NilClass]
29
36
  # @return [Vedeu::NullGeometry]
30
- def initialize; end
37
+ def initialize(name = nil)
38
+ @name = name
39
+ end
31
40
 
32
41
  # @return [FalseClass]
33
42
  def centred
@@ -58,7 +58,7 @@ module Vedeu
58
58
  #
59
59
  # @param block [Proc]
60
60
  # @return [String]
61
- def to_s(&block)
61
+ def to_s
62
62
  if block_given?
63
63
  [sequence, yield, sequence].join
64
64
 
@@ -112,12 +112,12 @@ module Vedeu
112
112
  self
113
113
  end
114
114
 
115
- # @return [Vedeu::Border|Vedeu::NullBorder|NilClass]
115
+ # @return (see Vedeu::Borders#by_name)
116
116
  def border
117
117
  @border ||= Vedeu.borders.by_name(name)
118
118
  end
119
119
 
120
- # @return [Vedeu::Geometry|Vedeu::NullGeometry]
120
+ # @return (see Vedeu::Geometries#by_name)
121
121
  def geometry
122
122
  @geometry ||= Vedeu.geometries.by_name(name)
123
123
  end
@@ -48,9 +48,9 @@ module Vedeu
48
48
 
49
49
  return true if key_defined? && keymap.use(key)
50
50
 
51
- return true if global_key? && keymap(global).use(key)
51
+ return true if global_key? && keymap('_global_').use(key)
52
52
 
53
- return true if system_key? && keymap(system).use(key)
53
+ return true if system_key? && keymap('_system_').use(key)
54
54
 
55
55
  false
56
56
  end
@@ -79,14 +79,14 @@ module Vedeu
79
79
  #
80
80
  # @return [Boolean]
81
81
  def global_key?
82
- key_defined?(global)
82
+ key_defined?('_global_')
83
83
  end
84
84
 
85
85
  # Is the key a system key?
86
86
  #
87
87
  # @return [Boolean]
88
88
  def system_key?
89
- key_defined?(system)
89
+ key_defined?('_system_')
90
90
  end
91
91
 
92
92
  # Is the key defined in the named keymap?
@@ -122,20 +122,6 @@ module Vedeu
122
122
  end
123
123
  alias_method :interface, :name
124
124
 
125
- # Return the name of the global keymap.
126
- #
127
- # @return [String]
128
- def global
129
- '_global_'
130
- end
131
-
132
- # Return the name of the system keymap.
133
- #
134
- # @return [String]
135
- def system
136
- '_system_'
137
- end
138
-
139
125
  end # Mapper
140
126
 
141
127
  end # Vedeu
@@ -17,7 +17,7 @@ module Vedeu
17
17
  #
18
18
  # @param block [Proc]
19
19
  # @return [void]
20
- def self.start!(&block)
20
+ def self.start!
21
21
  @started = true
22
22
  @loop = true
23
23
 
@@ -37,8 +37,6 @@ module Vedeu
37
37
  @loop = false
38
38
  end
39
39
 
40
- private
41
-
42
40
  # Check the application has started and we wish to continue running.
43
41
  #
44
42
  # @raise [VedeuInterrupt] When we wish to terminate the running application.
@@ -4,13 +4,9 @@ module Vedeu
4
4
  #
5
5
  class Cell
6
6
 
7
- # @!attribute [r] background
7
+ # @!attribute [r] colour
8
8
  # @return [NilClass|String]
9
- attr_reader :background
10
-
11
- # @!attribute [r] foreground
12
- # @return [NilClass|String]
13
- attr_reader :foreground
9
+ attr_reader :colour
14
10
 
15
11
  # @!attribute [r] style
16
12
  # @return [NilClass|Array<Symbol|String>|Symbol|String]
@@ -32,28 +28,26 @@ module Vedeu
32
28
  #
33
29
  # @param attributes [Hash<Symbol => Array<Symbol|String>,
34
30
  # Fixnum, String, Symbol]
35
- # @option attributes background [NilClass|String]
36
- # @option attributes foreground [NilClass|String]
31
+ # @option attributes colour [NilClass|String]
37
32
  # @option attributes style [NilClass|Array<Symbol|String>|Symbol|String]
38
33
  # @option attributes value [NilClass|String]
39
34
  # @option attributes x [NilClass|Fixnum]
40
35
  # @option attributes y [NilClass|Fixnum]
41
36
  # @return [Vedeu::Cell]
42
37
  def initialize(attributes = {})
43
- @background = attributes[:background]
44
- @foreground = attributes[:foreground]
45
- @style = attributes[:style]
46
- @value = attributes[:value]
47
- @x = attributes[:x]
48
- @y = attributes[:y]
38
+ @colour = attributes[:colour]
39
+ @style = attributes[:style]
40
+ @value = attributes[:value]
41
+ @x = attributes[:x]
42
+ @y = attributes[:y]
49
43
  end
50
44
 
51
45
  # @param other [Vedeu::Cell]
52
46
  # @return [Boolean]
53
47
  def eql?(other)
54
- self.class == other.class && background == other.background &&
55
- foreground == other.foreground && style == other.style &&
56
- value == other.value && x == other.x && y == other.y
48
+ self.class == other.class && colour == other.colour &&
49
+ style == other.style && value == other.value && x == other.x &&
50
+ y == other.y
57
51
  end
58
52
  alias_method :==, :eql?
59
53
 
@@ -114,13 +114,6 @@ module Vedeu
114
114
  }
115
115
  end
116
116
 
117
- # Returns a boolean indicating whether the interface has a border.
118
- #
119
- # @return [Boolean]
120
- def border?
121
- Vedeu.borders.registered?(name)
122
- end
123
-
124
117
  # Returns the border object belonging to the interface.
125
118
  #
126
119
  # @return [Vedeu::Border|NilClass]
@@ -13,8 +13,18 @@ module Vedeu
13
13
  #
14
14
  class Border
15
15
 
16
+ extend Forwardable
16
17
  include Vedeu::Common
17
18
  include Vedeu::Model
19
+ include Vedeu::Presentation
20
+
21
+ def_delegators :geometry,
22
+ :x,
23
+ :xn,
24
+ :y,
25
+ :yn
26
+
27
+ def_delegators :interface, :visible?
18
28
 
19
29
  # @!attribute [rw] attributes
20
30
  # @return [Hash]
@@ -91,7 +101,7 @@ module Vedeu
91
101
  # @option attributes bottom_left [String] The bottom left border character.
92
102
  # @option attributes bottom_right [String] The bottom right border
93
103
  # character.
94
- # @option attributes colour []
104
+ # @option attributes colour [Hash]
95
105
  # @option attributes enabled [Boolean] Indicate whether the border is to be
96
106
  # shown for this interface.
97
107
  # @option attributes horizontal [String] The horizontal border character.
@@ -127,37 +137,29 @@ module Vedeu
127
137
  @horizontal = @attributes[:horizontal]
128
138
  @vertical = @attributes[:vertical]
129
139
  @name = @attributes[:name]
130
- @colour = @attributes[:colour]
131
140
  @repository = Vedeu.borders
141
+ @colour = @attributes[:colour]
132
142
  @style = @attributes[:style]
133
143
  end
134
144
 
135
145
  # @return [Fixnum]
136
146
  def bx
137
- bo = (enabled? && left?) ? 1 : 0
138
-
139
- geometry.x + bo
147
+ (enabled? && left?) ? x + 1 : x
140
148
  end
141
149
 
142
150
  # @return [Fixnum]
143
151
  def bxn
144
- bo = (enabled? && right?) ? 1 : 0
145
-
146
- geometry.xn - bo
152
+ (enabled? && right?) ? xn - 1 : xn
147
153
  end
148
154
 
149
155
  # @return [Fixnum]
150
156
  def by
151
- bo = (enabled? && top?) ? 1 : 0
152
-
153
- geometry.y + bo
157
+ (enabled? && top?) ? y + 1 : y
154
158
  end
155
159
 
156
160
  # @return [Fixnum]
157
161
  def byn
158
- bo = (enabled? && bottom?) ? 1 : 0
159
-
160
- geometry.yn - bo
162
+ (enabled? && bottom?) ? yn - 1 : yn
161
163
  end
162
164
 
163
165
  # Returns the width of the interface determined by whether a left, right,
@@ -176,21 +178,9 @@ module Vedeu
176
178
  (by..byn).size
177
179
  end
178
180
 
179
- # @return [Vedeu::Colour]
180
- def colour
181
- Vedeu::Colour.coerce(@colour)
182
- end
183
-
184
- # Set the border colour.
185
- #
186
- # @return [Vedeu::Colour]
187
- def colour=(value)
188
- @colour = Vedeu::Colour.coerce(value)
189
- end
190
-
191
181
  # @return [Array<Array<Vedeu::Char>>]
192
182
  def render
193
- return [] unless interface.visible?
183
+ return [] unless visible?
194
184
  return [] unless enabled?
195
185
 
196
186
  out = [top, bottom]
@@ -202,16 +192,9 @@ module Vedeu
202
192
  out.flatten
203
193
  end
204
194
 
205
- # @return [Vedeu::Style]
206
- def style
207
- Vedeu::Style.coerce(@style)
208
- end
209
-
210
- # Set the border style.
211
- #
212
- # @return [Vedeu::Style]
213
- def style=(value)
214
- @style = Vedeu::Style.coerce(value)
195
+ # @return [String]
196
+ def to_s
197
+ Vedeu::TextRenderer.render(render)
215
198
  end
216
199
 
217
200
  # Renders the bottom border for the interface.
@@ -267,9 +250,7 @@ module Vedeu
267
250
  out << titlebar
268
251
 
269
252
  else
270
- width.times do |ix|
271
- out << border(horizontal, prefix_horizontal, nil, ix)
272
- end
253
+ out << horizontal_border(prefix_horizontal)
273
254
 
274
255
  end
275
256
 
@@ -277,10 +258,11 @@ module Vedeu
277
258
  out
278
259
  end
279
260
 
261
+ # @param position [Symbol] Either :top_horizontal, or :bottom_horizontal.
280
262
  # @return [Array<Vedeu::Char>]
281
- def horizontal_border
263
+ def horizontal_border(position)
282
264
  width.times.inject([]) do |a, ix|
283
- a << border(horizontal, :top_horizontal, nil, ix)
265
+ a << border(horizontal, position, nil, ix)
284
266
  a
285
267
  end
286
268
  end
@@ -290,7 +272,7 @@ module Vedeu
290
272
  #
291
273
  # @return [Array<Vedeu::Char>]
292
274
  def titlebar
293
- horizontal_border.each_with_index do |char, index|
275
+ horizontal_border(:top_horizontal).each_with_index do |char, index|
294
276
  if index >= 1 && index <= title_characters.size
295
277
  char.border = nil
296
278
  char.value = title_characters[(index - 1)]
@@ -359,8 +341,7 @@ module Vedeu
359
341
 
360
342
  # @return [Vedeu::Geometry]
361
343
  def geometry
362
- # @geometry ||= Vedeu.geometry.find(name)
363
- interface.geometry
344
+ @geometry ||= Vedeu.geometries.by_name(name)
364
345
  end
365
346
 
366
347
  # @return [Vedeu::Interface]
@@ -402,22 +383,14 @@ module Vedeu
402
383
  # @return [Vedeu::Position]
403
384
  def position(name, iy = 0, ix = 0)
404
385
  case name
405
- when :top_horizontal
406
- Vedeu::Position[geometry.y, (bx + ix)]
407
-
408
- when :bottom_horizontal
409
- Vedeu::Position[geometry.yn, (bx + ix)]
410
-
411
- when :left_vertical
412
- Vedeu::Position[(by + iy), geometry.x]
413
-
414
- when :right_vertical
415
- Vedeu::Position[(by + iy), geometry.xn]
416
-
417
- when :bottom_left then geometry.bottom_left
418
- when :bottom_right then geometry.bottom_right
419
- when :top_left then geometry.top_left
420
- when :top_right then geometry.top_right
386
+ when :top_horizontal then Vedeu::Position[y, (bx + ix)]
387
+ when :bottom_horizontal then Vedeu::Position[yn, (bx + ix)]
388
+ when :left_vertical then Vedeu::Position[(by + iy), x]
389
+ when :right_vertical then Vedeu::Position[(by + iy), xn]
390
+ when :bottom_left then geometry.bottom_left
391
+ when :bottom_right then geometry.bottom_right
392
+ when :top_left then geometry.top_left
393
+ when :top_right then geometry.top_right
421
394
  end
422
395
  end
423
396