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,49 @@
|
|
1
|
+
require 'vedeu/dsl/shared/all'
|
2
|
+
require 'vedeu/support/common'
|
3
|
+
|
4
|
+
module Vedeu
|
5
|
+
|
6
|
+
module DSL
|
7
|
+
|
8
|
+
# Provides methods to be used to define views.
|
9
|
+
#
|
10
|
+
# @api public
|
11
|
+
class Stream
|
12
|
+
|
13
|
+
include Vedeu::Common
|
14
|
+
include Vedeu::DSL
|
15
|
+
include Vedeu::DSL::Colour
|
16
|
+
include Vedeu::DSL::Style
|
17
|
+
include Vedeu::DSL::Text
|
18
|
+
|
19
|
+
# Returns an instance of DSL::Stream.
|
20
|
+
#
|
21
|
+
# @param model [Vedeu::Stream]
|
22
|
+
def initialize(model, client = nil)
|
23
|
+
@model = model
|
24
|
+
@client = client
|
25
|
+
end
|
26
|
+
|
27
|
+
def stream(&block)
|
28
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
29
|
+
|
30
|
+
model.add(model.class.build(attributes, &block))
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
attr_reader :client, :model
|
36
|
+
|
37
|
+
# @return [Hash]
|
38
|
+
def attributes
|
39
|
+
{
|
40
|
+
client: client,
|
41
|
+
parent: model.parent,
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
end # Stream
|
46
|
+
|
47
|
+
end # DSL
|
48
|
+
|
49
|
+
end # Vedeu
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require 'vedeu/models/view/composition'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module DSL
|
6
|
+
|
7
|
+
# DSL for creating views.
|
8
|
+
#
|
9
|
+
# @api public
|
10
|
+
class View
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
# Register an interface by name which will display output from a event
|
15
|
+
# or command. This provides the means for you to define your the views
|
16
|
+
# of your application without their content.
|
17
|
+
#
|
18
|
+
# @todo More documentation required.
|
19
|
+
#
|
20
|
+
# @param name [String] The name of the interface. Used to reference the
|
21
|
+
# interface throughout your application's execution lifetime.
|
22
|
+
# @param block [Proc] A set of attributes which define the features of
|
23
|
+
# the interface.
|
24
|
+
#
|
25
|
+
# @example
|
26
|
+
# Vedeu.interface 'my_interface' do
|
27
|
+
# # ...
|
28
|
+
#
|
29
|
+
# Vedeu.interface do
|
30
|
+
# name 'interfaces_must_have_a_name'
|
31
|
+
# # ...
|
32
|
+
#
|
33
|
+
# @raise [InvalidSyntax] The required block was not given.
|
34
|
+
# @return [Interface]
|
35
|
+
def interface(name = '', &block)
|
36
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
37
|
+
|
38
|
+
attributes = { client: client(&block), name: name }
|
39
|
+
|
40
|
+
Vedeu::Interface.build(attributes, &block).store
|
41
|
+
end
|
42
|
+
|
43
|
+
# Immediate render
|
44
|
+
#
|
45
|
+
# Directly write a view buffer to the terminal. Using this method means
|
46
|
+
# that the refresh event does not need to be triggered after creating
|
47
|
+
# the views, though can be later triggered if needed.
|
48
|
+
#
|
49
|
+
# @param block [Proc] The directives you wish to send to render.
|
50
|
+
# Typically includes `view` with associated sub-directives.
|
51
|
+
#
|
52
|
+
# @example
|
53
|
+
# Vedeu.renders do
|
54
|
+
# view 'my_interface' do
|
55
|
+
# # ...
|
56
|
+
#
|
57
|
+
# @raise [InvalidSyntax] The required block was not given.
|
58
|
+
# @return [Array<Interface>]
|
59
|
+
def renders(&block)
|
60
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
61
|
+
|
62
|
+
store(:store_immediate, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
# Deferred view
|
66
|
+
#
|
67
|
+
# Define a view (content) for an interface.
|
68
|
+
#
|
69
|
+
# @note The views declared within this block are stored in their
|
70
|
+
# respective interface back buffers until a refresh event occurs. When
|
71
|
+
# the refresh event is triggered, the back buffers are swapped into the
|
72
|
+
# front buffers and the content here will be rendered to
|
73
|
+
# {Vedeu::Terminal.output}.
|
74
|
+
#
|
75
|
+
# @param block [Proc] The directives you wish to send to render. Typically
|
76
|
+
# includes `view` with associated sub-directives.
|
77
|
+
#
|
78
|
+
# @example
|
79
|
+
# Vedeu.views do
|
80
|
+
# view 'my_interface' do
|
81
|
+
# # ... some attributes ...
|
82
|
+
# end
|
83
|
+
# view 'my_other_interface' do
|
84
|
+
# # ... some other attributes ...
|
85
|
+
# end
|
86
|
+
# ...
|
87
|
+
#
|
88
|
+
# @raise [InvalidSyntax] The required block was not given.
|
89
|
+
# @return [Array<Interface>]
|
90
|
+
def views(&block)
|
91
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
92
|
+
|
93
|
+
store(:store_deferred, &block)
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
|
98
|
+
# Returns the client object which called the DSL method.
|
99
|
+
#
|
100
|
+
# @param block [Proc]
|
101
|
+
# @return [Object]
|
102
|
+
def client(&block)
|
103
|
+
eval('self', block.binding)
|
104
|
+
end
|
105
|
+
|
106
|
+
# Creates a new Composition which may contain one or more views
|
107
|
+
# (Interface objects).
|
108
|
+
#
|
109
|
+
# @param client [Object]
|
110
|
+
# @param block [Proc]
|
111
|
+
# @return [Vedeu::Composition]
|
112
|
+
def composition(client, &block)
|
113
|
+
Vedeu::Composition.build({ client: client }, &block)
|
114
|
+
end
|
115
|
+
|
116
|
+
# Stores each of the views defined in their respective buffers ready to
|
117
|
+
# be rendered on next refresh.
|
118
|
+
#
|
119
|
+
# @param method [Symbol] An instruction; `:store_immediate` or
|
120
|
+
# `:store_deferred` which determines whether the view will be shown
|
121
|
+
# immediately or later respectively.
|
122
|
+
# @param block [Proc]
|
123
|
+
# @return [Array]
|
124
|
+
def store(method, &block)
|
125
|
+
composition(client(&block), &block).interfaces.map do |interface|
|
126
|
+
interface.public_send(method)
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
end # View
|
133
|
+
|
134
|
+
end # DSL
|
135
|
+
|
136
|
+
end # Vedeu
|
@@ -1,3 +1,7 @@
|
|
1
|
+
require 'vedeu/models/model'
|
2
|
+
require 'vedeu/repositories/repository'
|
3
|
+
require 'vedeu/events/trigger'
|
4
|
+
|
1
5
|
module Vedeu
|
2
6
|
|
3
7
|
# Contains all the logic of an event. Handles debouncing and throttling.
|
@@ -5,7 +9,81 @@ module Vedeu
|
|
5
9
|
# @api private
|
6
10
|
class Event
|
7
11
|
|
8
|
-
include Model
|
12
|
+
include Vedeu::Model
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# Register an event by name with optional delay (throttling) which when
|
17
|
+
# triggered will execute the code contained within the passed block.
|
18
|
+
#
|
19
|
+
# @param name [Symbol] The name of the event which will be triggered later.
|
20
|
+
# @param [Hash] options The options to register the event with.
|
21
|
+
# @option options :delay [Fixnum|Float] Limits the execution of the
|
22
|
+
# triggered event to only execute when first triggered, with subsequent
|
23
|
+
# triggering being ignored until the delay has expired.
|
24
|
+
# @option options :debounce [Fixnum|Float] Limits the execution of the
|
25
|
+
# triggered event to only execute once the debounce has expired.
|
26
|
+
# Subsequent triggers before debounce expiry are ignored.
|
27
|
+
# @param block [Proc] The event to be executed when triggered. This block
|
28
|
+
# could be a method call, or the triggering of another event, or sequence
|
29
|
+
# of either/both.
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# Vedeu.bind :my_event do |some, args|
|
33
|
+
# ... some code here ...
|
34
|
+
#
|
35
|
+
# Vedeu.trigger(:my_other_event)
|
36
|
+
# end
|
37
|
+
#
|
38
|
+
# T = Triggered, X = Executed, i = Ignored.
|
39
|
+
#
|
40
|
+
# 0.0.....0.2.....0.4.....0.6.....0.8.....1.0.....1.2.....1.4.....1.6...
|
41
|
+
# .T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T
|
42
|
+
# .X...i...i...i...i...X...i...i...i...i...X...i...i...i...i...i...i...i
|
43
|
+
#
|
44
|
+
# Vedeu.bind(:my_delayed_event, { delay: 0.5 })
|
45
|
+
# ... some code here ...
|
46
|
+
# end
|
47
|
+
#
|
48
|
+
# T = Triggered, X = Executed, i = Ignored.
|
49
|
+
#
|
50
|
+
# 0.0.....0.2.....0.4.....0.6.....0.8.....1.0.....1.2.....1.4.....1.6...
|
51
|
+
# .T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T...T
|
52
|
+
# .i...i...i...i...i...i...i...X...i...i...i...i...i...i...X...i...i...i
|
53
|
+
#
|
54
|
+
# Vedeu.bind(:my_debounced_event, { debounce: 0.7 })
|
55
|
+
# ... some code here ...
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# @return [TrueClass]
|
59
|
+
def bind(name, options = {}, &block)
|
60
|
+
Vedeu.log("Binding event: '#{name}'")
|
61
|
+
|
62
|
+
new(name, options, block).bind
|
63
|
+
end
|
64
|
+
alias_method :event, :bind
|
65
|
+
alias_method :register, :bind
|
66
|
+
|
67
|
+
# @see Vedeu::Trigger.trigger
|
68
|
+
def trigger(name, *args)
|
69
|
+
Vedeu::Trigger.trigger(name, *args)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Unbind events from a named handler.
|
73
|
+
#
|
74
|
+
# @param name [String]
|
75
|
+
# @return [Boolean]
|
76
|
+
def unbind(name)
|
77
|
+
return false unless Vedeu.events.registered?(name)
|
78
|
+
|
79
|
+
Vedeu.log("Unbinding event: '#{name}")
|
80
|
+
|
81
|
+
Vedeu.events.remove(name)
|
82
|
+
true
|
83
|
+
end
|
84
|
+
alias_method :unevent, :unbind
|
85
|
+
|
86
|
+
end
|
9
87
|
|
10
88
|
# Returns a new instance of Event.
|
11
89
|
#
|
@@ -20,10 +98,26 @@ module Vedeu
|
|
20
98
|
@deadline = 0
|
21
99
|
@executed_at = 0
|
22
100
|
@now = 0
|
101
|
+
@repository = Vedeu.events
|
102
|
+
end
|
103
|
+
|
104
|
+
def bind
|
105
|
+
if repository.registered?(name)
|
106
|
+
collection = repository.find(name)
|
107
|
+
new_collection = collection.add(self)
|
108
|
+
|
109
|
+
else
|
110
|
+
new_collection = Vedeu::Model::Collection.new([self], nil, name)
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
repository.store(new_collection)
|
115
|
+
|
116
|
+
true
|
23
117
|
end
|
24
118
|
|
25
119
|
# Triggers the event based on debouncing and throttling conditions.
|
26
|
-
|
120
|
+
|
27
121
|
# @param args [Array]
|
28
122
|
# @return []
|
29
123
|
def trigger(*args)
|
@@ -39,11 +133,6 @@ module Vedeu
|
|
39
133
|
attr_reader :closure, :name
|
40
134
|
attr_accessor :deadline, :executed_at, :now
|
41
135
|
|
42
|
-
# @return [Class] The repository class for this model.
|
43
|
-
def repository
|
44
|
-
Vedeu::Events
|
45
|
-
end
|
46
|
-
|
47
136
|
# Execute the code stored in the event closure.
|
48
137
|
#
|
49
138
|
# @param args []
|
@@ -162,7 +251,7 @@ module Vedeu
|
|
162
251
|
defaults.merge(@options)
|
163
252
|
end
|
164
253
|
|
165
|
-
# The default values for a new instance of
|
254
|
+
# The default values for a new instance of this class.
|
166
255
|
#
|
167
256
|
# @return [Hash]
|
168
257
|
def defaults
|
@@ -0,0 +1,58 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Trigger a registered or system event by name with arguments. If the
|
4
|
+
# event stored returns a value, that is returned. If multiple events are
|
5
|
+
# registered for a name, then the result of each event will be returned as
|
6
|
+
# part of a collection.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# Vedeu.trigger(:my_event, :oxidize, 'nitrogen')
|
10
|
+
#
|
11
|
+
# @api private
|
12
|
+
class Trigger
|
13
|
+
|
14
|
+
class << self
|
15
|
+
|
16
|
+
# @param name [Symbol] The name of the event you wish to trigger. The event
|
17
|
+
# does not have to exist.
|
18
|
+
# @param args [Array] Any arguments the event needs to execute correctly.
|
19
|
+
# @return [Array]
|
20
|
+
def trigger(name, *args)
|
21
|
+
new(name, *args).trigger
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
# @see Vedeu::Trigger.trigger
|
27
|
+
# @return [Trigger]
|
28
|
+
def initialize(name, *args)
|
29
|
+
@name = name
|
30
|
+
@args = args
|
31
|
+
@repository = Vedeu.events
|
32
|
+
end
|
33
|
+
|
34
|
+
# @see Vedeu::Trigger.trigger
|
35
|
+
# @return [Array]
|
36
|
+
def trigger
|
37
|
+
return [] unless repository.registered?(name)
|
38
|
+
|
39
|
+
collection = repository.find(name)
|
40
|
+
|
41
|
+
results = collection.map do |event|
|
42
|
+
event.trigger(*args)
|
43
|
+
end
|
44
|
+
|
45
|
+
return results.first if results.one?
|
46
|
+
|
47
|
+
results
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
attr_reader :name,
|
53
|
+
:args,
|
54
|
+
:repository
|
55
|
+
|
56
|
+
end # Trigger
|
57
|
+
|
58
|
+
end # Vedeu
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# ModelNotFound: Raised with Vedeu attempts to access a named model that does
|
4
|
+
# not exist.
|
5
|
+
#
|
6
|
+
# InvalidSyntax: Raised when Vedeu attempts to parse a {Vedeu.view} or
|
7
|
+
# {Vedeu.interface} and encounters a problem.
|
8
|
+
#
|
9
|
+
# MissingRequired: Raised when a name is not provided for a model when
|
10
|
+
# attempting to store it in a repository.
|
11
|
+
#
|
12
|
+
# ModeSwitch: Raised intentionally when the client application wishes to
|
13
|
+
# switch between cooked and raw (or vice versa) terminal modes. Vedeu is
|
14
|
+
# hard-wired to use the `Escape` key to trigger this change for the time
|
15
|
+
# being.
|
16
|
+
#
|
17
|
+
# NotImplemented: Raised to remind me (or client application developers) that
|
18
|
+
# the subclass implements the functionality sought.
|
19
|
+
#
|
20
|
+
# OutOfRange: Raised when trying to access an interface column less than 1 or
|
21
|
+
# greater than 12. Vedeu is hard-wired to a 12-column layout for the time
|
22
|
+
# being.
|
23
|
+
|
24
|
+
Exceptions = %w[
|
25
|
+
ModelNotFound
|
26
|
+
InvalidSyntax
|
27
|
+
MissingRequired
|
28
|
+
ModeSwitch
|
29
|
+
NotImplemented
|
30
|
+
OutOfRange
|
31
|
+
]
|
32
|
+
Exceptions.each { |e| const_set(e, Class.new(StandardError)) }
|
33
|
+
|
34
|
+
end # Vedeu
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'vedeu/repositories/repository'
|
2
|
+
require 'vedeu/input/mapper'
|
3
|
+
require 'vedeu/input/keys'
|
4
|
+
require 'vedeu/input/key'
|
5
|
+
require 'vedeu/input/input'
|
6
|
+
require 'vedeu/input/keymap'
|
7
|
+
|
8
|
+
module Vedeu
|
9
|
+
|
10
|
+
extend self
|
11
|
+
|
12
|
+
def keymaps
|
13
|
+
@_keymaps ||= Vedeu::Repository.new(Vedeu::Keymap)
|
14
|
+
end
|
15
|
+
|
16
|
+
def_delegators Vedeu::Keymap, :keymap
|
17
|
+
def_delegators Vedeu::Keymap, :keypress
|
18
|
+
|
19
|
+
Vedeu.keymap('_system_') do |keymap|
|
20
|
+
Vedeu::Configuration.system_keys.each do |label, keypress|
|
21
|
+
keymap.key(keypress) { Vedeu.trigger(("_" + label.to_s + "_").to_sym) }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
Vedeu.keymap('_global_') do
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end # Vedeu
|
data/lib/vedeu/input/input.rb
CHANGED
@@ -87,6 +87,32 @@ module Vedeu
|
|
87
87
|
"\e[1;2Q" => :scroll_lock,
|
88
88
|
"\e[1;2R" => :pause_break,
|
89
89
|
"\u007F" => :backspace,
|
90
|
+
"\u0001" => :ctrl_a,
|
91
|
+
"\u0002" => :ctrl_b,
|
92
|
+
"\u0003" => :ctrl_c,
|
93
|
+
"\u0004" => :ctrl_d,
|
94
|
+
"\u0005" => :ctrl_e,
|
95
|
+
"\u0006" => :ctrl_f,
|
96
|
+
"\u0007" => :ctrl_g,
|
97
|
+
"\u0008" => :ctrl_h,
|
98
|
+
# "\u0009" => :ctrl_i, # duplicates tab
|
99
|
+
"\u0010" => :ctrl_j,
|
100
|
+
"\u0011" => :ctrl_k,
|
101
|
+
"\u0012" => :ctrl_l,
|
102
|
+
"\u0013" => :ctrl_m,
|
103
|
+
"\u0014" => :ctrl_n,
|
104
|
+
"\u0015" => :ctrl_o,
|
105
|
+
"\u0016" => :ctrl_p,
|
106
|
+
"\u0017" => :ctrl_q,
|
107
|
+
"\u0018" => :ctrl_r,
|
108
|
+
"\u0019" => :ctrl_s,
|
109
|
+
# "\u0020" => :ctrl_t, # duplicates spacebar
|
110
|
+
"\u0021" => :ctrl_u,
|
111
|
+
"\u0022" => :ctrl_v,
|
112
|
+
"\u0023" => :ctrl_w,
|
113
|
+
"\u0024" => :ctrl_x,
|
114
|
+
"\u0025" => :ctrl_y,
|
115
|
+
"\u0026" => :ctrl_z,
|
90
116
|
}
|
91
117
|
end
|
92
118
|
|
@@ -1,16 +1,30 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
+
#
|
3
4
|
# A single keypress or combination of keypresses bound to a specific action.
|
5
|
+
#
|
4
6
|
class Key
|
5
7
|
|
8
|
+
# Creates a new instance of Key.
|
9
|
+
#
|
10
|
+
# @see Vedeu::Key#initialize
|
11
|
+
def self.define(input = nil, &block)
|
12
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
13
|
+
|
14
|
+
new(input, &block)
|
15
|
+
end
|
16
|
+
|
6
17
|
# Returns a new instance of Key.
|
7
18
|
#
|
8
19
|
# @param input [String|Symbol]
|
9
|
-
# @param
|
20
|
+
# @param block [Proc]
|
21
|
+
# @raise [InvalidSyntax] The required block was not given.
|
10
22
|
# @return [Key]
|
11
|
-
def initialize(input,
|
23
|
+
def initialize(input = nil, &block)
|
24
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
25
|
+
|
12
26
|
@input = input
|
13
|
-
@output =
|
27
|
+
@output = block
|
14
28
|
end
|
15
29
|
|
16
30
|
# Returns the key defined.
|
@@ -21,18 +35,14 @@ module Vedeu
|
|
21
35
|
end
|
22
36
|
alias_method :key, :input
|
23
37
|
|
24
|
-
# The procedure to call when the key is pressed.
|
25
|
-
def output
|
26
|
-
@output
|
27
|
-
end
|
28
|
-
alias_method :action, :output
|
29
|
-
|
30
38
|
# Pressing the key will call the procedure.
|
31
39
|
#
|
32
40
|
# @return [|Symbol]
|
33
|
-
def
|
34
|
-
output.
|
41
|
+
def output
|
42
|
+
@output.call
|
35
43
|
end
|
44
|
+
alias_method :action, :output
|
45
|
+
alias_method :press, :output
|
36
46
|
|
37
47
|
end # Key
|
38
48
|
|
@@ -0,0 +1,130 @@
|
|
1
|
+
require 'vedeu/exceptions'
|
2
|
+
require 'vedeu/support/common'
|
3
|
+
require 'vedeu/models/model'
|
4
|
+
require 'vedeu/dsl/components/keymap'
|
5
|
+
|
6
|
+
module Vedeu
|
7
|
+
|
8
|
+
class Keymap
|
9
|
+
|
10
|
+
include Vedeu::Common
|
11
|
+
include Vedeu::Model
|
12
|
+
|
13
|
+
attr_accessor :name
|
14
|
+
attr_reader :keys, :repository
|
15
|
+
|
16
|
+
class << self
|
17
|
+
|
18
|
+
|
19
|
+
# @option attributes client []
|
20
|
+
# @option attributes keys []
|
21
|
+
# @option attributes name []
|
22
|
+
# @option attributes repository []
|
23
|
+
def build(attributes = {}, &block)
|
24
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
25
|
+
|
26
|
+
attributes = defaults.merge(attributes)
|
27
|
+
|
28
|
+
model = new(attributes[:name],
|
29
|
+
attributes[:keys],
|
30
|
+
attributes[:repository])
|
31
|
+
model.deputy(attributes[:client]).instance_eval(&block)
|
32
|
+
model.store
|
33
|
+
end
|
34
|
+
|
35
|
+
# Define actions for keypresses for when specific interfaces are in focus.
|
36
|
+
# Unless an interface is specified, the key will be assumed to be global,
|
37
|
+
# meaning its action will happen regardless of the interface in focus.
|
38
|
+
#
|
39
|
+
# @note
|
40
|
+
# When defining an interface, there is no need to provide a name since
|
41
|
+
# this can be discerned from the interface itself, e.g:
|
42
|
+
#
|
43
|
+
# Vedeu.interface 'my_interface' do
|
44
|
+
# keymap do
|
45
|
+
# ...
|
46
|
+
#
|
47
|
+
# @param name [String] The name of the interface which this keymap relates
|
48
|
+
# to.
|
49
|
+
# @param block [Proc]
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# keymap 'my_interface' do
|
53
|
+
# ...
|
54
|
+
#
|
55
|
+
# @raise [InvalidSyntax] The required block was not given.
|
56
|
+
# @return [Keymap]
|
57
|
+
def keymap(name, &block)
|
58
|
+
new(name).store
|
59
|
+
|
60
|
+
build({ name: name }, &block)
|
61
|
+
end
|
62
|
+
|
63
|
+
private
|
64
|
+
|
65
|
+
# The default values for a new instance of this class.
|
66
|
+
#
|
67
|
+
# @return [Hash]
|
68
|
+
def defaults
|
69
|
+
{
|
70
|
+
client: nil,
|
71
|
+
keys: [],
|
72
|
+
name: '',
|
73
|
+
repository: Vedeu.keymaps,
|
74
|
+
}
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
# @param name [String] The name of the keymap.
|
80
|
+
# @param keys [Vedeu::Model::Collection|Array] A collection of keys.
|
81
|
+
# @return [Vedeu::Keymap]
|
82
|
+
def initialize(name = '', keys = [], repository = nil)
|
83
|
+
@name = name
|
84
|
+
@keys = Vedeu::Model::Collection.coerce(keys)
|
85
|
+
@repository = repository || Vedeu.keymaps
|
86
|
+
end
|
87
|
+
|
88
|
+
# @param key [Key]
|
89
|
+
def add(key)
|
90
|
+
return false unless valid?(key)
|
91
|
+
|
92
|
+
@keys << key
|
93
|
+
|
94
|
+
# immutable Keymap version:
|
95
|
+
# self.new(name, @keys += [key]).store if valid?(key)
|
96
|
+
end
|
97
|
+
|
98
|
+
# @param input [String|Symbol]
|
99
|
+
# @return [Boolean] A boolean indicating the input provided is already in
|
100
|
+
# use for this keymap.
|
101
|
+
def key_defined?(input)
|
102
|
+
keys.any? { |key| key.input == input }
|
103
|
+
end
|
104
|
+
|
105
|
+
# @param input [String|Symbol]
|
106
|
+
# @return [Array|FalseClass]
|
107
|
+
def use(input)
|
108
|
+
return false unless key_defined?(input)
|
109
|
+
|
110
|
+
Vedeu.log("Key pressed: '#{input}'")
|
111
|
+
|
112
|
+
Vedeu.trigger(:key, input)
|
113
|
+
|
114
|
+
keys.select { |key| key.input == input }.map(&:press)
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
# @param key [Vedeu::Key]
|
120
|
+
def valid?(key)
|
121
|
+
return true unless key_defined?(key.input)
|
122
|
+
|
123
|
+
Vedeu.log("Keymap '#{name}' already defines '#{key.input}'.")
|
124
|
+
|
125
|
+
false
|
126
|
+
end
|
127
|
+
|
128
|
+
end # Keymap
|
129
|
+
|
130
|
+
end # Vedeu
|