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
@@ -8,6 +8,30 @@ module Vedeu
|
|
8
8
|
#
|
9
9
|
class Viewport
|
10
10
|
|
11
|
+
extend Forwardable
|
12
|
+
|
13
|
+
def_delegators :interface,
|
14
|
+
:border,
|
15
|
+
:border?,
|
16
|
+
:geometry,
|
17
|
+
:lines,
|
18
|
+
:lines?,
|
19
|
+
:cursor
|
20
|
+
|
21
|
+
def_delegators :border,
|
22
|
+
:bottom?,
|
23
|
+
:left?,
|
24
|
+
:right?,
|
25
|
+
:top?
|
26
|
+
|
27
|
+
def_delegators :cursor,
|
28
|
+
:ox,
|
29
|
+
:oy
|
30
|
+
|
31
|
+
def_delegators :geometry,
|
32
|
+
:height,
|
33
|
+
:width
|
34
|
+
|
11
35
|
# @see Viewport#show
|
12
36
|
def self.show(interface)
|
13
37
|
new(interface).show
|
@@ -19,8 +43,6 @@ module Vedeu
|
|
19
43
|
# @return [Viewport]
|
20
44
|
def initialize(interface)
|
21
45
|
@interface = interface
|
22
|
-
@top = 0
|
23
|
-
@left = 0
|
24
46
|
end
|
25
47
|
|
26
48
|
# Returns the visible content for the interface.
|
@@ -32,14 +54,18 @@ module Vedeu
|
|
32
54
|
#
|
33
55
|
# @return [Array]
|
34
56
|
def show
|
35
|
-
|
36
|
-
column_adjustment
|
37
|
-
|
38
|
-
return [] unless content?
|
57
|
+
return [] unless lines?
|
39
58
|
|
40
59
|
line_pad.map { |line| column_pad(line) }.compact
|
41
60
|
end
|
42
61
|
|
62
|
+
# Returns a string representation of the viewport.
|
63
|
+
#
|
64
|
+
# @return [String]
|
65
|
+
def to_s
|
66
|
+
show.map(&:join).join("\n")
|
67
|
+
end
|
68
|
+
|
43
69
|
private
|
44
70
|
|
45
71
|
attr_reader :interface
|
@@ -49,13 +75,13 @@ module Vedeu
|
|
49
75
|
#
|
50
76
|
# @return [Array<Array<String>>]
|
51
77
|
def line_pad
|
52
|
-
|
78
|
+
visible_lines = lines[rows] || []
|
53
79
|
|
54
|
-
if
|
55
|
-
|
80
|
+
if visible_lines.size < height
|
81
|
+
visible_lines + [" "] * (height - visible_lines.size)
|
56
82
|
|
57
83
|
else
|
58
|
-
|
84
|
+
visible_lines
|
59
85
|
|
60
86
|
end
|
61
87
|
end
|
@@ -66,123 +92,81 @@ module Vedeu
|
|
66
92
|
# @param line [Array<String>]
|
67
93
|
# @return [Array<String>]
|
68
94
|
def column_pad(line)
|
69
|
-
|
95
|
+
visible_columns = line.chars[columns] || []
|
70
96
|
|
71
|
-
if
|
72
|
-
|
97
|
+
if visible_columns.size < width
|
98
|
+
visible_columns + [" "] * (width - visible_columns.size)
|
73
99
|
|
74
100
|
else
|
75
|
-
|
101
|
+
visible_columns
|
76
102
|
|
77
103
|
end
|
78
104
|
end
|
79
105
|
|
80
|
-
#
|
81
|
-
#
|
106
|
+
# Using the current cursor's x position, return a range of visible lines.
|
107
|
+
#
|
108
|
+
# Scrolls the content horizontally when the stored cursor's x position for
|
109
|
+
# the interface is outside of the visible area.
|
82
110
|
#
|
83
111
|
# @note
|
84
|
-
#
|
85
|
-
#
|
112
|
+
# [value, 0].max # this allows us to set a left that is greater
|
113
|
+
# # than the content width.
|
86
114
|
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
115
|
+
# [[value, (content_width - width)].min, 0].max
|
116
|
+
# # this does not allow us to have a position
|
117
|
+
# # greater than the content width.
|
90
118
|
#
|
91
|
-
# @return [
|
92
|
-
def
|
93
|
-
if
|
94
|
-
|
119
|
+
# @return [Range]
|
120
|
+
def rows
|
121
|
+
top = if oy >= bordered_height
|
122
|
+
[(oy - bordered_height), 0].max
|
95
123
|
|
96
|
-
|
97
|
-
|
124
|
+
else
|
125
|
+
0
|
98
126
|
|
99
127
|
end
|
128
|
+
|
129
|
+
top..(top + (height - 1))
|
100
130
|
end
|
101
131
|
|
102
|
-
#
|
132
|
+
# Using the current cursor's y position, return a range of visible columns.
|
133
|
+
#
|
134
|
+
# Scrolls the content vertically when the stored cursor's y position for the
|
103
135
|
# interface is outside of the visible area.
|
104
136
|
#
|
105
137
|
# @note
|
106
|
-
#
|
107
|
-
#
|
108
|
-
#
|
109
|
-
# @left = [[value, (content_width - width)].min, 0].max
|
110
|
-
# # this does not allow us to have an offset greater
|
111
|
-
# # than the content width.
|
112
|
-
#
|
113
|
-
# @return [Fixnum]
|
114
|
-
def column_adjustment
|
115
|
-
if offset.x < 0
|
116
|
-
@left = [offset.x, 0].max
|
117
|
-
|
118
|
-
elsif offset.x > width
|
119
|
-
@left = [(offset.x - width), 0].max
|
120
|
-
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
# Using the current x offset, return a range of visible lines.
|
138
|
+
# [value, 0].max # this allows us to set a top that is greater than
|
139
|
+
# # the content height.
|
125
140
|
#
|
126
|
-
#
|
127
|
-
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
|
-
# Using the current y offset, return a range of visible columns.
|
141
|
+
# [[value, (content_height - height)].min, 0].max
|
142
|
+
# # this does not allow us to have a position
|
143
|
+
# # greater than the content height.
|
132
144
|
#
|
133
145
|
# @return [Range]
|
134
146
|
def columns
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
# Returns the height of the content, or when no content, the visible height
|
139
|
-
# of the interface.
|
140
|
-
#
|
141
|
-
# @return [Fixnum]
|
142
|
-
def content_height
|
143
|
-
return height unless content?
|
147
|
+
left = if ox >= bordered_width
|
148
|
+
[(ox - bordered_width), 0].max
|
144
149
|
|
145
|
-
|
146
|
-
|
150
|
+
else
|
151
|
+
0
|
147
152
|
|
148
|
-
|
149
|
-
# the interface.
|
150
|
-
#
|
151
|
-
# @return [Fixnum]
|
152
|
-
def content_width
|
153
|
-
return width unless content?
|
153
|
+
end
|
154
154
|
|
155
|
-
|
155
|
+
left..(left + (width - 1))
|
156
156
|
end
|
157
157
|
|
158
|
-
# Returns the character length of the longest line for this interface.
|
159
|
-
#
|
160
158
|
# @return [Fixnum]
|
161
|
-
def
|
162
|
-
|
163
|
-
end
|
164
|
-
|
165
|
-
# Return a boolean indicating whether this interface currently has content.
|
166
|
-
#
|
167
|
-
# @return [Boolean]
|
168
|
-
def content?
|
169
|
-
content.any?
|
170
|
-
end
|
171
|
-
|
172
|
-
def content
|
173
|
-
interface.content
|
174
|
-
end
|
159
|
+
def bordered_width
|
160
|
+
return border.width if border?
|
175
161
|
|
176
|
-
|
177
|
-
interface.offset
|
162
|
+
width
|
178
163
|
end
|
179
164
|
|
180
|
-
|
181
|
-
|
182
|
-
|
165
|
+
# @return [Fixnum]
|
166
|
+
def bordered_height
|
167
|
+
return border.height if border?
|
183
168
|
|
184
|
-
|
185
|
-
interface.height - 1
|
169
|
+
height
|
186
170
|
end
|
187
171
|
|
188
172
|
end # Viewport
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
class Writer
|
4
|
+
|
5
|
+
attr_reader :writers
|
6
|
+
|
7
|
+
def self.[](*args)
|
8
|
+
new(args)
|
9
|
+
end
|
10
|
+
|
11
|
+
def initialize(writers)
|
12
|
+
@writers = writers
|
13
|
+
end
|
14
|
+
|
15
|
+
def ==(other)
|
16
|
+
writers == other.writers
|
17
|
+
end
|
18
|
+
|
19
|
+
def +(other)
|
20
|
+
Writer[*(writers + other.writers)]
|
21
|
+
end
|
22
|
+
|
23
|
+
def write(stream)
|
24
|
+
@writers.each { |writer| writer.write(stream) }
|
25
|
+
end
|
26
|
+
|
27
|
+
end # Consoles
|
28
|
+
|
29
|
+
end # Vedeu
|
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'vedeu/presentation/translator'
|
2
|
+
require 'vedeu/presentation/background'
|
3
|
+
require 'vedeu/presentation/colour'
|
4
|
+
require 'vedeu/presentation/foreground'
|
5
|
+
require 'vedeu/presentation/style'
|
6
|
+
require 'vedeu/presentation/presentation'
|
7
|
+
|
8
|
+
module Vedeu
|
9
|
+
end # Vedeu
|
@@ -15,7 +15,7 @@ module Vedeu
|
|
15
15
|
#
|
16
16
|
# @return [String]
|
17
17
|
def named
|
18
|
-
["\e[", background_codes[colour], 'm'].join
|
18
|
+
["\e[", Esc.background_codes[colour], 'm'].join
|
19
19
|
end
|
20
20
|
|
21
21
|
# Returns an escape sequence.
|
@@ -38,14 +38,6 @@ module Vedeu
|
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
# Produces the background named colour escape sequence hash from the
|
42
|
-
# foreground escape sequence hash.
|
43
|
-
#
|
44
|
-
# @return [Hash]
|
45
|
-
def background_codes
|
46
|
-
Esc.codes.inject({}) { |h, (k, v)| h.merge(k => v + 10) }
|
47
|
-
end
|
48
|
-
|
49
41
|
end # Background
|
50
42
|
|
51
43
|
end # Vedeu
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'vedeu/support/coercions'
|
2
|
+
|
1
3
|
module Vedeu
|
2
4
|
|
3
5
|
# Provides a container for terminal escape sequences controlling the
|
@@ -7,28 +9,39 @@ module Vedeu
|
|
7
9
|
# @api private
|
8
10
|
class Colour
|
9
11
|
|
10
|
-
|
12
|
+
include Vedeu::Coercions
|
13
|
+
|
14
|
+
attr_reader :attributes,
|
15
|
+
:background,
|
16
|
+
:foreground
|
11
17
|
|
12
18
|
# Returns a new instance of Colour.
|
13
19
|
#
|
14
20
|
# @param attributes [Hash]
|
21
|
+
# @option attributes background [String]
|
22
|
+
# @option attributes foreground [String]
|
15
23
|
# @return [Colour]
|
16
24
|
def initialize(attributes = {})
|
17
25
|
@attributes = defaults.merge(attributes)
|
26
|
+
|
27
|
+
@background = Background.escape_sequence(@attributes[:background])
|
28
|
+
@foreground = Foreground.escape_sequence(@attributes[:foreground])
|
18
29
|
end
|
19
30
|
|
20
|
-
# Converts the
|
31
|
+
# Converts the value into a terminal escape sequence.
|
21
32
|
#
|
33
|
+
# @param value [String]
|
22
34
|
# @return [String]
|
23
|
-
def foreground
|
24
|
-
@foreground
|
35
|
+
def foreground=(value)
|
36
|
+
@foreground = Foreground.escape_sequence(value)
|
25
37
|
end
|
26
38
|
|
27
|
-
# Converts the
|
39
|
+
# Converts the value into a terminal escape sequence.
|
28
40
|
#
|
41
|
+
# @param value [String]
|
29
42
|
# @return [String]
|
30
|
-
def background
|
31
|
-
@background
|
43
|
+
def background=(value)
|
44
|
+
@background = Background.escape_sequence(value)
|
32
45
|
end
|
33
46
|
|
34
47
|
# Returns both or either of the converted attributes into a single escape
|
@@ -41,7 +54,7 @@ module Vedeu
|
|
41
54
|
|
42
55
|
private
|
43
56
|
|
44
|
-
# The default values for a new instance of
|
57
|
+
# The default values for a new instance of this class.
|
45
58
|
#
|
46
59
|
# @return [Hash]
|
47
60
|
def defaults
|
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'vedeu/configuration/configuration'
|
2
|
+
require 'vedeu/presentation/translator'
|
3
|
+
require 'vedeu/support/esc'
|
4
|
+
|
1
5
|
module Vedeu
|
2
6
|
|
3
7
|
# The class represents one half (the other, can be found at
|
@@ -15,7 +19,7 @@ module Vedeu
|
|
15
19
|
#
|
16
20
|
# @return [String]
|
17
21
|
def named
|
18
|
-
["\e[", foreground_codes[colour], 'm'].join
|
22
|
+
["\e[", Esc.foreground_codes[colour], 'm'].join
|
19
23
|
end
|
20
24
|
|
21
25
|
# Returns an escape sequence.
|
@@ -38,14 +42,6 @@ module Vedeu
|
|
38
42
|
end
|
39
43
|
end
|
40
44
|
|
41
|
-
# Produces the foreground named colour escape sequence hash from
|
42
|
-
# {Vedeu::Translator#codes}
|
43
|
-
#
|
44
|
-
# @return [Hash]
|
45
|
-
def foreground_codes
|
46
|
-
Esc.codes
|
47
|
-
end
|
48
|
-
|
49
45
|
end # Foreground
|
50
46
|
|
51
47
|
end # Vedeu
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# This module allows the sharing of presentation concerns between the models:
|
4
|
+
# Interface, Line and Stream.
|
5
|
+
#
|
6
|
+
# @api private
|
7
|
+
module Presentation
|
8
|
+
|
9
|
+
# @return [Vedeu::Colour]
|
10
|
+
def colour
|
11
|
+
Vedeu::Colour.coerce(@colour)
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Vedeu::Colour]
|
15
|
+
def colour=(value)
|
16
|
+
@colour = Vedeu::Colour.coerce(value)
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [Vedeu::Style]
|
20
|
+
def style
|
21
|
+
Vedeu::Style.coerce(@style)
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Vedeu::Style]
|
25
|
+
def style=(value)
|
26
|
+
@style = Vedeu::Style.coerce(value)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Converts the colours and styles to escape sequences, and if the parent
|
30
|
+
# model has previously set the colour and style, reverts back to that for
|
31
|
+
# consistent formatting.
|
32
|
+
#
|
33
|
+
# @return [String] An escape sequence with value interpolated.
|
34
|
+
def to_s
|
35
|
+
render_position { render_colour { render_style { value } } }
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def parent_colour
|
41
|
+
return '' unless parent
|
42
|
+
|
43
|
+
parent.colour
|
44
|
+
end
|
45
|
+
|
46
|
+
def parent_style
|
47
|
+
return '' unless parent
|
48
|
+
|
49
|
+
parent.style
|
50
|
+
end
|
51
|
+
|
52
|
+
# Renders the colour attributes of the receiver, yields (to then render the
|
53
|
+
# the styles) and once returned, attempts to set the colours back to the
|
54
|
+
# those of the receiver's parent.
|
55
|
+
#
|
56
|
+
# @return [String]
|
57
|
+
def render_colour
|
58
|
+
[
|
59
|
+
colour,
|
60
|
+
yield,
|
61
|
+
parent_colour
|
62
|
+
].join
|
63
|
+
end
|
64
|
+
|
65
|
+
# @return [String]
|
66
|
+
def render_position
|
67
|
+
if self.respond_to?(:position) && position.is_a?(Position)
|
68
|
+
position.to_s { yield }
|
69
|
+
|
70
|
+
else
|
71
|
+
yield
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Renders the style attributes of the receiver, yields (to then render the
|
77
|
+
# next model, or finally, the content) and once returned, attempts to set
|
78
|
+
# the style back to that of the receiver's parent.
|
79
|
+
#
|
80
|
+
# @return [String]
|
81
|
+
def render_style
|
82
|
+
[
|
83
|
+
style,
|
84
|
+
yield,
|
85
|
+
parent_style
|
86
|
+
].join
|
87
|
+
end
|
88
|
+
|
89
|
+
end # Presentation
|
90
|
+
|
91
|
+
end # Vedeu
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'vedeu/support/common'
|
2
|
+
require 'vedeu/support/coercions'
|
3
|
+
|
4
|
+
module Vedeu
|
5
|
+
|
6
|
+
# Converts the style value or value collection into a terminal escape
|
7
|
+
# sequence. Unrecognised values are discarded- an empty string is returned.
|
8
|
+
#
|
9
|
+
# @api private
|
10
|
+
class Style
|
11
|
+
|
12
|
+
include Vedeu::Common
|
13
|
+
include Vedeu::Coercions
|
14
|
+
|
15
|
+
attr_accessor :value
|
16
|
+
|
17
|
+
# Return a new instance of Style.
|
18
|
+
#
|
19
|
+
# @param value [Array|Array<String>|Array<Symbol>|String|Symbol]
|
20
|
+
# The style value or a collection of values.
|
21
|
+
# @return [Style]
|
22
|
+
def initialize(value = nil)
|
23
|
+
@value = value
|
24
|
+
end
|
25
|
+
|
26
|
+
# Return an attributes hash for this class.
|
27
|
+
#
|
28
|
+
# @return [Hash]
|
29
|
+
def attributes
|
30
|
+
{
|
31
|
+
style: value
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return the terminal escape sequences after converting the style or styles.
|
36
|
+
#
|
37
|
+
# @return [String]
|
38
|
+
def to_s
|
39
|
+
return '' unless defined_value?(value)
|
40
|
+
|
41
|
+
@_sequences ||= Array(value).flatten.map { |v| Esc.string(v) }.join
|
42
|
+
end
|
43
|
+
alias_method :escape_sequences, :to_s
|
44
|
+
|
45
|
+
end # Style
|
46
|
+
|
47
|
+
end # Vedeu
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'vedeu/support/coercions'
|
2
|
+
|
1
3
|
module Vedeu
|
2
4
|
|
3
5
|
# Convert a CSS/HTML colour string into a terminal escape sequence.
|
@@ -22,6 +24,11 @@ module Vedeu
|
|
22
24
|
# @api private
|
23
25
|
class Translator
|
24
26
|
|
27
|
+
include Vedeu::Coercions
|
28
|
+
|
29
|
+
attr_reader :colour
|
30
|
+
alias_method :value, :colour
|
31
|
+
|
25
32
|
# Convert a CSS/HTML colour string into a terminal escape sequence.
|
26
33
|
#
|
27
34
|
# @param colour [Fixnum|String|Symbol]
|
@@ -58,11 +65,10 @@ module Vedeu
|
|
58
65
|
|
59
66
|
end
|
60
67
|
end
|
68
|
+
alias_method :to_s, :escape_sequence
|
61
69
|
|
62
70
|
private
|
63
71
|
|
64
|
-
attr_reader :colour
|
65
|
-
|
66
72
|
# @return [Boolean]
|
67
73
|
def no_colour?
|
68
74
|
colour.nil? || colour.to_s.empty?
|
@@ -159,7 +165,7 @@ module Vedeu
|
|
159
165
|
end
|
160
166
|
end
|
161
167
|
|
162
|
-
# Takes the red component of {css_to_rgb} and converts to the correct value
|
168
|
+
# Takes the red component of {#css_to_rgb} and converts to the correct value
|
163
169
|
# for setting the terminal red value.
|
164
170
|
#
|
165
171
|
# @return [Fixnum]
|
@@ -167,7 +173,7 @@ module Vedeu
|
|
167
173
|
(css_to_rgb[0] / 51) * 36
|
168
174
|
end
|
169
175
|
|
170
|
-
# Takes the green component of {css_to_rgb} and converts to the correct value
|
176
|
+
# Takes the green component of {#css_to_rgb} and converts to the correct value
|
171
177
|
# for setting the terminal green value.
|
172
178
|
#
|
173
179
|
# @return [Fixnum]
|
@@ -175,7 +181,7 @@ module Vedeu
|
|
175
181
|
(css_to_rgb[1] / 51) * 6
|
176
182
|
end
|
177
183
|
|
178
|
-
# Takes the blue component of {css_to_rgb} and converts to the correct value
|
184
|
+
# Takes the blue component of {#css_to_rgb} and converts to the correct value
|
179
185
|
# for setting the terminal blue value.
|
180
186
|
#
|
181
187
|
# @return [Fixnum]
|
@@ -1,48 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Repository for storing and retrieving defined menus.
|
4
|
-
#
|
5
|
-
# @api private
|
6
|
-
module Menus
|
7
|
-
|
8
|
-
include Repository
|
9
|
-
extend self
|
10
|
-
|
11
|
-
# Stores the menu attributes defined by the API.
|
12
|
-
#
|
13
|
-
# @param attributes [Hash]
|
14
|
-
# @return [Hash|MissingRequired]
|
15
|
-
def add(attributes)
|
16
|
-
validate_attributes!(attributes)
|
17
|
-
|
18
|
-
Vedeu.log("Registering menu: '#{attributes[:name]}'")
|
19
|
-
|
20
|
-
attributes.merge!({ items: model.new(attributes[:items]) })
|
1
|
+
require 'vedeu/repositories/repository'
|
21
2
|
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
# Access a menu by name.
|
26
|
-
#
|
27
|
-
# @param name [String]
|
28
|
-
# @return [Vedeu::Menu]
|
29
|
-
def use(name)
|
30
|
-
find(name).fetch(:items)
|
31
|
-
end
|
32
|
-
|
33
|
-
private
|
3
|
+
module Vedeu
|
34
4
|
|
35
|
-
|
36
|
-
def model
|
37
|
-
Vedeu::Menu
|
38
|
-
end
|
5
|
+
class Menus < Repository
|
39
6
|
|
40
|
-
|
41
|
-
|
42
|
-
#
|
43
|
-
# @return [Hash]
|
44
|
-
def in_memory
|
45
|
-
{}
|
7
|
+
def self.menus
|
8
|
+
@_menus ||= Vedeu::Menus.new(Vedeu::Menu)
|
46
9
|
end
|
47
10
|
|
48
11
|
end # Menus
|