vedeu 0.2.12 → 0.3.0
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/.ruby-version +1 -1
- data/Guardfile +13 -0
- data/README.md +11 -9
- data/Rakefile +10 -1
- data/bin/vedeu_test +14 -0
- data/config/cucumber.yml +8 -0
- data/docs/api.md +45 -16
- data/docs/events.md +21 -9
- data/docs/getting_started.md +16 -0
- data/docs/views.md +158 -0
- data/examples/borders_app.rb +236 -110
- data/examples/colour_support.sh +98 -0
- data/examples/colours_app.rb +41 -0
- data/examples/configuration_app.rb +11 -6
- data/examples/cursor_app.rb +60 -61
- data/examples/focus_app.rb +72 -34
- data/examples/hello_world.rb +13 -8
- data/examples/lines_app.rb +37 -28
- data/features/start_stop.feature +27 -0
- data/features/support/env.rb +14 -0
- data/lib/vedeu/all.rb +29 -0
- data/lib/vedeu/api.rb +39 -0
- data/lib/vedeu/application.rb +15 -7
- data/lib/vedeu/bindings.rb +121 -0
- data/lib/vedeu/buffers/all.rb +10 -0
- data/lib/vedeu/{repositories/models → buffers}/buffer.rb +47 -64
- data/lib/vedeu/buffers/display_buffer.rb +118 -0
- data/lib/vedeu/configuration/all.rb +6 -0
- data/lib/vedeu/configuration/api.rb +3 -1
- data/lib/vedeu/configuration/cli.rb +3 -1
- data/lib/vedeu/configuration/configuration.rb +23 -2
- data/lib/vedeu/cursor/all.rb +23 -0
- data/lib/vedeu/cursor/cursor.rb +116 -0
- data/lib/vedeu/cursor/move_cursor.rb +137 -0
- data/lib/vedeu/cursor/toggle_cursor.rb +53 -0
- data/lib/vedeu/dsl/all.rb +28 -0
- data/lib/vedeu/dsl/components/all.rb +7 -0
- data/lib/vedeu/dsl/components/border.rb +104 -0
- data/lib/vedeu/dsl/components/geometry.rb +153 -0
- data/lib/vedeu/dsl/components/keymap.rb +93 -0
- data/lib/vedeu/dsl/components/menu.rb +82 -0
- data/lib/vedeu/dsl/composition.rb +72 -0
- data/lib/vedeu/dsl/interface.rb +210 -0
- data/lib/vedeu/dsl/line.rb +135 -0
- data/lib/vedeu/dsl/shared/all.rb +7 -0
- data/lib/vedeu/dsl/shared/colour.rb +85 -0
- data/lib/vedeu/dsl/shared/style.rb +38 -0
- data/lib/vedeu/dsl/shared/text.rb +102 -0
- data/lib/vedeu/dsl/shared/use.rb +47 -0
- data/lib/vedeu/dsl/stream.rb +49 -0
- data/lib/vedeu/dsl/view.rb +136 -0
- data/lib/vedeu/events/all.rb +10 -0
- data/lib/vedeu/{repositories/models → events}/event.rb +97 -8
- data/lib/vedeu/events/trigger.rb +58 -0
- data/lib/vedeu/exceptions.rb +34 -0
- data/lib/vedeu/input/all.rb +29 -0
- data/lib/vedeu/input/input.rb +26 -0
- data/lib/vedeu/{models → input}/key.rb +21 -11
- data/lib/vedeu/input/keymap.rb +130 -0
- data/lib/vedeu/input/keys.rb +8 -0
- data/lib/vedeu/input/mapper.rb +112 -0
- data/lib/vedeu/launcher.rb +7 -4
- data/lib/vedeu/models/all.rb +12 -0
- data/lib/vedeu/models/collection.rb +71 -0
- data/lib/vedeu/{repositories → models}/focus.rb +63 -21
- data/lib/vedeu/models/geometry.rb +100 -259
- data/lib/vedeu/{repositories/models → models}/group.rb +16 -14
- data/lib/vedeu/{repositories/models → models}/menu.rb +85 -22
- data/lib/vedeu/models/model.rb +51 -0
- data/lib/vedeu/models/view/all.rb +12 -0
- data/lib/vedeu/models/view/char.rb +84 -0
- data/lib/vedeu/models/view/chars.rb +8 -0
- data/lib/vedeu/models/view/composition.rb +101 -0
- data/lib/vedeu/models/view/interface.rb +215 -0
- data/lib/vedeu/models/view/interfaces.rb +8 -0
- data/lib/vedeu/models/view/line.rb +134 -0
- data/lib/vedeu/models/view/lines.rb +8 -0
- data/lib/vedeu/models/view/stream.rb +144 -0
- data/lib/vedeu/models/view/streams.rb +8 -0
- data/lib/vedeu/output/all.rb +8 -0
- data/lib/vedeu/output/border.rb +387 -0
- data/lib/vedeu/output/compositor.rb +41 -30
- data/lib/vedeu/output/output.rb +6 -13
- data/lib/vedeu/output/viewport.rb +78 -94
- data/lib/vedeu/output/writer.rb +29 -0
- data/lib/vedeu/presentation/all.rb +9 -0
- data/lib/vedeu/{colours → presentation}/background.rb +1 -9
- data/lib/vedeu/{colours → presentation}/colour.rb +21 -8
- data/lib/vedeu/{colours → presentation}/foreground.rb +5 -9
- data/lib/vedeu/presentation/presentation.rb +91 -0
- data/lib/vedeu/presentation/style.rb +47 -0
- data/lib/vedeu/{colours → presentation}/translator.rb +11 -5
- data/lib/vedeu/repositories/all.rb +5 -0
- data/lib/vedeu/repositories/menus.rb +5 -42
- data/lib/vedeu/{support → repositories}/repository.rb +78 -41
- data/lib/vedeu/support/all.rb +22 -0
- data/lib/vedeu/support/bounding_area.rb +2 -1
- data/lib/vedeu/support/coercions.rb +18 -1
- data/lib/vedeu/support/console.rb +73 -0
- data/lib/vedeu/support/content_geometry.rb +69 -0
- data/lib/vedeu/support/coordinate.rb +246 -0
- data/lib/vedeu/support/esc.rb +29 -2
- data/lib/vedeu/support/log.rb +36 -2
- data/lib/vedeu/support/node.rb +61 -0
- data/lib/vedeu/support/position.rb +28 -13
- data/lib/vedeu/support/position_validator.rb +79 -0
- data/lib/vedeu/support/read.rb +65 -0
- data/lib/vedeu/support/refresh.rb +8 -32
- data/lib/vedeu/support/terminal.rb +34 -4
- data/lib/vedeu/support/text.rb +104 -0
- data/lib/vedeu/support/trace.rb +11 -23
- data/lib/vedeu/support/visible.rb +75 -0
- data/lib/vedeu/support/write.rb +85 -0
- data/lib/vedeu/traps.rb +18 -0
- data/lib/vedeu.rb +41 -101
- data/test/integration/dsl/compositions_test.rb +27 -0
- data/test/integration/dsl/interfaces_test.rb +261 -0
- data/test/integration/dsl/keymaps_test.rb +42 -0
- data/test/integration/dsl/lines_test.rb +146 -0
- data/test/integration/dsl/menus_test.rb +59 -0
- data/test/integration/dsl/streams_test.rb +129 -0
- data/test/integration/dsl/views_test.rb +63 -0
- data/test/lib/vedeu/api_test.rb +163 -0
- data/test/lib/vedeu/application_test.rb +19 -10
- data/test/lib/vedeu/bindings_test.rb +54 -0
- data/test/lib/vedeu/buffers/all_test.rb +11 -0
- data/test/lib/vedeu/buffers/buffer_test.rb +196 -0
- data/test/lib/vedeu/buffers/display_buffer_test.rb +58 -0
- data/test/lib/vedeu/configuration/api_test.rb +42 -58
- data/test/lib/vedeu/configuration/cli_test.rb +4 -4
- data/test/lib/vedeu/configuration/configuration_test.rb +11 -29
- data/test/lib/vedeu/cursor/all_test.rb +33 -0
- data/test/lib/vedeu/cursor/cursor_test.rb +85 -0
- data/test/lib/vedeu/cursor/move_cursor_test.rb +212 -0
- data/test/lib/vedeu/cursor/toggle_cursor_test.rb +63 -0
- data/test/lib/vedeu/dsl/components/border_test.rb +414 -0
- data/test/lib/vedeu/dsl/components/geometry_test.rb +231 -0
- data/test/lib/vedeu/dsl/components/keymap_test.rb +80 -0
- data/test/lib/vedeu/dsl/components/menu_test.rb +115 -0
- data/test/lib/vedeu/dsl/composition_test.rb +41 -0
- data/test/lib/vedeu/dsl/interface_test.rb +470 -0
- data/test/lib/vedeu/dsl/line_test.rb +60 -0
- data/test/lib/vedeu/dsl/shared/colour_test.rb +100 -0
- data/test/lib/vedeu/dsl/shared/style_test.rb +22 -0
- data/test/lib/vedeu/dsl/shared/text_test.rb +15 -0
- data/test/lib/vedeu/dsl/shared/use_test.rb +27 -0
- data/test/lib/vedeu/dsl/stream_test.rb +26 -0
- data/test/lib/vedeu/dsl/view_test.rb +73 -0
- data/test/lib/vedeu/events/all_test.rb +11 -0
- data/test/lib/vedeu/events/event_test.rb +109 -0
- data/test/lib/vedeu/events/trigger_test.rb +60 -0
- data/test/lib/vedeu/input/all_test.rb +11 -0
- data/test/lib/vedeu/input/input_test.rb +7 -3
- data/test/lib/vedeu/input/key_test.rb +72 -0
- data/test/lib/vedeu/input/keymap_test.rb +89 -0
- data/test/lib/vedeu/input/mapper_test.rb +94 -0
- data/test/lib/vedeu/launcher_test.rb +19 -20
- data/test/lib/vedeu/models/collection_test.rb +114 -0
- data/test/lib/vedeu/{repositories → models}/focus_test.rb +46 -13
- data/test/lib/vedeu/models/geometry_test.rb +35 -39
- data/test/lib/vedeu/models/group_test.rb +100 -0
- data/test/lib/vedeu/models/menu_test.rb +288 -0
- data/test/lib/vedeu/models/model_test.rb +31 -0
- data/test/lib/vedeu/models/view/char_test.rb +166 -0
- data/test/lib/vedeu/models/view/chars_test.rb +18 -0
- data/test/lib/vedeu/models/view/composition_test.rb +41 -0
- data/test/lib/vedeu/models/view/interface_test.rb +128 -0
- data/test/lib/vedeu/models/view/interfaces_test.rb +18 -0
- data/test/lib/vedeu/models/view/line_test.rb +214 -0
- data/test/lib/vedeu/models/view/lines_test.rb +18 -0
- data/test/lib/vedeu/models/view/stream_test.rb +106 -0
- data/test/lib/vedeu/models/view/streams_test.rb +18 -0
- data/test/lib/vedeu/output/border_test.rb +357 -0
- data/test/lib/vedeu/output/compositor_test.rb +61 -15
- data/test/lib/vedeu/output/output_test.rb +25 -84
- data/test/lib/vedeu/output/viewport_test.rb +171 -45
- data/test/lib/vedeu/output/writer_test.rb +45 -0
- data/test/lib/vedeu/{colours → presentation}/background_test.rb +0 -0
- data/test/lib/vedeu/{colours → presentation}/colour_test.rb +5 -5
- data/test/lib/vedeu/{colours → presentation}/foreground_test.rb +0 -0
- data/test/lib/vedeu/presentation/presentation_test.rb +56 -0
- data/test/lib/vedeu/presentation/style_test.rb +69 -0
- data/test/lib/vedeu/presentation/translator_test.rb +63 -0
- data/test/lib/vedeu/repositories/all_test.rb +7 -0
- data/test/lib/vedeu/repositories/menus_test.rb +3 -156
- data/test/lib/vedeu/repositories/repository_test.rb +271 -0
- data/test/lib/vedeu/support/bounding_area_test.rb +3 -3
- data/test/lib/vedeu/support/coercions_test.rb +39 -0
- data/test/lib/vedeu/support/common_test.rb +31 -16
- data/test/lib/vedeu/support/console_test.rb +85 -0
- data/test/lib/vedeu/support/content_geometry_test.rb +107 -0
- data/test/lib/vedeu/support/coordinate_test.rb +190 -0
- data/test/lib/vedeu/support/esc_test.rb +18 -0
- data/test/lib/vedeu/support/grid_test.rb +15 -10
- data/test/lib/vedeu/support/log_test.rb +3 -0
- data/test/lib/vedeu/support/position_test.rb +22 -2
- data/test/lib/vedeu/support/position_validator_test.rb +11 -0
- data/test/lib/vedeu/support/read_test.rb +88 -0
- data/test/lib/vedeu/support/refresh_test.rb +44 -12
- data/test/lib/vedeu/support/sentence_test.rb +6 -4
- data/test/lib/vedeu/support/terminal_test.rb +81 -70
- data/test/lib/vedeu/support/text_test.rb +93 -0
- data/test/lib/vedeu/support/trace_test.rb +21 -9
- data/test/lib/vedeu/support/visible_test.rb +148 -0
- data/test/lib/vedeu/support/write_test.rb +136 -0
- data/test/lib/vedeu/traps_test.rb +11 -0
- data/test/lib/vedeu_test.rb +2 -0
- data/test/support/helpers/all.rb +7 -0
- data/test/support/helpers/dsl_model_test_class.rb +25 -0
- data/test/support/{test_classes → helpers}/helpers.rb +0 -2
- data/test/support/helpers/misc.rb +15 -0
- data/test/support/helpers/model_test_class.rb +34 -0
- data/test/support/{test_classes → helpers}/presentation.rb +0 -0
- data/test/support/{test_classes → helpers}/repositories.rb +3 -3
- data/test/support/{test_modules/repository.rb → helpers/repository_test_module.rb} +5 -1
- data/test/test_helper.rb +19 -22
- data/vedeu.gemspec +11 -6
- metadata +322 -181
- data/lib/vedeu/api/api.rb +0 -239
- data/lib/vedeu/api/composition.rb +0 -38
- data/lib/vedeu/api/defined.rb +0 -52
- data/lib/vedeu/api/helpers.rb +0 -161
- data/lib/vedeu/api/interface.rb +0 -287
- data/lib/vedeu/api/keymap.rb +0 -75
- data/lib/vedeu/api/line.rb +0 -107
- data/lib/vedeu/api/menu.rb +0 -111
- data/lib/vedeu/api/stream.rb +0 -96
- data/lib/vedeu/models/border.rb +0 -238
- data/lib/vedeu/models/char.rb +0 -43
- data/lib/vedeu/models/composition.rb +0 -72
- data/lib/vedeu/models/line.rb +0 -100
- data/lib/vedeu/models/stream.rb +0 -130
- data/lib/vedeu/models/style.rb +0 -52
- data/lib/vedeu/repositories/buffers.rb +0 -52
- data/lib/vedeu/repositories/cursors.rb +0 -64
- data/lib/vedeu/repositories/events.rb +0 -147
- data/lib/vedeu/repositories/groups.rb +0 -47
- data/lib/vedeu/repositories/interfaces.rb +0 -78
- data/lib/vedeu/repositories/keymaps.rb +0 -196
- data/lib/vedeu/repositories/models/cursor.rb +0 -209
- data/lib/vedeu/repositories/models/interface.rb +0 -163
- data/lib/vedeu/repositories/models/keymap.rb +0 -111
- data/lib/vedeu/repositories/models/offset.rb +0 -91
- data/lib/vedeu/repositories/offsets.rb +0 -69
- data/lib/vedeu/support/exceptions.rb +0 -34
- data/lib/vedeu/support/keymap_validator.rb +0 -100
- data/lib/vedeu/support/model.rb +0 -14
- data/lib/vedeu/support/presentation.rb +0 -86
- data/lib/vedeu/support/registrar.rb +0 -53
- data/test/integration/api/api_test.rb +0 -97
- data/test/integration/api_dsl/dsl_api_test.rb +0 -4
- data/test/integration/api_dsl/dsl_composition_test.rb +0 -4
- data/test/integration/api_dsl/dsl_defined_test.rb +0 -4
- data/test/integration/api_dsl/dsl_helpers_test.rb +0 -4
- data/test/integration/api_dsl/dsl_interface_test.rb +0 -4
- data/test/integration/api_dsl/dsl_keymap.rb +0 -4
- data/test/integration/api_dsl/dsl_line_test.rb +0 -4
- data/test/integration/api_dsl/dsl_menu_test.rb +0 -4
- data/test/integration/api_dsl/dsl_stream_test.rb +0 -138
- data/test/integration/cursors_test.rb +0 -9
- data/test/integration/defining_interfaces_test.rb +0 -26
- data/test/integration/run_once_test.rb +0 -26
- data/test/integration/views/basic_view_test.rb +0 -807
- data/test/lib/vedeu/api/api_test.rb +0 -204
- data/test/lib/vedeu/api/composition_test.rb +0 -31
- data/test/lib/vedeu/api/defined_test.rb +0 -79
- data/test/lib/vedeu/api/helpers_test.rb +0 -111
- data/test/lib/vedeu/api/interface_test.rb +0 -410
- data/test/lib/vedeu/api/keymap_test.rb +0 -65
- data/test/lib/vedeu/api/line_test.rb +0 -83
- data/test/lib/vedeu/api/menu_test.rb +0 -85
- data/test/lib/vedeu/api/stream_test.rb +0 -59
- data/test/lib/vedeu/colours/translator_test.rb +0 -22
- data/test/lib/vedeu/models/border_test.rb +0 -197
- data/test/lib/vedeu/models/char_test.rb +0 -52
- data/test/lib/vedeu/models/composition_test.rb +0 -45
- data/test/lib/vedeu/models/key_test.rb +0 -43
- data/test/lib/vedeu/models/line_test.rb +0 -123
- data/test/lib/vedeu/models/stream_test.rb +0 -233
- data/test/lib/vedeu/models/style_test.rb +0 -59
- data/test/lib/vedeu/repositories/buffers_test.rb +0 -37
- data/test/lib/vedeu/repositories/cursors_test.rb +0 -62
- data/test/lib/vedeu/repositories/events_test.rb +0 -57
- data/test/lib/vedeu/repositories/groups_test.rb +0 -28
- data/test/lib/vedeu/repositories/interfaces_test.rb +0 -51
- data/test/lib/vedeu/repositories/keymaps_test.rb +0 -223
- data/test/lib/vedeu/repositories/models/buffer_test.rb +0 -174
- data/test/lib/vedeu/repositories/models/cursor_test.rb +0 -158
- data/test/lib/vedeu/repositories/models/event_test.rb +0 -53
- data/test/lib/vedeu/repositories/models/group_test.rb +0 -98
- data/test/lib/vedeu/repositories/models/interface_test.rb +0 -130
- data/test/lib/vedeu/repositories/models/keymap_test.rb +0 -27
- data/test/lib/vedeu/repositories/models/menu_test.rb +0 -246
- data/test/lib/vedeu/repositories/models/offset_test.rb +0 -128
- data/test/lib/vedeu/repositories/offsets_test.rb +0 -39
- data/test/lib/vedeu/support/keymap_validator_test.rb +0 -62
- data/test/lib/vedeu/support/model_test.rb +0 -23
- data/test/lib/vedeu/support/presentation_test.rb +0 -53
- data/test/lib/vedeu/support/registrar_test.rb +0 -94
- data/test/lib/vedeu/support/repository_test.rb +0 -208
- data/test/support/test_classes/all.rb +0 -5
- data/test/support/test_classes/coercions.rb +0 -16
- data/test/support/test_classes/model.rb +0 -23
- data/test/support/test_modules/all.rb +0 -1
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'vedeu/presentation/presentation'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
# A Char represents a single character of the terminal. It is a container for
|
6
|
+
# the a single character in a {Vedeu::Stream}.
|
7
|
+
#
|
8
|
+
# Though a multi-character String can be passed as a value, only the first
|
9
|
+
# character is returned in the escape sequence.
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
class Char
|
13
|
+
|
14
|
+
include Vedeu::Presentation
|
15
|
+
|
16
|
+
attr_accessor :parent
|
17
|
+
attr_reader :position
|
18
|
+
|
19
|
+
class << self
|
20
|
+
def coerce(value = nil, parent = nil, colour = nil, style = nil, position = nil)
|
21
|
+
if value.is_a?(self)
|
22
|
+
value
|
23
|
+
|
24
|
+
elsif value.is_a?(Array)
|
25
|
+
if value.first.is_a?(self)
|
26
|
+
value
|
27
|
+
|
28
|
+
elsif value.first.is_a?(String)
|
29
|
+
value.map { |char| new(char, parent, colour, style, position) }
|
30
|
+
|
31
|
+
else
|
32
|
+
# ...
|
33
|
+
|
34
|
+
end
|
35
|
+
else
|
36
|
+
# ...
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns a new instance of Char.
|
43
|
+
#
|
44
|
+
# @param value [String]
|
45
|
+
# @param parent [Line]
|
46
|
+
# @param colour [Colour]
|
47
|
+
# @param style [Style]
|
48
|
+
# @param position [Position]
|
49
|
+
# @return [Char]
|
50
|
+
def initialize(value = nil, parent = nil, colour = nil, style = nil, position = nil)
|
51
|
+
@value = value
|
52
|
+
@parent = parent
|
53
|
+
@colour = colour
|
54
|
+
@style = style
|
55
|
+
@position = position
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns log friendly output.
|
59
|
+
#
|
60
|
+
# @return [String]
|
61
|
+
def inspect
|
62
|
+
"<#{self.class.name} (value:#{@value})>"
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [Boolean]
|
66
|
+
def ==(other)
|
67
|
+
eql?(other)
|
68
|
+
end
|
69
|
+
|
70
|
+
# @return [Boolean]
|
71
|
+
def eql?(other)
|
72
|
+
self.class == other.class && value == other.value
|
73
|
+
end
|
74
|
+
|
75
|
+
# @return [String] The character.
|
76
|
+
def value
|
77
|
+
return '' unless @value
|
78
|
+
|
79
|
+
@value[0]
|
80
|
+
end
|
81
|
+
|
82
|
+
end # Char
|
83
|
+
|
84
|
+
end # Vedeu
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'vedeu/dsl/composition'
|
2
|
+
require 'vedeu/models/collection'
|
3
|
+
require 'vedeu/presentation/presentation'
|
4
|
+
require 'vedeu/support/common'
|
5
|
+
|
6
|
+
require 'vedeu/models/view/interfaces'
|
7
|
+
require 'vedeu/models/view/interface'
|
8
|
+
|
9
|
+
module Vedeu
|
10
|
+
|
11
|
+
# A composition is a collection of interfaces.
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
class Composition
|
15
|
+
|
16
|
+
include Vedeu::Presentation
|
17
|
+
include Vedeu::Model
|
18
|
+
|
19
|
+
attr_reader :interfaces
|
20
|
+
alias_method :value, :interfaces
|
21
|
+
|
22
|
+
class << self
|
23
|
+
|
24
|
+
# @param attributes [Hash]
|
25
|
+
# @option attributes client []
|
26
|
+
# @option attributes colour []
|
27
|
+
# @option attributes interfaces []
|
28
|
+
# @option attributes style []
|
29
|
+
# @param block [Proc]
|
30
|
+
# @return [Class]
|
31
|
+
def build(attributes = {}, &block)
|
32
|
+
attrs = defaults.merge(attributes)
|
33
|
+
|
34
|
+
model = new(attrs[:interfaces], attrs[:colour], attrs[:style])
|
35
|
+
model.deputy(attributes[:client]).instance_eval(&block) if block_given?
|
36
|
+
model
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# The default values for a new instance of this class.
|
42
|
+
#
|
43
|
+
# @return [Hash]
|
44
|
+
def defaults
|
45
|
+
{
|
46
|
+
client: nil,
|
47
|
+
colour: nil,
|
48
|
+
interfaces: [],
|
49
|
+
style: nil,
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
# Returns a new instance of Composition.
|
56
|
+
#
|
57
|
+
# @param interfaces [Interfaces]
|
58
|
+
# @return [Composition]
|
59
|
+
def initialize(interfaces = [], colour = nil, style = nil)
|
60
|
+
@interfaces = interfaces
|
61
|
+
@colour = colour
|
62
|
+
@style = style
|
63
|
+
end
|
64
|
+
|
65
|
+
# @param child []
|
66
|
+
# @return []
|
67
|
+
def add(child)
|
68
|
+
@interfaces = interfaces.add(child)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Returns log friendly output.
|
72
|
+
#
|
73
|
+
# @return [String]
|
74
|
+
def inspect
|
75
|
+
"<#{self.class.name} (interfaces:#{interfaces.size})>"
|
76
|
+
end
|
77
|
+
|
78
|
+
# @return [Vedeu::Interfaces]
|
79
|
+
def interfaces
|
80
|
+
children.coerce(@interfaces, self)
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# Return the class name for the children on this model.
|
86
|
+
#
|
87
|
+
# @return [Class]
|
88
|
+
def child
|
89
|
+
Vedeu::Interface
|
90
|
+
end
|
91
|
+
|
92
|
+
# Return the class name for the children on this model.
|
93
|
+
#
|
94
|
+
# @return [Class]
|
95
|
+
def children
|
96
|
+
Vedeu::Interfaces
|
97
|
+
end
|
98
|
+
|
99
|
+
end # Composition
|
100
|
+
|
101
|
+
end # Vedeu
|
@@ -0,0 +1,215 @@
|
|
1
|
+
require 'vedeu/support/common'
|
2
|
+
require 'vedeu/support/content_geometry'
|
3
|
+
require 'vedeu/models/model'
|
4
|
+
require 'vedeu/presentation/presentation'
|
5
|
+
require 'vedeu/buffers/display_buffer'
|
6
|
+
require 'vedeu/buffers/buffer'
|
7
|
+
|
8
|
+
require 'vedeu/models/view/lines'
|
9
|
+
|
10
|
+
module Vedeu
|
11
|
+
|
12
|
+
# An Interface represents a portion of the terminal defined by
|
13
|
+
# {Vedeu::Geometry}. It is a container for {Vedeu::Line} and {Vedeu::Stream}
|
14
|
+
# objects.
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
class Interface
|
18
|
+
|
19
|
+
extend Forwardable
|
20
|
+
|
21
|
+
include Vedeu::Common
|
22
|
+
include Vedeu::Model
|
23
|
+
include Vedeu::Presentation
|
24
|
+
include Vedeu::DisplayBuffer
|
25
|
+
|
26
|
+
attr_accessor :border,
|
27
|
+
:colour,
|
28
|
+
:delay,
|
29
|
+
:geometry,
|
30
|
+
:group,
|
31
|
+
:name,
|
32
|
+
:parent,
|
33
|
+
:style
|
34
|
+
|
35
|
+
attr_writer :lines
|
36
|
+
|
37
|
+
def_delegators :geometry,
|
38
|
+
:north,
|
39
|
+
:east,
|
40
|
+
:south,
|
41
|
+
:west,
|
42
|
+
:top,
|
43
|
+
:right,
|
44
|
+
:bottom,
|
45
|
+
:left,
|
46
|
+
:width,
|
47
|
+
:height,
|
48
|
+
:origin
|
49
|
+
|
50
|
+
class << self
|
51
|
+
|
52
|
+
# Build interfaces using a simple DSL.
|
53
|
+
# If a name is provided as part of the attributes, we check the repository
|
54
|
+
# for an interface of the same name and update it from the new attributes
|
55
|
+
# provided, or if a block is given, new parameters set via the DSL.
|
56
|
+
#
|
57
|
+
# @param attributes [Hash]
|
58
|
+
# @option attributes client []
|
59
|
+
# @option attributes colour []
|
60
|
+
# @option attributes lines []
|
61
|
+
# @option attributes name []
|
62
|
+
# @option attributes parent []
|
63
|
+
# @option attributes style []
|
64
|
+
# @param block [Proc]
|
65
|
+
# @return [Class]
|
66
|
+
def build(attributes = {}, &block)
|
67
|
+
attributes = defaults.merge(attributes)
|
68
|
+
model = new(attributes[:name],
|
69
|
+
attributes[:lines],
|
70
|
+
attributes[:parent],
|
71
|
+
attributes[:colour],
|
72
|
+
attributes[:style])
|
73
|
+
model.deputy(attributes[:client]).instance_eval(&block) if block_given?
|
74
|
+
model
|
75
|
+
end
|
76
|
+
|
77
|
+
private
|
78
|
+
|
79
|
+
# The default values for a new instance of this class.
|
80
|
+
#
|
81
|
+
# @return [Hash]
|
82
|
+
def defaults
|
83
|
+
{
|
84
|
+
client: nil,
|
85
|
+
colour: nil,
|
86
|
+
lines: [],
|
87
|
+
name: '',
|
88
|
+
parent: nil,
|
89
|
+
style: nil,
|
90
|
+
}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Return a new instance of Interface.
|
95
|
+
#
|
96
|
+
# @param name [String]
|
97
|
+
# @param lines [Vedeu::Lines]
|
98
|
+
# @param parent [Vedeu::Composition]
|
99
|
+
# @param colour [Vedeu::Colour]
|
100
|
+
# @param style [Vedeu::Style]
|
101
|
+
# @return [Interface]
|
102
|
+
def initialize(name = '', lines = [], parent = nil, colour = nil, style = nil)
|
103
|
+
@name = name
|
104
|
+
@lines = lines
|
105
|
+
@parent = parent
|
106
|
+
@colour = colour
|
107
|
+
@style = style
|
108
|
+
|
109
|
+
@border = nil
|
110
|
+
@delay = 0.0
|
111
|
+
@geometry = nil
|
112
|
+
@group = ''
|
113
|
+
|
114
|
+
@repository = Vedeu.interfaces
|
115
|
+
end
|
116
|
+
|
117
|
+
# @param child []
|
118
|
+
# @return []
|
119
|
+
def add(child)
|
120
|
+
@lines = lines.add(child)
|
121
|
+
end
|
122
|
+
|
123
|
+
# @return [Hash]
|
124
|
+
def attributes
|
125
|
+
{
|
126
|
+
border: border,
|
127
|
+
colour: colour,
|
128
|
+
delay: delay,
|
129
|
+
geometry: geometry,
|
130
|
+
group: group,
|
131
|
+
name: name,
|
132
|
+
parent: parent,
|
133
|
+
style: style,
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
137
|
+
# Returns a boolean indicating whether the interface has a border.
|
138
|
+
#
|
139
|
+
# @return [Boolean]
|
140
|
+
def border?
|
141
|
+
!!(border)
|
142
|
+
end
|
143
|
+
|
144
|
+
# @return [Vedeu::Cursor]
|
145
|
+
def cursor
|
146
|
+
Vedeu.cursors.by_name(name)
|
147
|
+
end
|
148
|
+
|
149
|
+
# Returns log friendly output.
|
150
|
+
#
|
151
|
+
# @return [String]
|
152
|
+
def inspect
|
153
|
+
"<#{self.class.name} (lines:#{lines.size})>"
|
154
|
+
end
|
155
|
+
|
156
|
+
# @return [Vedeu::Lines]
|
157
|
+
def lines
|
158
|
+
children.coerce(@lines, self)
|
159
|
+
end
|
160
|
+
alias_method :content, :lines
|
161
|
+
alias_method :value, :lines
|
162
|
+
|
163
|
+
# Returns a boolean indicating whether the interface has content.
|
164
|
+
#
|
165
|
+
# @return [Boolean]
|
166
|
+
def lines?
|
167
|
+
lines.any?
|
168
|
+
end
|
169
|
+
|
170
|
+
# @return []
|
171
|
+
def render
|
172
|
+
if border
|
173
|
+
border.render
|
174
|
+
|
175
|
+
else
|
176
|
+
viewport
|
177
|
+
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# @return [Interface]
|
182
|
+
def store
|
183
|
+
super
|
184
|
+
|
185
|
+
store_new_buffer
|
186
|
+
store_refresh_events
|
187
|
+
store_focusable
|
188
|
+
store_cursor
|
189
|
+
store_group
|
190
|
+
end
|
191
|
+
|
192
|
+
# return [Array]
|
193
|
+
def viewport
|
194
|
+
Vedeu::Viewport.show(self)
|
195
|
+
end
|
196
|
+
|
197
|
+
private
|
198
|
+
|
199
|
+
# Return the class name for the children on this model.
|
200
|
+
#
|
201
|
+
# @return [Class]
|
202
|
+
def child
|
203
|
+
Vedeu::Line
|
204
|
+
end
|
205
|
+
|
206
|
+
# Return the class name for the children on this model.
|
207
|
+
#
|
208
|
+
# @return [Class]
|
209
|
+
def children
|
210
|
+
Vedeu::Lines
|
211
|
+
end
|
212
|
+
|
213
|
+
end # Interface
|
214
|
+
|
215
|
+
end # Vedeu
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'vedeu/presentation/presentation'
|
2
|
+
|
3
|
+
require 'vedeu/models/view/streams'
|
4
|
+
require 'vedeu/models/view/stream'
|
5
|
+
|
6
|
+
module Vedeu
|
7
|
+
|
8
|
+
# A Line represents a single row of the terminal. It is a container for
|
9
|
+
# {Vedeu::Stream} objects. A line's width is determined by the
|
10
|
+
# {Vedeu::Interface} it belongs to.
|
11
|
+
#
|
12
|
+
# @api private
|
13
|
+
class Line
|
14
|
+
|
15
|
+
include Vedeu::Model
|
16
|
+
include Vedeu::Presentation
|
17
|
+
|
18
|
+
attr_accessor :parent,
|
19
|
+
:streams
|
20
|
+
|
21
|
+
alias_method :value, :streams
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
# @option attributes streams []
|
26
|
+
# @option attributes parent []
|
27
|
+
# @option attributes colour []
|
28
|
+
# @option attributes style []
|
29
|
+
# @option attributes client []
|
30
|
+
def build(attributes = {}, &block)
|
31
|
+
attributes = defaults.merge(attributes)
|
32
|
+
|
33
|
+
model = new(attributes[:streams],
|
34
|
+
attributes[:parent],
|
35
|
+
attributes[:colour],
|
36
|
+
attributes[:style])
|
37
|
+
model.deputy(attributes[:client]).instance_eval(&block) if block_given?
|
38
|
+
model
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# The default values for a new instance of this class.
|
44
|
+
#
|
45
|
+
# @return [Hash]
|
46
|
+
def defaults
|
47
|
+
{
|
48
|
+
client: nil,
|
49
|
+
colour: nil,
|
50
|
+
parent: nil,
|
51
|
+
streams: [],
|
52
|
+
style: nil,
|
53
|
+
}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Returns a new instance of Line.
|
58
|
+
#
|
59
|
+
# @return [Line]
|
60
|
+
def initialize(streams = [], parent = nil, colour = nil, style = nil)
|
61
|
+
@colour = colour
|
62
|
+
@parent = parent
|
63
|
+
@streams = streams
|
64
|
+
@style = style
|
65
|
+
end
|
66
|
+
|
67
|
+
# @param child []
|
68
|
+
# @return []
|
69
|
+
def add(child)
|
70
|
+
@streams = streams.add(child)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Returns an array of all the characters with formatting for this line.
|
74
|
+
#
|
75
|
+
# @return [Array]
|
76
|
+
# @see Vedeu::Stream
|
77
|
+
def chars
|
78
|
+
return [] if empty?
|
79
|
+
|
80
|
+
streams.map(&:chars).flatten
|
81
|
+
end
|
82
|
+
|
83
|
+
# Returns a boolean indicating whether the line has content.
|
84
|
+
#
|
85
|
+
# @return [Boolean]
|
86
|
+
def empty?
|
87
|
+
streams.empty?
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns log friendly output.
|
91
|
+
#
|
92
|
+
# @return [String]
|
93
|
+
def inspect
|
94
|
+
"<#{self.class.name} (streams:#{streams.size})>"
|
95
|
+
end
|
96
|
+
|
97
|
+
# Returns the size of the content in characters without formatting.
|
98
|
+
#
|
99
|
+
# @return [Fixnum]
|
100
|
+
def size
|
101
|
+
streams.map(&:size).inject(0, :+) { |sum, x| sum += x }
|
102
|
+
end
|
103
|
+
|
104
|
+
# @return [Vedeu::Streams]
|
105
|
+
def streams
|
106
|
+
children.coerce(@streams, self)
|
107
|
+
end
|
108
|
+
|
109
|
+
# Delegate to Vedeu::Interface#width if available.
|
110
|
+
#
|
111
|
+
# @return [Fixnum]
|
112
|
+
def width
|
113
|
+
parent.width if parent
|
114
|
+
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
# Return the class name for the children on this model.
|
119
|
+
#
|
120
|
+
# @return [Class]
|
121
|
+
def child
|
122
|
+
Vedeu::Stream
|
123
|
+
end
|
124
|
+
|
125
|
+
# Return the class name for the children on this model.
|
126
|
+
#
|
127
|
+
# @return [Class]
|
128
|
+
def children
|
129
|
+
Vedeu::Streams
|
130
|
+
end
|
131
|
+
|
132
|
+
end # Line
|
133
|
+
|
134
|
+
end # Vedeu
|
@@ -0,0 +1,144 @@
|
|
1
|
+
require 'vedeu/presentation/presentation'
|
2
|
+
require 'vedeu/models/view/char'
|
3
|
+
|
4
|
+
module Vedeu
|
5
|
+
|
6
|
+
# A Stream can represent a character or collection of characters as part of a
|
7
|
+
# {Vedeu::Line} which you wish to colour and style independently of the other
|
8
|
+
# characters in that line.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
class Stream
|
12
|
+
|
13
|
+
include Vedeu::Model
|
14
|
+
include Vedeu::Presentation
|
15
|
+
|
16
|
+
attr_accessor :parent,
|
17
|
+
:value
|
18
|
+
|
19
|
+
alias_method :content, :value
|
20
|
+
alias_method :data, :value
|
21
|
+
alias_method :text, :value
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
# @option attributes value []
|
26
|
+
# @option attributes parent []
|
27
|
+
# @option attributes colour []
|
28
|
+
# @option attributes style []
|
29
|
+
# @option attributes client []
|
30
|
+
def build(attributes = {}, &block)
|
31
|
+
attributes = defaults.merge(attributes)
|
32
|
+
|
33
|
+
model = new(attributes[:value],
|
34
|
+
attributes[:parent],
|
35
|
+
attributes[:colour],
|
36
|
+
attributes[:style])
|
37
|
+
model.deputy(attributes[:client]).instance_eval(&block) if block_given?
|
38
|
+
model
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# The default values for a new instance of this class.
|
44
|
+
#
|
45
|
+
# @return [Hash]
|
46
|
+
def defaults
|
47
|
+
{
|
48
|
+
client: nil,
|
49
|
+
colour: nil,
|
50
|
+
parent: nil,
|
51
|
+
style: nil,
|
52
|
+
value: '',
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
# Returns a new instance of Stream.
|
59
|
+
#
|
60
|
+
# @param value [String]
|
61
|
+
# @param parent [Vedeu::Line]
|
62
|
+
# @param colour [Vedeu::Colour]
|
63
|
+
# @param style [Vedeu::Style]
|
64
|
+
# @return [Vedeu::Stream]
|
65
|
+
def initialize(value = '', parent = nil, colour = nil, style = nil)
|
66
|
+
@value = value
|
67
|
+
@parent = parent
|
68
|
+
@colour = colour
|
69
|
+
@style = style
|
70
|
+
end
|
71
|
+
|
72
|
+
# @param child [Vedeu::Stream]
|
73
|
+
# @return [Vedeu::Line]
|
74
|
+
def add(child)
|
75
|
+
parent.add(child)
|
76
|
+
end
|
77
|
+
|
78
|
+
# Returns an array of characters, each element is the escape sequences of
|
79
|
+
# colours and styles for this stream, the character itself, and the escape
|
80
|
+
# sequences of colours and styles for the parent of the stream
|
81
|
+
# ({Vedeu::Line}).
|
82
|
+
#
|
83
|
+
# @return [Array]
|
84
|
+
def chars
|
85
|
+
return [] if value.empty?
|
86
|
+
|
87
|
+
value.chars.map do |char|
|
88
|
+
child.new(char, parent, colour, style, nil).to_s
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Returns a boolean indicating whether the stream has content.
|
93
|
+
#
|
94
|
+
# @return [Boolean]
|
95
|
+
def empty?
|
96
|
+
value.empty?
|
97
|
+
end
|
98
|
+
|
99
|
+
# Returns log friendly output.
|
100
|
+
#
|
101
|
+
# @return [String]
|
102
|
+
def inspect
|
103
|
+
"<#{self.class.name} (value:#{value}, size:#{size})>"
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the size of the content in characters without formatting.
|
107
|
+
#
|
108
|
+
# @return [Fixnum]
|
109
|
+
def size
|
110
|
+
value.size
|
111
|
+
end
|
112
|
+
|
113
|
+
# @return [String]
|
114
|
+
def value
|
115
|
+
# Vedeu::Char.coerce(@value, parent, colour, style)
|
116
|
+
@value
|
117
|
+
end
|
118
|
+
|
119
|
+
# Delegate to Vedeu::Line#width if available.
|
120
|
+
#
|
121
|
+
# @return [Fixnum]
|
122
|
+
def width
|
123
|
+
parent.width if parent
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
# Return the class name for the children on this model.
|
129
|
+
#
|
130
|
+
# @return [Class]
|
131
|
+
def child
|
132
|
+
Vedeu::Char
|
133
|
+
end
|
134
|
+
|
135
|
+
# Return the class name for the collection of children on this model.
|
136
|
+
#
|
137
|
+
# @return [Class]
|
138
|
+
def children
|
139
|
+
Vedeu::Chars
|
140
|
+
end
|
141
|
+
|
142
|
+
end # Stream
|
143
|
+
|
144
|
+
end # Vedeu
|