vedeu 0.3.4 → 0.3.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/Rakefile +6 -0
- data/bin/vedeu_drb_client +8 -3
- data/bin/vedeu_drb_server +113 -0
- data/bin/vedeu_test +1 -1
- data/docs/events.md +0 -127
- data/examples/borders_app.rb +17 -7
- data/examples/configuration_app.rb +1 -1
- data/examples/cursor_app.rb +4 -2
- data/examples/drb_app.rb +113 -0
- data/examples/focus_app.rb +1 -1
- data/examples/geometry_app.rb +1 -1
- data/examples/hello_world.rb +1 -1
- data/examples/lines_app.rb +1 -1
- data/features/start_stop.feature +1 -1
- data/inch.yml +5 -0
- data/lib/vedeu/all.rb +2 -0
- data/lib/vedeu/api.rb +1 -0
- data/lib/vedeu/application.rb +17 -36
- data/lib/vedeu/bindings.rb +134 -27
- data/lib/vedeu/buffers/display_buffer.rb +1 -4
- data/lib/vedeu/configuration/api.rb +15 -14
- data/lib/vedeu/configuration/cli.rb +17 -16
- data/lib/vedeu/configuration/configuration.rb +3 -1
- data/lib/vedeu/cursor/cursor.rb +6 -8
- data/lib/vedeu/cursor/move_cursor.rb +1 -0
- data/lib/vedeu/cursor/toggle_cursor.rb +1 -0
- data/lib/vedeu/debug.rb +23 -0
- data/lib/vedeu/distributed/all.rb +1 -1
- data/lib/vedeu/distributed/client.rb +55 -13
- data/lib/vedeu/distributed/server.rb +207 -0
- data/lib/vedeu/distributed/subprocess.rb +22 -21
- data/lib/vedeu/distributed/templates/default_application.vedeu +3 -1
- data/lib/vedeu/distributed/test_application.rb +2 -1
- data/lib/vedeu/distributed/uri.rb +1 -0
- data/lib/vedeu/dsl/all.rb +4 -2
- data/lib/vedeu/dsl/components/border.rb +11 -10
- data/lib/vedeu/dsl/components/geometry.rb +1 -0
- data/lib/vedeu/dsl/components/keymap.rb +1 -0
- data/lib/vedeu/dsl/components/menu.rb +1 -0
- data/lib/vedeu/dsl/interface.rb +1 -0
- data/lib/vedeu/dsl/line.rb +3 -1
- data/lib/vedeu/dsl/shared/colour.rb +1 -0
- data/lib/vedeu/dsl/shared/style.rb +1 -0
- data/lib/vedeu/dsl/shared/text.rb +2 -0
- data/lib/vedeu/dsl/shared/use.rb +3 -0
- data/lib/vedeu/dsl/stream.rb +3 -1
- data/lib/vedeu/dsl/view.rb +1 -0
- data/lib/vedeu/events/event.rb +9 -6
- data/lib/vedeu/events/trigger.rb +18 -7
- data/lib/vedeu/exceptions.rb +4 -1
- data/lib/vedeu/input/input.rb +1 -0
- data/lib/vedeu/input/key.rb +0 -1
- data/lib/vedeu/input/keymap.rb +5 -3
- data/lib/vedeu/input/keys.rb +1 -0
- data/lib/vedeu/input/mapper.rb +1 -0
- data/lib/vedeu/launcher.rb +35 -12
- data/lib/vedeu/main_loop.rb +53 -0
- data/lib/vedeu/models/collection.rb +11 -3
- data/lib/vedeu/models/focus.rb +3 -3
- data/lib/vedeu/models/geometry.rb +8 -16
- data/lib/vedeu/models/group.rb +1 -0
- data/lib/vedeu/models/menu.rb +2 -1
- data/lib/vedeu/models/model.rb +7 -1
- data/lib/vedeu/models/view/char.rb +52 -44
- data/lib/vedeu/models/view/chars.rb +1 -0
- data/lib/vedeu/models/view/composition.rb +2 -1
- data/lib/vedeu/models/view/interface.rb +5 -3
- data/lib/vedeu/models/view/interfaces.rb +1 -0
- data/lib/vedeu/models/view/line.rb +2 -1
- data/lib/vedeu/models/view/stream.rb +2 -1
- data/lib/vedeu/models/view/streams.rb +1 -0
- data/lib/vedeu/output/all.rb +4 -0
- data/lib/vedeu/output/border.rb +75 -206
- data/lib/vedeu/output/compositor.rb +1 -0
- data/lib/vedeu/output/html_char.rb +119 -0
- data/lib/vedeu/output/html_renderer.rb +89 -0
- data/lib/vedeu/output/output.rb +48 -44
- data/lib/vedeu/output/position_index.rb +12 -1
- data/lib/vedeu/output/renderer.rb +28 -0
- data/lib/vedeu/output/viewport.rb +14 -14
- data/lib/vedeu/output/virtual_buffer.rb +56 -0
- data/lib/vedeu/output/virtual_terminal.rb +42 -34
- data/lib/vedeu/output/wordwrap.rb +3 -0
- data/lib/vedeu/output/writer.rb +13 -1
- data/lib/vedeu/presentation/background.rb +1 -0
- data/lib/vedeu/presentation/colour.rb +8 -7
- data/lib/vedeu/presentation/foreground.rb +1 -0
- data/lib/vedeu/presentation/presentation.rb +43 -7
- data/lib/vedeu/presentation/translator.rb +12 -0
- data/lib/vedeu/repositories/repository.rb +8 -8
- data/lib/vedeu/support/bounding_area.rb +2 -0
- data/lib/vedeu/support/coercions.rb +2 -1
- data/lib/vedeu/support/common.rb +1 -0
- data/lib/vedeu/support/console.rb +17 -23
- data/lib/vedeu/support/content_geometry.rb +2 -0
- data/lib/vedeu/support/coordinate.rb +1 -0
- data/lib/vedeu/support/esc.rb +58 -29
- data/lib/vedeu/support/grid.rb +1 -0
- data/lib/vedeu/support/limit.rb +9 -0
- data/lib/vedeu/support/log.rb +31 -9
- data/lib/vedeu/support/node.rb +8 -18
- data/lib/vedeu/support/position.rb +13 -34
- data/lib/vedeu/support/position_validator.rb +3 -0
- data/lib/vedeu/support/read.rb +1 -0
- data/lib/vedeu/support/refresh.rb +3 -2
- data/lib/vedeu/support/terminal.rb +11 -5
- data/lib/vedeu/support/trace.rb +16 -1
- data/lib/vedeu/support/visible.rb +2 -0
- data/lib/vedeu/support/write.rb +1 -0
- data/lib/vedeu/traps.rb +1 -0
- data/lib/vedeu.rb +2 -0
- data/test/integration/distributed_test.rb +10 -8
- data/test/lib/vedeu/api_test.rb +3 -7
- data/test/lib/vedeu/application_test.rb +2 -5
- data/test/lib/vedeu/configuration/api_test.rb +12 -0
- data/test/lib/vedeu/cursor/cursor_test.rb +2 -0
- data/test/lib/vedeu/distributed/client_test.rb +17 -7
- data/test/lib/vedeu/distributed/server_test.rb +56 -0
- data/test/lib/vedeu/distributed/test_application_test.rb +7 -3
- data/test/lib/vedeu/dsl/components/border_test.rb +10 -2
- data/test/lib/vedeu/dsl/interface_test.rb +6 -0
- data/test/lib/vedeu/dsl/line_test.rb +19 -0
- data/test/lib/vedeu/dsl/shared/colour_test.rb +4 -26
- data/test/lib/vedeu/dsl/shared/text_test.rb +8 -1
- data/test/lib/vedeu/dsl/stream_test.rb +13 -1
- data/test/lib/vedeu/input/input_test.rb +1 -1
- data/test/lib/vedeu/input/key_test.rb +3 -16
- data/test/lib/vedeu/launcher_test.rb +11 -1
- data/test/lib/vedeu/main_loop_test.rb +41 -0
- data/test/lib/vedeu/models/geometry_test.rb +15 -34
- data/test/lib/vedeu/models/view/char_test.rb +44 -45
- data/test/lib/vedeu/models/view/interface_test.rb +6 -0
- data/test/lib/vedeu/models/view/line_test.rb +1 -1
- data/test/lib/vedeu/models/view/stream_test.rb +1 -1
- data/test/lib/vedeu/output/border_test.rb +6 -5
- data/test/lib/vedeu/output/compositor_test.rb +2 -20
- data/test/lib/vedeu/output/html_char_test.rb +85 -0
- data/test/lib/vedeu/output/html_renderer_test.rb +37 -0
- data/test/lib/vedeu/output/position_index_test.rb +2 -10
- data/test/lib/vedeu/output/renderer_test.rb +24 -0
- data/test/lib/vedeu/output/virtual_buffer_test.rb +53 -0
- data/test/lib/vedeu/output/virtual_terminal_test.rb +32 -2
- data/test/lib/vedeu/presentation/background_test.rb +41 -1
- data/test/lib/vedeu/presentation/colour_test.rb +10 -6
- data/test/lib/vedeu/presentation/foreground_test.rb +46 -6
- data/test/lib/vedeu/presentation/presentation_test.rb +44 -1
- data/test/lib/vedeu/presentation/translator_test.rb +34 -0
- data/test/lib/vedeu/repositories/repository_test.rb +1 -1
- data/test/lib/vedeu/support/bounding_area_test.rb +4 -12
- data/test/lib/vedeu/support/console_test.rb +9 -50
- data/test/lib/vedeu/support/esc_test.rb +7 -7
- data/test/lib/vedeu/support/position_test.rb +42 -0
- data/test/lib/vedeu/support/terminal_test.rb +5 -20
- data/test/lib/vedeu/support/write_test.rb +42 -18
- data/test/support/helpers/all.rb +0 -1
- data/test/support/helpers/repository_test_module.rb +1 -0
- data/test/test_helper.rb +5 -2
- data/vedeu.gemspec +7 -5
- metadata +60 -14
- data/lib/vedeu/distributed/application.rb +0 -91
- data/test/lib/vedeu/distributed/application_test.rb +0 -24
- data/test/support/helpers/presentation.rb +0 -16
data/lib/vedeu/dsl/line.rb
CHANGED
@@ -34,6 +34,7 @@ module Vedeu
|
|
34
34
|
# end
|
35
35
|
#
|
36
36
|
# @api public
|
37
|
+
#
|
37
38
|
class Line
|
38
39
|
|
39
40
|
include Vedeu::DSL
|
@@ -60,7 +61,8 @@ module Vedeu
|
|
60
61
|
# line do
|
61
62
|
# # ...
|
62
63
|
#
|
63
|
-
# @
|
64
|
+
# @raise [InvalidSyntax] When no block or value is provided.
|
65
|
+
# @return [Vedeu::Lines]
|
64
66
|
def line(value = '', &block)
|
65
67
|
content = if block_given?
|
66
68
|
Vedeu::Line.build({ client: client,
|
data/lib/vedeu/dsl/shared/use.rb
CHANGED
@@ -2,6 +2,8 @@ module Vedeu
|
|
2
2
|
|
3
3
|
module DSL
|
4
4
|
|
5
|
+
# Provides helper methods for building views.
|
6
|
+
#
|
5
7
|
module Use
|
6
8
|
|
7
9
|
extend self
|
@@ -29,6 +31,7 @@ module Vedeu
|
|
29
31
|
#
|
30
32
|
# @param value [String] The name of the interface you wish to use.
|
31
33
|
# Typically used when defining interfaces to share geometry.
|
34
|
+
# @raise [ModelNotFound] The interface has not yet been defined.
|
32
35
|
# @return [Vedeu::Interface]
|
33
36
|
def use(value)
|
34
37
|
if Vedeu.interfaces.registered?(value) == false
|
data/lib/vedeu/dsl/stream.rb
CHANGED
@@ -7,6 +7,7 @@ module Vedeu
|
|
7
7
|
# Provides methods to be used to define views.
|
8
8
|
#
|
9
9
|
# @api public
|
10
|
+
#
|
10
11
|
class Stream
|
11
12
|
|
12
13
|
include Vedeu::DSL
|
@@ -23,7 +24,8 @@ module Vedeu
|
|
23
24
|
end
|
24
25
|
|
25
26
|
# @param block [Proc]
|
26
|
-
# @
|
27
|
+
# @raise [InvalidSyntax] The required block was not given.
|
28
|
+
# @return [void]
|
27
29
|
def stream(&block)
|
28
30
|
fail InvalidSyntax, 'block not given' unless block_given?
|
29
31
|
|
data/lib/vedeu/dsl/view.rb
CHANGED
data/lib/vedeu/events/event.rb
CHANGED
@@ -7,6 +7,7 @@ module Vedeu
|
|
7
7
|
# Contains all the logic of an event. Handles debouncing and throttling.
|
8
8
|
#
|
9
9
|
# @api private
|
10
|
+
#
|
10
11
|
class Event
|
11
12
|
|
12
13
|
include Vedeu::Model
|
@@ -57,7 +58,7 @@ module Vedeu
|
|
57
58
|
#
|
58
59
|
# @return [TrueClass]
|
59
60
|
def bind(name, options = {}, &block)
|
60
|
-
Vedeu.log(
|
61
|
+
Vedeu.log(type: :event, message: "Binding: '#{name}'")
|
61
62
|
|
62
63
|
new(name, options, block).bind
|
63
64
|
end
|
@@ -76,7 +77,7 @@ module Vedeu
|
|
76
77
|
def unbind(name)
|
77
78
|
return false unless Vedeu.events.registered?(name)
|
78
79
|
|
79
|
-
Vedeu.log(
|
80
|
+
Vedeu.log(type: :event, message: "Unbinding: '#{name}")
|
80
81
|
|
81
82
|
Vedeu.events.remove(name)
|
82
83
|
true
|
@@ -120,7 +121,7 @@ module Vedeu
|
|
120
121
|
# Triggers the event based on debouncing and throttling conditions.
|
121
122
|
#
|
122
123
|
# @param args [Array]
|
123
|
-
# @return []
|
124
|
+
# @return [void]
|
124
125
|
def trigger(*args)
|
125
126
|
return execute(*args) unless debouncing? || throttling?
|
126
127
|
|
@@ -137,7 +138,7 @@ module Vedeu
|
|
137
138
|
# Execute the code stored in the event closure.
|
138
139
|
#
|
139
140
|
# @param args []
|
140
|
-
# @return []
|
141
|
+
# @return [void]
|
141
142
|
def execute(*args)
|
142
143
|
reset_deadline
|
143
144
|
|
@@ -145,6 +146,8 @@ module Vedeu
|
|
145
146
|
|
146
147
|
reset_time
|
147
148
|
|
149
|
+
Vedeu.log(type: :event, message: "Triggering: '#{name}'")
|
150
|
+
|
148
151
|
closure.call(*args)
|
149
152
|
end
|
150
153
|
|
@@ -165,7 +168,7 @@ module Vedeu
|
|
165
168
|
def throttle_expired?
|
166
169
|
return true if elapsed_time > delay
|
167
170
|
|
168
|
-
Vedeu.log("Throttling
|
171
|
+
Vedeu.log(type: :event, message: "Throttling: '#{name}'")
|
169
172
|
|
170
173
|
false
|
171
174
|
end
|
@@ -189,7 +192,7 @@ module Vedeu
|
|
189
192
|
def debounce_expired?
|
190
193
|
return true if set_executed > deadline
|
191
194
|
|
192
|
-
Vedeu.log("Debouncing
|
195
|
+
Vedeu.log(type: :event, message: "Debouncing: '#{name}'")
|
193
196
|
|
194
197
|
false
|
195
198
|
end
|
data/lib/vedeu/events/trigger.rb
CHANGED
@@ -9,6 +9,7 @@ module Vedeu
|
|
9
9
|
# Vedeu.trigger(:my_event, :oxidize, 'nitrogen')
|
10
10
|
#
|
11
11
|
# @api private
|
12
|
+
#
|
12
13
|
class Trigger
|
13
14
|
|
14
15
|
class << self
|
@@ -34,15 +35,13 @@ module Vedeu
|
|
34
35
|
# @see Vedeu::Trigger.trigger
|
35
36
|
# @return [Array]
|
36
37
|
def trigger
|
37
|
-
|
38
|
-
|
39
|
-
collection = repository.find(name)
|
38
|
+
if results.one?
|
39
|
+
results.first
|
40
40
|
|
41
|
-
|
41
|
+
else
|
42
|
+
results
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
results
|
44
|
+
end
|
46
45
|
end
|
47
46
|
|
48
47
|
private
|
@@ -51,6 +50,18 @@ module Vedeu
|
|
51
50
|
:args,
|
52
51
|
:repository
|
53
52
|
|
53
|
+
# @return [Array<void>|void]
|
54
|
+
def results
|
55
|
+
@results ||= registered_events.map { |event| event.trigger(*args) }
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [Array|Array<Vedeu::Event>]
|
59
|
+
def registered_events
|
60
|
+
return [] unless repository.registered?(name)
|
61
|
+
|
62
|
+
repository.find(name)
|
63
|
+
end
|
64
|
+
|
54
65
|
end # Trigger
|
55
66
|
|
56
67
|
end # Vedeu
|
data/lib/vedeu/exceptions.rb
CHANGED
@@ -20,7 +20,9 @@ module Vedeu
|
|
20
20
|
# OutOfRange: Raised when trying to access an interface column less than 1 or
|
21
21
|
# greater than 12. Vedeu is hard-wired to a 12-column layout for the time
|
22
22
|
# being.
|
23
|
-
|
23
|
+
#
|
24
|
+
# VedeuInterrupt: Raised when Vedeu wishes to exit.
|
25
|
+
#
|
24
26
|
Exceptions = %w[
|
25
27
|
ModelNotFound
|
26
28
|
InvalidSyntax
|
@@ -28,6 +30,7 @@ module Vedeu
|
|
28
30
|
ModeSwitch
|
29
31
|
NotImplemented
|
30
32
|
OutOfRange
|
33
|
+
VedeuInterrupt
|
31
34
|
]
|
32
35
|
Exceptions.each { |e| const_set(e, Class.new(StandardError)) }
|
33
36
|
|
data/lib/vedeu/input/input.rb
CHANGED
data/lib/vedeu/input/key.rb
CHANGED
data/lib/vedeu/input/keymap.rb
CHANGED
@@ -5,6 +5,7 @@ require 'vedeu/dsl/components/keymap'
|
|
5
5
|
module Vedeu
|
6
6
|
|
7
7
|
# A container class for keys associated with a particular interface.
|
8
|
+
#
|
8
9
|
class Keymap
|
9
10
|
|
10
11
|
include Vedeu::Model
|
@@ -22,6 +23,7 @@ module Vedeu
|
|
22
23
|
# @option attributes keys []
|
23
24
|
# @option attributes name [String]
|
24
25
|
# @option attributes repository [Vedeu::Repository]
|
26
|
+
# @raise [InvalidSyntax] The required block was not given.
|
25
27
|
# @return [Vedeu::Keymap]
|
26
28
|
def build(attributes = {}, &block)
|
27
29
|
fail InvalidSyntax, 'block not given' unless block_given?
|
@@ -61,7 +63,7 @@ module Vedeu
|
|
61
63
|
end
|
62
64
|
|
63
65
|
# @param key [Key]
|
64
|
-
# @return []
|
66
|
+
# @return [void]
|
65
67
|
def add(key)
|
66
68
|
return false unless valid?(key)
|
67
69
|
|
@@ -88,7 +90,7 @@ module Vedeu
|
|
88
90
|
def use(input)
|
89
91
|
return false unless key_defined?(input)
|
90
92
|
|
91
|
-
Vedeu.log("Key pressed: '#{input}'")
|
93
|
+
Vedeu.log(type: :input, message: "Key pressed: '#{input}'")
|
92
94
|
|
93
95
|
Vedeu.trigger(:key, input)
|
94
96
|
|
@@ -104,7 +106,7 @@ module Vedeu
|
|
104
106
|
def valid?(key)
|
105
107
|
return true unless key_defined?(key.input)
|
106
108
|
|
107
|
-
Vedeu.log("Keymap '#{name}' already defines '#{key.input}'.")
|
109
|
+
Vedeu.log(type: :debug, message: "Keymap '#{name}' already defines '#{key.input}'.")
|
108
110
|
|
109
111
|
false
|
110
112
|
end
|
data/lib/vedeu/input/keys.rb
CHANGED
data/lib/vedeu/input/mapper.rb
CHANGED
data/lib/vedeu/launcher.rb
CHANGED
@@ -6,6 +6,7 @@ module Vedeu
|
|
6
6
|
# finally the exiting of the application with the correct exit code.
|
7
7
|
#
|
8
8
|
# @api public
|
9
|
+
#
|
9
10
|
class Launcher
|
10
11
|
|
11
12
|
attr_reader :exit_code
|
@@ -20,14 +21,14 @@ module Vedeu
|
|
20
21
|
stdin = STDIN,
|
21
22
|
stdout = STDOUT,
|
22
23
|
stderr = STDERR,
|
23
|
-
kernel = Kernel).
|
24
|
+
kernel = Kernel).debug_execute!
|
24
25
|
end
|
25
26
|
|
26
27
|
# @param argv [Array]
|
27
|
-
# @param stdin []
|
28
|
-
# @param stdout []
|
29
|
-
# @param stderr []
|
30
|
-
# @param kernel []
|
28
|
+
# @param stdin [IO]
|
29
|
+
# @param stdout [IO]
|
30
|
+
# @param stderr [IO]
|
31
|
+
# @param kernel [Kernel]
|
31
32
|
# @return [Launcher]
|
32
33
|
def initialize(argv = [],
|
33
34
|
stdin = STDIN,
|
@@ -42,29 +43,51 @@ module Vedeu
|
|
42
43
|
@exit_code = 1
|
43
44
|
end
|
44
45
|
|
45
|
-
# @return []
|
46
|
+
# @return [void]
|
47
|
+
def debug_execute!
|
48
|
+
if configuration.debug?
|
49
|
+
Vedeu.debug { execute! }
|
50
|
+
|
51
|
+
else
|
52
|
+
execute!
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
terminate!
|
57
|
+
end
|
58
|
+
|
59
|
+
# @return [void]
|
46
60
|
def execute!
|
47
61
|
$stdin, $stdout, $stderr = @stdin, @stdout, @stderr
|
48
62
|
|
49
63
|
Application.start(configuration)
|
50
64
|
|
51
65
|
@exit_code = 0
|
66
|
+
|
52
67
|
rescue StandardError => uncaught_exception
|
53
68
|
puts uncaught_exception.message
|
54
69
|
puts uncaught_exception.backtrace.join("\n") if configuration.debug?
|
55
70
|
|
56
|
-
ensure
|
57
|
-
Vedeu.log("Exiting gracefully.")
|
58
|
-
|
59
|
-
$stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
|
60
|
-
@kernel.exit(exit_code)
|
61
71
|
end
|
62
72
|
|
63
73
|
private
|
64
74
|
|
75
|
+
# @!attribute [r] argv
|
76
|
+
# @return [Array<String>] The command line arguments provided.
|
65
77
|
attr_reader :argv
|
66
78
|
|
67
|
-
#
|
79
|
+
# Terminates the application after resetting $stdin, $stdout and $stderr.
|
80
|
+
#
|
81
|
+
# @return [void]
|
82
|
+
def terminate!
|
83
|
+
Vedeu.log(type: :info, message: "Exiting gracefully.")
|
84
|
+
|
85
|
+
$stdin, $stdout, $stderr = STDIN, STDOUT, STDERR
|
86
|
+
|
87
|
+
@kernel.exit(exit_code)
|
88
|
+
end
|
89
|
+
|
90
|
+
# @return [Vedeu::Configuration]
|
68
91
|
def configuration
|
69
92
|
Vedeu::Configuration.configure(argv)
|
70
93
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# Provides the main loop for a Vedeu application.
|
4
|
+
#
|
5
|
+
class MainLoop
|
6
|
+
|
7
|
+
trap('SIGTERM') { stop! }
|
8
|
+
trap('TERM') { stop! }
|
9
|
+
trap('INT') { stop! }
|
10
|
+
|
11
|
+
# Start the main loop.
|
12
|
+
#
|
13
|
+
# @param block [Proc]
|
14
|
+
# @return [void]
|
15
|
+
def self.start!(&block)
|
16
|
+
@started = true
|
17
|
+
@loop = true
|
18
|
+
|
19
|
+
while(@loop) do
|
20
|
+
Vedeu.trigger(:_tick_)
|
21
|
+
|
22
|
+
yield
|
23
|
+
|
24
|
+
safe_exit_point!
|
25
|
+
end
|
26
|
+
rescue VedeuInterrupt
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
# Signal that we wish to terminate the running application.
|
31
|
+
#
|
32
|
+
# @return [void]
|
33
|
+
def self.stop!
|
34
|
+
@loop = false
|
35
|
+
end
|
36
|
+
|
37
|
+
# Check the application has started and we wish to continue running.
|
38
|
+
#
|
39
|
+
# @raise [VedeuInterrupt] When we wish to terminate the running application.
|
40
|
+
# @return [void]
|
41
|
+
def self.safe_exit_point!
|
42
|
+
if @started && !@loop
|
43
|
+
fail VedeuInterrupt
|
44
|
+
|
45
|
+
else
|
46
|
+
Vedeu.trigger(:_tock_)
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end # MainLoop
|
52
|
+
|
53
|
+
end # Vedeu
|
@@ -6,26 +6,30 @@ module Vedeu
|
|
6
6
|
# is being used.
|
7
7
|
#
|
8
8
|
# @private
|
9
|
+
#
|
9
10
|
class Collection
|
10
11
|
|
11
12
|
include Enumerable
|
12
13
|
|
13
14
|
attr_accessor :parent, :name
|
14
15
|
|
16
|
+
# @param collection [Array|Vedeu::Model::Collection]
|
17
|
+
# @param parent []
|
18
|
+
# @param name [String|NilClass]
|
15
19
|
# @return [Vedeu::Model::Collection]
|
16
20
|
def self.coerce(collection = [], parent = nil, name = nil)
|
17
21
|
if collection.kind_of?(Vedeu::Model::Collection)
|
18
22
|
collection
|
19
23
|
|
20
|
-
elsif collection.is_a?(Array)
|
21
|
-
new(collection, parent, name)
|
22
|
-
|
23
24
|
else
|
24
25
|
new(Array(collection), parent, name)
|
25
26
|
|
26
27
|
end
|
27
28
|
end
|
28
29
|
|
30
|
+
# @param collection []
|
31
|
+
# @param parent []
|
32
|
+
# @param name []
|
29
33
|
# @return [Vedeu::Model::Collection]
|
30
34
|
def initialize(collection = [], parent = nil, name = nil)
|
31
35
|
@collection = collection
|
@@ -33,10 +37,13 @@ module Vedeu
|
|
33
37
|
@name = name
|
34
38
|
end
|
35
39
|
|
40
|
+
# @param value [Fixnum]
|
41
|
+
# @return [void]
|
36
42
|
def [](value)
|
37
43
|
@collection[value]
|
38
44
|
end
|
39
45
|
|
46
|
+
# @param other [Vedeu::Model::Collection]
|
40
47
|
# @return [Vedeu::Model::Collection]
|
41
48
|
def add(*other)
|
42
49
|
self.class.new(@collection += other, parent, name)
|
@@ -48,6 +55,7 @@ module Vedeu
|
|
48
55
|
@collection
|
49
56
|
end
|
50
57
|
|
58
|
+
# @param block [Proc]
|
51
59
|
# @return [Enumerator]
|
52
60
|
def each(&block)
|
53
61
|
@collection.each(&block)
|
data/lib/vedeu/models/focus.rb
CHANGED
@@ -23,7 +23,7 @@ module Vedeu
|
|
23
23
|
storage
|
24
24
|
|
25
25
|
else
|
26
|
-
Vedeu.log("Storing focus entry: '#{name}'")
|
26
|
+
Vedeu.log(type: :store, message: "Storing focus entry: '#{name}'")
|
27
27
|
|
28
28
|
if focus
|
29
29
|
storage.unshift(name)
|
@@ -140,7 +140,7 @@ module Vedeu
|
|
140
140
|
def update
|
141
141
|
return false if empty?
|
142
142
|
|
143
|
-
Vedeu.log("Interface in focus: '#{current}'")
|
143
|
+
Vedeu.log(type: :info, message: "Interface in focus: '#{current}'")
|
144
144
|
|
145
145
|
refresh
|
146
146
|
|
@@ -149,7 +149,7 @@ module Vedeu
|
|
149
149
|
|
150
150
|
# Access to the storage for this repository.
|
151
151
|
#
|
152
|
-
# @return [
|
152
|
+
# @return [Array]
|
153
153
|
def storage
|
154
154
|
@_storage ||= in_memory
|
155
155
|
end
|
@@ -26,6 +26,7 @@ module Vedeu
|
|
26
26
|
# south
|
27
27
|
#
|
28
28
|
# @api private
|
29
|
+
#
|
29
30
|
class Geometry
|
30
31
|
|
31
32
|
include Vedeu::Model
|
@@ -146,23 +147,14 @@ module Vedeu
|
|
146
147
|
Vedeu::Limit.apply(y, @height, Terminal.height, Terminal.origin)
|
147
148
|
end
|
148
149
|
|
149
|
-
# Returns
|
150
|
-
#
|
151
|
-
#
|
152
|
-
# @param index [Fixnum]
|
153
|
-
# @param block [Proc]
|
154
|
-
# @return [String]
|
155
|
-
def origin(index = 0, &block)
|
156
|
-
Esc.set_position(*raw_origin(index), &block)
|
157
|
-
end
|
158
|
-
|
159
|
-
# Returns a tuple which positions the cursor at the top-left coordinate,
|
160
|
-
# relative to the interface's position.
|
150
|
+
# Returns the position of the cursor at the top-left coordinate, relative to
|
151
|
+
# the interface's position.
|
161
152
|
#
|
162
|
-
# @param
|
163
|
-
# @
|
164
|
-
|
165
|
-
|
153
|
+
# @param y_index [Fixnum]
|
154
|
+
# @param x_index [Fixnum]
|
155
|
+
# @return [Vedeu::Position]
|
156
|
+
def origin(y_index = 0, x_index = 0)
|
157
|
+
Vedeu::Position.new(virtual_y[y_index], virtual_x[x_index])
|
166
158
|
end
|
167
159
|
|
168
160
|
# Returns the top coordinate of the interface, a fixed or dynamic value
|
data/lib/vedeu/models/group.rb
CHANGED
data/lib/vedeu/models/menu.rb
CHANGED
@@ -6,6 +6,7 @@ module Vedeu
|
|
6
6
|
# navigated using the instance methods or events provided.
|
7
7
|
#
|
8
8
|
# @api private
|
9
|
+
#
|
9
10
|
class Menu
|
10
11
|
|
11
12
|
include Vedeu::Model
|
@@ -74,7 +75,7 @@ module Vedeu
|
|
74
75
|
# Returns the item from the collection which shares the same index as the
|
75
76
|
# value of {Vedeu::Menu#current}.
|
76
77
|
#
|
77
|
-
# @return []
|
78
|
+
# @return [void]
|
78
79
|
def current_item
|
79
80
|
@collection[@current]
|
80
81
|
end
|
data/lib/vedeu/models/model.rb
CHANGED
@@ -4,10 +4,14 @@ module Vedeu
|
|
4
4
|
# repository for later retrieval.
|
5
5
|
#
|
6
6
|
# @api private
|
7
|
+
#
|
7
8
|
module Model
|
8
9
|
|
9
10
|
attr_reader :repository
|
10
11
|
|
12
|
+
# When {Vedeu::Model} is included in a class, the methods within this module
|
13
|
+
# are included as class methods on that class.
|
14
|
+
#
|
11
15
|
module ClassMethods
|
12
16
|
|
13
17
|
# Build models using a simple DSL when a block is given, otherwise returns
|
@@ -29,7 +33,7 @@ module Vedeu
|
|
29
33
|
#
|
30
34
|
# @param klass [Class] The member (singular) or collection (multiple)
|
31
35
|
# class name for the respective model.
|
32
|
-
# @return []
|
36
|
+
# @return [void]
|
33
37
|
def child(klass)
|
34
38
|
send(:define_method, __callee__) { klass }
|
35
39
|
end
|
@@ -54,6 +58,7 @@ module Vedeu
|
|
54
58
|
# methods for the class.
|
55
59
|
#
|
56
60
|
# @param klass [Class]
|
61
|
+
# @return [void]
|
57
62
|
def self.included(klass)
|
58
63
|
klass.send :extend, ClassMethods
|
59
64
|
end
|
@@ -84,6 +89,7 @@ module Vedeu
|
|
84
89
|
# demodulize('Vedeu::DSL::Interface') # => "Interface"
|
85
90
|
#
|
86
91
|
# @param klass [Class|String]
|
92
|
+
# @return [void]
|
87
93
|
def demodulize(klass)
|
88
94
|
klass = klass.to_s
|
89
95
|
|