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
@@ -1,209 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# Each interface has its own Cursor which maintains the position and
|
4
|
-
# visibility of the cursor within that interface.
|
5
|
-
#
|
6
|
-
# @api private
|
7
|
-
class Cursor
|
8
|
-
|
9
|
-
include Model
|
10
|
-
extend Forwardable
|
11
|
-
|
12
|
-
def_delegators :interface, :top, :right, :bottom, :left
|
13
|
-
|
14
|
-
attr_reader :name, :state
|
15
|
-
|
16
|
-
# Provides a new instance of Cursor.
|
17
|
-
#
|
18
|
-
# @param attributes [Hash] The stored attributes for a cursor.
|
19
|
-
# @option attributes :name [String] The name of the interface this cursor
|
20
|
-
# belongs to.
|
21
|
-
# @option attributes :state [Symbol] The visibility of the cursor, either
|
22
|
-
# +:hide+ or +:show+.
|
23
|
-
# @option attributes :x [Fixnum] The terminal x coordinate for the cursor.
|
24
|
-
# @option attributes :y [Fixnum] The terminal y coordinate for the cursor.
|
25
|
-
#
|
26
|
-
# @return [Cursor]
|
27
|
-
def initialize(attributes = {})
|
28
|
-
@attributes = defaults.merge(attributes)
|
29
|
-
|
30
|
-
@name = @attributes[:name]
|
31
|
-
@state = @attributes[:state]
|
32
|
-
@x = @attributes[:x]
|
33
|
-
@y = @attributes[:y]
|
34
|
-
end
|
35
|
-
|
36
|
-
# Returns an attribute hash for the current position and visibility of the
|
37
|
-
# cursor.
|
38
|
-
#
|
39
|
-
# @return [Hash]
|
40
|
-
def attributes
|
41
|
-
{
|
42
|
-
name: name,
|
43
|
-
state: state,
|
44
|
-
x: x,
|
45
|
-
y: y,
|
46
|
-
}
|
47
|
-
end
|
48
|
-
alias_method :refresh, :attributes
|
49
|
-
|
50
|
-
# Returns the x coordinate (column/character) of the cursor. Attempts to
|
51
|
-
# sensibly reposition the cursor if it is currently outside the interface,
|
52
|
-
# or outside the visible area of the terminal. If the interface has either a
|
53
|
-
# left or right border, then the cursor will be repositioned to be inside
|
54
|
-
# the border not on it.
|
55
|
-
#
|
56
|
-
# @return [Fixnum]
|
57
|
-
def x
|
58
|
-
@x = 1 if @x <= 1
|
59
|
-
@x = Terminal.width if @x >= Terminal.width
|
60
|
-
|
61
|
-
if border? && border.left? && @x <= (left + 1)
|
62
|
-
@x = (left + 1)
|
63
|
-
|
64
|
-
elsif @x <= left
|
65
|
-
@x = left
|
66
|
-
|
67
|
-
elsif border? && border.right? && @x >= (right - 1)
|
68
|
-
@x = (right - 2)
|
69
|
-
|
70
|
-
elsif @x >= right
|
71
|
-
@x = right
|
72
|
-
|
73
|
-
else
|
74
|
-
@x
|
75
|
-
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
# Returns the y coordinate (row/line) of the cursor. Attempts to sensibly
|
80
|
-
# reposition the cursor if it is currently outside the interface, or outside
|
81
|
-
# the visible area of the terminal. If the interface has either a top or
|
82
|
-
# bottom border, then the cursor will be repositioned to be inside the
|
83
|
-
# border not on it.
|
84
|
-
#
|
85
|
-
# @return [Fixnum]
|
86
|
-
def y
|
87
|
-
@y = 1 if @y <= 1
|
88
|
-
@y = Terminal.height if @y >= Terminal.height
|
89
|
-
|
90
|
-
if border? && border.top? && @y <= (top + 1)
|
91
|
-
@y = (top + 1)
|
92
|
-
|
93
|
-
elsif @y <= top
|
94
|
-
@y = top
|
95
|
-
|
96
|
-
elsif border? && border.bottom? && @y >= (bottom - 1)
|
97
|
-
@y = (bottom - 2)
|
98
|
-
|
99
|
-
elsif @y >= bottom
|
100
|
-
@y = bottom
|
101
|
-
|
102
|
-
else
|
103
|
-
@y
|
104
|
-
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
# Make the cursor visible.
|
109
|
-
#
|
110
|
-
# @return [Hash]
|
111
|
-
def show
|
112
|
-
@state = :show
|
113
|
-
|
114
|
-
store
|
115
|
-
end
|
116
|
-
|
117
|
-
# Make the cursor invisible.
|
118
|
-
#
|
119
|
-
# @return [Hash]
|
120
|
-
def hide
|
121
|
-
@state = :hide
|
122
|
-
|
123
|
-
store
|
124
|
-
end
|
125
|
-
|
126
|
-
# Returns an escape sequence to position the cursor and set its visibility.
|
127
|
-
# When passed a block, will position the cursor, yield and return the
|
128
|
-
# original position.
|
129
|
-
#
|
130
|
-
# @param block [Proc]
|
131
|
-
# @return [String]
|
132
|
-
def to_s(&block)
|
133
|
-
if block_given?
|
134
|
-
[ sequence, yield, sequence ].join
|
135
|
-
|
136
|
-
else
|
137
|
-
sequence
|
138
|
-
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
private
|
143
|
-
|
144
|
-
# @return [Class] The repository class for this model.
|
145
|
-
def repository
|
146
|
-
Vedeu::Cursors
|
147
|
-
end
|
148
|
-
|
149
|
-
# Returns the escape sequence to position the cursor and set its visibility.
|
150
|
-
#
|
151
|
-
# @return [String]
|
152
|
-
def sequence
|
153
|
-
[ position, visibility ].join
|
154
|
-
end
|
155
|
-
|
156
|
-
# Returns the escape sequence for setting the position of the cursor.
|
157
|
-
#
|
158
|
-
# @return [String]
|
159
|
-
def position
|
160
|
-
@_position ||= Position.new(y, x).to_s
|
161
|
-
end
|
162
|
-
|
163
|
-
# Returns the escape sequence for setting the visibility of the cursor.
|
164
|
-
#
|
165
|
-
# @return [String]
|
166
|
-
def visibility
|
167
|
-
return Esc.string('show_cursor') if state == :show
|
168
|
-
|
169
|
-
Esc.string('hide_cursor')
|
170
|
-
end
|
171
|
-
|
172
|
-
# Returns a boolean indicating whether the interface has a border.
|
173
|
-
#
|
174
|
-
# @return [Boolean]
|
175
|
-
def border?
|
176
|
-
border.enabled?
|
177
|
-
end
|
178
|
-
|
179
|
-
def border
|
180
|
-
interface.border
|
181
|
-
end
|
182
|
-
|
183
|
-
# Returns an instance of the associated interface for this cursor, used to
|
184
|
-
# ensure that {x} and {y} are still 'inside' the interface. A cursor could
|
185
|
-
# be 'outside' the interface if the terminal has resized, causing the
|
186
|
-
# geometry of an interface to change and therefore invalidating the cursor's
|
187
|
-
# position.
|
188
|
-
#
|
189
|
-
# @api private
|
190
|
-
# @return [Interface]
|
191
|
-
def interface
|
192
|
-
@interface ||= Interfaces.build(name)
|
193
|
-
end
|
194
|
-
|
195
|
-
# The default values for a new instance of Cursor.
|
196
|
-
#
|
197
|
-
# @return [Hash]
|
198
|
-
def defaults
|
199
|
-
{
|
200
|
-
name: '',
|
201
|
-
state: :hide,
|
202
|
-
x: 1,
|
203
|
-
y: 1,
|
204
|
-
}
|
205
|
-
end
|
206
|
-
|
207
|
-
end # Cursor
|
208
|
-
|
209
|
-
end # Vedeu
|
@@ -1,163 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# An Interface represents a portion of the terminal defined by
|
4
|
-
# {Vedeu::Geometry}. It is a container for {Vedeu::Line} and {Vedeu::Stream}
|
5
|
-
# objects.
|
6
|
-
#
|
7
|
-
# @api private
|
8
|
-
class Interface
|
9
|
-
|
10
|
-
include Coercions
|
11
|
-
include Common
|
12
|
-
include Model
|
13
|
-
include Presentation
|
14
|
-
|
15
|
-
extend Forwardable
|
16
|
-
|
17
|
-
def_delegators :geometry, :north, :east, :south, :west, :top, :right,
|
18
|
-
:bottom, :left, :width, :height, :origin
|
19
|
-
|
20
|
-
attr_reader :attributes, :delay, :group, :name, :parent
|
21
|
-
|
22
|
-
# Builds up a new Interface object and returns the attributes.
|
23
|
-
#
|
24
|
-
# @param attributes [Hash]
|
25
|
-
# @param block [Proc]
|
26
|
-
# @return [Hash]
|
27
|
-
def self.build(attributes = {}, &block)
|
28
|
-
new(attributes, &block).attributes
|
29
|
-
end
|
30
|
-
|
31
|
-
# @see Vedeu::API#interface
|
32
|
-
# @param attributes [Hash]
|
33
|
-
# @param block [Proc]
|
34
|
-
# @return []
|
35
|
-
def self.define(attributes = {}, &block)
|
36
|
-
new(attributes).define(&block)
|
37
|
-
end
|
38
|
-
|
39
|
-
# Return a new instance of Interface.
|
40
|
-
#
|
41
|
-
# @param attributes [Hash]
|
42
|
-
# @param block [Proc]
|
43
|
-
# @return [Interface]
|
44
|
-
def initialize(attributes = {}, &block)
|
45
|
-
@attributes = defaults.merge(attributes)
|
46
|
-
|
47
|
-
@cursor = @attributes[:cursor]
|
48
|
-
@delay = @attributes[:delay]
|
49
|
-
@group = @attributes[:group]
|
50
|
-
@name = @attributes[:name]
|
51
|
-
@parent = @attributes[:parent]
|
52
|
-
|
53
|
-
if block_given?
|
54
|
-
@self_before_instance_eval = eval('self', block.binding)
|
55
|
-
|
56
|
-
instance_eval(&block)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
# @see Vedeu::API#interface
|
61
|
-
# @param block [Proc]
|
62
|
-
# @return [Interface]
|
63
|
-
def define(&block)
|
64
|
-
instance_eval(&block) if block_given?
|
65
|
-
|
66
|
-
Registrar.record(attributes)
|
67
|
-
|
68
|
-
self
|
69
|
-
end
|
70
|
-
|
71
|
-
# Returns an instance of Border.
|
72
|
-
#
|
73
|
-
# @return [Border]
|
74
|
-
def border
|
75
|
-
@_border ||= Border.new(self, attributes[:border])
|
76
|
-
end
|
77
|
-
|
78
|
-
# Returns an instance of Cursor.
|
79
|
-
#
|
80
|
-
# @return [Cursor]
|
81
|
-
def cursor
|
82
|
-
@_cursor ||= Cursor.new({
|
83
|
-
name: name,
|
84
|
-
state: attributes[:cursor],
|
85
|
-
x: geometry.x_position(offset.x),
|
86
|
-
y: geometry.y_position(offset.y),
|
87
|
-
})
|
88
|
-
end
|
89
|
-
|
90
|
-
# Returns a boolean indicating whether this interface is currently in focus.
|
91
|
-
#
|
92
|
-
# @return [Boolean]
|
93
|
-
def in_focus?
|
94
|
-
Focus.current?(name)
|
95
|
-
end
|
96
|
-
|
97
|
-
# Returns a collection of lines associated with this interface.
|
98
|
-
#
|
99
|
-
# @return [Array]
|
100
|
-
def lines
|
101
|
-
@lines ||= Line.coercer(attributes[:lines])
|
102
|
-
end
|
103
|
-
alias_method :content, :lines
|
104
|
-
|
105
|
-
# Returns the position and size of the interface.
|
106
|
-
#
|
107
|
-
# @return [Geometry]
|
108
|
-
def geometry
|
109
|
-
@geometry ||= Geometry.new(attributes[:geometry])
|
110
|
-
end
|
111
|
-
|
112
|
-
# Returns the current offset for the content within the interface.
|
113
|
-
#
|
114
|
-
# @return [Offset]
|
115
|
-
def offset
|
116
|
-
@offset ||= Offsets.find_or_create(name)
|
117
|
-
end
|
118
|
-
|
119
|
-
# Returns the currently visible area of the interface.
|
120
|
-
#
|
121
|
-
# @return [Viewport]
|
122
|
-
def viewport
|
123
|
-
@_viewport ||= Viewport.show(self)
|
124
|
-
end
|
125
|
-
|
126
|
-
private
|
127
|
-
|
128
|
-
# @return [Class] The repository class for this model.
|
129
|
-
def repository
|
130
|
-
Vedeu::Interfaces
|
131
|
-
end
|
132
|
-
|
133
|
-
# The default values for a new instance of Interface.
|
134
|
-
#
|
135
|
-
# @return [Hash]
|
136
|
-
def defaults
|
137
|
-
{
|
138
|
-
border: {},
|
139
|
-
colour: {},
|
140
|
-
cursor: :hide,
|
141
|
-
delay: 0.0,
|
142
|
-
geometry: {},
|
143
|
-
group: '',
|
144
|
-
lines: [],
|
145
|
-
name: '',
|
146
|
-
parent: nil,
|
147
|
-
style: '',
|
148
|
-
}
|
149
|
-
end
|
150
|
-
|
151
|
-
# @param method [Symbol] The name of the method sought.
|
152
|
-
# @param args [Array] The arguments which the method was to be invoked with.
|
153
|
-
# @param block [Proc] The optional block provided to the method.
|
154
|
-
# @return []
|
155
|
-
def method_missing(method, *args, &block)
|
156
|
-
Vedeu.log("Interface#method_missing '#{method}' (args: #{args.inspect})")
|
157
|
-
|
158
|
-
@self_before_instance_eval.send(method, *args, &block) if @self_before_instance_eval
|
159
|
-
end
|
160
|
-
|
161
|
-
end # Interface
|
162
|
-
|
163
|
-
end # Vedeu
|
@@ -1,111 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# A Keymap is the binding of a keypress to one or more interfaces; or globally
|
4
|
-
# to perform a client application defined action.
|
5
|
-
#
|
6
|
-
# @api private
|
7
|
-
class Keymap
|
8
|
-
|
9
|
-
include Common
|
10
|
-
include Model
|
11
|
-
|
12
|
-
attr_reader :attributes
|
13
|
-
|
14
|
-
# Define actions for keypresses for when specific interfaces are in focus.
|
15
|
-
# Unless an interface is specified, the key will be assumed to be global,
|
16
|
-
# meaning its action will happen regardless of the interface in focus.
|
17
|
-
#
|
18
|
-
# @param name_or_names [String] The name or names of the interface(s) which
|
19
|
-
# will handle these keys.
|
20
|
-
# @param block [Proc]
|
21
|
-
#
|
22
|
-
# @example
|
23
|
-
# keys do # => will be global
|
24
|
-
# key('s') { :something }
|
25
|
-
# ...
|
26
|
-
#
|
27
|
-
# keys 'my_interface' do # => will only function when 'my_interface'
|
28
|
-
# ... # is in focus
|
29
|
-
#
|
30
|
-
# keys('main', 'other') do # => will function for both 'main' and
|
31
|
-
# ... # 'other' interfaces
|
32
|
-
#
|
33
|
-
# keys do
|
34
|
-
# interface 'my_interface' # => will only function when 'my_interface'
|
35
|
-
# ... # is in focus
|
36
|
-
#
|
37
|
-
# @raise [InvalidSyntax] When the required block is not given.
|
38
|
-
# @return [Keymap]
|
39
|
-
def self.keys(*name_or_names, &block)
|
40
|
-
fail InvalidSyntax, '`keys` requires a block.' unless block_given?
|
41
|
-
|
42
|
-
define({ interfaces: name_or_names }, &block)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Define a keymap for an interface or interfaces to perform an action when
|
46
|
-
# a key is pressed whilst an aforementioned interface is in focus.
|
47
|
-
#
|
48
|
-
# @param attributes [Hash] The attributes to register the keymap with.
|
49
|
-
# @option attributes :interfaces [] the interface(s) which will respond to
|
50
|
-
# the keypress(es)
|
51
|
-
# @option attributes :keys [] the keypress/action pairs for this keymap
|
52
|
-
# @param block [Proc]
|
53
|
-
# @return [Keymap]
|
54
|
-
def self.define(attributes = {}, &block)
|
55
|
-
new(attributes).define(&block)
|
56
|
-
end
|
57
|
-
|
58
|
-
# Instantiate a new instance of the Keymap model.
|
59
|
-
#
|
60
|
-
# @param attributes [Hash]
|
61
|
-
# @return [Keymap]
|
62
|
-
def initialize(attributes = {})
|
63
|
-
@attributes = defaults.merge(attributes)
|
64
|
-
end
|
65
|
-
|
66
|
-
# Adds the attributes to the Keymaps repository.
|
67
|
-
#
|
68
|
-
# @param block [Proc]
|
69
|
-
# @return [Keymap]
|
70
|
-
def define(&block)
|
71
|
-
if block_given?
|
72
|
-
@self_before_instance_eval = eval('self', block.binding)
|
73
|
-
|
74
|
-
instance_eval(&block)
|
75
|
-
end
|
76
|
-
|
77
|
-
repository.add(attributes)
|
78
|
-
|
79
|
-
self
|
80
|
-
end
|
81
|
-
|
82
|
-
private
|
83
|
-
|
84
|
-
# @return [Class] The repository class for this model.
|
85
|
-
def repository
|
86
|
-
Vedeu::Keymaps
|
87
|
-
end
|
88
|
-
|
89
|
-
# The default attributes of the Keymap model.
|
90
|
-
#
|
91
|
-
# @return [Hash]
|
92
|
-
def defaults
|
93
|
-
{
|
94
|
-
interfaces: [],
|
95
|
-
keys: [],
|
96
|
-
}
|
97
|
-
end
|
98
|
-
|
99
|
-
# @param method [Symbol] The name of the method sought.
|
100
|
-
# @param args [Array] The arguments which the method was to be invoked with.
|
101
|
-
# @param block [Proc] The optional block provided to the method.
|
102
|
-
# @return []
|
103
|
-
def method_missing(method, *args, &block)
|
104
|
-
Vedeu.log("Keymap#method_missing '#{method}' (args: #{args.inspect})")
|
105
|
-
|
106
|
-
@self_before_instance_eval.send(method, *args, &block) if @self_before_instance_eval
|
107
|
-
end
|
108
|
-
|
109
|
-
end # Keymap
|
110
|
-
|
111
|
-
end # Vedeu
|
@@ -1,91 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# Offset represents the scroll position of the content for an interface. The
|
4
|
-
# values herein are relative to the geometry of the interface.
|
5
|
-
#
|
6
|
-
# @note (to self) An offset is a position. A cursor resides at a position in
|
7
|
-
# an interface, ergo we can calculate cursors based from offsets. Also, we
|
8
|
-
# could rename Offset to Position, then kill Cursor, Cursors, and the old
|
9
|
-
# Position class.
|
10
|
-
#
|
11
|
-
# @api private
|
12
|
-
class Offset
|
13
|
-
|
14
|
-
include Model
|
15
|
-
|
16
|
-
attr_reader :name
|
17
|
-
|
18
|
-
# Returns a new instance of Offset.
|
19
|
-
#
|
20
|
-
# @param attributes [Hash]
|
21
|
-
# @return [Offset]
|
22
|
-
def initialize(attributes = {})
|
23
|
-
@attributes = defaults.merge(attributes)
|
24
|
-
@name = @attributes[:name]
|
25
|
-
@y = @attributes[:y]
|
26
|
-
@x = @attributes[:x]
|
27
|
-
end
|
28
|
-
|
29
|
-
# Return a convenient hash of the current values of this instance.
|
30
|
-
#
|
31
|
-
# @return [Hash]
|
32
|
-
def attributes
|
33
|
-
{
|
34
|
-
name: name,
|
35
|
-
y: y,
|
36
|
-
x: x,
|
37
|
-
}
|
38
|
-
end
|
39
|
-
|
40
|
-
# Adjusts the offset using the relative values provided, and updates the
|
41
|
-
# stored attributes. The values passed are -1, 0 or 1.
|
42
|
-
#
|
43
|
-
# @param relative_y [Fixnum] Move up (-1), or down (1), or no action (0).
|
44
|
-
# @param relative_x [Fixnum] Move left (-1), or right (1), or no action (0).
|
45
|
-
# @return [Offset]
|
46
|
-
def move(relative_y, relative_x)
|
47
|
-
@y += relative_y
|
48
|
-
@x += relative_x
|
49
|
-
|
50
|
-
store
|
51
|
-
end
|
52
|
-
|
53
|
-
# Returns the current x offset, correcting to 0 if less than 0.
|
54
|
-
#
|
55
|
-
# @return [Fixnum]
|
56
|
-
def x
|
57
|
-
return @x = 0 if @x <= 0
|
58
|
-
|
59
|
-
@x
|
60
|
-
end
|
61
|
-
|
62
|
-
# Returns the current y offset, correcting to 0 if less than 0.
|
63
|
-
#
|
64
|
-
# @return [Fixnum]
|
65
|
-
def y
|
66
|
-
return @y = 0 if @y <= 0
|
67
|
-
|
68
|
-
@y
|
69
|
-
end
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
# @return [Class] The repository class for this model.
|
74
|
-
def repository
|
75
|
-
Vedeu::Offsets
|
76
|
-
end
|
77
|
-
|
78
|
-
# Return the default values for an instance of Offset.
|
79
|
-
#
|
80
|
-
# @return [Hash]
|
81
|
-
def defaults
|
82
|
-
{
|
83
|
-
name: '',
|
84
|
-
y: 0,
|
85
|
-
x: 0,
|
86
|
-
}
|
87
|
-
end
|
88
|
-
|
89
|
-
end # Offset
|
90
|
-
|
91
|
-
end # Vedeu
|
@@ -1,69 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# Repository for storing and retrieving content offsets; i.e. scroll
|
4
|
-
# position for a named interface.
|
5
|
-
#
|
6
|
-
# @api private
|
7
|
-
module Offsets
|
8
|
-
|
9
|
-
include Repository
|
10
|
-
extend self
|
11
|
-
|
12
|
-
# Add or update the offset coordinates.
|
13
|
-
#
|
14
|
-
# @param attributes [Hash]
|
15
|
-
# @return [Offset]
|
16
|
-
def add(attributes)
|
17
|
-
validate_attributes!(attributes)
|
18
|
-
|
19
|
-
Vedeu.log("#{action(__callee__)} positional (#{model}): " \
|
20
|
-
"'#{attributes[:name]}'")
|
21
|
-
|
22
|
-
model.new(attributes).store
|
23
|
-
end
|
24
|
-
alias_method :update, :add
|
25
|
-
|
26
|
-
# @return [Array]
|
27
|
-
def down
|
28
|
-
move(1, 0)
|
29
|
-
end
|
30
|
-
|
31
|
-
# @return [Array]
|
32
|
-
def up
|
33
|
-
move(-1, 0)
|
34
|
-
end
|
35
|
-
|
36
|
-
# @return [Array]
|
37
|
-
def right
|
38
|
-
move(0, 1)
|
39
|
-
end
|
40
|
-
|
41
|
-
# @return [Array]
|
42
|
-
def left
|
43
|
-
move(0, -1)
|
44
|
-
end
|
45
|
-
|
46
|
-
private
|
47
|
-
|
48
|
-
# @param y [Fixnum]
|
49
|
-
# @param x [Fixnum]
|
50
|
-
# @return [Array]
|
51
|
-
def move(y, x)
|
52
|
-
find_or_create(Focus.current).move(y, x)
|
53
|
-
|
54
|
-
Focus.refresh
|
55
|
-
end
|
56
|
-
|
57
|
-
# @return [Class] The model class for this repository.
|
58
|
-
def model
|
59
|
-
Vedeu::Offset
|
60
|
-
end
|
61
|
-
|
62
|
-
# @return [Hash]
|
63
|
-
def in_memory
|
64
|
-
{}
|
65
|
-
end
|
66
|
-
|
67
|
-
end # Offsets
|
68
|
-
|
69
|
-
end # Vedeu
|
@@ -1,34 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
# Raised with Vedeu attempts to access a named model that does not exist.
|
4
|
-
ModelNotFound = Class.new(StandardError)
|
5
|
-
|
6
|
-
# Raised when Vedeu attempts to parse a {Vedeu.view} or {Vedeu.interface} and
|
7
|
-
# encounters a problem.
|
8
|
-
InvalidSyntax = Class.new(StandardError)
|
9
|
-
|
10
|
-
# Raised when attempting to assign a key which is already in use.
|
11
|
-
KeyInUse = Class.new(StandardError)
|
12
|
-
|
13
|
-
# Raised when the attributes argument to {Vedeu::Registrar} does not contain
|
14
|
-
# a required key or the value to that key is nil or empty.
|
15
|
-
MissingRequired = Class.new(StandardError)
|
16
|
-
|
17
|
-
# Raised intentionally when the client application wishes to switch between
|
18
|
-
# cooked and raw (or vice versa) terminal modes. Vedeu is hard-wired to use
|
19
|
-
# the `Escape` key to trigger this change for the time being.
|
20
|
-
ModeSwitch = Class.new(StandardError)
|
21
|
-
|
22
|
-
# Raised when attempting to reach the currently in focus interface, when no
|
23
|
-
# interfaces have been defined yet.
|
24
|
-
NoInterfacesDefined = Class.new(StandardError)
|
25
|
-
|
26
|
-
# Raised to remind me (or client application developers) that the subclass
|
27
|
-
# implements the functionality sought.
|
28
|
-
NotImplemented = Class.new(StandardError)
|
29
|
-
|
30
|
-
# Raised when trying to access an interface column less than 1 or greater
|
31
|
-
# than 12. Vedeu is hard-wired to a 12-column layout for the time being.
|
32
|
-
OutOfRange = Class.new(StandardError)
|
33
|
-
|
34
|
-
end # Vedeu
|