vedeu 0.2.12 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|