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,72 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
# DSL for creating collections of interfaces.
|
6
|
+
#
|
7
|
+
class Composition
|
8
|
+
|
9
|
+
include Vedeu::DSL
|
10
|
+
|
11
|
+
# Returns an instance of DSL::Composition.
|
12
|
+
#
|
13
|
+
# @param model [Composition]
|
14
|
+
def initialize(model, client = nil)
|
15
|
+
@model = model
|
16
|
+
@client = client
|
17
|
+
end
|
18
|
+
|
19
|
+
# Define a view.
|
20
|
+
#
|
21
|
+
# A view is just an Interface object.
|
22
|
+
#
|
23
|
+
# @todo More documentation required.
|
24
|
+
# @param name [String] The name of the interface you are targetting for
|
25
|
+
# this view.
|
26
|
+
# @param block [Proc] The directives you wish to send to this interface.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# view 'my_interface' do
|
30
|
+
# ...
|
31
|
+
#
|
32
|
+
# @raise [InvalidSyntax] The required block was not given.
|
33
|
+
# @return [Vedeu::Model::Collection<Vedeu::Interface>]
|
34
|
+
def view(name = '', &block)
|
35
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
36
|
+
|
37
|
+
child_model = if Vedeu.interfaces.registered?(name)
|
38
|
+
interface = Vedeu.interfaces.find(name)
|
39
|
+
child.build(attributes.merge(interface.attributes), &block)
|
40
|
+
|
41
|
+
else
|
42
|
+
child.build(attributes.merge({ name: name }), &block)
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
model.add(child_model)
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
attr_reader :client, :model
|
52
|
+
|
53
|
+
# @return [Hash]
|
54
|
+
def attributes
|
55
|
+
{
|
56
|
+
client: client,
|
57
|
+
parent: model,
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
# Return the class name for the children on this model.
|
62
|
+
#
|
63
|
+
# @return [Class]
|
64
|
+
def child
|
65
|
+
Vedeu::Interface
|
66
|
+
end
|
67
|
+
|
68
|
+
end # Composition
|
69
|
+
|
70
|
+
end # DSL
|
71
|
+
|
72
|
+
end # Vedeu
|
@@ -0,0 +1,210 @@
|
|
1
|
+
require 'vedeu/support/common'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module DSL
|
6
|
+
|
7
|
+
# DSL for creating interfaces.
|
8
|
+
class Interface
|
9
|
+
|
10
|
+
include Vedeu::Common
|
11
|
+
include Vedeu::DSL
|
12
|
+
include Vedeu::DSL::Colour
|
13
|
+
include Vedeu::DSL::Style
|
14
|
+
include Vedeu::DSL::Text
|
15
|
+
include Vedeu::DSL::Use
|
16
|
+
|
17
|
+
# Returns an instance of Vedeu::DSL::Interface.
|
18
|
+
#
|
19
|
+
# @param model [Vedeu::DSL::Interface]
|
20
|
+
# @param client [Object]
|
21
|
+
# @return [Vedeu::DSL::Interface]
|
22
|
+
def initialize(model, client = nil)
|
23
|
+
@model = model
|
24
|
+
@client = client
|
25
|
+
end
|
26
|
+
|
27
|
+
# Allows the setting of a border for the interface.
|
28
|
+
#
|
29
|
+
# @param block [Proc]
|
30
|
+
# @raise [InvalidSyntax] The required block was not given.
|
31
|
+
# @return [Hash]
|
32
|
+
def border(&block)
|
33
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
34
|
+
|
35
|
+
border_attrs = attributes.merge({ enabled: true, interface: model })
|
36
|
+
|
37
|
+
model.border = Vedeu::Border.build(border_attrs, &block)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Set the cursor visibility on an interface.
|
41
|
+
#
|
42
|
+
# @param value [Boolean] Any value other than nil or false will evaluate
|
43
|
+
# to true.
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
# interface 'my_interface' do
|
47
|
+
# cursor true # => show the cursor for this interface
|
48
|
+
# cursor :show # => both of these are equivalent to line above
|
49
|
+
# cursor! #
|
50
|
+
# # ...
|
51
|
+
#
|
52
|
+
# cursor false # => hide the cursor for this interface
|
53
|
+
# cursor :hide # => both of these are equivalent to line above
|
54
|
+
# cursor nil #
|
55
|
+
# # ...
|
56
|
+
#
|
57
|
+
# view 'my_interface' do
|
58
|
+
# cursor true
|
59
|
+
# # ...
|
60
|
+
#
|
61
|
+
# @return [Cursor]
|
62
|
+
def cursor(value = true)
|
63
|
+
Vedeu::Cursor.new({ name: model.name, state: value }).store
|
64
|
+
end
|
65
|
+
|
66
|
+
def cursor!
|
67
|
+
cursor(true)
|
68
|
+
end
|
69
|
+
|
70
|
+
# To maintain performance interfaces can be delayed from refreshing too
|
71
|
+
# often, the reduces artefacts particularly when resizing the terminal
|
72
|
+
# screen.
|
73
|
+
#
|
74
|
+
# @param value [Fixnum|Float]
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# interface 'my_interface' do
|
78
|
+
# delay 0.5 # interface will not update more often than every 500ms.
|
79
|
+
# # ...
|
80
|
+
#
|
81
|
+
# @return [Fixnum|Float]
|
82
|
+
def delay(value)
|
83
|
+
model.delay = value
|
84
|
+
end
|
85
|
+
|
86
|
+
# Specify this interface as being in focus when the application starts.
|
87
|
+
#
|
88
|
+
# @note If multiple interfaces are defined, and this is included in each,
|
89
|
+
# then the last defined will be the interface in focus.
|
90
|
+
#
|
91
|
+
# @return [String] The name of the interface in focus.
|
92
|
+
def focus!
|
93
|
+
Vedeu::Focus.add(model.name, true) if defined_value?(model.name)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Define the geometry for an interface.
|
97
|
+
#
|
98
|
+
# @param block [Proc]
|
99
|
+
#
|
100
|
+
# @example
|
101
|
+
# interface 'my_interface' do
|
102
|
+
# geometry do
|
103
|
+
# # ...
|
104
|
+
#
|
105
|
+
# @raise [InvalidSyntax] The required block was not given.
|
106
|
+
# @return [Geometry]
|
107
|
+
# @see Vedeu::DSL::Geometry
|
108
|
+
def geometry(&block)
|
109
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
110
|
+
|
111
|
+
model.geometry = Vedeu::Geometry.build(attributes, &block)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Specify a group for an interface. Interfaces of the same group can be
|
115
|
+
# targetted together; for example you may want to refresh multiple
|
116
|
+
# interfaces at once.
|
117
|
+
#
|
118
|
+
# @param value [String] The name for the group of interfaces.
|
119
|
+
#
|
120
|
+
# @example
|
121
|
+
# interface 'my_interface' do
|
122
|
+
# group 'main_screen'
|
123
|
+
# # ...
|
124
|
+
#
|
125
|
+
# @return [String]
|
126
|
+
def group(value)
|
127
|
+
if defined_value?(model.name)
|
128
|
+
if Vedeu.groups.registered?(value)
|
129
|
+
Vedeu.groups.find(value).add(model.name)
|
130
|
+
|
131
|
+
else
|
132
|
+
Vedeu::Group.new(value, model.name).store
|
133
|
+
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
model.group = value
|
138
|
+
end
|
139
|
+
|
140
|
+
# @see Vedeu::Keymap.keymap
|
141
|
+
def keymap(name = model.name, &block)
|
142
|
+
Vedeu.keymap(name, &block)
|
143
|
+
end
|
144
|
+
alias_method :keys, :keymap
|
145
|
+
|
146
|
+
# Specify multiple lines in a view.
|
147
|
+
#
|
148
|
+
# @param block [Proc]
|
149
|
+
#
|
150
|
+
# @example
|
151
|
+
# view 'my_interface' do
|
152
|
+
# lines do
|
153
|
+
# # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
|
154
|
+
# end
|
155
|
+
# end
|
156
|
+
#
|
157
|
+
# view 'my_interface' do
|
158
|
+
# line do
|
159
|
+
# # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
|
160
|
+
# end
|
161
|
+
# end
|
162
|
+
#
|
163
|
+
# @raise [InvalidSyntax] The required block was not given.
|
164
|
+
# @return [Line]
|
165
|
+
def lines(&block)
|
166
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
167
|
+
|
168
|
+
model.add(child.build(attributes, &block))
|
169
|
+
end
|
170
|
+
alias_method :line, :lines
|
171
|
+
|
172
|
+
# The name of the interface. Used to reference the interface throughout
|
173
|
+
# your application's execution lifetime.
|
174
|
+
#
|
175
|
+
# @param value [String]
|
176
|
+
#
|
177
|
+
# @example
|
178
|
+
# interface do
|
179
|
+
# name 'my_interface'
|
180
|
+
# # ...
|
181
|
+
#
|
182
|
+
# @return [String]
|
183
|
+
def name(value)
|
184
|
+
model.name = value
|
185
|
+
end
|
186
|
+
|
187
|
+
private
|
188
|
+
|
189
|
+
attr_reader :client, :model
|
190
|
+
|
191
|
+
# @return [Hash]
|
192
|
+
def attributes
|
193
|
+
{
|
194
|
+
client: client,
|
195
|
+
parent: model,
|
196
|
+
}
|
197
|
+
end
|
198
|
+
|
199
|
+
# Return the class name for the children on this model.
|
200
|
+
#
|
201
|
+
# @return [Class]
|
202
|
+
def child
|
203
|
+
Vedeu::Line
|
204
|
+
end
|
205
|
+
|
206
|
+
end # Interface
|
207
|
+
|
208
|
+
end # DSL
|
209
|
+
|
210
|
+
end # Vedeu
|
@@ -0,0 +1,135 @@
|
|
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
|
+
# @example
|
11
|
+
# Vedeu.renders do
|
12
|
+
# view 'my_interface' do
|
13
|
+
# lines do
|
14
|
+
# background '#000000'
|
15
|
+
# foreground '#ffffff'
|
16
|
+
# line 'This is white text on a black background.'
|
17
|
+
# line 'Next is a blank line:'
|
18
|
+
# line ''
|
19
|
+
#
|
20
|
+
# streams { stream 'We can define ' }
|
21
|
+
#
|
22
|
+
# streams do
|
23
|
+
# foreground '#ff0000'
|
24
|
+
# stream 'parts of a line '
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# streams { stream 'independently using ' }
|
28
|
+
#
|
29
|
+
# streams do
|
30
|
+
# foreground '#00ff00'
|
31
|
+
# stream 'streams.'
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
# end
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# @api public
|
38
|
+
class Line
|
39
|
+
|
40
|
+
include Vedeu::Common
|
41
|
+
include Vedeu::DSL
|
42
|
+
include Vedeu::DSL::Colour
|
43
|
+
include Vedeu::DSL::Style
|
44
|
+
include Vedeu::DSL::Text
|
45
|
+
|
46
|
+
# Returns an instance of DSL::Line.
|
47
|
+
#
|
48
|
+
# @param model [Vedeu::Line]
|
49
|
+
def initialize(model, client = nil)
|
50
|
+
@model = model
|
51
|
+
@client = client
|
52
|
+
end
|
53
|
+
|
54
|
+
# Specify a single line in a view.
|
55
|
+
#
|
56
|
+
# @example
|
57
|
+
# Vedeu.renders do
|
58
|
+
# view 'my_interface' do
|
59
|
+
# line 'some text...'
|
60
|
+
# # ...
|
61
|
+
#
|
62
|
+
# line do
|
63
|
+
# # ...
|
64
|
+
#
|
65
|
+
# @return [Vedeu::Line]
|
66
|
+
def line(value = '', &block)
|
67
|
+
content = if block_given?
|
68
|
+
Vedeu::Line.build({ client: client,
|
69
|
+
parent: model.parent }, &block)
|
70
|
+
|
71
|
+
elsif value
|
72
|
+
stream = Vedeu::Stream.build({ client: client,
|
73
|
+
parent: model,
|
74
|
+
value: value })
|
75
|
+
Vedeu::Line.build({ client: client,
|
76
|
+
parent: model.parent,
|
77
|
+
streams: [stream] })
|
78
|
+
|
79
|
+
else
|
80
|
+
fail InvalidSyntax, 'block not given'
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
model.parent.add(content)
|
85
|
+
end
|
86
|
+
|
87
|
+
# Define multiple streams (a stream is a subset of a line).
|
88
|
+
# Uses {Vedeu::DSL::Stream} for all directives within the required block.
|
89
|
+
#
|
90
|
+
# @param block [Proc]
|
91
|
+
#
|
92
|
+
# @example
|
93
|
+
# Vedeu.renders do
|
94
|
+
# view 'my_interface' do
|
95
|
+
# line do
|
96
|
+
# streams do
|
97
|
+
# # ...
|
98
|
+
#
|
99
|
+
# stream do
|
100
|
+
# # ...
|
101
|
+
#
|
102
|
+
# @raise [InvalidSyntax] The required block was not given.
|
103
|
+
# @return [Vedeu::Streams<Vedeu::Stream>]
|
104
|
+
# @see Vedeu::DSL::Stream for subdirectives.
|
105
|
+
def streams(&block)
|
106
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
107
|
+
|
108
|
+
model.add(child.build(attributes, &block))
|
109
|
+
end
|
110
|
+
alias_method :stream, :streams
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
attr_reader :client, :model
|
115
|
+
|
116
|
+
# @return [Hash]
|
117
|
+
def attributes
|
118
|
+
{
|
119
|
+
client: client,
|
120
|
+
parent: model,
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
# Return the class name for the children on this model.
|
125
|
+
#
|
126
|
+
# @return [Class]
|
127
|
+
def child
|
128
|
+
Vedeu::Stream
|
129
|
+
end
|
130
|
+
|
131
|
+
end # Line
|
132
|
+
|
133
|
+
end # DSL
|
134
|
+
|
135
|
+
end # Vedeu
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
# Provides colour helpers for use in the {Vedeu::DSL::Interface},
|
6
|
+
# {Vedeu::DSL::Line} and {Vedeu::DSL::Stream} classes.
|
7
|
+
#
|
8
|
+
# @api public
|
9
|
+
module Colour
|
10
|
+
|
11
|
+
# Define the background colour for an interface, line, or a stream. When
|
12
|
+
# called with a block, will create a new stream with the background colour
|
13
|
+
# specified. When the block terminates, the background will return to that
|
14
|
+
# of the parent.
|
15
|
+
#
|
16
|
+
# @note The last defined background colour for a particular interface,
|
17
|
+
# line or stream overrides previously defined entries in the same block.
|
18
|
+
#
|
19
|
+
# @param value [String]
|
20
|
+
#
|
21
|
+
# @example
|
22
|
+
# interface 'my_interface' do
|
23
|
+
# background '#0022ff' # /or/ (blue)
|
24
|
+
# bgcolor '#22ff00' # /or/ (blue is overridden to green)
|
25
|
+
# bg '#ff0022' # (green is overridden to red)
|
26
|
+
# # ...
|
27
|
+
#
|
28
|
+
# lines do
|
29
|
+
# background '#2200ff'
|
30
|
+
# # ...
|
31
|
+
#
|
32
|
+
# stream do
|
33
|
+
# background '#22ff00'
|
34
|
+
# # ...
|
35
|
+
#
|
36
|
+
# @return [String]
|
37
|
+
def background(value = '')
|
38
|
+
colour({ background: value })
|
39
|
+
end
|
40
|
+
alias_method :bg, :background
|
41
|
+
alias_method :bgcolor, :background
|
42
|
+
|
43
|
+
# @see Vedeu::DSL::Colour#background
|
44
|
+
def foreground(value = '')
|
45
|
+
colour({ foreground: value })
|
46
|
+
end
|
47
|
+
alias_method :fg, :foreground
|
48
|
+
alias_method :fgcolor, :foreground
|
49
|
+
|
50
|
+
# Define either or both foreground and background colours for an
|
51
|
+
# interface, line or a stream. At least one attribute is required.
|
52
|
+
#
|
53
|
+
# @note Rejects invalid keys and empty/nil attributes. Also, the last
|
54
|
+
# defined colour for a particular interface, line or stream overrides
|
55
|
+
# previously defined entries in the same block.
|
56
|
+
#
|
57
|
+
# @param attributes [Hash] See {Vedeu::Colour}
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# interface 'my_interface' do
|
61
|
+
# colour background: '#ff00ff', foreground: '#ffff00'
|
62
|
+
# # ...
|
63
|
+
#
|
64
|
+
# lines do
|
65
|
+
# colour background: '#000000', foreground: '#ffffff'
|
66
|
+
# # ...
|
67
|
+
#
|
68
|
+
# stream do
|
69
|
+
# colour background: '#000000', foreground: '#ffffff'
|
70
|
+
# # ...
|
71
|
+
#
|
72
|
+
# @return [Hash]
|
73
|
+
def colour(attributes = {})
|
74
|
+
attributes.delete_if do |k, v|
|
75
|
+
[:background, :foreground].include?(k) == false || v.nil? || v.empty?
|
76
|
+
end
|
77
|
+
|
78
|
+
model.colour = Vedeu::Colour.new(attributes)
|
79
|
+
end
|
80
|
+
|
81
|
+
end # Colour
|
82
|
+
|
83
|
+
end # DSL
|
84
|
+
|
85
|
+
end # Vedeu
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
# Provides a style helper for use in the {DSL::Interface}, {DSL::Line} and
|
6
|
+
# {DSL::Stream} classes.
|
7
|
+
#
|
8
|
+
# @api public
|
9
|
+
module Style
|
10
|
+
|
11
|
+
# Define a style or styles for an interface, line or a stream.
|
12
|
+
#
|
13
|
+
# @param value [Array|Symbol|String]
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# interface 'my_interface' do
|
17
|
+
# style 'normal'
|
18
|
+
# ...
|
19
|
+
#
|
20
|
+
# lines do
|
21
|
+
# style ['bold', 'underline']
|
22
|
+
# ...
|
23
|
+
#
|
24
|
+
# stream do
|
25
|
+
# style 'blink'
|
26
|
+
# ...
|
27
|
+
#
|
28
|
+
# @return [Vedeu::Style]
|
29
|
+
def style(value)
|
30
|
+
model.style = Vedeu::Style.coerce(value)
|
31
|
+
end
|
32
|
+
alias_method :styles, :style
|
33
|
+
|
34
|
+
end # Style
|
35
|
+
|
36
|
+
end # DSL
|
37
|
+
|
38
|
+
end # Vedeu
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'vedeu/support/text'
|
2
|
+
|
3
|
+
module Vedeu
|
4
|
+
|
5
|
+
module DSL
|
6
|
+
|
7
|
+
module Text
|
8
|
+
|
9
|
+
# Specify the content for a view. Provides the means to align a string
|
10
|
+
# (or object responding to `to_s`), and add it as a Line or to the Stream.
|
11
|
+
#
|
12
|
+
# @note If using the convenience methods; {left}, {centre}, {center} or
|
13
|
+
# {right}, then a specified anchor will be ignored.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# lines do
|
17
|
+
# centre '...'
|
18
|
+
#
|
19
|
+
# line do
|
20
|
+
# right '...'
|
21
|
+
#
|
22
|
+
# left 'This will be left aligned.', width: 35
|
23
|
+
# # => 'This will be left aligned. '
|
24
|
+
#
|
25
|
+
# centre 'This will be aligned centrally.', width: 35
|
26
|
+
# # => ' This will be aligned centrally. '
|
27
|
+
# # centre is also aliased to center
|
28
|
+
#
|
29
|
+
# right 'This will be right aligned.', width: 35
|
30
|
+
# # => ' This will be right aligned.'
|
31
|
+
|
32
|
+
# right 'This will be right aligned.', width: 35, anchor: centre
|
33
|
+
# # => ' This will be right aligned.'
|
34
|
+
#
|
35
|
+
# text 'This will be truncated here. More text here.', width: 28
|
36
|
+
# # => 'This will be truncated here.'
|
37
|
+
#
|
38
|
+
# text 'Padded with hyphens.', width: 25, pad: '-', anchor: :right
|
39
|
+
# # => '-----Padded with hyphens.'
|
40
|
+
#
|
41
|
+
# @param value [String|Object] A string or object that responds to `to_s`.
|
42
|
+
# @param options [Hash] Text options.
|
43
|
+
# @option options :anchor [Symbol] One of `:left`, `:centre`/`:center`, or
|
44
|
+
# `:right`.
|
45
|
+
# @option options :width [Integer|NilClass] The width of the text stream
|
46
|
+
# to add. If the `string` provided is longer than this value, the string
|
47
|
+
# will be truncated. If no width is provided in the context of 'lines',
|
48
|
+
# then the interface width is used. If no width is provided in the
|
49
|
+
# context of a 'stream', then no alignment will occur.
|
50
|
+
# @option options :pad [String] The character to use to pad the width, by
|
51
|
+
# default uses an empty space (0x20). Only when the string is shorter
|
52
|
+
# than the specified width.
|
53
|
+
# @return [String]
|
54
|
+
def text(value = '', options = {})
|
55
|
+
output = Vedeu::Text.with(value, options.merge({ anchor: __callee__ }))
|
56
|
+
|
57
|
+
content = if model.is_a?(Vedeu::Interface)
|
58
|
+
stream = stream_builder({ value: output })
|
59
|
+
Vedeu::Line.build({ streams: [stream], parent: model })
|
60
|
+
|
61
|
+
elsif model.is_a?(Vedeu::Line)
|
62
|
+
stream_builder({ value: output })
|
63
|
+
|
64
|
+
elsif model.is_a?(Vedeu::Stream)
|
65
|
+
stream_builder({ value: output, parent: model.parent })
|
66
|
+
|
67
|
+
else
|
68
|
+
# should never get here
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
model.add(content)
|
73
|
+
end
|
74
|
+
alias_method :align, :text
|
75
|
+
alias_method :center, :text
|
76
|
+
alias_method :centre, :text
|
77
|
+
alias_method :left, :text
|
78
|
+
alias_method :right, :text
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
# @param attrs [Hash]
|
83
|
+
# @return [Vedeu::Stream]
|
84
|
+
def stream_builder(attrs)
|
85
|
+
Vedeu::Stream.build(stream_attributes(attrs))
|
86
|
+
end
|
87
|
+
|
88
|
+
# @param attrs [Hash]
|
89
|
+
# @return [Hash]
|
90
|
+
def stream_attributes(attrs)
|
91
|
+
{
|
92
|
+
colour: model.colour,
|
93
|
+
parent: model,
|
94
|
+
style: model.style,
|
95
|
+
}.merge(attrs)
|
96
|
+
end
|
97
|
+
|
98
|
+
end # Text
|
99
|
+
|
100
|
+
end # DSL
|
101
|
+
|
102
|
+
end # Vedeu
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
module Use
|
6
|
+
|
7
|
+
extend self
|
8
|
+
|
9
|
+
# Use the specified interface; useful for sharing attributes with other
|
10
|
+
# interfaces. Any public method of {Vedeu::Interface} is available.
|
11
|
+
#
|
12
|
+
# @example
|
13
|
+
# Vedeu.interface 'my_interface' do
|
14
|
+
# # use the delay of another interface
|
15
|
+
# delay Vedeu.use('my_other_interface').delay
|
16
|
+
# # ...
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# Vedeu.interface 'my_interface' do
|
20
|
+
# geometry do
|
21
|
+
# # use the width of another interface
|
22
|
+
# width Vedeu.use('my_other_interface').width
|
23
|
+
# # ...
|
24
|
+
# end
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# Vedeu.use('my_other_interface').width # can be used in your code to
|
28
|
+
# # get this value
|
29
|
+
#
|
30
|
+
# @param value [String] The name of the interface you wish to use.
|
31
|
+
# Typically used when defining interfaces to share geometry.
|
32
|
+
# @return [Vedeu::Interface]
|
33
|
+
def use(value)
|
34
|
+
if Vedeu.interfaces.registered?(value) == false
|
35
|
+
fail ModelNotFound, "The properties of this interface (#{value}) " \
|
36
|
+
"cannot be used, since the interface has not " \
|
37
|
+
"been defined."
|
38
|
+
end
|
39
|
+
|
40
|
+
Vedeu.interfaces.find(value)
|
41
|
+
end
|
42
|
+
|
43
|
+
end # Use
|
44
|
+
|
45
|
+
end # DSL
|
46
|
+
|
47
|
+
end # Vedeu
|