vedeu 0.3.4 → 0.3.5
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/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
|
|