vedeu 0.4.13 → 0.4.14
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/.rubocop.yml +2 -1
- data/.travis.yml +2 -1
- data/Guardfile +6 -5
- data/README.md +3 -30
- data/Rakefile +5 -5
- data/bin/vedeu_drb_client +1 -1
- data/bin/vedeu_drb_server +91 -89
- data/bin/vedeu_test +4 -0
- data/config/rubocop_enabled.yml +5 -10
- data/examples/borders_app.rb +2 -1
- data/examples/colours_app.rb +13 -8
- data/examples/configuration_app.rb +3 -2
- data/examples/cursor_app.rb +16 -11
- data/examples/drb_app.rb +88 -89
- data/examples/focus_app.rb +31 -32
- data/examples/geometry_app.rb +2 -1
- data/examples/hello_world.rb +2 -1
- data/examples/lines_app.rb +2 -1
- data/examples/material_colours_app.rb +126 -0
- data/examples/typed_commands/typed_commands_app.rb +5 -1
- data/examples/view_templates_app/view_templates_app.rb +6 -3
- data/lib/vedeu/all.rb +1 -1
- data/lib/vedeu/api.rb +18 -10
- data/lib/vedeu/application.rb +0 -1
- data/lib/vedeu/bindings.rb +77 -16
- data/lib/vedeu/buffers/all.rb +2 -5
- data/lib/vedeu/buffers/buffer.rb +69 -25
- data/lib/vedeu/buffers/display_buffer.rb +3 -7
- data/lib/vedeu/configuration/all.rb +3 -6
- data/lib/vedeu/configuration/api.rb +28 -4
- data/lib/vedeu/configuration/cli.rb +9 -9
- data/lib/vedeu/configuration/configuration.rb +11 -7
- data/lib/vedeu/cursor/all.rb +3 -6
- data/lib/vedeu/cursor/cursor.rb +22 -14
- data/lib/vedeu/cursor/move.rb +32 -22
- data/lib/vedeu/cursor/refresh_cursor.rb +1 -1
- data/lib/vedeu/debug.rb +2 -1
- data/lib/vedeu/distributed/client.rb +1 -7
- data/lib/vedeu/distributed/server.rb +0 -4
- data/lib/vedeu/distributed/subprocess.rb +1 -1
- data/lib/vedeu/distributed/templates/default_configuration.vedeu +1 -1
- data/lib/vedeu/distributed/test_application.rb +3 -5
- data/lib/vedeu/distributed/uri.rb +2 -2
- data/lib/vedeu/dsl/all.rb +6 -6
- data/lib/vedeu/dsl/components/all.rb +0 -3
- data/lib/vedeu/dsl/components/border.rb +20 -12
- data/lib/vedeu/dsl/components/geometry.rb +68 -3
- data/lib/vedeu/dsl/components/keymap.rb +1 -2
- data/lib/vedeu/dsl/composition.rb +8 -1
- data/lib/vedeu/dsl/interface.rb +61 -11
- data/lib/vedeu/dsl/line.rb +12 -12
- data/lib/vedeu/dsl/shared/all.rb +4 -7
- data/lib/vedeu/dsl/shared/colour.rb +2 -2
- data/lib/vedeu/dsl/shared/text.rb +2 -35
- data/lib/vedeu/dsl/shared/use.rb +2 -2
- data/lib/vedeu/dsl/view.rb +4 -4
- data/lib/vedeu/events/all.rb +3 -5
- data/lib/vedeu/events/event.rb +5 -5
- data/lib/vedeu/geometry/all.rb +11 -16
- data/lib/vedeu/geometry/area.rb +2 -5
- data/lib/vedeu/geometry/canvas.rb +12 -16
- data/lib/vedeu/geometry/dimension.rb +20 -22
- data/lib/vedeu/geometry/geometry.rb +28 -30
- data/lib/vedeu/geometry/grid.rb +1 -1
- data/lib/vedeu/geometry/index_position.rb +7 -0
- data/lib/vedeu/geometry/null_geometry.rb +61 -0
- data/lib/vedeu/geometry/position.rb +0 -3
- data/lib/vedeu/geometry/position_index.rb +7 -0
- data/lib/vedeu/geometry/position_validator.rb +44 -33
- data/lib/vedeu/input/all.rb +5 -4
- data/lib/vedeu/input/keymap.rb +0 -1
- data/lib/vedeu/input/mapper.rb +1 -3
- data/lib/vedeu/launcher.rb +6 -7
- data/lib/vedeu/main_loop.rb +1 -2
- data/lib/vedeu/models/all.rb +1 -0
- data/lib/vedeu/models/cell.rb +5 -8
- data/lib/vedeu/models/char.rb +50 -15
- data/lib/vedeu/models/composition.rb +8 -1
- data/lib/vedeu/models/focus.rb +4 -4
- data/lib/vedeu/models/group.rb +3 -3
- data/lib/vedeu/models/interface.rb +62 -46
- data/lib/vedeu/models/line.rb +1 -1
- data/lib/vedeu/models/null.rb +48 -0
- data/lib/vedeu/models/stream.rb +5 -5
- data/lib/vedeu/output/all.rb +20 -30
- data/lib/vedeu/output/border.rb +93 -40
- data/lib/vedeu/output/clear.rb +100 -15
- data/lib/vedeu/output/colour.rb +56 -12
- data/lib/vedeu/output/compressor.rb +59 -0
- data/lib/vedeu/output/html_char.rb +4 -2
- data/lib/vedeu/output/null_border.rb +16 -4
- data/lib/vedeu/output/output.rb +13 -21
- data/lib/vedeu/output/presentation.rb +28 -23
- data/lib/vedeu/output/refresh.rb +2 -2
- data/lib/vedeu/output/renderers/all.rb +80 -3
- data/lib/vedeu/output/renderers/file_renderer.rb +38 -2
- data/lib/vedeu/output/renderers/html_renderer.rb +6 -4
- data/lib/vedeu/output/renderers/json_renderer.rb +52 -0
- data/lib/vedeu/output/renderers/null_renderer.rb +14 -0
- data/lib/vedeu/output/renderers/terminal_renderer.rb +2 -12
- data/lib/vedeu/output/style.rb +33 -3
- data/lib/vedeu/output/text.rb +98 -1
- data/lib/vedeu/output/translator.rb +30 -7
- data/lib/vedeu/output/viewport.rb +43 -79
- data/lib/vedeu/output/wordwrap.rb +4 -4
- data/lib/vedeu/repositories/all.rb +22 -179
- data/lib/vedeu/repositories/collection.rb +11 -13
- data/lib/vedeu/repositories/collections/all.rb +8 -0
- data/lib/vedeu/repositories/collections/chars.rb +9 -0
- data/lib/vedeu/repositories/collections/events.rb +9 -0
- data/lib/vedeu/repositories/collections/interfaces.rb +9 -0
- data/lib/vedeu/repositories/collections/keys.rb +9 -0
- data/lib/vedeu/repositories/collections/lines.rb +9 -0
- data/lib/vedeu/repositories/collections/streams.rb +9 -0
- data/lib/vedeu/repositories/model.rb +7 -2
- data/lib/vedeu/repositories/repositories/all.rb +14 -0
- data/lib/vedeu/repositories/repositories/background_colours.rb +14 -0
- data/lib/vedeu/repositories/repositories/borders.rb +38 -0
- data/lib/vedeu/repositories/repositories/buffers.rb +36 -0
- data/lib/vedeu/repositories/repositories/colours.rb +63 -0
- data/lib/vedeu/repositories/repositories/cursors.rb +29 -0
- data/lib/vedeu/repositories/repositories/events_repository.rb +24 -0
- data/lib/vedeu/repositories/repositories/foreground_colours.rb +14 -0
- data/lib/vedeu/repositories/repositories/geometries.rb +37 -0
- data/lib/vedeu/repositories/repositories/groups.rb +24 -0
- data/lib/vedeu/repositories/repositories/interfaces_repository.rb +24 -0
- data/lib/vedeu/repositories/repositories/keymaps.rb +24 -0
- data/lib/vedeu/repositories/repositories/menus.rb +24 -0
- data/lib/vedeu/repositories/repository.rb +29 -47
- data/lib/vedeu/storage/all.rb +6 -0
- data/lib/vedeu/storage/associative_store.rb +47 -0
- data/lib/vedeu/storage/conveyor_store.rb +69 -0
- data/lib/vedeu/storage/fifo_store.rb +37 -0
- data/lib/vedeu/storage/store.rb +58 -0
- data/lib/vedeu/support/all.rb +5 -10
- data/lib/vedeu/support/common.rb +0 -8
- data/lib/vedeu/support/log.rb +13 -24
- data/lib/vedeu/support/template.rb +4 -1
- data/lib/vedeu/support/terminal.rb +10 -10
- data/lib/vedeu/support/trace.rb +15 -88
- data/lib/vedeu/support/visibility.rb +73 -0
- data/lib/vedeu.rb +37 -0
- data/test/lib/vedeu/api_test.rb +7 -3
- data/test/lib/vedeu/application_test.rb +9 -3
- data/test/lib/vedeu/bindings_test.rb +21 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +110 -134
- data/test/lib/vedeu/buffers/display_buffer_test.rb +8 -0
- data/test/lib/vedeu/configuration/api_test.rb +5 -1
- data/test/lib/vedeu/configuration/configuration_test.rb +4 -6
- data/test/lib/vedeu/cursor/cursor_test.rb +25 -17
- data/test/lib/vedeu/cursor/move_test.rb +7 -7
- data/test/lib/vedeu/distributed/client_test.rb +1 -1
- data/test/lib/vedeu/distributed/subprocess_test.rb +3 -1
- data/test/lib/vedeu/distributed/uri_test.rb +5 -5
- data/test/lib/vedeu/dsl/components/geometry_test.rb +43 -0
- data/test/lib/vedeu/dsl/components/keymap_test.rb +1 -1
- data/test/lib/vedeu/dsl/composition_test.rb +6 -5
- data/test/lib/vedeu/dsl/interface_test.rb +81 -16
- data/test/lib/vedeu/dsl/shared/colour_test.rb +4 -4
- data/test/lib/vedeu/dsl/shared/text_test.rb +87 -9
- data/test/lib/vedeu/dsl/stream_test.rb +1 -1
- data/test/lib/vedeu/events/event_test.rb +3 -1
- data/test/lib/vedeu/events/trigger_test.rb +8 -4
- data/test/lib/vedeu/geometry/dimension_test.rb +1 -1
- data/test/lib/vedeu/geometry/geometry_test.rb +5 -3
- data/test/lib/vedeu/geometry/index_position_test.rb +30 -7
- data/test/lib/vedeu/geometry/null_geometry_test.rb +57 -0
- data/test/lib/vedeu/geometry/position_index_test.rb +14 -0
- data/test/lib/vedeu/geometry/position_validator_test.rb +17 -3
- data/test/lib/vedeu/input/keymap_test.rb +3 -1
- data/test/lib/vedeu/input/mapper_test.rb +8 -4
- data/test/lib/vedeu/launcher_test.rb +1 -1
- data/test/lib/vedeu/models/cell_test.rb +10 -8
- data/test/lib/vedeu/models/char_test.rb +52 -28
- data/test/lib/vedeu/models/composition_test.rb +26 -4
- data/test/lib/vedeu/models/group_test.rb +11 -5
- data/test/lib/vedeu/models/interface_test.rb +32 -19
- data/test/lib/vedeu/models/line_test.rb +21 -25
- data/test/lib/vedeu/models/menu_test.rb +10 -6
- data/test/lib/vedeu/models/null_test.rb +66 -0
- data/test/lib/vedeu/models/stream_test.rb +13 -10
- data/test/lib/vedeu/output/border_test.rb +29 -8
- data/test/lib/vedeu/output/clear_test.rb +23 -4
- data/test/lib/vedeu/output/colour_test.rb +20 -4
- data/test/lib/vedeu/output/compressor_test.rb +43 -0
- data/test/lib/vedeu/output/html_char_test.rb +29 -17
- data/test/lib/vedeu/output/null_border_test.rb +2 -1
- data/test/lib/vedeu/output/output_test.rb +20 -30
- data/test/lib/vedeu/output/presentation_test.rb +39 -16
- data/test/lib/vedeu/output/refresh_test.rb +14 -10
- data/test/lib/vedeu/output/renderers/all_test.rb +96 -0
- data/test/lib/vedeu/output/renderers/file_renderer_test.rb +1 -1
- data/test/lib/vedeu/output/renderers/html_renderer_test.rb +13 -9
- data/test/lib/vedeu/output/renderers/json_renderer_test.rb +52 -0
- data/test/lib/vedeu/output/renderers/null_renderer_test.rb +19 -0
- data/test/lib/vedeu/output/style_test.rb +41 -1
- data/test/lib/vedeu/output/text_test.rb +61 -10
- data/test/lib/vedeu/output/translator_test.rb +14 -0
- data/test/lib/vedeu/output/viewport_test.rb +22 -3
- data/test/lib/vedeu/output/virtual_terminal_test.rb +3 -3
- data/test/lib/vedeu/output/wordwrap_test.rb +58 -45
- data/test/lib/vedeu/repositories/collections/chars_test.rb +16 -0
- data/test/lib/vedeu/repositories/collections/events_test.rb +16 -0
- data/test/lib/vedeu/repositories/collections/interfaces_test.rb +16 -0
- data/test/lib/vedeu/repositories/collections/keys_test.rb +16 -0
- data/test/lib/vedeu/repositories/collections/lines_test.rb +16 -0
- data/test/lib/vedeu/repositories/collections/streams_test.rb +16 -0
- data/test/lib/vedeu/repositories/repositories/background_colours_test.rb +17 -0
- data/test/lib/vedeu/repositories/repositories/borders_test.rb +51 -0
- data/test/lib/vedeu/repositories/repositories/buffers_test.rb +52 -0
- data/test/lib/vedeu/repositories/repositories/colours_test.rb +16 -0
- data/test/lib/vedeu/repositories/repositories/cursors_test.rb +39 -0
- data/test/lib/vedeu/repositories/repositories/events_repository_test.rb +17 -0
- data/test/lib/vedeu/repositories/repositories/foreground_colours_test.rb +17 -0
- data/test/lib/vedeu/repositories/repositories/geometries_test.rb +42 -0
- data/test/lib/vedeu/repositories/repositories/groups_test.rb +17 -0
- data/test/lib/vedeu/repositories/repositories/interfaces_repositories_test.rb +17 -0
- data/test/lib/vedeu/repositories/repositories/keymaps_test.rb +17 -0
- data/test/lib/vedeu/repositories/repositories/menus_test.rb +17 -0
- data/test/lib/vedeu/repositories/repository_test.rb +16 -36
- data/test/lib/vedeu/storage/associative_store_test.rb +69 -0
- data/test/lib/vedeu/storage/conveyor_store_test.rb +135 -0
- data/test/lib/vedeu/storage/fifo_store_test.rb +47 -0
- data/test/lib/vedeu/storage/store_test.rb +123 -0
- data/test/lib/vedeu/support/common_test.rb +0 -9
- data/test/lib/vedeu/support/terminal_test.rb +78 -55
- data/test/lib/vedeu/support/visibility_test.rb +80 -0
- data/test/test_helper.rb +13 -11
- data/vedeu.gemspec +4 -3
- metadata +92 -32
- data/lib/vedeu/cursor/toggle.rb +0 -55
- data/lib/vedeu/exceptions.rb +0 -37
- data/lib/vedeu/geometry/centre.rb +0 -85
- data/lib/vedeu/geometry/content.rb +0 -70
- data/lib/vedeu/geometry/limit.rb +0 -58
- data/lib/vedeu/output/compositor.rb +0 -62
- data/lib/vedeu/repositories/collections.rb +0 -41
- data/lib/vedeu/support/coercions.rb +0 -60
- data/lib/vedeu/support/sentence.rb +0 -91
- data/lib/vedeu/support/visible.rb +0 -90
- data/test/lib/vedeu/cursor/toggle_test.rb +0 -63
- data/test/lib/vedeu/geometry/centre_test.rb +0 -58
- data/test/lib/vedeu/geometry/content_test.rb +0 -98
- data/test/lib/vedeu/geometry/limit_test.rb +0 -30
- data/test/lib/vedeu/output/compositor_test.rb +0 -48
- data/test/lib/vedeu/repositories/all_test.rb +0 -135
- data/test/lib/vedeu/repositories/collections_test.rb +0 -71
- data/test/lib/vedeu/support/coercions_test.rb +0 -84
- data/test/lib/vedeu/support/sentence_test.rb +0 -56
- data/test/lib/vedeu/support/visible_test.rb +0 -161
data/lib/vedeu/output/border.rb
CHANGED
@@ -136,28 +136,28 @@ module Vedeu
|
|
136
136
|
def bx
|
137
137
|
bo = (enabled? && left?) ? 1 : 0
|
138
138
|
|
139
|
-
|
139
|
+
geometry.x + bo
|
140
140
|
end
|
141
141
|
|
142
142
|
# @return [Fixnum]
|
143
143
|
def bxn
|
144
144
|
bo = (enabled? && right?) ? 1 : 0
|
145
145
|
|
146
|
-
|
146
|
+
geometry.xn - bo
|
147
147
|
end
|
148
148
|
|
149
149
|
# @return [Fixnum]
|
150
150
|
def by
|
151
151
|
bo = (enabled? && top?) ? 1 : 0
|
152
152
|
|
153
|
-
|
153
|
+
geometry.y + bo
|
154
154
|
end
|
155
155
|
|
156
156
|
# @return [Fixnum]
|
157
157
|
def byn
|
158
158
|
bo = (enabled? && bottom?) ? 1 : 0
|
159
159
|
|
160
|
-
|
160
|
+
geometry.yn - bo
|
161
161
|
end
|
162
162
|
|
163
163
|
# Returns the width of the interface determined by whether a left, right,
|
@@ -190,6 +190,7 @@ module Vedeu
|
|
190
190
|
|
191
191
|
# @return [Array<Array<Vedeu::Char>>]
|
192
192
|
def render
|
193
|
+
return [] unless interface.visible?
|
193
194
|
return [] unless enabled?
|
194
195
|
|
195
196
|
out = [top, bottom]
|
@@ -262,20 +263,8 @@ module Vedeu
|
|
262
263
|
out = []
|
263
264
|
out << border(send(prefix_left), prefix_left) if left?
|
264
265
|
|
265
|
-
if prefix == 'top' &&
|
266
|
-
|
267
|
-
width.times do |ix|
|
268
|
-
title_out << border(horizontal, prefix_horizontal, nil, ix)
|
269
|
-
end
|
270
|
-
|
271
|
-
truncate = title.chomp.slice(0..(width - 5))
|
272
|
-
pad = truncate.center(truncate.size + 2).chars
|
273
|
-
out << title_out.each_with_index do |b, i|
|
274
|
-
if i >= 1 && i <= pad.size
|
275
|
-
b.border = nil
|
276
|
-
b.value = pad[(i - 1)]
|
277
|
-
end
|
278
|
-
end
|
266
|
+
if prefix == 'top' && title?
|
267
|
+
out << titlebar
|
279
268
|
|
280
269
|
else
|
281
270
|
width.times do |ix|
|
@@ -288,18 +277,90 @@ module Vedeu
|
|
288
277
|
out
|
289
278
|
end
|
290
279
|
|
280
|
+
# @return [Array<Vedeu::Char>]
|
281
|
+
def horizontal_border
|
282
|
+
width.times.inject([]) do |a, ix|
|
283
|
+
a << border(horizontal, :top_horizontal, nil, ix)
|
284
|
+
a
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
# From the second element of {#title_characters} remove the border from each
|
289
|
+
# {#horizontal_border} Vedeu::Char, and add the title character.
|
290
|
+
#
|
291
|
+
# @return [Array<Vedeu::Char>]
|
292
|
+
def titlebar
|
293
|
+
horizontal_border.each_with_index do |char, index|
|
294
|
+
if index >= 1 && index <= title_characters.size
|
295
|
+
char.border = nil
|
296
|
+
char.value = title_characters[(index - 1)]
|
297
|
+
end
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
# @return [Array<String>]
|
302
|
+
def title_characters
|
303
|
+
@title_characters ||= padded_title.chars
|
304
|
+
end
|
305
|
+
|
306
|
+
# Pads the title with a single whitespace either side.
|
307
|
+
#
|
308
|
+
# @example
|
309
|
+
# title = 'Truncated!'
|
310
|
+
# width = 20
|
311
|
+
# # => ' Truncated! '
|
312
|
+
#
|
313
|
+
# width = 10
|
314
|
+
# # => ' Trunca '
|
315
|
+
#
|
316
|
+
# @return [String]
|
317
|
+
# @see #truncated_title
|
318
|
+
def padded_title
|
319
|
+
truncated_title.center(truncated_title.size + 2)
|
320
|
+
end
|
321
|
+
|
322
|
+
# Truncates the title to the width of the interface, minus characters needed
|
323
|
+
# to ensure there is at least a single character of horizontal border and a
|
324
|
+
# whitespace on either side of the title.
|
325
|
+
#
|
326
|
+
# @example
|
327
|
+
# title = 'Truncated!'
|
328
|
+
# width = 20
|
329
|
+
# # => 'Truncated!'
|
330
|
+
#
|
331
|
+
# width = 10
|
332
|
+
# # => 'Trunca'
|
333
|
+
#
|
334
|
+
# @return [String]
|
335
|
+
def truncated_title
|
336
|
+
title.chomp.slice(0..(width - 5))
|
337
|
+
end
|
338
|
+
|
339
|
+
# Return boolean indicating whether this border has a non-empty title.
|
340
|
+
#
|
341
|
+
# @return [Boolean]
|
342
|
+
def title?
|
343
|
+
defined_value?(title)
|
344
|
+
end
|
345
|
+
|
291
346
|
# @param value [String]
|
292
347
|
# @param type [Symbol|NilClass]
|
293
348
|
# @param iy [Fixnum]
|
294
349
|
# @param ix [Fixnum]
|
295
350
|
# @return [Vedeu::Char]
|
296
351
|
def border(value, type = :border, iy = 0, ix = 0)
|
297
|
-
Vedeu::Char.new(
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
352
|
+
Vedeu::Char.new(value: value,
|
353
|
+
parent: interface,
|
354
|
+
colour: colour,
|
355
|
+
style: style,
|
356
|
+
position: position(type, iy, ix),
|
357
|
+
border: type)
|
358
|
+
end
|
359
|
+
|
360
|
+
# @return [Vedeu::Geometry]
|
361
|
+
def geometry
|
362
|
+
# @geometry ||= Vedeu.geometry.find(name)
|
363
|
+
interface.geometry
|
303
364
|
end
|
304
365
|
|
305
366
|
# @return [Vedeu::Interface]
|
@@ -335,11 +396,6 @@ module Vedeu
|
|
335
396
|
}
|
336
397
|
end
|
337
398
|
|
338
|
-
# @return [Vedeu::Interface]
|
339
|
-
def interface
|
340
|
-
@interface ||= Vedeu.interfaces.find(name)
|
341
|
-
end
|
342
|
-
|
343
399
|
# @param name [Symbol]
|
344
400
|
# @param iy [Fixnum]
|
345
401
|
# @param ix [Fixnum]
|
@@ -347,24 +403,21 @@ module Vedeu
|
|
347
403
|
def position(name, iy = 0, ix = 0)
|
348
404
|
case name
|
349
405
|
when :top_horizontal
|
350
|
-
Vedeu::Position[
|
406
|
+
Vedeu::Position[geometry.y, (bx + ix)]
|
351
407
|
|
352
408
|
when :bottom_horizontal
|
353
|
-
Vedeu::Position[
|
409
|
+
Vedeu::Position[geometry.yn, (bx + ix)]
|
354
410
|
|
355
411
|
when :left_vertical
|
356
|
-
Vedeu::Position[(by + iy),
|
412
|
+
Vedeu::Position[(by + iy), geometry.x]
|
357
413
|
|
358
414
|
when :right_vertical
|
359
|
-
Vedeu::Position[(by + iy),
|
360
|
-
|
361
|
-
when :bottom_left then interface.bottom_left
|
362
|
-
when :bottom_right then interface.bottom_right
|
363
|
-
when :top_left then interface.top_left
|
364
|
-
when :top_right then interface.top_right
|
365
|
-
else
|
366
|
-
nil
|
415
|
+
Vedeu::Position[(by + iy), geometry.xn]
|
367
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
|
368
421
|
end
|
369
422
|
end
|
370
423
|
|
data/lib/vedeu/output/clear.rb
CHANGED
@@ -10,8 +10,14 @@ module Vedeu
|
|
10
10
|
#
|
11
11
|
# @return [Array|String]
|
12
12
|
# @see #initialize
|
13
|
-
def clear(interface)
|
14
|
-
|
13
|
+
def clear(interface, options = {})
|
14
|
+
if interface.visible?
|
15
|
+
new(interface, options).write
|
16
|
+
|
17
|
+
else
|
18
|
+
[]
|
19
|
+
|
20
|
+
end
|
15
21
|
end
|
16
22
|
alias_method :render, :clear
|
17
23
|
|
@@ -20,9 +26,14 @@ module Vedeu
|
|
20
26
|
# Return a new instance of Vedeu::Clear.
|
21
27
|
#
|
22
28
|
# @param interface [Interface]
|
29
|
+
# @param options [Hash]
|
30
|
+
# @option options clear_border [Boolean] see {#clear_border?}
|
31
|
+
# @option options use_terminal_colours [Boolean] see
|
32
|
+
# {#use_terminal_colours?}
|
23
33
|
# @return [Vedeu::Clear]
|
24
|
-
def initialize(interface)
|
34
|
+
def initialize(interface, options = {})
|
25
35
|
@interface = interface
|
36
|
+
@options = options
|
26
37
|
end
|
27
38
|
|
28
39
|
# For each visible line of the interface, set the foreground and background
|
@@ -31,31 +42,36 @@ module Vedeu
|
|
31
42
|
#
|
32
43
|
# @return [Array<Array<Vedeu::Char>>]
|
33
44
|
def clear
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
45
|
+
if interface.visible?
|
46
|
+
Vedeu.log(type: :output, message: "Clearing: '#{interface.name}'")
|
47
|
+
|
48
|
+
@clear ||= Array.new(height) do |iy|
|
49
|
+
Array.new(width) do |ix|
|
50
|
+
Vedeu::Char.new(value: ' ',
|
51
|
+
colour: colour,
|
38
52
|
style: interface.style,
|
39
|
-
position: position(iy, ix)
|
53
|
+
position: position(iy, ix))
|
54
|
+
end
|
40
55
|
end
|
56
|
+
else
|
57
|
+
[]
|
58
|
+
|
41
59
|
end
|
42
60
|
end
|
61
|
+
alias_method :render, :clear
|
62
|
+
alias_method :rendered, :clear
|
43
63
|
|
44
64
|
# Clear the view and send to the terminal.
|
45
65
|
#
|
46
66
|
# @return [Array]
|
47
67
|
def write
|
48
|
-
Vedeu.log(type: :output, message: "Clearing: '#{interface.name}'")
|
49
|
-
|
50
68
|
if Vedeu::Configuration.drb?
|
51
|
-
Vedeu.trigger(:_drb_store_output_,
|
69
|
+
Vedeu.trigger(:_drb_store_output_, rendered)
|
52
70
|
|
53
71
|
Vedeu::HTMLRenderer.to_file(Vedeu::VirtualBuffer.retrieve)
|
54
72
|
end
|
55
73
|
|
56
|
-
|
57
|
-
|
58
|
-
Vedeu::TerminalRenderer.render(clear)
|
74
|
+
Vedeu.renderers.render(rendered)
|
59
75
|
end
|
60
76
|
|
61
77
|
private
|
@@ -64,11 +80,80 @@ module Vedeu
|
|
64
80
|
# @return [Interface]
|
65
81
|
attr_reader :interface
|
66
82
|
|
83
|
+
# @return [Boolean] Indicates whether the area occupied by the border of the
|
84
|
+
# interface should be cleared also.
|
85
|
+
def clear_border?
|
86
|
+
options[:clear_border]
|
87
|
+
end
|
88
|
+
|
89
|
+
# @return [Vedeu::Colour] The default background and foreground colours for
|
90
|
+
# the terminal, or the colours of the interface.
|
91
|
+
def colour
|
92
|
+
if use_terminal_colours?
|
93
|
+
Colour.new(background: :default, foreground: :default)
|
94
|
+
|
95
|
+
else
|
96
|
+
interface.colour
|
97
|
+
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [Hash<Symbol => Boolean>]
|
102
|
+
def defaults
|
103
|
+
{
|
104
|
+
clear_border: true,
|
105
|
+
use_terminal_colours: true,
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
# Returns the height of the area to be cleared.
|
110
|
+
#
|
111
|
+
# @return [Fixnum]
|
112
|
+
def height
|
113
|
+
if clear_border?
|
114
|
+
interface.height
|
115
|
+
|
116
|
+
else
|
117
|
+
interface.border.height
|
118
|
+
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# @return [Hash<Symbol => Boolean>]
|
123
|
+
def options
|
124
|
+
@_options ||= defaults.merge!(@options)
|
125
|
+
end
|
126
|
+
|
67
127
|
# @param iy [Fixnum]
|
68
128
|
# @param ix [Fixnum]
|
69
129
|
# @return [Vedeu::IndexPosition]
|
70
130
|
def position(iy, ix)
|
71
|
-
|
131
|
+
if clear_border?
|
132
|
+
Vedeu::IndexPosition[iy, ix, interface.y, interface.x]
|
133
|
+
|
134
|
+
else
|
135
|
+
Vedeu::IndexPosition[iy, ix, interface.border.by, interface.border.bx]
|
136
|
+
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# @return [Boolean] Indicates whether the default terminal colours should be
|
141
|
+
# used to clear the area.
|
142
|
+
def use_terminal_colours?
|
143
|
+
options[:use_terminal_colours]
|
144
|
+
end
|
145
|
+
|
146
|
+
# Returns the width of the area to be cleared.
|
147
|
+
#
|
148
|
+
# @return [Fixnum]
|
149
|
+
def width
|
150
|
+
if clear_border?
|
151
|
+
interface.width
|
152
|
+
|
153
|
+
else
|
154
|
+
interface.border.width
|
155
|
+
|
156
|
+
end
|
72
157
|
end
|
73
158
|
|
74
159
|
end # Clear
|
data/lib/vedeu/output/colour.rb
CHANGED
@@ -1,15 +1,24 @@
|
|
1
|
-
require 'vedeu/support/coercions'
|
2
|
-
|
3
1
|
module Vedeu
|
4
2
|
|
5
3
|
# Provides a container for terminal escape sequences controlling the
|
6
4
|
# foreground and background colours of a character or collection of
|
7
5
|
# characters.
|
8
6
|
#
|
7
|
+
# Vedeu uses HTML/CSS style notation (i.e. '#aadd00'), they can be used at the
|
8
|
+
# stream level, the line level or for the whole interface. Terminals generally
|
9
|
+
# support either 8, 16 or 256 colours, with few supporting full 24-bit colour.
|
10
|
+
#
|
11
|
+
# Vedeu attempts to detect the colour depth using the `$TERM` environment
|
12
|
+
# variable.
|
13
|
+
#
|
14
|
+
# To set your `$TERM` variable to allow 256 colour support:
|
15
|
+
#
|
16
|
+
# ```bash
|
17
|
+
# echo "export TERM=xterm-256color" >> ~/.bashrc
|
18
|
+
# ```
|
19
|
+
#
|
9
20
|
class Colour
|
10
21
|
|
11
|
-
include Vedeu::Coercions
|
12
|
-
|
13
22
|
# @!attribute [r] attributes
|
14
23
|
# @return [Hash]
|
15
24
|
attr_reader :attributes
|
@@ -22,6 +31,33 @@ module Vedeu
|
|
22
31
|
# @return [Foreground|String]
|
23
32
|
attr_reader :foreground
|
24
33
|
|
34
|
+
# @param value []
|
35
|
+
# @return [Object]
|
36
|
+
def self.coerce(value)
|
37
|
+
if value.nil?
|
38
|
+
new
|
39
|
+
|
40
|
+
elsif value.is_a?(self)
|
41
|
+
value
|
42
|
+
|
43
|
+
elsif value.is_a?(Hash)
|
44
|
+
if value.key?(:colour) && value[:colour].is_a?(self)
|
45
|
+
value
|
46
|
+
|
47
|
+
elsif value.key?(:background) || value.key?(:foreground)
|
48
|
+
new(value)
|
49
|
+
|
50
|
+
else
|
51
|
+
new
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
else
|
56
|
+
new(value)
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
25
61
|
# Returns a new instance of Vedeu::Colour.
|
26
62
|
#
|
27
63
|
# @param attributes [Hash]
|
@@ -35,20 +71,28 @@ module Vedeu
|
|
35
71
|
@foreground = Vedeu::Foreground.coerce(@attributes[:foreground])
|
36
72
|
end
|
37
73
|
|
38
|
-
# Converts the value into a Vedeu::
|
74
|
+
# Converts the value into a Vedeu::Background.
|
39
75
|
#
|
40
76
|
# @param value [String]
|
41
77
|
# @return [String]
|
42
|
-
def
|
43
|
-
@
|
78
|
+
def background=(value)
|
79
|
+
@background = Vedeu::Background.coerce(value)
|
44
80
|
end
|
45
81
|
|
46
|
-
#
|
82
|
+
# @param other [Vedeu::Char]
|
83
|
+
# @return [Boolean]
|
84
|
+
def eql?(other)
|
85
|
+
self.class == other.class && background == other.background &&
|
86
|
+
foreground == other.foreground
|
87
|
+
end
|
88
|
+
alias_method :==, :eql?
|
89
|
+
|
90
|
+
# Converts the value into a Vedeu::Foreground.
|
47
91
|
#
|
48
92
|
# @param value [String]
|
49
93
|
# @return [String]
|
50
|
-
def
|
51
|
-
@
|
94
|
+
def foreground=(value)
|
95
|
+
@foreground = Vedeu::Foreground.coerce(value)
|
52
96
|
end
|
53
97
|
|
54
98
|
# Returns both or either of the converted attributes into a single escape
|
@@ -63,11 +107,11 @@ module Vedeu
|
|
63
107
|
|
64
108
|
# The default values for a new instance of this class.
|
65
109
|
#
|
66
|
-
# @return [Hash<Symbol =>
|
110
|
+
# @return [Hash<Symbol => NilClass>]
|
67
111
|
def defaults
|
68
112
|
{
|
113
|
+
background: '',
|
69
114
|
foreground: '',
|
70
|
-
background: ''
|
71
115
|
}
|
72
116
|
end
|
73
117
|
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# During the conversion of a Vedeu::Char object into a string of escape
|
4
|
+
# sequences, this class removes multiple occurences of the same escape
|
5
|
+
# sequence, resulting in a smaller payload being sent to the renderer.
|
6
|
+
#
|
7
|
+
class Compressor
|
8
|
+
|
9
|
+
# @param output [Array<Array<Vedeu::Char>>]
|
10
|
+
# @return [Vedeu::Compressor]
|
11
|
+
def initialize(output)
|
12
|
+
@output = output
|
13
|
+
@colour = ''
|
14
|
+
@style = ''
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [String]
|
18
|
+
def render
|
19
|
+
Array(output).flatten.map do |char|
|
20
|
+
if char.is_a?(Vedeu::Char)
|
21
|
+
out = ''
|
22
|
+
out << char.position.to_s
|
23
|
+
out << colour_for(char)
|
24
|
+
out << style_for(char)
|
25
|
+
out << char.value
|
26
|
+
out
|
27
|
+
|
28
|
+
else
|
29
|
+
char.to_s
|
30
|
+
|
31
|
+
end
|
32
|
+
end.join
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
attr_reader :output
|
38
|
+
|
39
|
+
# @param char [Vedeu::Char]
|
40
|
+
# @return [String]
|
41
|
+
def colour_for(char)
|
42
|
+
return '' if char.colour == @colour
|
43
|
+
|
44
|
+
@colour = char.colour
|
45
|
+
@colour.to_s
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param char [Vedeu::Char]
|
49
|
+
# @return [String]
|
50
|
+
def style_for(char)
|
51
|
+
return '' if char.style == @style
|
52
|
+
|
53
|
+
@style = char.style
|
54
|
+
@style.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
end # Compressor
|
58
|
+
|
59
|
+
end # Vedeu
|
@@ -102,14 +102,16 @@ module Vedeu
|
|
102
102
|
|
103
103
|
# @return [String|NilClass]
|
104
104
|
def parent_bg
|
105
|
-
if char.parent_background &&
|
105
|
+
if char.parent_background &&
|
106
|
+
defined_value?(char.parent_background.to_html)
|
106
107
|
char.parent_background.to_html
|
107
108
|
end
|
108
109
|
end
|
109
110
|
|
110
111
|
# @return [String|NilClass]
|
111
112
|
def parent_fg
|
112
|
-
if char.parent_foreground &&
|
113
|
+
if char.parent_foreground &&
|
114
|
+
defined_value?(char.parent_foreground.to_html)
|
113
115
|
char.parent_foreground.to_html
|
114
116
|
end
|
115
117
|
end
|
@@ -15,22 +15,27 @@ module Vedeu
|
|
15
15
|
|
16
16
|
# @return [Fixnum]
|
17
17
|
def bx
|
18
|
-
|
18
|
+
geometry.x
|
19
19
|
end
|
20
20
|
|
21
21
|
# @return [Fixnum]
|
22
22
|
def bxn
|
23
|
-
|
23
|
+
geometry.xn
|
24
24
|
end
|
25
25
|
|
26
26
|
# @return [Fixnum]
|
27
27
|
def by
|
28
|
-
|
28
|
+
geometry.y
|
29
29
|
end
|
30
30
|
|
31
31
|
# @return [Fixnum]
|
32
32
|
def byn
|
33
|
-
|
33
|
+
geometry.yn
|
34
|
+
end
|
35
|
+
|
36
|
+
# @return [FalseClass]
|
37
|
+
def enabled?
|
38
|
+
false
|
34
39
|
end
|
35
40
|
|
36
41
|
# @return [Fixnum]
|
@@ -54,6 +59,13 @@ module Vedeu
|
|
54
59
|
# @return [Vedeu::Interface]
|
55
60
|
attr_reader :interface
|
56
61
|
|
62
|
+
# Returns the geometry for the interface.
|
63
|
+
#
|
64
|
+
# @return [Vedeu::Geometry]
|
65
|
+
def geometry
|
66
|
+
interface.geometry
|
67
|
+
end
|
68
|
+
|
57
69
|
end # NullBorder
|
58
70
|
|
59
71
|
end # Vedeu
|
data/lib/vedeu/output/output.rb
CHANGED
@@ -1,54 +1,46 @@
|
|
1
1
|
require 'vedeu/output/renderers/all'
|
2
2
|
require 'vedeu/output/virtual_buffer'
|
3
|
-
require 'vedeu/support/terminal'
|
4
3
|
|
5
4
|
module Vedeu
|
6
5
|
|
7
|
-
# Sends the
|
6
|
+
# Sends the content to the renderers.
|
8
7
|
#
|
9
8
|
class Output
|
10
9
|
|
11
|
-
# Writes content
|
12
|
-
# streams, colours and styles) to the area defined by the interface.
|
10
|
+
# Writes content to the defined renderers.
|
13
11
|
#
|
14
12
|
# @return [Array|String]
|
15
13
|
# @see #initialize
|
16
|
-
def self.render(
|
17
|
-
new(
|
14
|
+
def self.render(content)
|
15
|
+
new(content).render
|
18
16
|
end
|
19
17
|
|
20
18
|
# Return a new instance of Vedeu::Output.
|
21
19
|
#
|
22
|
-
# @param
|
20
|
+
# @param content [Array<Array<Vedeu::Char>>]
|
23
21
|
# @return [Output]
|
24
|
-
def initialize(
|
25
|
-
@
|
22
|
+
def initialize(content)
|
23
|
+
@content = content
|
26
24
|
end
|
27
25
|
|
28
|
-
# Send the view to the
|
26
|
+
# Send the view to the renderers.
|
29
27
|
#
|
30
28
|
# @return [Array]
|
31
29
|
def render
|
32
30
|
if Vedeu::Configuration.drb?
|
33
|
-
Vedeu.trigger(:_drb_store_output_,
|
31
|
+
Vedeu.trigger(:_drb_store_output_, content)
|
34
32
|
|
35
33
|
Vedeu::HTMLRenderer.to_file(Vedeu::VirtualBuffer.retrieve)
|
36
34
|
end
|
37
35
|
|
38
|
-
|
39
|
-
|
40
|
-
Vedeu::TerminalRenderer.render(rendered)
|
36
|
+
Vedeu.renderers.render(content)
|
41
37
|
end
|
42
38
|
|
43
39
|
private
|
44
40
|
|
45
|
-
# @!attribute [r]
|
46
|
-
# @return [
|
47
|
-
attr_reader :
|
48
|
-
|
49
|
-
def rendered
|
50
|
-
@rendered ||= interface.render
|
51
|
-
end
|
41
|
+
# @!attribute [r] content
|
42
|
+
# @return [Array<Array<Vedeu::Char>>]
|
43
|
+
attr_reader :content
|
52
44
|
|
53
45
|
end # Output
|
54
46
|
|