vedeu 0.7.4 → 0.8.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/.rubocop.yml +3 -0
- data/docs/api.md +5 -1
- data/docs/borders.md +2 -26
- data/docs/dsl.md +4 -4
- data/docs/dsl_elements.md +100 -0
- data/docs/events/by_name/action.md +3 -0
- data/docs/events/by_name/cursor_hide.md +3 -0
- data/docs/events/by_name/cursor_reset.md +3 -0
- data/docs/events/by_name/cursor_show.md +3 -0
- data/docs/events/by_name/geometry_down.md +3 -0
- data/docs/events/by_name/geometry_left.md +3 -0
- data/docs/events/by_name/geometry_right.md +3 -0
- data/docs/events/by_name/geometry_up.md +3 -0
- data/docs/events/by_name/hide_view.md +3 -0
- data/docs/events/by_name/set_border_caption.md +13 -0
- data/docs/events/by_name/set_border_title.md +13 -0
- data/docs/events/by_name/show_view.md +3 -0
- data/docs/events/by_name/standalone.md +3 -0
- data/docs/events/by_name/toggle_view.md +3 -0
- data/docs/events/by_name/view_down.md +4 -0
- data/docs/events/by_name/view_left.md +4 -0
- data/docs/events/by_name/view_right.md +4 -0
- data/docs/events/by_name/view_up.md +4 -0
- data/examples/views/empty_template.rb +46 -0
- data/examples/views/expected/line.out +1 -0
- data/examples/views/expected/lines.out +1 -0
- data/examples/views/expected/lines_alignment.out +1 -0
- data/examples/views/line.rb +220 -0
- data/examples/views/lines.rb +281 -0
- data/examples/views/lines_alignment.rb +231 -0
- data/examples/views/lines_line_stream.rb +99 -0
- data/examples/views/lines_line_streams.rb +73 -0
- data/examples/views/lines_line_streams_stream.rb +83 -0
- data/examples/views/lines_line_streams_stream_stream.rb +53 -0
- data/examples/views/lines_streams.rb +50 -0
- data/examples/views/lines_streams_stream.rb +51 -0
- data/examples/views/runner.sh +27 -0
- data/lib/vedeu/all.rb +6 -2
- data/lib/vedeu/application/controller.rb +1 -1
- data/lib/vedeu/boolean.rb +35 -0
- data/lib/vedeu/borders/border.rb +3 -3
- data/lib/vedeu/borders/caption.rb +1 -1
- data/lib/vedeu/borders/dsl.rb +1 -20
- data/lib/vedeu/borders/title.rb +6 -8
- data/lib/vedeu/buffers/buffer.rb +2 -2
- data/lib/vedeu/buffers/refresh.rb +1 -1
- data/lib/vedeu/cells/border.rb +0 -11
- data/lib/vedeu/cells/empty.rb +4 -4
- data/lib/vedeu/{geometries/alignment → coercers}/alignment.rb +50 -53
- data/lib/vedeu/coercers/all.rb +16 -0
- data/lib/vedeu/coercers/colour.rb +78 -0
- data/lib/vedeu/coercers/colour_attributes.rb +122 -0
- data/lib/vedeu/coercers/horizontal_alignment.rb +28 -0
- data/lib/vedeu/coercers/vertical_alignment.rb +27 -0
- data/lib/vedeu/colours/all.rb +1 -0
- data/lib/vedeu/colours/background.rb +13 -2
- data/lib/vedeu/colours/colour.rb +16 -31
- data/lib/vedeu/colours/foreground.rb +13 -2
- data/lib/vedeu/colours/translator.rb +21 -59
- data/lib/vedeu/colours/validator.rb +84 -0
- data/lib/vedeu/common.rb +52 -0
- data/lib/vedeu/configuration/api.rb +4 -10
- data/lib/vedeu/configuration/configuration.rb +4 -4
- data/lib/vedeu/cursors/coordinate.rb +1 -1
- data/lib/vedeu/cursors/cursor.rb +1 -1
- data/lib/vedeu/cursors/dsl.rb +1 -28
- data/lib/vedeu/dsl/all.rb +7 -7
- data/lib/vedeu/dsl/attributes.rb +224 -0
- data/lib/vedeu/dsl/border.rb +127 -0
- data/lib/vedeu/dsl/cursors.rb +44 -0
- data/lib/vedeu/dsl/dsl.rb +9 -0
- data/lib/vedeu/dsl/elements.rb +335 -0
- data/lib/vedeu/dsl/geometry.rb +113 -0
- data/lib/vedeu/dsl/string/align.rb +127 -0
- data/lib/vedeu/dsl/string/all.rb +14 -0
- data/lib/vedeu/dsl/string/text.rb +107 -0
- data/lib/vedeu/dsl/string/truncate.rb +111 -0
- data/lib/vedeu/{output → dsl/string}/wordwrap.rb +10 -6
- data/lib/vedeu/dsl/view.rb +124 -248
- data/lib/vedeu/dsl/views.rb +244 -0
- data/lib/vedeu/editor/cursor.rb +1 -1
- data/lib/vedeu/editor/delete.rb +3 -1
- data/lib/vedeu/editor/insert.rb +22 -6
- data/lib/vedeu/editor/line.rb +15 -9
- data/lib/vedeu/editor/lines.rb +27 -18
- data/lib/vedeu/esc/actions.rb +73 -26
- data/lib/vedeu/esc/all.rb +2 -0
- data/lib/vedeu/esc/background.rb +219 -0
- data/lib/vedeu/esc/borders.rb +72 -26
- data/lib/vedeu/esc/colours.rb +26 -27
- data/lib/vedeu/esc/esc.rb +4 -4
- data/lib/vedeu/esc/foreground.rb +219 -0
- data/lib/vedeu/esc/mouse.rb +16 -13
- data/lib/vedeu/events/aliases.rb +2 -2
- data/lib/vedeu/events/event.rb +1 -1
- data/lib/vedeu/geometries/all.rb +0 -1
- data/lib/vedeu/geometries/area/dimension.rb +2 -2
- data/lib/vedeu/geometries/dsl/dsl.rb +3 -51
- data/lib/vedeu/geometries/dsl/validator.rb +4 -4
- data/lib/vedeu/geometries/geometry.rb +10 -10
- data/lib/vedeu/geometries/move.rb +4 -4
- data/lib/vedeu/groups/dsl.rb +1 -0
- data/lib/vedeu/groups/group.rb +1 -1
- data/lib/vedeu/input/all.rb +1 -0
- data/lib/vedeu/input/capture.rb +14 -10
- data/lib/vedeu/input/dsl.rb +20 -26
- data/lib/vedeu/input/key.rb +0 -6
- data/lib/vedeu/input/keymap.rb +4 -9
- data/lib/vedeu/input/keys.rb +13 -0
- data/lib/vedeu/input/mapper.rb +29 -14
- data/lib/vedeu/input/read.rb +4 -2
- data/lib/vedeu/interfaces/dsl.rb +23 -22
- data/lib/vedeu/interfaces/interface.rb +2 -2
- data/lib/vedeu/logging/debug.rb +33 -0
- data/lib/vedeu/logging/log.rb +42 -33
- data/lib/vedeu/menus/dsl.rb +7 -18
- data/lib/vedeu/menus/menu.rb +1 -1
- data/lib/vedeu/models/focus.rb +1 -1
- data/lib/vedeu/models/toggleable.rb +4 -4
- data/lib/vedeu/null/generic.rb +2 -2
- data/lib/vedeu/output/all.rb +0 -2
- data/lib/vedeu/output/compressor_cache.rb +1 -1
- data/lib/vedeu/output/output.rb +5 -20
- data/lib/vedeu/presentation/colour.rb +39 -7
- data/lib/vedeu/presentation/style.rb +25 -11
- data/lib/vedeu/renderers/html.rb +11 -11
- data/lib/vedeu/repositories/assemblage.rb +9 -0
- data/lib/vedeu/repositories/collection.rb +1 -0
- data/lib/vedeu/repositories/defaults.rb +4 -1
- data/lib/vedeu/repositories/model.rb +7 -37
- data/lib/vedeu/repositories/parent.rb +6 -6
- data/lib/vedeu/repositories/registerable.rb +16 -2
- data/lib/vedeu/repositories/repositories.rb +1 -1
- data/lib/vedeu/repositories/repository.rb +2 -12
- data/lib/vedeu/runtime/flags.rb +1 -1
- data/lib/vedeu/terminal/terminal.rb +7 -2
- data/lib/vedeu/version.rb +1 -1
- data/lib/vedeu/views/all.rb +4 -1
- data/lib/vedeu/views/char.rb +5 -4
- data/lib/vedeu/views/chars.rb +42 -0
- data/lib/vedeu/views/composition.rb +15 -30
- data/lib/vedeu/views/default_attributes.rb +74 -0
- data/lib/vedeu/views/html_char.rb +2 -2
- data/lib/vedeu/views/line.rb +27 -53
- data/lib/vedeu/views/lines.rb +31 -0
- data/lib/vedeu/views/stream.rb +31 -78
- data/lib/vedeu/views/streams.rb +42 -0
- data/lib/vedeu/views/value.rb +150 -0
- data/lib/vedeu/views/view.rb +32 -36
- data/lib/vedeu/views/{view_collection.rb → views.rb} +2 -2
- data/test/lib/vedeu/application/application_controller_test.rb +5 -0
- data/test/lib/vedeu/application/controller_test.rb +22 -28
- data/test/lib/vedeu/boolean_test.rb +57 -0
- data/test/lib/vedeu/borders/border_test.rb +130 -36
- data/test/lib/vedeu/borders/dsl_test.rb +63 -10
- data/test/lib/vedeu/borders/title_test.rb +16 -5
- data/test/lib/vedeu/buffers/buffer_test.rb +26 -10
- data/test/lib/vedeu/buffers/empty_test.rb +1 -1
- data/test/lib/vedeu/cells/border_test.rb +0 -6
- data/test/lib/vedeu/cells/clear_test.rb +2 -0
- data/test/lib/vedeu/cells/empty_test.rb +12 -2
- data/test/lib/vedeu/cells/escape_test.rb +7 -2
- data/test/lib/vedeu/{geometries/alignment → coercers}/alignment_test.rb +44 -19
- data/test/lib/vedeu/coercers/colour_attributes_test.rb +168 -0
- data/test/lib/vedeu/coercers/colour_test.rb +75 -0
- data/test/lib/vedeu/{geometries/alignment → coercers}/horizontal_alignment_test.rb +6 -6
- data/test/lib/vedeu/{geometries/alignment → coercers}/vertical_alignment_test.rb +6 -6
- data/test/lib/vedeu/colours/background_test.rb +17 -1
- data/test/lib/vedeu/colours/colour_test.rb +74 -2
- data/test/lib/vedeu/colours/foreground_test.rb +17 -1
- data/test/lib/vedeu/colours/repository_test.rb +1 -1
- data/test/lib/vedeu/colours/translator_test.rb +8 -1
- data/test/lib/vedeu/colours/validator_test.rb +60 -0
- data/test/lib/vedeu/common_test.rb +138 -0
- data/test/lib/vedeu/configuration/api_test.rb +96 -51
- data/test/lib/vedeu/cursors/coordinate_test.rb +58 -117
- data/test/lib/vedeu/cursors/cursor_test.rb +46 -17
- data/test/lib/vedeu/cursors/dsl_test.rb +19 -5
- data/test/lib/vedeu/distributed/client_test.rb +8 -3
- data/test/lib/vedeu/distributed/server_test.rb +8 -0
- data/test/lib/vedeu/distributed/test_application_test.rb +62 -19
- data/test/lib/vedeu/distributed/uri_test.rb +4 -2
- data/test/lib/vedeu/dsl/attributes_test.rb +212 -0
- data/test/lib/vedeu/dsl/border_test.rb +51 -0
- data/test/lib/vedeu/dsl/{lines_test.rb → cursors_test.rb} +2 -2
- data/test/lib/vedeu/dsl/dsl_test.rb +44 -0
- data/test/lib/vedeu/dsl/elements_test.rb +118 -0
- data/test/lib/vedeu/dsl/geometry_test.rb +35 -0
- data/test/lib/vedeu/dsl/presentation_test.rb +52 -11
- data/test/lib/vedeu/dsl/string/align_test.rb +147 -0
- data/test/lib/vedeu/dsl/string/text_test.rb +213 -0
- data/test/lib/vedeu/dsl/string/truncate_test.rb +97 -0
- data/test/lib/vedeu/{output → dsl/string}/wordwrap_test.rb +3 -3
- data/test/lib/vedeu/dsl/view_test.rb +30 -42
- data/test/lib/vedeu/dsl/views_test.rb +61 -0
- data/test/lib/vedeu/editor/cursor_test.rb +30 -12
- data/test/lib/vedeu/editor/document_test.rb +18 -10
- data/test/lib/vedeu/editor/line_test.rb +4 -1
- data/test/lib/vedeu/editor/lines_test.rb +11 -3
- data/test/lib/vedeu/esc/actions_test.rb +42 -4
- data/test/lib/vedeu/esc/background_test.rb +185 -0
- data/test/lib/vedeu/esc/borders_test.rb +37 -9
- data/test/lib/vedeu/esc/colours_test.rb +0 -59
- data/test/lib/vedeu/esc/foreground_test.rb +185 -0
- data/test/lib/vedeu/esc/mouse_test.rb +9 -4
- data/test/lib/vedeu/geometries/area/area_test.rb +34 -11
- data/test/lib/vedeu/geometries/dsl/dsl_test.rb +52 -61
- data/test/lib/vedeu/geometries/geometry_test.rb +62 -18
- data/test/lib/vedeu/geometries/position_test.rb +14 -7
- data/test/lib/vedeu/groups/dsl_test.rb +24 -15
- data/test/lib/vedeu/groups/group_test.rb +18 -8
- data/test/lib/vedeu/input/dsl_test.rb +33 -16
- data/test/lib/vedeu/input/key_test.rb +8 -1
- data/test/lib/vedeu/input/keymap_test.rb +4 -1
- data/test/lib/vedeu/input/keys_test.rb +16 -0
- data/test/lib/vedeu/interfaces/dsl_test.rb +24 -30
- data/test/lib/vedeu/interfaces/interface_test.rb +79 -24
- data/test/lib/vedeu/logging/ips_test.rb +10 -1
- data/test/lib/vedeu/menus/dsl_test.rb +24 -23
- data/test/lib/vedeu/menus/menu_test.rb +18 -8
- data/test/lib/vedeu/models/page_test.rb +5 -1
- data/test/lib/vedeu/models/row_test.rb +4 -0
- data/test/lib/vedeu/models/toggleable_test.rb +10 -6
- data/test/lib/vedeu/null/generic_test.rb +90 -1
- data/test/lib/vedeu/output/viewport_test.rb +11 -10
- data/test/lib/vedeu/plugins/plugin_test.rb +22 -9
- data/test/lib/vedeu/presentation/colour_test.rb +2 -1
- data/test/lib/vedeu/presentation/presentation_test.rb +13 -8
- data/test/lib/vedeu/presentation/style_test.rb +28 -13
- data/test/lib/vedeu/renderers/file_test.rb +4 -2
- data/test/lib/vedeu/renderers/options_test.rb +1 -1
- data/test/lib/vedeu/repositories/assemblage_test.rb +18 -0
- data/test/lib/vedeu/repositories/collection_test.rb +34 -10
- data/test/lib/vedeu/repositories/defaults_test.rb +6 -0
- data/test/lib/vedeu/repositories/model_test.rb +4 -13
- data/test/lib/vedeu/repositories/repository_test.rb +12 -5
- data/test/lib/vedeu/repositories/store_test.rb +9 -0
- data/test/lib/vedeu/runtime/flags_test.rb +6 -4
- data/test/lib/vedeu/runtime/launcher_test.rb +1 -1
- data/test/lib/vedeu/templating/helpers_test.rb +93 -65
- data/test/lib/vedeu/templating/view_template_test.rb +26 -26
- data/test/lib/vedeu/views/char_test.rb +36 -11
- data/test/lib/vedeu/views/chars_test.rb +71 -0
- data/test/lib/vedeu/views/composition_test.rb +17 -16
- data/test/lib/vedeu/views/default_attributes_test.rb +97 -0
- data/test/lib/vedeu/views/line_test.rb +20 -75
- data/test/lib/vedeu/views/lines_test.rb +47 -0
- data/test/lib/vedeu/views/stream_test.rb +38 -63
- data/test/lib/vedeu/views/streams_test.rb +9 -0
- data/test/lib/vedeu/views/value_test.rb +112 -0
- data/test/lib/vedeu/views/view_test.rb +67 -45
- data/test/lib/vedeu/views/views_test.rb +22 -0
- data/test/support/examples/material_colours_app.rb +2 -2
- data/test/support/helpers/model_test_class.rb +1 -0
- data/test/test_helper.rb +3 -1
- data/vedeu.gemspec +2 -2
- metadata +124 -58
- data/lib/vedeu/dsl/composition.rb +0 -150
- data/lib/vedeu/dsl/line.rb +0 -119
- data/lib/vedeu/dsl/lines.rb +0 -23
- data/lib/vedeu/dsl/shared.rb +0 -85
- data/lib/vedeu/dsl/stream.rb +0 -40
- data/lib/vedeu/dsl/streams.rb +0 -23
- data/lib/vedeu/dsl/text.rb +0 -98
- data/lib/vedeu/geometries/alignment/all.rb +0 -11
- data/lib/vedeu/geometries/alignment/horizontal_alignment.rb +0 -27
- data/lib/vedeu/geometries/alignment/vertical_alignment.rb +0 -27
- data/lib/vedeu/output/text.rb +0 -275
- data/test/lib/vedeu/dsl/composition_test.rb +0 -67
- data/test/lib/vedeu/dsl/line_test.rb +0 -85
- data/test/lib/vedeu/dsl/shared_test.rb +0 -66
- data/test/lib/vedeu/dsl/stream_test.rb +0 -30
- data/test/lib/vedeu/dsl/streams_test.rb +0 -13
- data/test/lib/vedeu/dsl/text_test.rb +0 -122
- data/test/lib/vedeu/output/text_test.rb +0 -156
- data/test/lib/vedeu/views/view_collection_test.rb +0 -13
@@ -1,19 +1,23 @@
|
|
1
1
|
module Vedeu
|
2
2
|
|
3
|
-
module
|
3
|
+
module DSL
|
4
4
|
|
5
|
-
# Wrap or prune text
|
5
|
+
# Wrap or prune a text value based on given options when building
|
6
|
+
# views.
|
7
|
+
#
|
8
|
+
# @api private
|
6
9
|
#
|
7
10
|
class Wordwrap
|
8
11
|
|
9
12
|
include Vedeu::Common
|
10
13
|
|
11
|
-
# @see
|
14
|
+
# @param (see #initialize)
|
15
|
+
# @return (see #content)
|
12
16
|
def self.for(text, options = {})
|
13
17
|
new(text, options).content
|
14
18
|
end
|
15
19
|
|
16
|
-
# Returns a new instance of Vedeu::
|
20
|
+
# Returns a new instance of Vedeu::DSL::Wordwrap.
|
17
21
|
#
|
18
22
|
# @param text [String]
|
19
23
|
# @param options [Hash]
|
@@ -21,7 +25,7 @@ module Vedeu
|
|
21
25
|
# @option options mode [Symbol] See {#mode}.
|
22
26
|
# @option options name [String|Symbol] See {#name}.
|
23
27
|
# @option options width [Fixnum] See {#width}.
|
24
|
-
# @return [Vedeu::
|
28
|
+
# @return [Vedeu::DSL::Wordwrap]
|
25
29
|
def initialize(text, options = {})
|
26
30
|
@text = text
|
27
31
|
@options = defaults.merge!(options)
|
@@ -201,6 +205,6 @@ module Vedeu
|
|
201
205
|
|
202
206
|
end # Wordwrap
|
203
207
|
|
204
|
-
end #
|
208
|
+
end # DSL
|
205
209
|
|
206
210
|
end # Vedeu
|
data/lib/vedeu/dsl/view.rb
CHANGED
@@ -2,273 +2,149 @@ module Vedeu
|
|
2
2
|
|
3
3
|
module DSL
|
4
4
|
|
5
|
-
#
|
6
|
-
# to draw the view to the screen immediately (immediate render) or
|
7
|
-
# you want to save a view to be drawn when you trigger a refresh
|
8
|
-
# event later (deferred view).
|
5
|
+
# DSL for creating collections of interfaces.
|
9
6
|
#
|
10
|
-
#
|
11
|
-
#
|
12
|
-
#
|
13
|
-
|
14
|
-
#
|
15
|
-
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
21
|
-
#
|
22
|
-
#
|
23
|
-
#
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
#
|
30
|
-
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
#
|
39
|
-
#
|
40
|
-
#
|
41
|
-
#
|
42
|
-
#
|
43
|
-
# currently showing. When a refresh event is fired, again,
|
44
|
-
# globally or for that interface specifically, the content of this
|
45
|
-
# 'front' buffer is first copied to the 'previous' buffer, and
|
46
|
-
# then the current 'back' buffer overwrites this 'front' buffer.
|
47
|
-
#
|
48
|
-
# The 'previous' buffer contains what was shown on the 'front'
|
49
|
-
# before the current 'front'.
|
50
|
-
#
|
51
|
-
# You can only write to either the 'front' (you want the content
|
52
|
-
# to be drawn immediately (immediate render)) or the 'back' (you
|
53
|
-
# would like the content to be drawn on the next refresh
|
54
|
-
# (deferred view)).
|
55
|
-
#
|
56
|
-
# The basic view DSL methods look like this:
|
57
|
-
#
|
58
|
-
# renders/views
|
59
|
-
# |- view
|
60
|
-
# |- lines
|
61
|
-
# | |- line
|
62
|
-
# | |- streams
|
63
|
-
# | | |- stream
|
64
|
-
# | | |- char
|
65
|
-
# | |
|
66
|
-
# | |- stream
|
67
|
-
# | |- char
|
68
|
-
# |
|
69
|
-
# |- line
|
70
|
-
# |- streams
|
71
|
-
# | |- stream
|
72
|
-
# | |- char
|
73
|
-
# |
|
74
|
-
# |- stream
|
75
|
-
# |- char
|
76
|
-
#
|
77
|
-
# renders/views
|
78
|
-
# |- view
|
79
|
-
# |- lines/line
|
80
|
-
# |- streams/stream
|
81
|
-
# |- char
|
7
|
+
# Views with Vedeu are made up of simple building blocks. These
|
8
|
+
# blocks can be arranged in a multitude of ways which I hope is
|
9
|
+
# more than sufficient for your design needs.
|
10
|
+
|
11
|
+
# - A view (`View`) is made up of one or more interfaces.
|
12
|
+
# - An interface is an area on the screen where you can take input
|
13
|
+
# or direct output. You will define it's colour and style, its
|
14
|
+
# dimensions, including position and give it a name. You can
|
15
|
+
# then direct the output of a command, or event, to this
|
16
|
+
# interface and Vedeu will ensure the content is placed there.
|
17
|
+
# - Interfaces (`Interface`) are made up of lines (`Line`), their
|
18
|
+
# length being the width of the interface and their number being
|
19
|
+
# the height of the interface.
|
20
|
+
# - An interface with `width: 12, height: 5` will have five lines,
|
21
|
+
# each made of 12 characters- providing 60 cells. Colours and
|
22
|
+
# styles are handled by terminal escape sequences and therefore
|
23
|
+
# do not consume a cell.
|
24
|
+
# - Lines are made up of zero, one or multiple streams which are
|
25
|
+
# basically subsets of the line.
|
26
|
+
# - An interface, line or stream can have a colour attribute.
|
27
|
+
# - An interface, line or stream can have a style attribute.
|
28
|
+
# - Interfaces have a position (`y`, `x`) on the screen, and a
|
29
|
+
# size. (`width`, `height`)
|
30
|
+
# - Interfaces can be placed relative to each other based on their
|
31
|
+
# attributes.
|
32
|
+
# - An interface has a `top`, `right`, `bottom`, `left`.
|
33
|
+
# - An interface also has a `north` and `west` (`top` and `left`
|
34
|
+
# minus 1 respectively).
|
35
|
+
# - An interface also has a `south` and `east` (`bottom` and
|
36
|
+
# `right` plus 1 respectively).
|
37
|
+
# - Colours are defined in CSS-style values, i.e. `#ff0000` would
|
38
|
+
# be red.
|
39
|
+
# - Styles are named. See the table below for supported styles.
|
82
40
|
#
|
83
41
|
class View
|
84
42
|
|
85
43
|
include Vedeu::DSL
|
86
|
-
include Vedeu::Cursors::DSL
|
87
|
-
include Vedeu::DSL::Presentation
|
88
|
-
include Vedeu::DSL::Shared
|
89
|
-
include Vedeu::DSL::Text
|
90
|
-
include Vedeu::DSL::Use
|
91
|
-
|
92
|
-
class << self
|
93
|
-
|
94
|
-
include Vedeu::Common
|
95
44
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
# # ... some code
|
120
|
-
# end
|
121
|
-
#
|
122
|
-
# # or...
|
123
|
-
#
|
124
|
-
# Vedeu.render do
|
125
|
-
# view :my_interface do
|
126
|
-
# # ... some code
|
127
|
-
# end
|
128
|
-
# end
|
129
|
-
#
|
130
|
-
# @param block [Proc] The directives you wish to send to
|
131
|
-
# render. Typically includes `view` with associated
|
132
|
-
# sub-directives.
|
133
|
-
# @raise [Vedeu::Error::RequiresBlock]
|
134
|
-
# @return [Array<View>]
|
135
|
-
def renders(&block)
|
136
|
-
fail Vedeu::Error::RequiresBlock unless block_given?
|
137
|
-
|
138
|
-
client = eval('self', block.binding)
|
139
|
-
|
140
|
-
store(:store_immediate, client, &block)
|
141
|
-
end
|
142
|
-
alias_method :render, :renders
|
143
|
-
|
144
|
-
# Define a view (content) for an interface.
|
145
|
-
#
|
146
|
-
# As you can see by comparing the examples above to these
|
147
|
-
# below, the immediate render simply wraps what is already
|
148
|
-
# here in the deferred view.
|
149
|
-
#
|
150
|
-
# The views declared within this block are stored in their
|
151
|
-
# respective interface back buffers until a refresh event
|
152
|
-
# occurs. When the refresh event is triggered, the back
|
153
|
-
# buffers are swapped into the front buffers and the content
|
154
|
-
# here will be rendered to {Vedeu::Terminal#output}.
|
155
|
-
#
|
156
|
-
# Vedeu.views do
|
157
|
-
# view :some_interface do
|
158
|
-
# line do
|
159
|
-
# stream do
|
160
|
-
# left 'Title goes here', width: 35
|
161
|
-
# end
|
162
|
-
# stream do
|
163
|
-
# right Time.now.strftime('%H:%m'), width: 7
|
164
|
-
# end
|
165
|
-
# end
|
166
|
-
# end
|
167
|
-
# view :other_interface do
|
168
|
-
# lines do
|
169
|
-
# line 'This is content for the main interface.'
|
170
|
-
# line ''
|
171
|
-
# line 'Pretty easy eh?'
|
172
|
-
# end
|
173
|
-
# end
|
174
|
-
# # ... some code
|
175
|
-
# end
|
176
|
-
#
|
177
|
-
# @param block [Proc] The directives you wish to send to
|
178
|
-
# render. Typically includes `view` with associated
|
179
|
-
# sub-directives.
|
180
|
-
# @raise [Vedeu::Error::RequiresBlock]
|
181
|
-
# @return [Array<View>]
|
182
|
-
def views(&block)
|
183
|
-
fail Vedeu::Error::RequiresBlock unless block_given?
|
184
|
-
|
185
|
-
client = eval('self', block.binding)
|
186
|
-
|
187
|
-
store(:store_deferred, client, &block)
|
188
|
-
end
|
189
|
-
|
190
|
-
private
|
191
|
-
|
192
|
-
# Returns the client object which called the DSL method.
|
193
|
-
#
|
194
|
-
# @param block [Proc]
|
195
|
-
# @return [Object]
|
196
|
-
def client(&block)
|
197
|
-
eval('self', block.binding)
|
198
|
-
end
|
199
|
-
|
200
|
-
# Creates a new Vedeu::Views::Composition which may contain
|
201
|
-
# one or more views (Vedeu::Views::View objects).
|
202
|
-
#
|
203
|
-
# @param client [Object]
|
204
|
-
# @param block [Proc]
|
205
|
-
# @return [Vedeu::Views::Composition]
|
206
|
-
def composition(client, &block)
|
207
|
-
attrs = { client: client, colour: Vedeu::Configuration.colour }
|
208
|
-
|
209
|
-
Vedeu::Views::Composition.build(attrs, &block)
|
210
|
-
end
|
45
|
+
# Define a view.
|
46
|
+
#
|
47
|
+
# A view is just an Interface object.
|
48
|
+
#
|
49
|
+
# When a view already exists, we take its attributes and use
|
50
|
+
# them as the basis for the newly defined view. This way we
|
51
|
+
# don't need to specify everything again.
|
52
|
+
#
|
53
|
+
# @todo More documentation required.
|
54
|
+
# @param name [String|Symbol] The name of the interface you are
|
55
|
+
# targetting for this view.
|
56
|
+
# @param block [Proc] The directives you wish to send to this
|
57
|
+
# interface.
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# view :my_interface do
|
61
|
+
# # ...
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# @raise [Vedeu::Error::RequiresBlock]
|
65
|
+
# @return [Vedeu::Views::Views<Vedeu::Views::View>]
|
66
|
+
def view(name = '', &block)
|
67
|
+
fail Vedeu::Error::RequiresBlock unless block_given?
|
211
68
|
|
212
|
-
|
213
|
-
# one or more views (Vedeu::Views::View objects).
|
214
|
-
#
|
215
|
-
# Stores each of the views defined in their respective buffers
|
216
|
-
# ready to be rendered on next refresh.
|
217
|
-
#
|
218
|
-
# @param method [Symbol] An instruction; `:store_immediate` or
|
219
|
-
# `:store_deferred` which determines whether the view will
|
220
|
-
# be shown immediately or later respectively.
|
221
|
-
# @param client [Object] The client class which called the DSL
|
222
|
-
# object.
|
223
|
-
# @param block [Proc]
|
224
|
-
# @return [Array]
|
225
|
-
def store(method, client, &block)
|
226
|
-
composition(client, &block).views.map do |view|
|
227
|
-
view.public_send(method)
|
228
|
-
end
|
229
|
-
end
|
69
|
+
new_model = Vedeu::Views::View.build(new_attributes(name), &block)
|
230
70
|
|
231
|
-
|
71
|
+
model.add(new_model)
|
72
|
+
end
|
232
73
|
|
233
|
-
#
|
234
|
-
#
|
235
|
-
# @param block [Proc]
|
74
|
+
# Load content from an ERb template.
|
236
75
|
#
|
237
76
|
# @example
|
238
|
-
# Vedeu.
|
239
|
-
#
|
240
|
-
#
|
241
|
-
#
|
77
|
+
# Vedeu.renders do
|
78
|
+
# template_for(:my_interface,
|
79
|
+
# '/path/to/template.erb',
|
80
|
+
# @some_object, options)
|
242
81
|
# end
|
243
82
|
#
|
244
|
-
#
|
245
|
-
# line do
|
246
|
-
# # ... see {Vedeu::DSL::Line} and {Vedeu::DSL::Stream}
|
247
|
-
# end
|
248
|
-
# end
|
83
|
+
# @todo More documentation required.
|
249
84
|
#
|
250
|
-
# @
|
251
|
-
#
|
252
|
-
|
253
|
-
|
85
|
+
# @param name [String|Symbol] The name of interface for which this
|
86
|
+
# template's content belongs to.
|
87
|
+
# @param filename [String] The filename (including path) to the
|
88
|
+
# template to be used. Yoy can use `File.dirname(__FILE__)` to
|
89
|
+
# use relative paths.
|
90
|
+
# @param object [Object] The object for which the values of
|
91
|
+
# template's variables can be obtained.
|
92
|
+
# @param options [Hash<Symbol => void>] See {Vedeu::DSL::Wordwrap}
|
93
|
+
# @raise [Vedeu::Error::MissingRequired]
|
94
|
+
# @return [Vedeu::Views::Views<Vedeu::Views::View>]
|
95
|
+
def template_for(name, filename, object = nil, options = {})
|
96
|
+
fail Vedeu::Error::MissingRequired,
|
97
|
+
'Cannot render template without the name of the ' \
|
98
|
+
'view.'.freeze unless name
|
99
|
+
fail Vedeu::Error::MissingRequired,
|
100
|
+
'Cannot render template without a filename.'.freeze unless filename
|
101
|
+
|
102
|
+
options.merge!(name: name)
|
103
|
+
|
104
|
+
content = Vedeu::Templating::ViewTemplate.parse(object,
|
105
|
+
filename,
|
106
|
+
options)
|
107
|
+
|
108
|
+
# lines = Vedeu::DSL::Wordwrap.for(content, options)
|
109
|
+
|
110
|
+
new_model = Vedeu::Views::View.build(template_attributes(name, content))
|
111
|
+
|
112
|
+
model.add(new_model)
|
113
|
+
end
|
114
|
+
|
115
|
+
private
|
116
|
+
|
117
|
+
# @param name [String|Symbol]
|
118
|
+
# @param lines [Vedeu::Views::Lines]
|
119
|
+
# @return [Hash<Symbol => void>]
|
120
|
+
def template_attributes(name, lines)
|
121
|
+
new_attributes(name).merge!(value: lines)
|
122
|
+
end
|
254
123
|
|
255
|
-
|
124
|
+
# Return the current attributes combined with the existing
|
125
|
+
# interface attributes defined by the interface.
|
126
|
+
#
|
127
|
+
# @param name [String|Symbol] The name of the interface.
|
128
|
+
# @return [Hash<Symbol => void>]
|
129
|
+
def new_attributes(name)
|
130
|
+
existing_attributes(name).merge!(attributes)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Retrieve the attributes of the interface by name.
|
134
|
+
#
|
135
|
+
# @param name [String|Symbol] The name of the interface.
|
136
|
+
# @return [Hash<Symbol => void>]
|
137
|
+
def existing_attributes(name)
|
138
|
+
interface(name).attributes
|
139
|
+
end
|
140
|
+
|
141
|
+
# @return [Vedeu::Interfaces::Interface]
|
142
|
+
def interface(name)
|
143
|
+
Vedeu.interfaces.by_name(name)
|
256
144
|
end
|
257
|
-
alias_method :line, :lines
|
258
145
|
|
259
146
|
end # View
|
260
147
|
|
261
148
|
end # DSL
|
262
149
|
|
263
|
-
# @!method render
|
264
|
-
# @see Vedeu::DSL::View.render
|
265
|
-
# @!method renders
|
266
|
-
# @see Vedeu::DSL::View.renders
|
267
|
-
# @!method views
|
268
|
-
# @see Vedeu::DSL::View.views
|
269
|
-
def_delegators Vedeu::DSL::View,
|
270
|
-
:renders,
|
271
|
-
:render,
|
272
|
-
:views
|
273
|
-
|
274
150
|
end # Vedeu
|
@@ -0,0 +1,244 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
module DSL
|
4
|
+
|
5
|
+
# There are two ways to construct views with Vedeu. You would like
|
6
|
+
# to draw the view to the screen immediately (immediate render) or
|
7
|
+
# you want to save a view to be drawn when you trigger a refresh
|
8
|
+
# event later (deferred view).
|
9
|
+
#
|
10
|
+
# Both of these approaches require that you have defined an
|
11
|
+
# interface (or 'visible area') first. You can find out how to
|
12
|
+
# define an interface with Vedeu below or in
|
13
|
+
# {Vedeu::Interfaces::DSL}. The examples in 'Immediate Render' and
|
14
|
+
# 'Deferred View' use these interface definitions: (Note: should
|
15
|
+
# you use these examples, ensure your terminal is at least 70
|
16
|
+
# characters in width and 5 lines in height.)
|
17
|
+
#
|
18
|
+
# Vedeu.interface :main do
|
19
|
+
# geometry do
|
20
|
+
# height 4
|
21
|
+
# width 50
|
22
|
+
# end
|
23
|
+
# end
|
24
|
+
#
|
25
|
+
# Vedeu.interface :title do
|
26
|
+
# geometry do
|
27
|
+
# height 1
|
28
|
+
# width 50
|
29
|
+
# x use('main').left
|
30
|
+
# y use('main').north
|
31
|
+
# end
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# Both of these approaches use a concept of Buffers in Vedeu.
|
35
|
+
# There are three buffers for any defined interface. These are
|
36
|
+
# imaginatively called: 'back', 'front' and 'previous'.
|
37
|
+
#
|
38
|
+
# The 'back' buffer is the content for an interface which will be
|
39
|
+
# shown next time a refresh event is fired globally or for that
|
40
|
+
# interface. So, 'back' becomes 'front'.
|
41
|
+
#
|
42
|
+
# The 'front' buffer is the content for an interface which is
|
43
|
+
# currently showing. When a refresh event is fired, again,
|
44
|
+
# globally or for that interface specifically, the content of this
|
45
|
+
# 'front' buffer is first copied to the 'previous' buffer, and
|
46
|
+
# then the current 'back' buffer overwrites this 'front' buffer.
|
47
|
+
#
|
48
|
+
# The 'previous' buffer contains what was shown on the 'front'
|
49
|
+
# before the current 'front'.
|
50
|
+
#
|
51
|
+
# You can only write to either the 'front' (you want the content
|
52
|
+
# to be drawn immediately (immediate render)) or the 'back' (you
|
53
|
+
# would like the content to be drawn on the next refresh
|
54
|
+
# (deferred view)).
|
55
|
+
#
|
56
|
+
# The basic view DSL methods look like this:
|
57
|
+
#
|
58
|
+
# renders/views
|
59
|
+
# |- view
|
60
|
+
# |- lines
|
61
|
+
# | |- line
|
62
|
+
# | |- streams
|
63
|
+
# | | |- stream
|
64
|
+
# | | |- char
|
65
|
+
# | |
|
66
|
+
# | |- stream
|
67
|
+
# | |- char
|
68
|
+
# |
|
69
|
+
# |- line
|
70
|
+
# |- streams
|
71
|
+
# | |- stream
|
72
|
+
# | |- char
|
73
|
+
# |
|
74
|
+
# |- stream
|
75
|
+
# |- char
|
76
|
+
#
|
77
|
+
# renders/views
|
78
|
+
# |- view
|
79
|
+
# |- lines/line
|
80
|
+
# |- streams/stream
|
81
|
+
# |- char
|
82
|
+
#
|
83
|
+
class Views
|
84
|
+
|
85
|
+
include Vedeu::DSL
|
86
|
+
include Vedeu::DSL::Cursors
|
87
|
+
include Vedeu::DSL::Border
|
88
|
+
include Vedeu::DSL::Geometry
|
89
|
+
include Vedeu::DSL::Use
|
90
|
+
include Vedeu::DSL::Elements
|
91
|
+
|
92
|
+
class << self
|
93
|
+
|
94
|
+
include Vedeu::Common
|
95
|
+
|
96
|
+
# Directly write a view buffer to the terminal. Using this
|
97
|
+
# method means that the refresh event does not need to be
|
98
|
+
# triggered after creating the views, though can be later
|
99
|
+
# triggered when needed.
|
100
|
+
#
|
101
|
+
# Vedeu.renders do
|
102
|
+
# view :some_interface do
|
103
|
+
# line do
|
104
|
+
# stream do
|
105
|
+
# left 'Title goes here', width: 35
|
106
|
+
# end
|
107
|
+
# stream do
|
108
|
+
# right Time.now.strftime('%H:%m'), width: 7
|
109
|
+
# end
|
110
|
+
# end
|
111
|
+
# end
|
112
|
+
# view :other_interface do
|
113
|
+
# lines do
|
114
|
+
# line 'This is content for the main interface.'
|
115
|
+
# line ''
|
116
|
+
# line 'Pretty easy eh?'
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
# # ... some code
|
120
|
+
# end
|
121
|
+
#
|
122
|
+
# # or...
|
123
|
+
#
|
124
|
+
# Vedeu.render do
|
125
|
+
# view :my_interface do
|
126
|
+
# # ... some code
|
127
|
+
# end
|
128
|
+
# end
|
129
|
+
#
|
130
|
+
# @param block [Proc] The directives you wish to send to
|
131
|
+
# render. Typically includes `view` with associated
|
132
|
+
# sub-directives.
|
133
|
+
# @raise [Vedeu::Error::RequiresBlock]
|
134
|
+
# @return [Array<View>]
|
135
|
+
def renders(&block)
|
136
|
+
fail Vedeu::Error::RequiresBlock unless block_given?
|
137
|
+
|
138
|
+
store(:store_immediate, client(&block), &block)
|
139
|
+
end
|
140
|
+
alias_method :render, :renders
|
141
|
+
|
142
|
+
# Define a view (content) for an interface.
|
143
|
+
#
|
144
|
+
# As you can see by comparing the examples above to these
|
145
|
+
# below, the immediate render simply wraps what is already
|
146
|
+
# here in the deferred view.
|
147
|
+
#
|
148
|
+
# The views declared within this block are stored in their
|
149
|
+
# respective interface back buffers until a refresh event
|
150
|
+
# occurs. When the refresh event is triggered, the back
|
151
|
+
# buffers are swapped into the front buffers and the content
|
152
|
+
# here will be rendered to {Vedeu::Terminal#output}.
|
153
|
+
#
|
154
|
+
# Vedeu.views do
|
155
|
+
# view :some_interface do
|
156
|
+
# line do
|
157
|
+
# stream do
|
158
|
+
# left 'Title goes here', width: 35
|
159
|
+
# end
|
160
|
+
# stream do
|
161
|
+
# right Time.now.strftime('%H:%m'), width: 7
|
162
|
+
# end
|
163
|
+
# end
|
164
|
+
# end
|
165
|
+
# view :other_interface do
|
166
|
+
# lines do
|
167
|
+
# line 'This is content for the main interface.'
|
168
|
+
# line ''
|
169
|
+
# line 'Pretty easy eh?'
|
170
|
+
# end
|
171
|
+
# end
|
172
|
+
# # ... some code
|
173
|
+
# end
|
174
|
+
#
|
175
|
+
# @param block [Proc] The directives you wish to send to
|
176
|
+
# render. Typically includes `view` with associated
|
177
|
+
# sub-directives.
|
178
|
+
# @raise [Vedeu::Error::RequiresBlock]
|
179
|
+
# @return [Array<View>]
|
180
|
+
def views(&block)
|
181
|
+
fail Vedeu::Error::RequiresBlock unless block_given?
|
182
|
+
|
183
|
+
store(:store_deferred, client(&block), &block)
|
184
|
+
end
|
185
|
+
|
186
|
+
private
|
187
|
+
|
188
|
+
# Returns the client object which called the DSL method.
|
189
|
+
#
|
190
|
+
# @param block [Proc]
|
191
|
+
# @return [Object]
|
192
|
+
def client(&block)
|
193
|
+
eval('self', block.binding)
|
194
|
+
end
|
195
|
+
|
196
|
+
# Creates a new Vedeu::Views::Composition which may contain
|
197
|
+
# one or more views (Vedeu::Views::View objects).
|
198
|
+
#
|
199
|
+
# @param client [Object]
|
200
|
+
# @param block [Proc]
|
201
|
+
# @return [Vedeu::Views::Composition]
|
202
|
+
def composition(client, &block)
|
203
|
+
attrs = { client: client, colour: Vedeu::Configuration.colour }
|
204
|
+
|
205
|
+
Vedeu::Views::Composition.build(attrs, &block)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Creates a new Vedeu::Views::Composition which may contain
|
209
|
+
# one or more views (Vedeu::Views::View objects).
|
210
|
+
#
|
211
|
+
# Stores each of the views defined in their respective buffers
|
212
|
+
# ready to be rendered on next refresh.
|
213
|
+
#
|
214
|
+
# @param method [Symbol] An instruction; `:store_immediate` or
|
215
|
+
# `:store_deferred` which determines whether the view will
|
216
|
+
# be shown immediately or later respectively.
|
217
|
+
# @param client [Object] The client class which called the DSL
|
218
|
+
# object.
|
219
|
+
# @param block [Proc]
|
220
|
+
# @return [Array]
|
221
|
+
def store(method, client, &block)
|
222
|
+
composition(client, &block).views.map do |view|
|
223
|
+
view.public_send(method)
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
end # Eigenclass
|
228
|
+
|
229
|
+
end # Views
|
230
|
+
|
231
|
+
end # DSL
|
232
|
+
|
233
|
+
# @!method render
|
234
|
+
# @see Vedeu::DSL::Views.render
|
235
|
+
# @!method renders
|
236
|
+
# @see Vedeu::DSL::Views.renders
|
237
|
+
# @!method views
|
238
|
+
# @see Vedeu::DSL::Views.views
|
239
|
+
def_delegators Vedeu::DSL::Views,
|
240
|
+
:renders,
|
241
|
+
:render,
|
242
|
+
:views
|
243
|
+
|
244
|
+
end # Vedeu
|