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,121 @@
|
|
1
|
+
require 'vedeu/events/event'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module API
|
6
|
+
|
7
|
+
def_delegators Vedeu::Event, :bind, :trigger, :unbind
|
8
|
+
|
9
|
+
end
|
10
|
+
|
11
|
+
# Creates system events which when called provide a variety of core functions
|
12
|
+
# and behaviours.
|
13
|
+
#
|
14
|
+
# @note
|
15
|
+
# Unbinding any of these events is likely to cause problems, so I would
|
16
|
+
# advise leaving them alone. A safe rule: if the name starts with an
|
17
|
+
# underscore, it's probably used by Vedeu internally.
|
18
|
+
#
|
19
|
+
# :nocov:
|
20
|
+
module Bindings
|
21
|
+
|
22
|
+
# System events needed by Vedeu to run.
|
23
|
+
Vedeu.bind(:_clear_) { Vedeu::Terminal.clear }
|
24
|
+
Vedeu.bind(:_exit_) { Vedeu::Application.stop }
|
25
|
+
Vedeu.bind(:_initialize_) { Vedeu.trigger(:_refresh_) }
|
26
|
+
Vedeu.bind(:_keypress_) { |key| Vedeu.keypress(key) }
|
27
|
+
Vedeu.bind(:_log_) { |msg| Vedeu.log(msg) }
|
28
|
+
Vedeu.bind(:_mode_switch_) { fail ModeSwitch }
|
29
|
+
Vedeu.bind(:_resize_, { delay: 0.25 }) { Vedeu.resize }
|
30
|
+
|
31
|
+
# System events which when called will update the cursor visibility
|
32
|
+
# accordingly for the interface in focus, or the named interface. Also
|
33
|
+
# includes events to move the cursor in the direction specified; these will
|
34
|
+
# update the cursor position according to the interface in focus.
|
35
|
+
Vedeu.bind(:_cursor_hide_) do
|
36
|
+
ToggleCursor.hide(Vedeu.cursor)
|
37
|
+
end
|
38
|
+
|
39
|
+
Vedeu.bind(:_cursor_show_) do
|
40
|
+
ToggleCursor.show(Vedeu.cursor)
|
41
|
+
end
|
42
|
+
|
43
|
+
Vedeu.bind(:_cursor_hide_by_name_) do |name|
|
44
|
+
named = Vedeu.cursors.by_name(name)
|
45
|
+
|
46
|
+
ToggleCursor.hide(named)
|
47
|
+
end
|
48
|
+
|
49
|
+
Vedeu.bind(:_cursor_show_by_name_) do |name|
|
50
|
+
named = Vedeu.cursors.by_name(name)
|
51
|
+
|
52
|
+
ToggleCursor.show(named)
|
53
|
+
end
|
54
|
+
|
55
|
+
Vedeu.bind(:_cursor_down_) do
|
56
|
+
interface = Vedeu.interfaces.current
|
57
|
+
|
58
|
+
MoveCursor.down(Vedeu.cursor, interface)
|
59
|
+
|
60
|
+
Refresh.by_focus
|
61
|
+
end
|
62
|
+
|
63
|
+
Vedeu.bind(:_cursor_left_) do
|
64
|
+
interface = Vedeu.interfaces.current
|
65
|
+
|
66
|
+
MoveCursor.left(Vedeu.cursor, interface)
|
67
|
+
|
68
|
+
Refresh.by_focus
|
69
|
+
end
|
70
|
+
|
71
|
+
Vedeu.bind(:_cursor_right_) do
|
72
|
+
interface = Vedeu.interfaces.current
|
73
|
+
|
74
|
+
MoveCursor.right(Vedeu.cursor, interface)
|
75
|
+
|
76
|
+
Refresh.by_focus
|
77
|
+
end
|
78
|
+
|
79
|
+
Vedeu.bind(:_cursor_up_) do
|
80
|
+
interface = Vedeu.interfaces.current
|
81
|
+
|
82
|
+
MoveCursor.up(Vedeu.cursor, interface)
|
83
|
+
|
84
|
+
Refresh.by_focus
|
85
|
+
end
|
86
|
+
|
87
|
+
Vedeu.bind(:_cursor_origin_) do
|
88
|
+
interface = Vedeu.interfaces.current
|
89
|
+
|
90
|
+
MoveCursor.origin(Vedeu.cursor, interface)
|
91
|
+
|
92
|
+
Refresh.by_focus
|
93
|
+
end
|
94
|
+
|
95
|
+
# System events which when called will change which interface is currently
|
96
|
+
# focussed. When the interface is brought into focus, its cursor position
|
97
|
+
# and visibility is restored.
|
98
|
+
Vedeu.bind(:_focus_by_name_) { |name| Vedeu.focus_by_name(name) }
|
99
|
+
Vedeu.bind(:_focus_next_) { Vedeu.focus_next }
|
100
|
+
Vedeu.bind(:_focus_prev_) { Vedeu.focus_previous }
|
101
|
+
|
102
|
+
# System events which when called with the appropriate menu name will
|
103
|
+
# update the menu accordingly.
|
104
|
+
Vedeu.bind(:_menu_bottom_) { |name| Vedeu.menus.find(name).bottom_item }
|
105
|
+
Vedeu.bind(:_menu_current_) { |name| Vedeu.menus.find(name).current_item }
|
106
|
+
Vedeu.bind(:_menu_deselect_) { |name| Vedeu.menus.find(name).deselect_item }
|
107
|
+
Vedeu.bind(:_menu_items_) { |name| Vedeu.menus.find(name).items }
|
108
|
+
Vedeu.bind(:_menu_next_) { |name| Vedeu.menus.find(name).next_item }
|
109
|
+
Vedeu.bind(:_menu_prev_) { |name| Vedeu.menus.find(name).prev_item }
|
110
|
+
Vedeu.bind(:_menu_selected_) { |name| Vedeu.menus.find(name).selected_item }
|
111
|
+
Vedeu.bind(:_menu_select_) { |name| Vedeu.menus.find(name).select_item }
|
112
|
+
Vedeu.bind(:_menu_top_) { |name| Vedeu.menus.find(name).top_item }
|
113
|
+
Vedeu.bind(:_menu_view_) { |name| Vedeu.menus.find(name).view }
|
114
|
+
|
115
|
+
# System event to refresh all registered interfaces.
|
116
|
+
Vedeu.bind(:_refresh_) { Vedeu::Refresh.all }
|
117
|
+
|
118
|
+
end # Bindings
|
119
|
+
# :nocov:
|
120
|
+
|
121
|
+
end # Vedeu
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'vedeu/models/model'
|
2
|
+
|
1
3
|
module Vedeu
|
2
4
|
|
3
5
|
# The Buffer object represents the states of display for an interface. The
|
@@ -12,49 +14,45 @@ module Vedeu
|
|
12
14
|
#
|
13
15
|
class Buffer
|
14
16
|
|
15
|
-
include Model
|
17
|
+
include Vedeu::Model
|
16
18
|
|
17
|
-
|
18
|
-
|
19
|
+
attr_accessor :back, :front, :previous
|
20
|
+
attr_reader :name, :repository
|
19
21
|
|
20
22
|
# Return a new instance of Buffer.
|
21
23
|
#
|
22
|
-
# @param
|
24
|
+
# @param name [String] The name of the interface for which the buffer
|
25
|
+
# belongs.
|
26
|
+
# @param back [Interface]
|
27
|
+
# @param front [Interface]
|
28
|
+
# @param previous [Interface]
|
23
29
|
# @return [Buffer]
|
24
|
-
def initialize(
|
25
|
-
@
|
26
|
-
|
27
|
-
@
|
28
|
-
@
|
29
|
-
@
|
30
|
-
@previous = @attributes[:previous]
|
30
|
+
def initialize(name, back = nil, front = nil, previous = nil, repository = nil)
|
31
|
+
@name = name
|
32
|
+
@back = back
|
33
|
+
@front = front
|
34
|
+
@previous = previous
|
35
|
+
@repository = repository || Vedeu.buffers
|
31
36
|
end
|
32
37
|
|
33
|
-
#
|
34
|
-
# boolean indicating that the repository was updated.
|
38
|
+
# Returns log friendly output.
|
35
39
|
#
|
36
|
-
# @
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
true
|
40
|
+
# @return [String]
|
41
|
+
def inspect
|
42
|
+
"<#{self.class.name} ( " \
|
43
|
+
"back?:#{content_for?(:back)} " \
|
44
|
+
"front?:#{content_for?(:front)} " \
|
45
|
+
"previous?:#{content_for?(:previous)} " \
|
46
|
+
")>"
|
44
47
|
end
|
45
48
|
|
46
|
-
#
|
47
|
-
#
|
49
|
+
# Add the content to the back buffer, then update the repository. Returns
|
50
|
+
# boolean indicating that the repository was updated.
|
48
51
|
#
|
52
|
+
# @param content [Interface]
|
49
53
|
# @return [Boolean]
|
50
|
-
def
|
51
|
-
|
52
|
-
|
53
|
-
# Offsets.update({ name: name })
|
54
|
-
|
55
|
-
self.previous = front
|
56
|
-
self.front = back
|
57
|
-
self.back = {}
|
54
|
+
def add(content)
|
55
|
+
@back = content
|
58
56
|
|
59
57
|
store
|
60
58
|
|
@@ -70,14 +68,14 @@ module Vedeu
|
|
70
68
|
# buffer and display that.
|
71
69
|
# - If there is no new content, and the front buffer is empty, display the
|
72
70
|
# 'previous' buffer.
|
73
|
-
# - If the 'previous' buffer is empty, return an empty
|
71
|
+
# - If the 'previous' buffer is empty, return an empty collection.
|
74
72
|
#
|
75
73
|
# @return [Array<Hash>]
|
76
74
|
def content
|
77
75
|
if content_for?(:back)
|
78
76
|
swap
|
79
77
|
|
80
|
-
[
|
78
|
+
[front]
|
81
79
|
|
82
80
|
elsif content_for?(:front)
|
83
81
|
[front]
|
@@ -86,50 +84,35 @@ module Vedeu
|
|
86
84
|
[previous]
|
87
85
|
|
88
86
|
else
|
89
|
-
[
|
87
|
+
[]
|
90
88
|
|
91
89
|
end
|
92
90
|
end
|
93
91
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
# Return a boolean indicating content was swapped between buffers.
|
93
|
+
#
|
94
|
+
# @return [Boolean]
|
95
|
+
def swap
|
96
|
+
@previous = front
|
97
|
+
@front = back
|
98
|
+
@back = nil
|
101
99
|
|
102
|
-
|
103
|
-
{}
|
100
|
+
store
|
104
101
|
|
105
|
-
|
102
|
+
true
|
106
103
|
end
|
107
104
|
|
105
|
+
private
|
106
|
+
|
108
107
|
# Return a boolean indicating content presence on the buffer type.
|
109
108
|
#
|
110
|
-
# @param buffer [Symbol] One of; :back, :
|
109
|
+
# @param buffer [Symbol] One of; :back, :front or :previous.
|
111
110
|
# @return [Boolean] Whether the buffer targetted has content.
|
112
111
|
def content_for?(buffer)
|
113
|
-
public_send(buffer).
|
114
|
-
|
115
|
-
end
|
116
|
-
end
|
112
|
+
return false if public_send(buffer).nil? ||
|
113
|
+
public_send(buffer).content.empty?
|
117
114
|
|
118
|
-
|
119
|
-
def repository
|
120
|
-
Vedeu::Buffers
|
121
|
-
end
|
122
|
-
|
123
|
-
# Return the default attributes of a Buffer.
|
124
|
-
#
|
125
|
-
# @return [Hash]
|
126
|
-
def defaults
|
127
|
-
{
|
128
|
-
name: '',
|
129
|
-
back: {},
|
130
|
-
front: {},
|
131
|
-
previous: {},
|
132
|
-
}
|
115
|
+
true
|
133
116
|
end
|
134
117
|
|
135
118
|
end # Buffer
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'vedeu/repositories/repository'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
# This module is included in Vedeu::Interface to provide means to store client
|
6
|
+
# application views created with {Vedeu.renders} or {Vedeu.views}.
|
7
|
+
#
|
8
|
+
module DisplayBuffer
|
9
|
+
|
10
|
+
include Vedeu::Common
|
11
|
+
|
12
|
+
# Store the view and immediate refresh it; causing to be pushed to the
|
13
|
+
# Terminal.
|
14
|
+
#
|
15
|
+
# @return [Interface]
|
16
|
+
def store_immediate
|
17
|
+
store_deferred
|
18
|
+
|
19
|
+
Vedeu::Refresh.by_name(name)
|
20
|
+
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
# Store the view if it has a name. This view will be shown next time the
|
25
|
+
# refresh event is triggered for the interface.
|
26
|
+
#
|
27
|
+
# @return [Interface]
|
28
|
+
def store_deferred
|
29
|
+
unless defined_value?(name)
|
30
|
+
fail InvalidSyntax, 'Cannot store an interface without a name.'
|
31
|
+
end
|
32
|
+
|
33
|
+
store_new_buffer
|
34
|
+
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
# Registers a set of buffers for the interface unless already registered,
|
41
|
+
# and also adds interface's name to list of focussable interfaces.
|
42
|
+
#
|
43
|
+
# @see Vedeu::Buffer
|
44
|
+
# @return [Interface]
|
45
|
+
def store_new_buffer
|
46
|
+
if Vedeu.buffers.registered?(name)
|
47
|
+
Vedeu.log("Updating buffer: '#{name}'")
|
48
|
+
|
49
|
+
Vedeu.buffers.find(name).add(self)
|
50
|
+
|
51
|
+
else
|
52
|
+
Vedeu.log("Registering buffer: '#{name}'")
|
53
|
+
|
54
|
+
Buffer.new(name, self).store
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
# Registers refresh events for the interface unless already registered.
|
62
|
+
#
|
63
|
+
# @return [Interface]
|
64
|
+
def store_refresh_events
|
65
|
+
options = { delay: delay }
|
66
|
+
event = "_refresh_#{name}_".to_sym
|
67
|
+
|
68
|
+
unless Vedeu.events.registered?(event)
|
69
|
+
Vedeu.bind(event, options) { Vedeu::Refresh.by_name(name) }
|
70
|
+
end
|
71
|
+
|
72
|
+
unless group.nil? || group.empty?
|
73
|
+
event = "_refresh_group_#{group}_".to_sym
|
74
|
+
|
75
|
+
unless Vedeu.events.registered?(event)
|
76
|
+
Vedeu.bind(event, options) { Vedeu::Refresh.by_group(group) }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
self
|
81
|
+
end
|
82
|
+
|
83
|
+
# Registers interface name in focus list unless already registered.
|
84
|
+
#
|
85
|
+
# @return [Interface]
|
86
|
+
def store_focusable
|
87
|
+
unless Vedeu.focusable.registered?(name)
|
88
|
+
Vedeu.focusable.add(name)
|
89
|
+
end
|
90
|
+
|
91
|
+
self
|
92
|
+
end
|
93
|
+
|
94
|
+
# Registers a new cursor for the interface unless already registered.
|
95
|
+
#
|
96
|
+
# @return [Interface]
|
97
|
+
def store_cursor
|
98
|
+
unless Vedeu.cursors.registered?(name)
|
99
|
+
Vedeu::Cursor.new({ name: name }).store
|
100
|
+
end
|
101
|
+
|
102
|
+
self
|
103
|
+
end
|
104
|
+
|
105
|
+
# Registers a new group for the interface unless already registered.
|
106
|
+
#
|
107
|
+
# @return [Interface]
|
108
|
+
def store_group
|
109
|
+
unless group.nil? || group.empty? || Vedeu.groups.registered?(group)
|
110
|
+
Vedeu::Group.new(name, group).store
|
111
|
+
end
|
112
|
+
|
113
|
+
self
|
114
|
+
end
|
115
|
+
|
116
|
+
end # DisplayBuffer
|
117
|
+
|
118
|
+
end # Vedeu
|
@@ -1,5 +1,16 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
require 'vedeu/support/common'
|
4
|
+
require 'vedeu/configuration/api'
|
5
|
+
require 'vedeu/configuration/cli'
|
6
|
+
|
1
7
|
module Vedeu
|
2
8
|
|
9
|
+
# Namespace for the API configuration and CLI configuration classes.
|
10
|
+
#
|
11
|
+
module Config
|
12
|
+
end
|
13
|
+
|
3
14
|
# Allows the customisation of Vedeu's behaviour through the configuration API
|
4
15
|
# or command-line arguments.
|
5
16
|
#
|
@@ -15,6 +26,8 @@ module Vedeu
|
|
15
26
|
|
16
27
|
class << self
|
17
28
|
|
29
|
+
include Vedeu::Common
|
30
|
+
|
18
31
|
# Configure Vedeu with sensible defaults. If the client application sets
|
19
32
|
# options, override the defaults with those, and if command-line arguments
|
20
33
|
# are provided at application invocation, override any options with the
|
@@ -22,11 +35,19 @@ module Vedeu
|
|
22
35
|
#
|
23
36
|
# @param args [Array]
|
24
37
|
# @param block [Proc]
|
38
|
+
# @raise [InvalidSyntax] When the required block is not given.
|
25
39
|
# @return [Hash]
|
26
40
|
def configure(args = [], &block)
|
27
41
|
instance.configure(args, &block)
|
28
42
|
end
|
29
43
|
|
44
|
+
# Returns the configuration singleton.
|
45
|
+
#
|
46
|
+
# @return [Vedeu::Configuration]
|
47
|
+
def configuration
|
48
|
+
instance
|
49
|
+
end
|
50
|
+
|
30
51
|
# Returns the chosen colour mode.
|
31
52
|
#
|
32
53
|
# @return [Fixnum]
|
@@ -94,7 +115,7 @@ module Vedeu
|
|
94
115
|
end
|
95
116
|
alias_method :trace, :trace?
|
96
117
|
|
97
|
-
# Vedeu's default system keys. Use {
|
118
|
+
# Vedeu's default system keys. Use {Vedeu::Configuration.system_keys}.
|
98
119
|
#
|
99
120
|
# @return [Hash]
|
100
121
|
def default_system_keys
|
@@ -142,7 +163,7 @@ module Vedeu
|
|
142
163
|
|
143
164
|
@options.merge!(Config::CLI.configure(args)) if args.any?
|
144
165
|
|
145
|
-
|
166
|
+
Configuration
|
146
167
|
end
|
147
168
|
|
148
169
|
# Reset the configuration to the default values.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'vedeu/repositories/repository'
|
2
|
+
require 'vedeu/cursor/cursor'
|
3
|
+
require 'vedeu/cursor/move_cursor'
|
4
|
+
require 'vedeu/cursor/toggle_cursor'
|
5
|
+
|
6
|
+
module Vedeu
|
7
|
+
|
8
|
+
class Cursors < Repository
|
9
|
+
end
|
10
|
+
|
11
|
+
extend self
|
12
|
+
|
13
|
+
# @return [Cursors]
|
14
|
+
def cursors
|
15
|
+
@_cursors ||= Vedeu::Cursors.new(Vedeu::Cursor)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Cursor|NilClass]
|
19
|
+
def cursor
|
20
|
+
cursors.current
|
21
|
+
end
|
22
|
+
|
23
|
+
end # Vedeu
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'vedeu/cursor/all'
|
2
|
+
require 'vedeu/models/model'
|
3
|
+
require 'vedeu/support/position'
|
4
|
+
require 'vedeu/support/visible'
|
5
|
+
|
6
|
+
module Vedeu
|
7
|
+
|
8
|
+
# Each interface has its own Cursor which maintains the position and
|
9
|
+
# visibility of the cursor within that interface.
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
class Cursor
|
13
|
+
|
14
|
+
extend Forwardable
|
15
|
+
|
16
|
+
def_delegators :state, :visible?, :invisible?
|
17
|
+
|
18
|
+
include Vedeu::Model
|
19
|
+
|
20
|
+
attr_reader :attributes, :name, :ox, :oy, :repository, :state, :x, :y
|
21
|
+
|
22
|
+
# Provides a new instance of Cursor.
|
23
|
+
#
|
24
|
+
# @param attributes [Hash]
|
25
|
+
# @option attributes name [String] The name of the interface this cursor belongs to.
|
26
|
+
# @option attributes ox [Fixnum] The offset x coordinate.
|
27
|
+
# @option attributes oy [Fixnum] The offset y coordinate.
|
28
|
+
# @option attributes repository [Vedeu::Repository]
|
29
|
+
# @option attributes state [Boolean|Symbol] The visibility of the cursor, either +true+
|
30
|
+
# or +false+, +:hide+ or +:show+.
|
31
|
+
# @option attributes x [Fixnum] The terminal x coordinate for the cursor.
|
32
|
+
# @option attributes y [Fixnum] The terminal y coordinate for the cursor.
|
33
|
+
#
|
34
|
+
# @return [Cursor]
|
35
|
+
def initialize(attributes = {})
|
36
|
+
# Hack because Repository#by_name creates Cursor objects with just a
|
37
|
+
# name.
|
38
|
+
if attributes.is_a?(String)
|
39
|
+
attributes = { name: attributes }
|
40
|
+
end
|
41
|
+
|
42
|
+
@attributes = defaults.merge(attributes)
|
43
|
+
|
44
|
+
@name = @attributes.fetch(:name)
|
45
|
+
@ox = @attributes.fetch(:ox)
|
46
|
+
@oy = @attributes.fetch(:oy)
|
47
|
+
@repository = @attributes.fetch(:repository)
|
48
|
+
@state = Vedeu::Visible.coerce(@attributes.fetch(:state))
|
49
|
+
@x = @attributes.fetch(:x)
|
50
|
+
@y = @attributes.fetch(:y)
|
51
|
+
end
|
52
|
+
|
53
|
+
# Returns log friendly output.
|
54
|
+
#
|
55
|
+
# @return [String]
|
56
|
+
def inspect
|
57
|
+
"<#{self.class.name} (#{@name}: x:#{@x} y:#{@y} ox:#{@ox} oy:#{@oy})>"
|
58
|
+
end
|
59
|
+
|
60
|
+
# Returns an escape sequence to position the cursor and set its visibility.
|
61
|
+
# When passed a block, will position the cursor, yield and return the
|
62
|
+
# original position.
|
63
|
+
#
|
64
|
+
# @param block [Proc]
|
65
|
+
# @return [String]
|
66
|
+
def to_s(&block)
|
67
|
+
if block_given?
|
68
|
+
[ sequence, yield, sequence ].join
|
69
|
+
|
70
|
+
else
|
71
|
+
sequence
|
72
|
+
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
# The default values for a new instance of this class.
|
79
|
+
#
|
80
|
+
# @return [Hash]
|
81
|
+
def defaults
|
82
|
+
{
|
83
|
+
name: '',
|
84
|
+
ox: 0,
|
85
|
+
oy: 0,
|
86
|
+
repository: Vedeu.cursors,
|
87
|
+
state: Vedeu::Visible.new(false),
|
88
|
+
x: 1,
|
89
|
+
y: 1,
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
# Returns the escape sequence to position the cursor and set its visibility.
|
94
|
+
#
|
95
|
+
# @return [String]
|
96
|
+
def sequence
|
97
|
+
[ position, visibility ].join
|
98
|
+
end
|
99
|
+
|
100
|
+
# Returns the escape sequence for setting the position of the cursor.
|
101
|
+
#
|
102
|
+
# @return [String]
|
103
|
+
def position
|
104
|
+
Vedeu::Position.new(y, x).to_s
|
105
|
+
end
|
106
|
+
|
107
|
+
# Returns the escape sequence for setting the visibility of the cursor.
|
108
|
+
#
|
109
|
+
# @return [String]
|
110
|
+
def visibility
|
111
|
+
state.cursor
|
112
|
+
end
|
113
|
+
|
114
|
+
end # Cursor
|
115
|
+
|
116
|
+
end # Vedeu
|