vedeu 0.6.7 → 0.6.8
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/LICENSE.txt +1 -1
- data/docs/dsl.md +4 -4
- data/lib/vedeu/all.rb +6 -18
- data/lib/vedeu/api.rb +14 -13
- data/lib/vedeu/bindings/system.rb +5 -4
- data/lib/vedeu/buffers/virtual_buffer.rb +13 -11
- data/lib/vedeu/configuration/api.rb +4 -3
- data/lib/vedeu/cursors/cursor.rb +23 -18
- data/lib/vedeu/distributed/client.rb +11 -6
- data/lib/vedeu/distributed/server.rb +4 -3
- data/lib/vedeu/dsl/keymap.rb +6 -6
- data/lib/vedeu/editor/all.rb +19 -0
- data/lib/vedeu/{input/editor → editor}/capture.rb +1 -1
- data/lib/vedeu/{input/editor → editor}/cropper.rb +0 -0
- data/lib/vedeu/{input/editor → editor}/cursor.rb +0 -0
- data/lib/vedeu/{input/editor → editor}/document.rb +0 -0
- data/lib/vedeu/{input/editor → editor}/documents.rb +0 -0
- data/lib/vedeu/{input/editor → editor}/editor.rb +0 -0
- data/lib/vedeu/{input/editor → editor}/insert.rb +0 -0
- data/lib/vedeu/{input/editor → editor}/line.rb +0 -0
- data/lib/vedeu/{input/editor → editor}/lines.rb +0 -0
- data/lib/vedeu/error.rb +21 -18
- data/lib/vedeu/esc/borders.rb +6 -4
- data/lib/vedeu/esc/colours.rb +13 -12
- data/lib/vedeu/esc/esc.rb +11 -10
- data/lib/vedeu/input/all.rb +15 -0
- data/lib/vedeu/input/input.rb +55 -52
- data/lib/vedeu/input/key.rb +36 -30
- data/lib/vedeu/input/keymap.rb +101 -92
- data/lib/vedeu/input/keymaps.rb +10 -6
- data/lib/vedeu/input/keys.rb +8 -4
- data/lib/vedeu/input/mapper.rb +125 -121
- data/lib/vedeu/input/translator.rb +159 -0
- data/lib/vedeu/internal_api.rb +16 -15
- data/lib/vedeu/logging/all.rb +13 -0
- data/lib/vedeu/logging/debug.rb +84 -0
- data/lib/vedeu/logging/lockless_log_device.rb +65 -0
- data/lib/vedeu/logging/log.rb +179 -0
- data/lib/vedeu/logging/mono_logger.rb +26 -0
- data/lib/vedeu/logging/timer.rb +68 -0
- data/lib/vedeu/menus/all.rb +12 -0
- data/lib/vedeu/{dsl/menu.rb → menus/dsl.rb} +19 -18
- data/lib/vedeu/menus/menu.rb +234 -0
- data/lib/vedeu/{null/menu.rb → menus/null.rb} +6 -6
- data/lib/vedeu/menus/repository.rb +18 -0
- data/lib/vedeu/models/cell.rb +62 -55
- data/lib/vedeu/models/escape.rb +55 -50
- data/lib/vedeu/models/page.rb +74 -69
- data/lib/vedeu/models/row.rb +55 -51
- data/lib/vedeu/models/views/all.rb +1 -0
- data/lib/vedeu/models/views/char.rb +1 -1
- data/lib/vedeu/models/views/html_char.rb +165 -0
- data/lib/vedeu/output/renderers/html.rb +5 -4
- data/lib/vedeu/repositories/model.rb +2 -0
- data/lib/vedeu/runtime/application.rb +110 -103
- data/lib/vedeu/runtime/bootstrap.rb +109 -103
- data/lib/vedeu/runtime/flags.rb +45 -41
- data/lib/vedeu/runtime/launcher.rb +1 -1
- data/lib/vedeu/runtime/main_loop.rb +51 -46
- data/lib/vedeu/runtime/traps.rb +20 -16
- data/lib/vedeu/version.rb +1 -1
- data/lib/vedeu.rb +2 -2
- data/test/lib/vedeu/buffers/virtual_buffer_test.rb +1 -1
- data/test/lib/vedeu/cursors/cursor_test.rb +11 -5
- data/test/lib/vedeu/dsl/interface_test.rb +1 -1
- data/test/lib/vedeu/dsl/keymap_test.rb +2 -2
- data/test/lib/vedeu/{input/editor → editor}/capture_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/cropper_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/cursor_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/document_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/documents_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/editor_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/insert_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/line_test.rb +0 -0
- data/test/lib/vedeu/{input/editor → editor}/lines_test.rb +0 -0
- data/test/lib/vedeu/input/input_test.rb +58 -54
- data/test/lib/vedeu/input/key_test.rb +29 -25
- data/test/lib/vedeu/input/keymap_test.rb +74 -70
- data/test/lib/vedeu/input/keymaps_test.rb +8 -4
- data/test/lib/vedeu/input/keys_test.rb +12 -8
- data/test/lib/vedeu/input/mapper_test.rb +64 -56
- data/test/lib/vedeu/input/translator_test.rb +36 -0
- data/test/lib/vedeu/logging/debug_test.rb +39 -0
- data/test/lib/vedeu/logging/lockless_log_device_test.rb +42 -0
- data/test/lib/vedeu/logging/log_test.rb +52 -0
- data/test/lib/vedeu/logging/mono_logger_test.rb +43 -0
- data/test/lib/vedeu/logging/timer_test.rb +44 -0
- data/test/lib/vedeu/{dsl/menu_test.rb → menus/dsl_test.rb} +6 -6
- data/test/lib/vedeu/menus/menu_test.rb +305 -0
- data/test/lib/vedeu/{null/menu_test.rb → menus/null_test.rb} +5 -5
- data/test/lib/vedeu/menus/repository_test.rb +17 -0
- data/test/lib/vedeu/models/cell_test.rb +54 -50
- data/test/lib/vedeu/models/escape_test.rb +49 -45
- data/test/lib/vedeu/models/page_test.rb +167 -160
- data/test/lib/vedeu/models/row_test.rb +71 -67
- data/test/lib/vedeu/models/views/html_char_test.rb +110 -0
- data/test/lib/vedeu/output/compressor_test.rb +44 -22
- data/test/lib/vedeu/output/renderers_test.rb +4 -2
- data/test/lib/vedeu/runtime/application_test.rb +36 -32
- data/test/lib/vedeu/runtime/bootstrap_test.rb +31 -26
- data/test/lib/vedeu/runtime/flags_test.rb +33 -29
- data/test/lib/vedeu/runtime/launcher_test.rb +4 -2
- data/test/lib/vedeu/runtime/main_loop_test.rb +28 -24
- data/test/lib/vedeu/runtime/traps_test.rb +8 -4
- data/test/test_helper.rb +4 -2
- metadata +66 -63
- data/lib/vedeu/input/editor/all.rb +0 -19
- data/lib/vedeu/input/input_translator.rb +0 -155
- data/lib/vedeu/log/debug.rb +0 -79
- data/lib/vedeu/log/lockless_log_device.rb +0 -61
- data/lib/vedeu/log/log.rb +0 -172
- data/lib/vedeu/log/mono_logger.rb +0 -21
- data/lib/vedeu/log/timer.rb +0 -63
- data/lib/vedeu/models/menu.rb +0 -217
- data/lib/vedeu/models/menus.rb +0 -14
- data/lib/vedeu/output/html_char.rb +0 -161
- data/test/lib/vedeu/input/input_translator_test.rb +0 -32
- data/test/lib/vedeu/log/debug_test.rb +0 -35
- data/test/lib/vedeu/log/lockless_log_device_test.rb +0 -29
- data/test/lib/vedeu/log/log_test.rb +0 -48
- data/test/lib/vedeu/log/mono_logger_test.rb +0 -31
- data/test/lib/vedeu/log/timer_test.rb +0 -40
- data/test/lib/vedeu/models/menu_test.rb +0 -301
- data/test/lib/vedeu/models/menus_test.rb +0 -13
- data/test/lib/vedeu/output/html_char_test.rb +0 -106
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
module Vedeu
|
|
2
|
+
|
|
3
|
+
module Logging
|
|
4
|
+
|
|
5
|
+
# Provides the ability to log anything to the Vedeu log file.
|
|
6
|
+
#
|
|
7
|
+
class Log
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
|
|
11
|
+
# Write a message to the Vedeu log file.
|
|
12
|
+
#
|
|
13
|
+
# @example
|
|
14
|
+
# Vedeu.log(type: :debug,
|
|
15
|
+
# message: 'A useful debugging message: Error!')
|
|
16
|
+
#
|
|
17
|
+
# @param message [String] The message you wish to emit to the
|
|
18
|
+
# log file, useful for debugging.
|
|
19
|
+
# @param force [Boolean] When evaluates to true will attempt
|
|
20
|
+
# to write to the log file regardless of the Configuration
|
|
21
|
+
# setting.
|
|
22
|
+
# @param type [Symbol] Colour code messages in the log file
|
|
23
|
+
# depending on their source. See {message_types}
|
|
24
|
+
#
|
|
25
|
+
# @return [TrueClass]
|
|
26
|
+
def log(message:, force: false, type: :info)
|
|
27
|
+
output = log_entry(type, message)
|
|
28
|
+
|
|
29
|
+
if (enabled? || force) && (Vedeu::Configuration.log_only.empty? ||
|
|
30
|
+
Vedeu::Configuration.log_only.include?(type))
|
|
31
|
+
logger.debug(output)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
output
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# Write a message to STDOUT.
|
|
38
|
+
#
|
|
39
|
+
# @example
|
|
40
|
+
# Vedeu.log_stdout
|
|
41
|
+
#
|
|
42
|
+
# @return [TrueClass]
|
|
43
|
+
def log_stdout(type: :info, message:)
|
|
44
|
+
$stdout.puts log_entry(type, message)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Write a message to STDERR.
|
|
48
|
+
#
|
|
49
|
+
# @example
|
|
50
|
+
# Vedeu.log_stderr
|
|
51
|
+
#
|
|
52
|
+
# @return [TrueClass]
|
|
53
|
+
def log_stderr(type: :info, message:)
|
|
54
|
+
$stderr.puts log_entry(type, message)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
# @return [TrueClass]
|
|
60
|
+
def logger
|
|
61
|
+
MonoLogger.new(log_file).tap do |log|
|
|
62
|
+
log.formatter = proc do |_, _, _, message|
|
|
63
|
+
formatted_message(message)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Returns the message with timestamp.
|
|
69
|
+
#
|
|
70
|
+
# [ 0.0987] [debug] Something happened.
|
|
71
|
+
#
|
|
72
|
+
# @param message [String] The message type and message
|
|
73
|
+
# coloured and combined.
|
|
74
|
+
# @return [String]
|
|
75
|
+
def formatted_message(message)
|
|
76
|
+
"#{timestamp}#{message}\n" if message
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Returns the message:
|
|
80
|
+
#
|
|
81
|
+
# [type] message
|
|
82
|
+
#
|
|
83
|
+
# @param type [Symbol] The type of log message.
|
|
84
|
+
# @param message [String] The message you wish to emit to the
|
|
85
|
+
# log file, useful for debugging.
|
|
86
|
+
# @return [String]
|
|
87
|
+
def log_entry(type, message)
|
|
88
|
+
"#{message_type(type)}#{message_body(type, message)}"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Fetches the filename from the configuration.
|
|
92
|
+
#
|
|
93
|
+
# @return [String]
|
|
94
|
+
def log_file
|
|
95
|
+
Vedeu::Configuration.log
|
|
96
|
+
end
|
|
97
|
+
alias_method :enabled?, :log_file
|
|
98
|
+
|
|
99
|
+
# Displays the message body using the colour specified in the
|
|
100
|
+
# last element of {message_types}.
|
|
101
|
+
#
|
|
102
|
+
# @param type [Symbol] The type of log message.
|
|
103
|
+
# @param body [String] The log message itself.
|
|
104
|
+
# @return [String]
|
|
105
|
+
def message_body(type, body)
|
|
106
|
+
Vedeu::Esc.send(message_types.fetch(type, :default)[-1]) do
|
|
107
|
+
body
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Displays the message type using the colour specified in the
|
|
112
|
+
# first element of {message_types}.
|
|
113
|
+
#
|
|
114
|
+
# @param type [Symbol] The type of log message.
|
|
115
|
+
# @return [String]
|
|
116
|
+
def message_type(type)
|
|
117
|
+
Vedeu::Esc.send(message_types.fetch(type, :default)[0]) do
|
|
118
|
+
"[#{type}]".ljust(9)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# The defined message types for Vedeu with their respective
|
|
123
|
+
# colours. When used, produces a log entry of the format:
|
|
124
|
+
#
|
|
125
|
+
# [type] message
|
|
126
|
+
#
|
|
127
|
+
# The 'type' will be shown as the first colour defined in the
|
|
128
|
+
# value array, whilst the 'message' will be shown using the
|
|
129
|
+
# last colour.
|
|
130
|
+
#
|
|
131
|
+
# Valid types available:
|
|
132
|
+
#
|
|
133
|
+
# :config, :create, :debug, :error, :drb, :event, :info,
|
|
134
|
+
# :input, :output, :reset, :store, :test, :timer, :update
|
|
135
|
+
#
|
|
136
|
+
# @return [Hash<Symbol => Array<Symbol>>]
|
|
137
|
+
def message_types
|
|
138
|
+
{
|
|
139
|
+
config: [:light_yellow, :yellow],
|
|
140
|
+
create: [:light_green, :green],
|
|
141
|
+
debug: [:light_red, :red],
|
|
142
|
+
error: [:light_red, :red],
|
|
143
|
+
drb: [:light_blue, :blue],
|
|
144
|
+
event: [:light_magenta, :magenta],
|
|
145
|
+
info: [:white, :default],
|
|
146
|
+
input: [:light_yellow, :yellow],
|
|
147
|
+
output: [:light_green, :green],
|
|
148
|
+
reset: [:light_cyan, :cyan],
|
|
149
|
+
store: [:light_cyan, :cyan],
|
|
150
|
+
test: [:light_white, :white],
|
|
151
|
+
timer: [:light_yellow, :yellow],
|
|
152
|
+
update: [:light_cyan, :cyan],
|
|
153
|
+
}
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Returns a formatted timestamp.
|
|
157
|
+
# eg. [137.7824]
|
|
158
|
+
#
|
|
159
|
+
# @return [String]
|
|
160
|
+
def timestamp
|
|
161
|
+
@now = Time.now.to_f
|
|
162
|
+
@time = 0.0 unless @time
|
|
163
|
+
@last = @now unless @last
|
|
164
|
+
|
|
165
|
+
unless @last == @time
|
|
166
|
+
@time += (@now - @last).round(4)
|
|
167
|
+
@last = @now
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
"[#{format('%7.4f', @time.to_s)}] ".rjust(7)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end # Eigenclass
|
|
174
|
+
|
|
175
|
+
end # Log
|
|
176
|
+
|
|
177
|
+
end # Logging
|
|
178
|
+
|
|
179
|
+
end # Vedeu
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module Vedeu
|
|
2
|
+
|
|
3
|
+
module Logging
|
|
4
|
+
|
|
5
|
+
# Allows the creation of a lock-less log device.
|
|
6
|
+
#
|
|
7
|
+
class MonoLogger < ::Logger
|
|
8
|
+
|
|
9
|
+
# Create a trappable Logger instance.
|
|
10
|
+
#
|
|
11
|
+
# @param logdev [String|IO] The filename (String) or IO object
|
|
12
|
+
# (typically STDOUT, STDERR or an open file).
|
|
13
|
+
# @return [Vedeu::Logging::MonoLogger]
|
|
14
|
+
def initialize(logdev)
|
|
15
|
+
@level = Logger::DEBUG
|
|
16
|
+
@default_formatter = Logger::Formatter.new
|
|
17
|
+
@formatter = nil
|
|
18
|
+
|
|
19
|
+
@logdev = Vedeu::Logging::LocklessLogDevice.new(logdev) if logdev
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end # MonoLogger
|
|
23
|
+
|
|
24
|
+
end # Logging
|
|
25
|
+
|
|
26
|
+
end # Vedeu
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Vedeu
|
|
2
|
+
|
|
3
|
+
module Logging
|
|
4
|
+
|
|
5
|
+
# Measure the duration. Used for debugging.
|
|
6
|
+
#
|
|
7
|
+
class Timer
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
|
|
11
|
+
# @example
|
|
12
|
+
# Vedeu.timer 'message' do
|
|
13
|
+
# # ... code to be measured
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# @param message [String]
|
|
17
|
+
# @param block [Proc]
|
|
18
|
+
# @return [void] The return value of the executed block.
|
|
19
|
+
def timer(message = '', &block)
|
|
20
|
+
new(message).measure(&block)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end # Eigenclass
|
|
24
|
+
|
|
25
|
+
# Returns a new instance of Vedeu::Logging::Timer.
|
|
26
|
+
#
|
|
27
|
+
# @param message [String]
|
|
28
|
+
# @return [Vedeu::Logging::Timer]
|
|
29
|
+
def initialize(message = '')
|
|
30
|
+
@message = message
|
|
31
|
+
@started = Time.now.to_f
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Write an entry to the log file stating how long a section of
|
|
35
|
+
# code took in milliseconds. Useful for debugging performance.
|
|
36
|
+
#
|
|
37
|
+
# @return [void] The return value of the executed block.
|
|
38
|
+
def measure
|
|
39
|
+
work = yield
|
|
40
|
+
|
|
41
|
+
Vedeu.log(type: :timer, message: "#{message} took #{elapsed}ms.")
|
|
42
|
+
|
|
43
|
+
work
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
protected
|
|
47
|
+
|
|
48
|
+
# @!attribute [r] started
|
|
49
|
+
# @return [Time]
|
|
50
|
+
attr_reader :started
|
|
51
|
+
|
|
52
|
+
# @!attribute [r] message
|
|
53
|
+
# @return [String]
|
|
54
|
+
attr_reader :message
|
|
55
|
+
|
|
56
|
+
# Returns the elapsed time in milliseconds with 3 decimal
|
|
57
|
+
# places.
|
|
58
|
+
#
|
|
59
|
+
# @return [Float]
|
|
60
|
+
def elapsed
|
|
61
|
+
((Time.now.to_f - started) * 1000).round(3)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
end # Timer
|
|
65
|
+
|
|
66
|
+
end # Logging
|
|
67
|
+
|
|
68
|
+
end # Vedeu
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
module Vedeu
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module Menus
|
|
4
4
|
|
|
5
|
-
# Provides the mechanism to create menus within client
|
|
6
|
-
# events to drive them.
|
|
5
|
+
# Provides the mechanism to create menus within client
|
|
6
|
+
# applications and use events to drive them.
|
|
7
7
|
#
|
|
8
|
-
class
|
|
8
|
+
class DSL
|
|
9
9
|
|
|
10
10
|
include Vedeu::DSL
|
|
11
11
|
|
|
12
|
-
# Return a new instance of DSL
|
|
12
|
+
# Return a new instance of Vedeu::Menus::DSL.
|
|
13
13
|
#
|
|
14
|
-
# @param model [Vedeu::Menu]
|
|
14
|
+
# @param model [Vedeu::Menus::Menu]
|
|
15
15
|
# @param client [Object]
|
|
16
|
-
# @return [Vedeu::DSL
|
|
16
|
+
# @return [Vedeu::Menus::DSL]
|
|
17
17
|
def initialize(model, client = nil)
|
|
18
18
|
@model = model
|
|
19
19
|
@client = client
|
|
@@ -21,7 +21,8 @@ module Vedeu
|
|
|
21
21
|
|
|
22
22
|
# Add an individual item to the menu.
|
|
23
23
|
#
|
|
24
|
-
# @param element [Object] An object you wish to add to the
|
|
24
|
+
# @param element [Object] An object you wish to add to the
|
|
25
|
+
# collection.
|
|
25
26
|
#
|
|
26
27
|
# Vedeu.menu 'my_menu' do
|
|
27
28
|
# item SomeClass.new
|
|
@@ -34,11 +35,11 @@ module Vedeu
|
|
|
34
35
|
end
|
|
35
36
|
alias_method :item=, :item
|
|
36
37
|
|
|
37
|
-
# Define the items for the menu. Most powerful when used with
|
|
38
|
-
# model classes.
|
|
38
|
+
# Define the items for the menu. Most powerful when used with
|
|
39
|
+
# one of your model classes.
|
|
39
40
|
#
|
|
40
|
-
# In the 'my_playlist' example below, your `Track` model may
|
|
41
|
-
# collection of tracks to populate the menu.
|
|
41
|
+
# In the 'my_playlist' example below, your `Track` model may
|
|
42
|
+
# return a collection of tracks to populate the menu.
|
|
42
43
|
#
|
|
43
44
|
# Vedeu.menu 'my_menu' do
|
|
44
45
|
# items [:item_1, :item_2, :item_3]
|
|
@@ -48,16 +49,16 @@ module Vedeu
|
|
|
48
49
|
# items Track.all_my_favourites
|
|
49
50
|
# end
|
|
50
51
|
#
|
|
51
|
-
# @param collection [Array<Object>] A collection of objects
|
|
52
|
-
# the menu items.
|
|
52
|
+
# @param collection [Array<Object>] A collection of objects
|
|
53
|
+
# which make up the menu items.
|
|
53
54
|
# @return [Array]
|
|
54
55
|
def items(collection = [])
|
|
55
56
|
model.collection = collection
|
|
56
57
|
end
|
|
57
58
|
alias_method :items=, :items
|
|
58
59
|
|
|
59
|
-
# The name of the menu. Used to reference the menu throughout
|
|
60
|
-
# application's execution lifetime.
|
|
60
|
+
# The name of the menu. Used to reference the menu throughout
|
|
61
|
+
# your application's execution lifetime.
|
|
61
62
|
#
|
|
62
63
|
# Vedeu.menu do
|
|
63
64
|
# name 'my_menu'
|
|
@@ -71,8 +72,8 @@ module Vedeu
|
|
|
71
72
|
end
|
|
72
73
|
alias_method :name=, :name
|
|
73
74
|
|
|
74
|
-
end #
|
|
75
|
+
end # DSL
|
|
75
76
|
|
|
76
|
-
end #
|
|
77
|
+
end # Menus
|
|
77
78
|
|
|
78
79
|
end # Vedeu
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
module Vedeu
|
|
2
|
+
|
|
3
|
+
module Menus
|
|
4
|
+
|
|
5
|
+
# Converts the collection passed into a list of menu items which
|
|
6
|
+
# can be navigated using the instance methods or events provided.
|
|
7
|
+
#
|
|
8
|
+
class Menu
|
|
9
|
+
|
|
10
|
+
include Vedeu::Model
|
|
11
|
+
|
|
12
|
+
# @!attribute [rw] collection
|
|
13
|
+
# @return [Array]
|
|
14
|
+
attr_accessor :collection
|
|
15
|
+
|
|
16
|
+
# Returns the index of the value in the collection which is
|
|
17
|
+
# current.
|
|
18
|
+
#
|
|
19
|
+
# @!attribute [rw] current
|
|
20
|
+
# @return [Fixnum]
|
|
21
|
+
attr_accessor :current
|
|
22
|
+
|
|
23
|
+
# The name of the menu. Used to reference the menu throughout
|
|
24
|
+
# the application's execution lifetime.
|
|
25
|
+
#
|
|
26
|
+
# @!attribute [rw] name
|
|
27
|
+
# @return [String]
|
|
28
|
+
attr_accessor :name
|
|
29
|
+
|
|
30
|
+
# Returns the index of the value in the collection which is
|
|
31
|
+
# selected.
|
|
32
|
+
#
|
|
33
|
+
# @!attribute [rw] selected
|
|
34
|
+
# @return [Fixnum]
|
|
35
|
+
attr_accessor :selected
|
|
36
|
+
|
|
37
|
+
# Register a menu by name which will display a collection of
|
|
38
|
+
# items for your users to select; and provide interactivity
|
|
39
|
+
# within your application.
|
|
40
|
+
#
|
|
41
|
+
# @param name [String]
|
|
42
|
+
# @param block [Proc] A set of attributes which define the
|
|
43
|
+
# features of the menu. See {Vedeu::Menus::DSL#items} and
|
|
44
|
+
# {Vedeu::Menus::DSL#name}.
|
|
45
|
+
#
|
|
46
|
+
# @example
|
|
47
|
+
# Vedeu.menu 'my_interface' do
|
|
48
|
+
# items [:item_1, :item_2, :item_3]
|
|
49
|
+
# # ...
|
|
50
|
+
# end
|
|
51
|
+
#
|
|
52
|
+
# Vedeu.menu do
|
|
53
|
+
# name 'menus_must_have_a_name'
|
|
54
|
+
# items Track.all_my_favourites
|
|
55
|
+
# # ...
|
|
56
|
+
# end
|
|
57
|
+
#
|
|
58
|
+
# @raise [Vedeu::Error::InvalidSyntax] The required block was
|
|
59
|
+
# not given.
|
|
60
|
+
# @return [API::Menu]
|
|
61
|
+
def self.menu(name = '', &block)
|
|
62
|
+
fail Vedeu::Error::InvalidSyntax, 'block not given' unless block_given?
|
|
63
|
+
|
|
64
|
+
build(name: name, &block).store
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Returns a new instance of Vedeu::Menus::Menu.
|
|
68
|
+
#
|
|
69
|
+
# @param attributes [Hash]
|
|
70
|
+
# @option attributes collection [Array]
|
|
71
|
+
# @option attributes name [String]
|
|
72
|
+
# @option attributes current [Fixnum]
|
|
73
|
+
# @option attributes selected [Fixnum|NilClass]
|
|
74
|
+
# @return [Vedeu::Menus::Menu]
|
|
75
|
+
def initialize(attributes = {})
|
|
76
|
+
@attributes = defaults.merge!(attributes)
|
|
77
|
+
|
|
78
|
+
@attributes.each do |key, value|
|
|
79
|
+
instance_variable_set("@#{key}", value)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Returns the item from the collection which shares the same
|
|
84
|
+
# index as the value of {Vedeu::Menus::Menu#current}.
|
|
85
|
+
#
|
|
86
|
+
# @return [void]
|
|
87
|
+
def current_item
|
|
88
|
+
@collection[@current]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
# Returns the item from the collection which shares the same
|
|
92
|
+
# index as the value of {Vedeu::Menus::Menu#selected}.
|
|
93
|
+
#
|
|
94
|
+
# @return [|NilClass]
|
|
95
|
+
def selected_item
|
|
96
|
+
return nil unless @selected
|
|
97
|
+
|
|
98
|
+
@collection[@selected]
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Returns a new collection of items.
|
|
102
|
+
# Each element of the collection is of the format:
|
|
103
|
+
#
|
|
104
|
+
# [selected, current, item]
|
|
105
|
+
#
|
|
106
|
+
# `selected` is a boolean indicating whether the item is
|
|
107
|
+
# selected.
|
|
108
|
+
# `current` is a boolean indicating whether the item is
|
|
109
|
+
# current.
|
|
110
|
+
# `item` is the item itself.
|
|
111
|
+
#
|
|
112
|
+
# @return [Array]
|
|
113
|
+
def items
|
|
114
|
+
items = []
|
|
115
|
+
@collection.each_with_index do |item, index|
|
|
116
|
+
if index == @current && index == @selected
|
|
117
|
+
items << [true, true, item]
|
|
118
|
+
|
|
119
|
+
elsif index == @current
|
|
120
|
+
items << [false, true, item]
|
|
121
|
+
|
|
122
|
+
elsif index == @selected
|
|
123
|
+
items << [true, false, item]
|
|
124
|
+
|
|
125
|
+
else
|
|
126
|
+
items << [false, false, item]
|
|
127
|
+
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
items
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# Returns a subset of all the items.
|
|
134
|
+
#
|
|
135
|
+
# @return [Array]
|
|
136
|
+
def view
|
|
137
|
+
items[@current, @collection.size]
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Sets the value of current to be the first item of the
|
|
141
|
+
# collection.
|
|
142
|
+
#
|
|
143
|
+
# @return [Array]
|
|
144
|
+
def top_item
|
|
145
|
+
@current = 0
|
|
146
|
+
|
|
147
|
+
items
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# Sets the value of current to be the last item of the
|
|
151
|
+
# collection.
|
|
152
|
+
#
|
|
153
|
+
# @return [Array]
|
|
154
|
+
def bottom_item
|
|
155
|
+
@current = last
|
|
156
|
+
|
|
157
|
+
items
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
# Sets the value of current to be the next item in the
|
|
161
|
+
# collection until we reach the last.
|
|
162
|
+
#
|
|
163
|
+
# @return [Array]
|
|
164
|
+
def next_item
|
|
165
|
+
@current += 1 if @current < last
|
|
166
|
+
|
|
167
|
+
items
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Sets the value of current to be the previous item in the
|
|
171
|
+
# collection until we reach the first.
|
|
172
|
+
#
|
|
173
|
+
# @return [Array]
|
|
174
|
+
def prev_item
|
|
175
|
+
@current -= 1 if @current > 0
|
|
176
|
+
|
|
177
|
+
items
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
# Sets the selected item to be the same value as the current
|
|
181
|
+
# item.
|
|
182
|
+
#
|
|
183
|
+
# @return [Array]
|
|
184
|
+
def select_item
|
|
185
|
+
@selected = @current
|
|
186
|
+
|
|
187
|
+
items
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Removes the value of `selected`, meaning no items are
|
|
191
|
+
# selected.
|
|
192
|
+
#
|
|
193
|
+
# @return [Array]
|
|
194
|
+
def deselect_item
|
|
195
|
+
@selected = nil
|
|
196
|
+
|
|
197
|
+
items
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Returns the last index of the collection.
|
|
201
|
+
#
|
|
202
|
+
# @return [Fixnum]
|
|
203
|
+
def last
|
|
204
|
+
@collection.size - 1
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
# Returns the size of the collection.
|
|
208
|
+
#
|
|
209
|
+
# @return [Fixnum]
|
|
210
|
+
def size
|
|
211
|
+
@collection.size
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
private
|
|
215
|
+
|
|
216
|
+
# The default values for a new instance of this class.
|
|
217
|
+
#
|
|
218
|
+
# @return [Hash]
|
|
219
|
+
def defaults
|
|
220
|
+
{
|
|
221
|
+
client: nil,
|
|
222
|
+
collection: [],
|
|
223
|
+
current: 0,
|
|
224
|
+
name: '',
|
|
225
|
+
repository: Vedeu.menus,
|
|
226
|
+
selected: nil,
|
|
227
|
+
}
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
end # Menu
|
|
231
|
+
|
|
232
|
+
end # Menus
|
|
233
|
+
|
|
234
|
+
end # Vedeu
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
module Vedeu
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module Menus
|
|
4
4
|
|
|
5
5
|
# Provides a non-existent model to swallow messages.
|
|
6
6
|
#
|
|
7
|
-
class
|
|
7
|
+
class Null < Vedeu::Null::Generic
|
|
8
8
|
|
|
9
|
-
# Returns an instance of the Vedeu::Null
|
|
9
|
+
# Returns an instance of the Vedeu::Menus::Null class.
|
|
10
10
|
#
|
|
11
11
|
# @param attributes [Hash<Symbol => void>]
|
|
12
12
|
# @option attributes name [String|NilClass]
|
|
13
|
-
# @return [Vedeu::Null
|
|
13
|
+
# @return [Vedeu::Menus::Null]
|
|
14
14
|
def initialize(attributes = {})
|
|
15
15
|
@attributes = attributes
|
|
16
16
|
@name = @attributes[:name]
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
-
end #
|
|
19
|
+
end # Null
|
|
20
20
|
|
|
21
|
-
end #
|
|
21
|
+
end # Menus
|
|
22
22
|
|
|
23
23
|
end # Vedeu
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Vedeu
|
|
2
|
+
|
|
3
|
+
module Menus
|
|
4
|
+
|
|
5
|
+
# Allows the storing of menus by name.
|
|
6
|
+
#
|
|
7
|
+
class Repository < Vedeu::Repository
|
|
8
|
+
|
|
9
|
+
singleton_class.send(:alias_method, :menus, :repository)
|
|
10
|
+
|
|
11
|
+
real Vedeu::Menus::Menu
|
|
12
|
+
null Vedeu::Menus::Null
|
|
13
|
+
|
|
14
|
+
end # Repository
|
|
15
|
+
|
|
16
|
+
end # Menus
|
|
17
|
+
|
|
18
|
+
end # Vedeu
|