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,387 @@
|
|
1
|
+
require 'vedeu/dsl/components/border'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
# Provides the mechanism to decorate an interface with a border on all edges,
|
6
|
+
# or specific edges. The characters which are used for the border parts (e.g.
|
7
|
+
# the corners, verticals and horizontals) can be customised as can the colours
|
8
|
+
# and styles.
|
9
|
+
#
|
10
|
+
# @note Refer to UTF-8 U+2500 to U+257F for border characters. More details
|
11
|
+
# can be found at: http://en.wikipedia.org/wiki/Box-drawing_character
|
12
|
+
#
|
13
|
+
class Border
|
14
|
+
|
15
|
+
include Vedeu::Model
|
16
|
+
|
17
|
+
attr_accessor :attributes
|
18
|
+
|
19
|
+
class << self
|
20
|
+
|
21
|
+
# @see Vedeu::Border#initialize
|
22
|
+
def build(attributes = {}, &block)
|
23
|
+
attributes = defaults.merge(attributes)
|
24
|
+
|
25
|
+
model = new(attributes[:interface], attributes)
|
26
|
+
model.deputy(attributes[:client]).instance_eval(&block) if block_given?
|
27
|
+
model
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# The default values for a new instance of this class.
|
33
|
+
#
|
34
|
+
# @return [Hash]
|
35
|
+
def defaults
|
36
|
+
{
|
37
|
+
client: nil,
|
38
|
+
interface: nil,
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns a new instance of Border.
|
45
|
+
#
|
46
|
+
# @param interface [Interface]
|
47
|
+
# @param attributes [Hash]
|
48
|
+
# @option attributes colour
|
49
|
+
# @option attributes style
|
50
|
+
# @option attributes enabled [Boolean]
|
51
|
+
# @option attributes show_bottom [Boolean]
|
52
|
+
# @option attributes show_left [Boolean]
|
53
|
+
# @option attributes show_right [Boolean]
|
54
|
+
# @option attributes show_top [Boolean]
|
55
|
+
# @option attributes horizontal [String]
|
56
|
+
# @option attributes vertical [String]
|
57
|
+
# @option attributes bottom_left [String]
|
58
|
+
# @option attributes bottom_right [String]
|
59
|
+
# @option attributes top_left [String]
|
60
|
+
# @option attributes top_right [String]
|
61
|
+
# @return [Border]
|
62
|
+
def initialize(interface, attributes = {})
|
63
|
+
@interface = interface
|
64
|
+
@attributes = defaults.merge(attributes)
|
65
|
+
@colour = Colour.coerce(@attributes[:colour])
|
66
|
+
@style = Style.coerce(@attributes[:style])
|
67
|
+
end
|
68
|
+
|
69
|
+
# Returns the width of the interface determined by whether a left, right,
|
70
|
+
# both or neither borders are shown.
|
71
|
+
#
|
72
|
+
# @return [Fixnum]
|
73
|
+
def width
|
74
|
+
return interface.width unless enabled?
|
75
|
+
|
76
|
+
if left? && right?
|
77
|
+
interface.width - 2
|
78
|
+
|
79
|
+
elsif left? || right?
|
80
|
+
interface.width - 1
|
81
|
+
|
82
|
+
else
|
83
|
+
interface.width
|
84
|
+
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns the height of the interface determined by whether a top, bottom,
|
89
|
+
# both or neither borders are shown.
|
90
|
+
#
|
91
|
+
# @return [Fixnum]
|
92
|
+
def height
|
93
|
+
return interface.height unless enabled?
|
94
|
+
|
95
|
+
if top? && bottom?
|
96
|
+
interface.height - 2
|
97
|
+
|
98
|
+
elsif top? || bottom?
|
99
|
+
interface.height - 1
|
100
|
+
|
101
|
+
else
|
102
|
+
interface.height
|
103
|
+
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
# Returns the interface with border (if enabled) and the content for the
|
108
|
+
# interface.
|
109
|
+
#
|
110
|
+
# @return [Array<Array<String>>]
|
111
|
+
def render
|
112
|
+
out = []
|
113
|
+
|
114
|
+
out << top if top?
|
115
|
+
|
116
|
+
interface.viewport[0...height].each do |line|
|
117
|
+
out << [left, line[0...width], right].flatten
|
118
|
+
end
|
119
|
+
|
120
|
+
out << bottom if bottom?
|
121
|
+
|
122
|
+
out
|
123
|
+
end
|
124
|
+
|
125
|
+
# Set the border colour.
|
126
|
+
#
|
127
|
+
# @return []
|
128
|
+
def colour=(value)
|
129
|
+
@colour = Colour.coerce(value)
|
130
|
+
end
|
131
|
+
|
132
|
+
# Set the border style.
|
133
|
+
#
|
134
|
+
# @return []
|
135
|
+
def style=(value)
|
136
|
+
@style = Style.coerce(value)
|
137
|
+
end
|
138
|
+
|
139
|
+
# Returns a boolean indicating whether the border is to be shown for this
|
140
|
+
# interface.
|
141
|
+
#
|
142
|
+
# @return [Boolean]
|
143
|
+
def enabled?
|
144
|
+
attributes[:enabled]
|
145
|
+
end
|
146
|
+
|
147
|
+
# Returns a boolean indicating whether the bottom border is to be shown.
|
148
|
+
#
|
149
|
+
# @return [Boolean]
|
150
|
+
def bottom?
|
151
|
+
attributes[:show_bottom]
|
152
|
+
end
|
153
|
+
|
154
|
+
# Returns a boolean indicating whether the left border is to be shown.
|
155
|
+
#
|
156
|
+
# @return [Boolean]
|
157
|
+
def left?
|
158
|
+
attributes[:show_left]
|
159
|
+
end
|
160
|
+
|
161
|
+
# Returns a boolean indicating whether the right border is to be shown.
|
162
|
+
#
|
163
|
+
# @return [Boolean]
|
164
|
+
def right?
|
165
|
+
attributes[:show_right]
|
166
|
+
end
|
167
|
+
|
168
|
+
# Returns a boolean indicating whether the top border is to be shown.
|
169
|
+
#
|
170
|
+
# @return [Boolean]
|
171
|
+
def top?
|
172
|
+
attributes[:show_top]
|
173
|
+
end
|
174
|
+
|
175
|
+
# Returns a string representation of the border for the interface without
|
176
|
+
# content.
|
177
|
+
#
|
178
|
+
# @return [Boolean]
|
179
|
+
def to_s
|
180
|
+
render.map { |line| line.flatten.join }.join("\n")
|
181
|
+
end
|
182
|
+
|
183
|
+
private
|
184
|
+
|
185
|
+
attr_reader :colour, :interface, :style
|
186
|
+
|
187
|
+
# Renders the bottom border for the interface.
|
188
|
+
#
|
189
|
+
# @return [String]
|
190
|
+
def bottom
|
191
|
+
return [] unless bottom?
|
192
|
+
|
193
|
+
out = []
|
194
|
+
|
195
|
+
out << bottom_left
|
196
|
+
horizontal_border.each do |border|
|
197
|
+
out << border
|
198
|
+
end
|
199
|
+
out << bottom_right
|
200
|
+
|
201
|
+
out
|
202
|
+
end
|
203
|
+
|
204
|
+
# Renders the left border for the interface.
|
205
|
+
#
|
206
|
+
# @return [String]
|
207
|
+
def left
|
208
|
+
return '' unless left?
|
209
|
+
|
210
|
+
vertical_border
|
211
|
+
end
|
212
|
+
|
213
|
+
# Renders the right border for the interface.
|
214
|
+
#
|
215
|
+
# @return [String]
|
216
|
+
def right
|
217
|
+
return '' unless right?
|
218
|
+
|
219
|
+
vertical_border
|
220
|
+
end
|
221
|
+
|
222
|
+
# Renders the top border for the interface.
|
223
|
+
#
|
224
|
+
# @return [String]
|
225
|
+
def top
|
226
|
+
return [] unless top?
|
227
|
+
|
228
|
+
out = []
|
229
|
+
out << top_left
|
230
|
+
horizontal_border.each do |border|
|
231
|
+
out << border
|
232
|
+
end
|
233
|
+
out << top_right
|
234
|
+
|
235
|
+
out
|
236
|
+
end
|
237
|
+
|
238
|
+
# Renders the bottom left border character with escape codes for colour and
|
239
|
+
# style for the interface.
|
240
|
+
#
|
241
|
+
# @return [String]
|
242
|
+
def bottom_left
|
243
|
+
return '' unless left?
|
244
|
+
|
245
|
+
[*presentation, on, bl, off, *reset].join
|
246
|
+
end
|
247
|
+
|
248
|
+
# Renders the bottom right border character with escape codes for colour and
|
249
|
+
# style for the interface.
|
250
|
+
#
|
251
|
+
# @return [String]
|
252
|
+
def bottom_right
|
253
|
+
return '' unless right?
|
254
|
+
|
255
|
+
[*presentation, on, br, off, *reset].join
|
256
|
+
end
|
257
|
+
|
258
|
+
# Renders the top left border character with escape codes for colour and
|
259
|
+
# style for the interface.
|
260
|
+
#
|
261
|
+
# @return [String]
|
262
|
+
def top_left
|
263
|
+
return '' unless left?
|
264
|
+
|
265
|
+
[*presentation, on, tl, off, *reset].join
|
266
|
+
end
|
267
|
+
|
268
|
+
# Renders the top right border character with escape codes for colour and
|
269
|
+
# style for the interface.
|
270
|
+
#
|
271
|
+
# @return [String]
|
272
|
+
def top_right
|
273
|
+
return '' unless right?
|
274
|
+
|
275
|
+
[*presentation, on, tr, off, *reset].join
|
276
|
+
end
|
277
|
+
|
278
|
+
# Returns the horizontal border characters with colours and styles.
|
279
|
+
#
|
280
|
+
# @return [Array<String>]
|
281
|
+
def horizontal_border
|
282
|
+
[[*presentation, on, h, off, *reset].join] * width
|
283
|
+
end
|
284
|
+
|
285
|
+
# Returns the vertical border characters with colours and styles.
|
286
|
+
#
|
287
|
+
# @return [String]
|
288
|
+
def vertical_border
|
289
|
+
[*presentation, on, v, off, *reset].join
|
290
|
+
end
|
291
|
+
|
292
|
+
# Returns the horizontal border character.
|
293
|
+
#
|
294
|
+
# @return [String]
|
295
|
+
def h
|
296
|
+
attributes[:horizontal]
|
297
|
+
end
|
298
|
+
|
299
|
+
# Returns the vertical border character.
|
300
|
+
#
|
301
|
+
# @return [String]
|
302
|
+
def v
|
303
|
+
attributes[:vertical]
|
304
|
+
end
|
305
|
+
|
306
|
+
# Returns the top right border character.
|
307
|
+
#
|
308
|
+
# @return [String]
|
309
|
+
def tr
|
310
|
+
attributes[:top_right]
|
311
|
+
end
|
312
|
+
|
313
|
+
# Returns the top left border character.
|
314
|
+
#
|
315
|
+
# @return [String]
|
316
|
+
def tl
|
317
|
+
attributes[:top_left]
|
318
|
+
end
|
319
|
+
|
320
|
+
# Returns the bottom right border character.
|
321
|
+
#
|
322
|
+
# @return [String]
|
323
|
+
def br
|
324
|
+
attributes[:bottom_right]
|
325
|
+
end
|
326
|
+
|
327
|
+
# Returns the bottom left border character.
|
328
|
+
#
|
329
|
+
# @return [String]
|
330
|
+
def bl
|
331
|
+
attributes[:bottom_left]
|
332
|
+
end
|
333
|
+
|
334
|
+
# Returns the escape sequence to start a border.
|
335
|
+
#
|
336
|
+
# @return [String]
|
337
|
+
def on
|
338
|
+
"\e(0"
|
339
|
+
end
|
340
|
+
|
341
|
+
# Returns the escape sequence to end a border.
|
342
|
+
#
|
343
|
+
# @return [String]
|
344
|
+
def off
|
345
|
+
"\e(B"
|
346
|
+
end
|
347
|
+
|
348
|
+
# Returns the colour and styles for the border.
|
349
|
+
#
|
350
|
+
# @return [Array]
|
351
|
+
def presentation
|
352
|
+
[colour, style]
|
353
|
+
end
|
354
|
+
|
355
|
+
# Returns the colour and styles for the interface; effectively turning off
|
356
|
+
# the colours and styles for the border.
|
357
|
+
#
|
358
|
+
# @return [Array]
|
359
|
+
def reset
|
360
|
+
[interface.colour, interface.style]
|
361
|
+
end
|
362
|
+
|
363
|
+
# The default values for a new instance of this class.
|
364
|
+
#
|
365
|
+
# @return [Hash]
|
366
|
+
def defaults
|
367
|
+
{
|
368
|
+
enabled: false,
|
369
|
+
show_bottom: true,
|
370
|
+
show_left: true,
|
371
|
+
show_right: true,
|
372
|
+
show_top: true,
|
373
|
+
bottom_right: "\x6A", # ┘
|
374
|
+
top_right: "\x6B", # ┐
|
375
|
+
top_left: "\x6C", # ┌
|
376
|
+
bottom_left: "\x6D", # └
|
377
|
+
horizontal: "\x71", # ─
|
378
|
+
colour: {},
|
379
|
+
style: [],
|
380
|
+
vertical: "\x78", # │
|
381
|
+
interface: nil,
|
382
|
+
}
|
383
|
+
end
|
384
|
+
|
385
|
+
end # Border
|
386
|
+
|
387
|
+
end # Vedeu
|
@@ -1,65 +1,76 @@
|
|
1
|
+
require 'vedeu/support/common'
|
2
|
+
|
1
3
|
module Vedeu
|
2
4
|
|
5
|
+
# Before the content of the buffer can be output to the terminal, if there are
|
6
|
+
# any changes to the geometry of the interface (stored in the buffer), then
|
7
|
+
# these need to be stored; replacing those already stored. This is our last
|
8
|
+
# chance to do this as the terminal may have resized, or the client
|
9
|
+
# application may have specified this this view should move to a new location.
|
10
|
+
|
3
11
|
# Combines stored interface layout/geometry with an interface view/buffer
|
4
12
|
# to create a single view to be sent to the terminal for output.
|
5
13
|
#
|
6
14
|
# @api private
|
7
15
|
class Compositor
|
8
16
|
|
9
|
-
include Common
|
17
|
+
include Vedeu::Common
|
10
18
|
|
11
19
|
# Convenience method to initialize a new Compositor and call its {#compose}
|
12
20
|
# method.
|
13
21
|
#
|
14
22
|
# @return [Compositor]
|
15
23
|
# @see #initialize
|
16
|
-
def self.compose(
|
17
|
-
new(
|
24
|
+
def self.compose(name)
|
25
|
+
new(name).compose
|
18
26
|
end
|
19
27
|
|
20
28
|
# Initialize a new Compositor.
|
21
29
|
#
|
22
|
-
# @param
|
23
|
-
# @param buffer [Hash] The atttributes of the buffer to refresh the
|
24
|
-
# interface with.
|
30
|
+
# @param name [String] The name of the buffer.
|
25
31
|
# @return [Compositor]
|
26
|
-
def initialize(
|
27
|
-
@
|
28
|
-
@buffer = buffer
|
32
|
+
def initialize(name)
|
33
|
+
@name = name
|
29
34
|
end
|
30
35
|
|
31
|
-
#
|
32
|
-
#
|
36
|
+
# @todo What do we do about resizing terminals. I don't want to overwrite
|
37
|
+
# the stored geometry and when the terminal returns to original size not also
|
38
|
+
# return the interface back to its originally prescribed dimensions.
|
39
|
+
#
|
40
|
+
# @note
|
41
|
+
# If the buffer has geometry stored, we should check whether this is different
|
42
|
+
# to the geometries repository- the client application is wanting to resize
|
43
|
+
# or move the interface.
|
44
|
+
#
|
45
|
+
# If it is different, overwrite the old geometry with the new.
|
33
46
|
#
|
34
|
-
#
|
47
|
+
# If the buffer does not have geometry stored, retrieve the geometry for this
|
48
|
+
# interface from the geometries repository so we can draw this buffer in the
|
49
|
+
# correct place.
|
50
|
+
#
|
51
|
+
# @return [Array<Interface>]
|
35
52
|
def compose
|
36
|
-
buffer.
|
37
|
-
|
38
|
-
|
39
|
-
interface
|
40
|
-
|
41
|
-
change_style(content)
|
53
|
+
buffer.map do |view|
|
54
|
+
view.border = interface.border unless view.border
|
55
|
+
view.colour = interface.colour unless view.colour
|
56
|
+
view.style = interface.style unless view.style
|
57
|
+
view.geometry = interface.geometry unless view.geometry
|
42
58
|
|
43
|
-
Output.render(
|
59
|
+
Output.render(view)
|
44
60
|
end
|
45
61
|
end
|
46
62
|
|
47
63
|
private
|
48
64
|
|
49
|
-
attr_reader :
|
50
|
-
|
51
|
-
def change_colour(content)
|
52
|
-
interface[:colour] = content[:colour] if defined_value?(content[:colour])
|
53
|
-
end
|
65
|
+
attr_reader :name
|
54
66
|
|
55
|
-
def
|
56
|
-
content
|
57
|
-
interface[:geometry][k] = v if defined_value?(k)
|
58
|
-
end if defined_value?(content[:geometry])
|
67
|
+
def buffer
|
68
|
+
Vedeu.buffers.find(name).content
|
59
69
|
end
|
60
70
|
|
61
|
-
|
62
|
-
|
71
|
+
# @return [Interface]
|
72
|
+
def interface
|
73
|
+
@interface ||= Vedeu.interfaces.find(name)
|
63
74
|
end
|
64
75
|
|
65
76
|
end # Compositor
|
data/lib/vedeu/output/output.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
+
# Sends the interface to the terminal or output device.
|
4
|
+
#
|
3
5
|
class Output
|
4
6
|
|
5
7
|
# Writes content (the provided interface object with associated lines,
|
@@ -23,7 +25,7 @@ module Vedeu
|
|
23
25
|
#
|
24
26
|
# @return [Array]
|
25
27
|
def render
|
26
|
-
Terminal.output(view,
|
28
|
+
Terminal.output(view, interface.cursor.to_s)
|
27
29
|
end
|
28
30
|
|
29
31
|
private
|
@@ -38,21 +40,11 @@ module Vedeu
|
|
38
40
|
def clear
|
39
41
|
Vedeu.log("Clearing view: '#{interface.name}'")
|
40
42
|
|
41
|
-
|
43
|
+
interface.height.times.inject([interface.colour]) do |line, index|
|
42
44
|
line << interface.origin(index) { ' ' * interface.width }
|
43
45
|
end.join
|
44
46
|
end
|
45
47
|
|
46
|
-
# @return [String]
|
47
|
-
def colours
|
48
|
-
interface.colour.to_s
|
49
|
-
end
|
50
|
-
|
51
|
-
# @return [Enumerator]
|
52
|
-
def rows
|
53
|
-
interface.height.times
|
54
|
-
end
|
55
|
-
|
56
48
|
# Produces a single string which contains all content and escape sequences
|
57
49
|
# required to render this interface in the terminal window.
|
58
50
|
#
|
@@ -62,10 +54,11 @@ module Vedeu
|
|
62
54
|
|
63
55
|
Vedeu.log("Rendering view: '#{interface.name}'")
|
64
56
|
|
65
|
-
interface.
|
57
|
+
interface.render.each_with_index do |line, index|
|
66
58
|
out << interface.origin(index)
|
67
59
|
out << line.join
|
68
60
|
end
|
61
|
+
|
69
62
|
out.join
|
70
63
|
end
|
71
64
|
|