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
@@ -1,37 +1,116 @@
|
|
1
|
+
require 'vedeu/dsl/components/geometry'
|
2
|
+
require 'vedeu/models/model'
|
3
|
+
require 'vedeu/support/esc'
|
4
|
+
require 'vedeu/support/terminal'
|
5
|
+
|
1
6
|
module Vedeu
|
2
7
|
|
8
|
+
# @todo Consider storing the Terminal size at the time of first creation,
|
9
|
+
# this allows us to return the interface to its original dimensions if
|
10
|
+
# the terminal resizes back to normal size.
|
11
|
+
|
3
12
|
# Calculates and provides interface geometry determined by both the client's
|
4
13
|
# requirements and the terminal's current viewing area.
|
5
14
|
#
|
6
15
|
# Geometry for Vedeu, as the same for ANSI terminals, has the origin at
|
7
16
|
# top-left, y = 1, x = 1. The 'y' coordinate is deliberately first.
|
8
17
|
#
|
18
|
+
# x north xn # north: y - 1
|
19
|
+
# y +--------------+ # top: y
|
20
|
+
# | top | # west: x - 1
|
21
|
+
# | | # left: x
|
22
|
+
# west | left right | east # right: xn
|
23
|
+
# | | # east: xn + 1
|
24
|
+
# | bottom | # bottom: yn
|
25
|
+
# yn +--------------+ # south: yn + 1
|
26
|
+
# south
|
27
|
+
#
|
9
28
|
# @api private
|
10
29
|
class Geometry
|
11
30
|
|
12
|
-
|
31
|
+
include Vedeu::Model
|
32
|
+
|
33
|
+
attr_accessor :centred, :height, :name, :width
|
34
|
+
attr_reader :attributes
|
35
|
+
attr_writer :x, :y
|
36
|
+
|
37
|
+
class << self
|
38
|
+
|
39
|
+
# Build models using a simple DSL when a block is given, otherwise returns
|
40
|
+
# a new instance of the class including this module.
|
41
|
+
#
|
42
|
+
# @see Vedeu::Geometry#initialize
|
43
|
+
def build(attributes = {}, &block)
|
44
|
+
attributes = defaults.merge(attributes)
|
45
|
+
|
46
|
+
model = new(attributes)
|
47
|
+
model.deputy(attributes[:client]).instance_eval(&block) if block_given?
|
48
|
+
model
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
# The default values for a new instance of this class.
|
54
|
+
#
|
55
|
+
# @return [Hash]
|
56
|
+
def defaults
|
57
|
+
{
|
58
|
+
client: nil
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
13
63
|
|
14
64
|
# Returns a new instance of Geometry.
|
15
65
|
#
|
16
66
|
# @param attributes [Hash]
|
67
|
+
# @option attributes centred [Boolean]
|
68
|
+
# @option attributes height [Fixnum]
|
69
|
+
# @option attributes name [String]
|
70
|
+
# @option attributes width [Fixnum]
|
71
|
+
# @option attributes x [Fixnum]
|
72
|
+
# @option attributes xn [Fixnum]
|
73
|
+
# @option attributes y [Fixnum]
|
74
|
+
# @option attributes yn [Fixnum]
|
17
75
|
# @return [Geometry]
|
18
76
|
def initialize(attributes = {})
|
19
77
|
@attributes = defaults.merge(attributes)
|
20
78
|
|
21
79
|
@centred = @attributes[:centred]
|
22
80
|
@height = @attributes[:height]
|
81
|
+
@name = @attributes[:name]
|
23
82
|
@width = @attributes[:width]
|
83
|
+
@x = @attributes[:x]
|
84
|
+
@xn = @attributes[:xn]
|
85
|
+
@y = @attributes[:y]
|
86
|
+
@yn = @attributes[:yn]
|
87
|
+
@repository = Vedeu.geometries
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns log friendly output.
|
91
|
+
#
|
92
|
+
# @note
|
93
|
+
# The attribute format is (specified/calculated).
|
94
|
+
#
|
95
|
+
# @return [String]
|
96
|
+
def inspect
|
97
|
+
"<#{self.class.name} (height:(#{@height}/#{height}) " \
|
98
|
+
"width:(#{@width}/#{width}) " \
|
99
|
+
"top:#{top} " \
|
100
|
+
"bottom:#{bottom} " \
|
101
|
+
"left:#{left} " \
|
102
|
+
"right:#{right})>"
|
24
103
|
end
|
25
104
|
|
26
105
|
# Returns the row/line start position for the interface.
|
27
106
|
#
|
28
107
|
# @return [Fixnum]
|
29
108
|
def y
|
30
|
-
if
|
31
|
-
|
109
|
+
if @y.is_a?(Proc)
|
110
|
+
@y.call
|
32
111
|
|
33
112
|
else
|
34
|
-
|
113
|
+
@y
|
35
114
|
|
36
115
|
end
|
37
116
|
end
|
@@ -40,11 +119,11 @@ module Vedeu
|
|
40
119
|
#
|
41
120
|
# @return [Fixnum]
|
42
121
|
def yn
|
43
|
-
if
|
44
|
-
|
122
|
+
if @yn.is_a?(Proc)
|
123
|
+
@yn.call
|
45
124
|
|
46
125
|
else
|
47
|
-
|
126
|
+
@yn
|
48
127
|
|
49
128
|
end
|
50
129
|
end
|
@@ -53,11 +132,11 @@ module Vedeu
|
|
53
132
|
#
|
54
133
|
# @return [Fixnum]
|
55
134
|
def x
|
56
|
-
if
|
57
|
-
|
135
|
+
if @x.is_a?(Proc)
|
136
|
+
@x.call
|
58
137
|
|
59
138
|
else
|
60
|
-
|
139
|
+
@x
|
61
140
|
|
62
141
|
end
|
63
142
|
end
|
@@ -66,11 +145,11 @@ module Vedeu
|
|
66
145
|
#
|
67
146
|
# @return [Fixnum]
|
68
147
|
def xn
|
69
|
-
if
|
70
|
-
|
148
|
+
if @xn.is_a?(Proc)
|
149
|
+
@xn.call
|
71
150
|
|
72
151
|
else
|
73
|
-
|
152
|
+
@xn
|
74
153
|
|
75
154
|
end
|
76
155
|
end
|
@@ -141,7 +220,6 @@ module Vedeu
|
|
141
220
|
|
142
221
|
end
|
143
222
|
end
|
144
|
-
alias_method :y_min, :top
|
145
223
|
|
146
224
|
# Returns the row above the top by default.
|
147
225
|
#
|
@@ -171,7 +249,6 @@ module Vedeu
|
|
171
249
|
|
172
250
|
end
|
173
251
|
end
|
174
|
-
alias_method :x_min, :left
|
175
252
|
|
176
253
|
# Returns the column before left by default.
|
177
254
|
#
|
@@ -258,257 +335,21 @@ module Vedeu
|
|
258
335
|
(left...right).to_a
|
259
336
|
end
|
260
337
|
|
261
|
-
# Returns the actual position of y for a given index. Crudely corrects out
|
262
|
-
# of range values.
|
263
|
-
#
|
264
|
-
# @example
|
265
|
-
# # y_range = [7, 8, 9, 10, 11]
|
266
|
-
# y_position # => 7
|
267
|
-
# y_position(-2) # => 7
|
268
|
-
# y_position(2) # => 9
|
269
|
-
# y_position(7) # => 11
|
270
|
-
#
|
271
|
-
# @param index [Fixnum]
|
272
|
-
# @return [Fixnum]
|
273
|
-
def y_position(index = 0)
|
274
|
-
if index <= 0
|
275
|
-
y_min
|
276
|
-
|
277
|
-
elsif index >= y_max_index
|
278
|
-
y_max
|
279
|
-
|
280
|
-
else
|
281
|
-
y_range[index]
|
282
|
-
|
283
|
-
end
|
284
|
-
end
|
285
|
-
|
286
|
-
# Returns the actual position of x for a given index. Crudely corrects out
|
287
|
-
# of range values.
|
288
|
-
#
|
289
|
-
# @example
|
290
|
-
# # x_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
291
|
-
# x_position # => 4
|
292
|
-
# x_position(-2) # => 4
|
293
|
-
# x_position(2) # => 6
|
294
|
-
# x_position(15) # => 13
|
295
|
-
#
|
296
|
-
# @param index [Fixnum]
|
297
|
-
# @return [Fixnum]
|
298
|
-
def x_position(index = 0)
|
299
|
-
if index <= 0
|
300
|
-
x_min
|
301
|
-
|
302
|
-
elsif index >= x_max_index
|
303
|
-
x_max
|
304
|
-
|
305
|
-
else
|
306
|
-
x_range[index]
|
307
|
-
|
308
|
-
end
|
309
|
-
end
|
310
|
-
|
311
|
-
# Provides all the geometry in a convenient hash.
|
312
|
-
#
|
313
|
-
# @return [Hash]
|
314
|
-
def to_h
|
315
|
-
{
|
316
|
-
centred: centred,
|
317
|
-
height: height,
|
318
|
-
width: width,
|
319
|
-
x: x,
|
320
|
-
y: y,
|
321
|
-
top: top,
|
322
|
-
right: right,
|
323
|
-
bottom: bottom,
|
324
|
-
left: left,
|
325
|
-
north: north,
|
326
|
-
east: east,
|
327
|
-
south: south,
|
328
|
-
west: west,
|
329
|
-
virtual_x: virtual_x,
|
330
|
-
virtual_y: virtual_y,
|
331
|
-
}
|
332
|
-
end
|
333
|
-
|
334
338
|
private
|
335
339
|
|
336
|
-
#
|
337
|
-
# value is provided, the y coordinate is overridden. Crudely corrects out of
|
338
|
-
# range values.
|
339
|
-
#
|
340
|
-
# @example
|
341
|
-
# # y_range = [7, 8, 9, 10]
|
342
|
-
# # y = 8
|
343
|
-
# y_index # => 1
|
344
|
-
# y_index(10) # => 3
|
345
|
-
# y_index(5) # => 0
|
346
|
-
# y_index(15) # => 3
|
347
|
-
#
|
348
|
-
# @param value [Fixnum]
|
349
|
-
# @return [Fixnum]
|
350
|
-
def y_index(value = y)
|
351
|
-
if height <= 0 || value <= y_min
|
352
|
-
0
|
353
|
-
|
354
|
-
elsif value >= y_max
|
355
|
-
y_max_index
|
356
|
-
|
357
|
-
else
|
358
|
-
y_range.index(value)
|
359
|
-
|
360
|
-
end
|
361
|
-
end
|
362
|
-
|
363
|
-
# Returns the x coordinate as an offset index in the area's x range. When a
|
364
|
-
# value is provided, the x coordinate is overridden. Crudely corrects out of
|
365
|
-
# range values.
|
366
|
-
#
|
367
|
-
# @example
|
368
|
-
# # x_range = [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
369
|
-
# # x = 8
|
370
|
-
# x_index # => 4
|
371
|
-
# x_index(11) # => 7
|
372
|
-
# x_index(2) # => 0
|
373
|
-
# x_index(15) # => 9
|
374
|
-
#
|
375
|
-
# @param value [Fixnum]
|
376
|
-
# @return [Fixnum]
|
377
|
-
def x_index(value = x)
|
378
|
-
if width <= 0 || value <= x_min
|
379
|
-
0
|
380
|
-
|
381
|
-
elsif value >= x_max
|
382
|
-
x_max_index
|
383
|
-
|
384
|
-
else
|
385
|
-
x_range.index(value)
|
386
|
-
|
387
|
-
end
|
388
|
-
end
|
389
|
-
|
390
|
-
# Returns the maximum y index for an area.
|
391
|
-
#
|
392
|
-
# @example
|
393
|
-
# # height = 3
|
394
|
-
# y_max_index # => 2
|
395
|
-
#
|
396
|
-
# @return [Fixnum]
|
397
|
-
def y_max_index
|
398
|
-
return 0 if y_indices.empty?
|
399
|
-
|
400
|
-
y_indices.last
|
401
|
-
end
|
402
|
-
|
403
|
-
# Returns the maximum x index for an area.
|
404
|
-
#
|
405
|
-
# @example
|
406
|
-
# # width = 6
|
407
|
-
# x_max_index # => 5
|
408
|
-
#
|
409
|
-
# @return [Fixnum]
|
410
|
-
def x_max_index
|
411
|
-
return 0 if x_indices.empty?
|
412
|
-
|
413
|
-
x_indices.last
|
414
|
-
end
|
415
|
-
|
416
|
-
# Returns the same as #y_range, except as indices of an array.
|
417
|
-
#
|
418
|
-
# @example
|
419
|
-
# # height = 4
|
420
|
-
# y_indices # => [0, 1, 2, 3]
|
421
|
-
#
|
422
|
-
# @return [Array]
|
423
|
-
def y_indices
|
424
|
-
(0...height).to_a
|
425
|
-
end
|
426
|
-
|
427
|
-
# Returns the same as #x_range, except as indices of an array.
|
428
|
-
#
|
429
|
-
# @example
|
430
|
-
# # width = 10
|
431
|
-
# x_indices # => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
432
|
-
#
|
433
|
-
# @return [Array]
|
434
|
-
def x_indices
|
435
|
-
(0...width).to_a
|
436
|
-
end
|
437
|
-
|
438
|
-
# Returns an array with all coordinates from x to x_max.
|
439
|
-
#
|
440
|
-
# @example
|
441
|
-
# # width = 10
|
442
|
-
# # x_min = 4
|
443
|
-
# # x_max = 14
|
444
|
-
# x_range # => [4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
|
445
|
-
#
|
446
|
-
# @return [Array]
|
447
|
-
def x_range
|
448
|
-
(x_min...x_max).to_a
|
449
|
-
end
|
450
|
-
|
451
|
-
# Returns an array with all coordinates from y to y_max.
|
452
|
-
#
|
453
|
-
# @example
|
454
|
-
# # height = 4
|
455
|
-
# # y_min = 7
|
456
|
-
# # y_max = 11
|
457
|
-
# y_range # => [7, 8, 9, 10]
|
458
|
-
#
|
459
|
-
# @return [Array]
|
460
|
-
def y_range
|
461
|
-
(y_min...y_max).to_a
|
462
|
-
end
|
463
|
-
|
464
|
-
# Returns the maximum y coordinate for an area.
|
465
|
-
#
|
466
|
-
# @example
|
467
|
-
# # y_min = 2
|
468
|
-
# # height = 4
|
469
|
-
# y_max # => 6
|
470
|
-
#
|
471
|
-
# @return [Fixnum]
|
472
|
-
def y_max
|
473
|
-
if height <= 0
|
474
|
-
0
|
475
|
-
|
476
|
-
else
|
477
|
-
y_min + height
|
478
|
-
|
479
|
-
end
|
480
|
-
end
|
481
|
-
|
482
|
-
# Returns the maximum x coordinate for an area.
|
483
|
-
#
|
484
|
-
# @example
|
485
|
-
# # x_min = 5
|
486
|
-
# # width = 20
|
487
|
-
# x_max # => 25
|
488
|
-
#
|
489
|
-
# @return [Fixnum]
|
490
|
-
def x_max
|
491
|
-
if width <= 0
|
492
|
-
0
|
493
|
-
|
494
|
-
else
|
495
|
-
x_min + width
|
496
|
-
|
497
|
-
end
|
498
|
-
end
|
499
|
-
|
500
|
-
# The default geometry of an interface- full screen.
|
340
|
+
# The default values for a new instance of this class.
|
501
341
|
#
|
502
342
|
# @return [Hash]
|
503
343
|
def defaults
|
504
344
|
{
|
505
|
-
y: 1,
|
506
|
-
x: 1,
|
507
|
-
width: Terminal.width,
|
508
|
-
height: Terminal.height,
|
509
345
|
centred: false,
|
510
|
-
|
511
|
-
|
346
|
+
height: Terminal.height,
|
347
|
+
name: '',
|
348
|
+
width: Terminal.width,
|
349
|
+
x: 1,
|
350
|
+
xn: Terminal.width,
|
351
|
+
y: 1,
|
352
|
+
yn: Terminal.height,
|
512
353
|
}
|
513
354
|
end
|
514
355
|
|
@@ -3,18 +3,22 @@ module Vedeu
|
|
3
3
|
# Interfaces can be associated with one another by being members of the same
|
4
4
|
# Group. A Group is a collection of interface names.
|
5
5
|
#
|
6
|
+
# @api private
|
6
7
|
class Group
|
7
8
|
|
9
|
+
include Vedeu::Model
|
10
|
+
|
8
11
|
attr_reader :name
|
9
12
|
|
10
13
|
# Return a new instance of Group.
|
11
14
|
#
|
12
15
|
# @param name [String] The name of the group.
|
13
|
-
# @param members [
|
16
|
+
# @param members [Array]
|
14
17
|
# @return [Group]
|
15
|
-
def initialize(name,
|
16
|
-
@name
|
17
|
-
@members
|
18
|
+
def initialize(name, members = [])
|
19
|
+
@name = name
|
20
|
+
@members = Array(members)
|
21
|
+
@repository = Vedeu.groups
|
18
22
|
end
|
19
23
|
|
20
24
|
# Add a member to the group by name.
|
@@ -22,16 +26,14 @@ module Vedeu
|
|
22
26
|
# @param member [String]
|
23
27
|
# @return [Group]
|
24
28
|
def add(member)
|
25
|
-
|
26
|
-
|
27
|
-
Group.new(name, *new_members)
|
29
|
+
Group.new(name, members.add(member)).store
|
28
30
|
end
|
29
31
|
|
30
|
-
#
|
32
|
+
# Return the members as a Set.
|
31
33
|
#
|
32
|
-
# @return [
|
34
|
+
# @return [Set]
|
33
35
|
def members
|
34
|
-
@members.
|
36
|
+
@members.to_set
|
35
37
|
end
|
36
38
|
|
37
39
|
# Remove a member from the group by name.
|
@@ -39,18 +41,18 @@ module Vedeu
|
|
39
41
|
# @param member [String]
|
40
42
|
# @return [Group]
|
41
43
|
def remove(member)
|
42
|
-
|
43
|
-
|
44
|
-
Group.new(name, *new_members)
|
44
|
+
Group.new(name, members.delete(member)).store
|
45
45
|
end
|
46
46
|
|
47
47
|
# Remove all members from the group.
|
48
48
|
#
|
49
49
|
# @return [Group]
|
50
50
|
def reset
|
51
|
-
Group.new(name)
|
51
|
+
Group.new(name).store
|
52
52
|
end
|
53
53
|
|
54
|
+
private
|
55
|
+
|
54
56
|
end # Group
|
55
57
|
|
56
58
|
end # Vedeu
|
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'vedeu/models/model'
|
2
|
+
require 'vedeu/support/common'
|
3
|
+
|
1
4
|
module Vedeu
|
2
5
|
|
3
6
|
# Converts the collection passed into a list of menu items which can be
|
@@ -6,32 +9,97 @@ module Vedeu
|
|
6
9
|
# @api private
|
7
10
|
class Menu
|
8
11
|
|
9
|
-
include
|
12
|
+
include Vedeu::Common
|
13
|
+
include Vedeu::Model
|
10
14
|
|
11
|
-
|
12
|
-
#
|
13
|
-
# @param collection [Array]
|
14
|
-
# @param name [String]
|
15
|
-
# @return [Menu]
|
16
|
-
def initialize(collection, name = '')
|
17
|
-
@collection = collection
|
18
|
-
@name = name
|
19
|
-
@current = 0
|
20
|
-
@selected = nil
|
21
|
-
end
|
15
|
+
attr_accessor :collection
|
22
16
|
|
23
17
|
# Returns the index of the value in the collection which is current.
|
24
18
|
#
|
25
19
|
# @return [Fixnum]
|
26
|
-
|
27
|
-
|
28
|
-
|
20
|
+
attr_accessor :current
|
21
|
+
|
22
|
+
attr_accessor :name
|
29
23
|
|
30
24
|
# Returns the index of the value in the collection which is selected.
|
31
25
|
#
|
32
26
|
# @return [Fixnum]
|
33
|
-
|
34
|
-
|
27
|
+
attr_accessor :selected
|
28
|
+
|
29
|
+
class << self
|
30
|
+
|
31
|
+
# @option attributes collection []
|
32
|
+
# @option attributes client []
|
33
|
+
# @option attributes name []
|
34
|
+
# @option attributes current []
|
35
|
+
# @option attributes selected []
|
36
|
+
def build(attributes = {}, &block)
|
37
|
+
attributes = defaults.merge(attributes)
|
38
|
+
|
39
|
+
model = new(attributes[:collection],
|
40
|
+
attributes[:name],
|
41
|
+
attributes[:current],
|
42
|
+
attributes[:selected])
|
43
|
+
model.deputy(attributes[:client]).instance_eval(&block) if block_given?
|
44
|
+
model
|
45
|
+
end
|
46
|
+
|
47
|
+
# Register a menu by name which will display a collection of items for
|
48
|
+
# your users to select; and provide interactivity within your application.
|
49
|
+
#
|
50
|
+
# @param name [String] The name of the menu. Used to reference the
|
51
|
+
# menu throughout your application's execution lifetime.
|
52
|
+
# @param block [Proc] A set of attributes which define the features of the
|
53
|
+
# menu. See {Vedeu::DSL::Menu#items} and {Vedeu::DSL::Menu#name}.
|
54
|
+
#
|
55
|
+
# @example
|
56
|
+
# Vedeu.menu 'my_interface' do
|
57
|
+
# items [:item_1, :item_2, :item_3]
|
58
|
+
# ...
|
59
|
+
#
|
60
|
+
# Vedeu.menu do
|
61
|
+
# name 'menus_must_have_a_name'
|
62
|
+
# items Track.all_my_favourites
|
63
|
+
# ...
|
64
|
+
#
|
65
|
+
# @raise [InvalidSyntax] The required block was not given.
|
66
|
+
# @return [API::Menu]
|
67
|
+
def menu(name = '', &block)
|
68
|
+
fail InvalidSyntax, 'block not given' unless block_given?
|
69
|
+
|
70
|
+
build({ name: name }, &block).store
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
# The default values for a new instance of this class.
|
76
|
+
#
|
77
|
+
# @return [Hash]
|
78
|
+
def defaults
|
79
|
+
{
|
80
|
+
client: nil,
|
81
|
+
collection: [],
|
82
|
+
current: 0,
|
83
|
+
name: '',
|
84
|
+
selected: nil,
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns a new instance of Menu.
|
91
|
+
#
|
92
|
+
# @param collection [Array]
|
93
|
+
# @param name [String]
|
94
|
+
# @param current [Fixnum]
|
95
|
+
# @param selected [Fixnum|NilClass]
|
96
|
+
# @return [Menu]
|
97
|
+
def initialize(collection = [], name = '', current = 0, selected = nil)
|
98
|
+
@collection = collection
|
99
|
+
@name = name
|
100
|
+
@current = current
|
101
|
+
@selected = selected
|
102
|
+
@repository = Vedeu.menus
|
35
103
|
end
|
36
104
|
|
37
105
|
# Returns the item from the collection which shares the same index as the
|
@@ -161,11 +229,6 @@ module Vedeu
|
|
161
229
|
|
162
230
|
private
|
163
231
|
|
164
|
-
# @return [Class] The repository class for this model.
|
165
|
-
def repository
|
166
|
-
Vedeu::Menus
|
167
|
-
end
|
168
|
-
|
169
232
|
end # Menu
|
170
233
|
|
171
234
|
end # Vedeu
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# When included into a class, provides the mechanism to store the class in a
|
4
|
+
# repository for later retrieval.
|
5
|
+
#
|
6
|
+
# @api private
|
7
|
+
module Model
|
8
|
+
|
9
|
+
attr_reader :repository
|
10
|
+
|
11
|
+
# Returns a DSL instance responsible for defining the DSL methods of this
|
12
|
+
# model.
|
13
|
+
#
|
14
|
+
# @param client [Object|NilClass] The client binding represents
|
15
|
+
# the client application object that is currently invoking a DSL method.
|
16
|
+
# It is required so that we can send messages to the client application
|
17
|
+
# object should we need to.
|
18
|
+
# @return [void] The DSL instance for this model.
|
19
|
+
def deputy(client = nil)
|
20
|
+
Object.const_get(dsl_class).new(self, client)
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [void] The model instance stored in the repository.
|
24
|
+
def store
|
25
|
+
repository.store(self) # if valid?
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
# Removes the module part from the expression in the string.
|
31
|
+
#
|
32
|
+
# @example
|
33
|
+
# demodulize('Vedeu::DSL::Interface') # => "Interface"
|
34
|
+
#
|
35
|
+
# @param klass [Class|String]
|
36
|
+
def demodulize(klass)
|
37
|
+
klass = klass.to_s
|
38
|
+
|
39
|
+
klass[(klass.rindex('::') + 2)..-1]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Returns the DSL class name responsible for this model.
|
43
|
+
#
|
44
|
+
# @return [String]
|
45
|
+
def dsl_class
|
46
|
+
'Vedeu::DSL::' + demodulize(self.class.name)
|
47
|
+
end
|
48
|
+
|
49
|
+
end # Model
|
50
|
+
|
51
|
+
end # Vedeu
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'vedeu/models/view/chars'
|
2
|
+
require 'vedeu/models/view/char'
|
3
|
+
require 'vedeu/models/view/composition'
|
4
|
+
require 'vedeu/models/view/interfaces'
|
5
|
+
require 'vedeu/models/view/interface'
|
6
|
+
require 'vedeu/models/view/lines'
|
7
|
+
require 'vedeu/models/view/line'
|
8
|
+
require 'vedeu/models/view/streams'
|
9
|
+
require 'vedeu/models/view/stream'
|
10
|
+
|
11
|
+
module Vedeu
|
12
|
+
end # Vedeu
|