vedeu 0.2.3 → 0.2.4
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/docs/api.md +2 -0
- data/docs/events.md +0 -4
- data/examples/cursor_app/cursor_app.rb +56 -44
- data/lib/vedeu/api/api.rb +4 -6
- data/lib/vedeu/api/composition.rb +3 -7
- data/lib/vedeu/api/interface.rb +2 -3
- data/lib/vedeu/api/menu.rb +5 -3
- data/lib/vedeu/api/stream.rb +34 -0
- data/lib/vedeu/application.rb +4 -7
- data/lib/vedeu/configuration/api.rb +0 -5
- data/lib/vedeu/configuration/cli.rb +0 -1
- data/lib/vedeu/configuration/configuration.rb +0 -12
- data/lib/vedeu/input/input.rb +0 -3
- data/lib/vedeu/launcher.rb +0 -1
- data/lib/vedeu/models/{attributes/background.rb → background.rb} +0 -4
- data/lib/vedeu/models/char.rb +43 -0
- data/lib/vedeu/models/colour.rb +0 -1
- data/lib/vedeu/models/composition.rb +4 -3
- data/lib/vedeu/models/cursor.rb +70 -146
- data/lib/vedeu/models/{attributes/foreground.rb → foreground.rb} +0 -4
- data/lib/vedeu/models/geometry.rb +19 -20
- data/lib/vedeu/models/interface.rb +36 -5
- data/lib/vedeu/models/keymap.rb +7 -4
- data/lib/vedeu/models/line.rb +31 -11
- data/lib/vedeu/models/offset.rb +84 -0
- data/lib/vedeu/models/stream.rb +37 -13
- data/lib/vedeu/models/style.rb +0 -1
- data/lib/vedeu/output/area.rb +284 -0
- data/lib/vedeu/output/clear.rb +2 -4
- data/lib/vedeu/output/compositor.rb +0 -4
- data/lib/vedeu/output/refresh.rb +1 -2
- data/lib/vedeu/output/render.rb +12 -163
- data/lib/vedeu/output/view.rb +0 -2
- data/lib/vedeu/output/viewport.rb +132 -0
- data/lib/vedeu/repositories/buffers.rb +11 -22
- data/lib/vedeu/repositories/cursors.rb +20 -47
- data/lib/vedeu/repositories/events.rb +2 -1
- data/lib/vedeu/repositories/focus.rb +16 -16
- data/lib/vedeu/repositories/groups.rb +1 -4
- data/lib/vedeu/repositories/interfaces.rb +10 -3
- data/lib/vedeu/repositories/keymaps.rb +0 -3
- data/lib/vedeu/repositories/menus.rb +0 -2
- data/lib/vedeu/repositories/offsets.rb +47 -0
- data/lib/vedeu/{models/attributes → support}/coercions.rb +0 -0
- data/lib/vedeu/{models/attributes → support}/colour_translator.rb +0 -16
- data/lib/vedeu/support/esc.rb +0 -22
- data/lib/vedeu/support/event.rb +1 -17
- data/lib/vedeu/support/exceptions.rb +0 -3
- data/lib/vedeu/support/grid.rb +0 -3
- data/lib/vedeu/support/log.rb +13 -14
- data/lib/vedeu/support/move.rb +50 -0
- data/lib/vedeu/support/position.rb +17 -9
- data/lib/vedeu/{models/attributes → support}/presentation.rb +1 -4
- data/lib/vedeu/support/registrar.rb +2 -2
- data/lib/vedeu/support/repository.rb +23 -2
- data/lib/vedeu/support/terminal.rb +0 -2
- data/lib/vedeu/support/trace.rb +0 -11
- data/lib/vedeu.rb +11 -5
- data/test/lib/vedeu/api/api_test.rb +14 -5
- data/test/lib/vedeu/api/composition_test.rb +9 -26
- data/test/lib/vedeu/api/keymap_test.rb +1 -1
- data/test/lib/vedeu/api/menu_test.rb +6 -0
- data/test/lib/vedeu/api/stream_test.rb +32 -0
- data/test/lib/vedeu/models/{attributes/background_test.rb → background_test.rb} +0 -0
- data/test/lib/vedeu/models/char_test.rb +46 -0
- data/test/lib/vedeu/models/composition_test.rb +7 -0
- data/test/lib/vedeu/models/cursor_test.rb +63 -80
- data/test/lib/vedeu/models/{attributes/foreground_test.rb → foreground_test.rb} +0 -0
- data/test/lib/vedeu/models/geometry_test.rb +8 -10
- data/test/lib/vedeu/models/interface_test.rb +26 -21
- data/test/lib/vedeu/models/keymap_test.rb +6 -0
- data/test/lib/vedeu/models/line_test.rb +82 -3
- data/test/lib/vedeu/models/offset_test.rb +121 -0
- data/test/lib/vedeu/models/stream_test.rb +107 -8
- data/test/lib/vedeu/output/area_test.rb +242 -0
- data/test/lib/vedeu/output/compositor_test.rb +12 -3
- data/test/lib/vedeu/output/render_test.rb +34 -39
- data/test/lib/vedeu/output/viewport_test.rb +36 -0
- data/test/lib/vedeu/repositories/cursors_test.rb +32 -9
- data/test/lib/vedeu/repositories/focus_test.rb +8 -0
- data/test/lib/vedeu/repositories/offsets_test.rb +32 -0
- data/test/lib/vedeu/{models/attributes → support}/coercions_test.rb +0 -0
- data/test/lib/vedeu/{models/attributes → support}/colour_translator_test.rb +0 -0
- data/test/lib/vedeu/support/move_test.rb +35 -0
- data/test/lib/vedeu/{models/attributes → support}/presentation_test.rb +0 -0
- data/test/lib/vedeu/support/registrar_test.rb +6 -0
- data/test/lib/vedeu_test.rb +5 -0
- data/vedeu.gemspec +1 -1
- metadata +37 -17
data/lib/vedeu/output/render.rb
CHANGED
@@ -7,26 +7,26 @@ module Vedeu
|
|
7
7
|
# @api private
|
8
8
|
class Render
|
9
9
|
|
10
|
+
extend Forwardable
|
11
|
+
|
12
|
+
def_delegators :interface, :viewport
|
13
|
+
|
10
14
|
# Create a new instance of Render with the provided {Vedeu::Interface} and
|
11
15
|
# then convert the interface into a single string of content and escape
|
12
16
|
# sequences.
|
13
17
|
#
|
14
|
-
# @api private
|
15
18
|
# @param interface [Interface]
|
16
|
-
# @param options [Hash]
|
17
19
|
# @return [String]
|
18
|
-
def self.call(interface
|
19
|
-
new(interface
|
20
|
+
def self.call(interface)
|
21
|
+
new(interface).render
|
20
22
|
end
|
21
23
|
|
22
24
|
# Return a new instance of Render.
|
23
25
|
#
|
24
26
|
# @param interface [Interface]
|
25
|
-
# @param options [Hash]
|
26
27
|
# @return [Render]
|
27
|
-
def initialize(interface
|
28
|
+
def initialize(interface)
|
28
29
|
@interface = interface
|
29
|
-
@options = options
|
30
30
|
end
|
31
31
|
|
32
32
|
# Produces a single string which contains all content and escape sequences
|
@@ -34,13 +34,15 @@ module Vedeu
|
|
34
34
|
#
|
35
35
|
# @return [String]
|
36
36
|
def render
|
37
|
+
out = [ Clear.call(interface) ]
|
38
|
+
|
37
39
|
Vedeu.log("Rendering view: '#{interface.name}'")
|
38
40
|
|
39
|
-
|
40
|
-
processed_lines.each_with_index do |line, index|
|
41
|
+
viewport.each_with_index do |line, index|
|
41
42
|
out << interface.origin(index)
|
42
|
-
out << line.
|
43
|
+
out << line.join
|
43
44
|
end
|
45
|
+
out << interface.cursor.to_s if interface.in_focus?
|
44
46
|
out.join
|
45
47
|
end
|
46
48
|
|
@@ -48,159 +50,6 @@ module Vedeu
|
|
48
50
|
|
49
51
|
attr_reader :interface
|
50
52
|
|
51
|
-
# The client application may have created a line that us too long for the
|
52
|
-
# interface. This code tries to truncate streams whilst preserving styles
|
53
|
-
# and colours. To achieve this, it successively checks each stream length
|
54
|
-
# against remaining line length and truncates the stream data if it
|
55
|
-
# exceeds the line length. Further stream data that does not fit is
|
56
|
-
# discarded.
|
57
|
-
#
|
58
|
-
# @api private
|
59
|
-
# @return [Array]
|
60
|
-
def processed_lines
|
61
|
-
return [] unless visible_lines.any? { |line| line.streams.any? }
|
62
|
-
|
63
|
-
visible_lines.map do |line|
|
64
|
-
if exceeds_width?(line)
|
65
|
-
line_length = 0
|
66
|
-
new_streams = []
|
67
|
-
|
68
|
-
new_streams = line.streams.map do |stream|
|
69
|
-
next if stream.content.empty?
|
70
|
-
|
71
|
-
if (line_length += stream.content.size) >= width
|
72
|
-
remainder = width - line_length
|
73
|
-
truncated = truncate(stream.content, remainder)
|
74
|
-
|
75
|
-
build_stream(line, stream, truncated)
|
76
|
-
|
77
|
-
else
|
78
|
-
stream
|
79
|
-
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
build_line(line, new_streams)
|
84
|
-
|
85
|
-
else
|
86
|
-
line
|
87
|
-
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
# Builds a new Stream object with the newly truncated text and previous
|
93
|
-
# attributes.
|
94
|
-
#
|
95
|
-
# @api private
|
96
|
-
# @param line [Line]
|
97
|
-
# @param stream [Stream]
|
98
|
-
# @param content [String]
|
99
|
-
# @return [Stream]
|
100
|
-
def build_stream(line, stream, content)
|
101
|
-
attributes = stream.view_attributes.merge!({
|
102
|
-
parent: line.view_attributes,
|
103
|
-
text: content,
|
104
|
-
})
|
105
|
-
|
106
|
-
Stream.new(attributes)
|
107
|
-
end
|
108
|
-
|
109
|
-
# Builds a new Line object with the new streams and previous attributes.
|
110
|
-
#
|
111
|
-
# @api private
|
112
|
-
# @param line [Line]
|
113
|
-
# @param streams [Array]
|
114
|
-
# @return [Line]
|
115
|
-
def build_line(line, streams)
|
116
|
-
attributes = line.view_attributes.merge!({
|
117
|
-
parent: interface.view_attributes,
|
118
|
-
streams: streams,
|
119
|
-
})
|
120
|
-
|
121
|
-
Line.new(attributes)
|
122
|
-
end
|
123
|
-
|
124
|
-
# Converts all streams within a line into a single line of text to then
|
125
|
-
# check that this line (without formatting, as that is not visible) exceeds
|
126
|
-
# the width of the interface.
|
127
|
-
#
|
128
|
-
# @api private
|
129
|
-
# @param line [Line]
|
130
|
-
# @return [Boolean]
|
131
|
-
def exceeds_width?(line)
|
132
|
-
line.streams.map(&:content).join.size > width
|
133
|
-
end
|
134
|
-
|
135
|
-
# Truncates the provided string.
|
136
|
-
#
|
137
|
-
# @api private
|
138
|
-
# @param string [String] The string to be truncated.
|
139
|
-
# @param value [Fixnum] The total length of the string after truncation.
|
140
|
-
# @return [String]
|
141
|
-
def truncate(string, value)
|
142
|
-
string.chomp.slice(0...value)
|
143
|
-
end
|
144
|
-
|
145
|
-
# Provides the collection of visible lines associated with the interface.
|
146
|
-
# If the option `:top` was set, we will start at that line. Any lines
|
147
|
-
# outside of the height will not be rendered.
|
148
|
-
#
|
149
|
-
# @api private
|
150
|
-
# @return [Array]
|
151
|
-
def visible_lines
|
152
|
-
lines[top..height]
|
153
|
-
end
|
154
|
-
|
155
|
-
# Provides the collection of lines associated with the interface.
|
156
|
-
#
|
157
|
-
# @api private
|
158
|
-
# @return [Array]
|
159
|
-
def lines
|
160
|
-
interface.lines
|
161
|
-
end
|
162
|
-
|
163
|
-
# Provides the currently available height of the interface.
|
164
|
-
#
|
165
|
-
# @note The height is reported to be one less line than actual because
|
166
|
-
# terminal coordinates count from 1, not 0.
|
167
|
-
#
|
168
|
-
# @api private
|
169
|
-
# @return [Fixnum]
|
170
|
-
def height
|
171
|
-
interface.viewport_height - 1
|
172
|
-
end
|
173
|
-
|
174
|
-
# Provides the currently available width of the interface.
|
175
|
-
#
|
176
|
-
# @api private
|
177
|
-
# @return [Fixnum]
|
178
|
-
def width
|
179
|
-
interface.viewport_width
|
180
|
-
end
|
181
|
-
|
182
|
-
# The current top line.
|
183
|
-
#
|
184
|
-
# @api private
|
185
|
-
# @return [Fixnum]
|
186
|
-
def top
|
187
|
-
options[:top]
|
188
|
-
end
|
189
|
-
|
190
|
-
# @api private
|
191
|
-
# @return [Hash]
|
192
|
-
def options
|
193
|
-
@_options ||= defaults.merge!(@options)
|
194
|
-
end
|
195
|
-
|
196
|
-
# @api private
|
197
|
-
# @return [Hash]
|
198
|
-
def defaults
|
199
|
-
{
|
200
|
-
top: 0
|
201
|
-
}
|
202
|
-
end
|
203
|
-
|
204
53
|
end # Render
|
205
54
|
|
206
55
|
end # Vedeu
|
data/lib/vedeu/output/view.rb
CHANGED
@@ -46,7 +46,6 @@ module Vedeu
|
|
46
46
|
|
47
47
|
# Create a new Composition object with the attributes.
|
48
48
|
#
|
49
|
-
# @api private
|
50
49
|
# @return [Composition]
|
51
50
|
def composition
|
52
51
|
@_composition ||= Composition.new(attributes)
|
@@ -55,7 +54,6 @@ module Vedeu
|
|
55
54
|
# Calls the #render method of the subclass, hopefully receives attributes
|
56
55
|
# suitable to create one or more views.
|
57
56
|
#
|
58
|
-
# @api private
|
59
57
|
# @return []
|
60
58
|
def attributes
|
61
59
|
render
|
@@ -0,0 +1,132 @@
|
|
1
|
+
module Vedeu
|
2
|
+
|
3
|
+
# A Viewport is the visible part of the content within an interface.
|
4
|
+
#
|
5
|
+
# When a buffer has more lines than the defined height, or more columns than
|
6
|
+
# the defined width of the interface, the Viewport class provides 'scrolling'
|
7
|
+
# via the cursor's position.
|
8
|
+
#
|
9
|
+
class Viewport
|
10
|
+
|
11
|
+
extend Forwardable
|
12
|
+
|
13
|
+
def_delegators :interface, :content, :height, :offset, :width
|
14
|
+
|
15
|
+
# @see Viewport#show
|
16
|
+
def self.show(interface)
|
17
|
+
new(interface).show
|
18
|
+
end
|
19
|
+
|
20
|
+
# Returns an instance of Viewport.
|
21
|
+
#
|
22
|
+
# @param interface [Interface] An instance of interface.
|
23
|
+
# @return [Viewport]
|
24
|
+
def initialize(interface)
|
25
|
+
@interface = interface
|
26
|
+
@top = 0
|
27
|
+
@left = 0
|
28
|
+
end
|
29
|
+
|
30
|
+
# Returns the visible content for the interface.
|
31
|
+
#
|
32
|
+
# @return [Array]
|
33
|
+
def show
|
34
|
+
line_adjustment
|
35
|
+
column_adjustment
|
36
|
+
|
37
|
+
return [] unless content?
|
38
|
+
|
39
|
+
content[lines].map { |line| line.chars[columns] }.compact
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
attr_reader :interface
|
45
|
+
|
46
|
+
# @return [Fixnum]
|
47
|
+
def line_adjustment
|
48
|
+
if offset.y < lines.min
|
49
|
+
set_top(offset.y)
|
50
|
+
|
51
|
+
elsif offset.y > lines.max
|
52
|
+
set_top(offset.y - (lines.max - lines.min))
|
53
|
+
|
54
|
+
else
|
55
|
+
# @top does not need adjusting
|
56
|
+
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# @return [Fixnum]
|
61
|
+
def column_adjustment
|
62
|
+
if offset.x < columns.min
|
63
|
+
set_left(offset.x)
|
64
|
+
|
65
|
+
elsif offset.x > columns.max
|
66
|
+
set_left(offset.x - (columns.max - columns.min))
|
67
|
+
|
68
|
+
else
|
69
|
+
# @left does not need adjusting
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# @param value [Fixnum]
|
75
|
+
# @return [Fixnum]
|
76
|
+
def set_top(value)
|
77
|
+
@top = [[value, (content_height - height)].min, 0].max
|
78
|
+
end
|
79
|
+
|
80
|
+
# @param value [Fixnum]
|
81
|
+
# @return [Fixnum]
|
82
|
+
def set_left(value)
|
83
|
+
@left = [value, 0].max
|
84
|
+
end
|
85
|
+
|
86
|
+
# @return [Range]
|
87
|
+
def lines
|
88
|
+
@top..(@top + height - 1)
|
89
|
+
end
|
90
|
+
|
91
|
+
# @return [Range]
|
92
|
+
def columns
|
93
|
+
@left..(@left + width - 1)
|
94
|
+
end
|
95
|
+
|
96
|
+
# Returns the height of the content, or when no content, the visible height
|
97
|
+
# of the interface.
|
98
|
+
#
|
99
|
+
# @return [Fixnum]
|
100
|
+
def content_height
|
101
|
+
return height unless content?
|
102
|
+
|
103
|
+
[content.size, height].max
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the width of the content, or when no content, the visible width of
|
107
|
+
# the interface.
|
108
|
+
#
|
109
|
+
# @return [Fixnum]
|
110
|
+
def content_width
|
111
|
+
return width unless content?
|
112
|
+
|
113
|
+
[content_maximum_line_length, width].max
|
114
|
+
end
|
115
|
+
|
116
|
+
# Returns the character length of the longest line for this interface.
|
117
|
+
#
|
118
|
+
# @return [Fixnum]
|
119
|
+
def content_maximum_line_length
|
120
|
+
content.map { |line| line.size }.max
|
121
|
+
end
|
122
|
+
|
123
|
+
# Return a boolean indicating whether this interface currently has content.
|
124
|
+
#
|
125
|
+
# @return [Boolean]
|
126
|
+
def content?
|
127
|
+
content.any?
|
128
|
+
end
|
129
|
+
|
130
|
+
end # Viewport
|
131
|
+
|
132
|
+
end # Vedeu
|
@@ -49,31 +49,26 @@ module Vedeu
|
|
49
49
|
# and we should return nothing.
|
50
50
|
#
|
51
51
|
# @param name [String]
|
52
|
-
# @return [Hash]
|
52
|
+
# @return [Hash|NilClass]
|
53
53
|
def latest(name)
|
54
|
-
if new_content?(name)
|
55
|
-
swap_buffers(name)
|
56
|
-
front_buffer(name)
|
57
|
-
|
58
|
-
elsif old_content?(name)
|
59
|
-
front_buffer(name)
|
60
|
-
|
61
|
-
else
|
62
|
-
nil
|
54
|
+
swap_buffers(name) if new_content?(name)
|
63
55
|
|
64
|
-
|
56
|
+
front_buffer(name)
|
65
57
|
end
|
66
58
|
|
67
59
|
private
|
68
60
|
|
69
|
-
# Swap the named back buffer into the front buffer of the same name.
|
61
|
+
# Swap the named back buffer into the front buffer of the same name. This is
|
62
|
+
# called when the back buffer has new content (perhaps as part of a
|
63
|
+
# refresh). It also resets the offsets (i.e. scroll position)
|
70
64
|
#
|
71
|
-
# @api private
|
72
65
|
# @param name [String]
|
73
66
|
# @return [Hash]
|
74
67
|
def swap_buffers(name)
|
75
68
|
buffer = find(name)
|
76
69
|
|
70
|
+
Offsets.update({ name: name })
|
71
|
+
|
77
72
|
storage.store(name, {
|
78
73
|
front_buffer: buffer[:back_buffer],
|
79
74
|
back_buffer: nil,
|
@@ -82,7 +77,6 @@ module Vedeu
|
|
82
77
|
|
83
78
|
# Return a boolean indicating whether the named back buffer has new content.
|
84
79
|
#
|
85
|
-
# @api private
|
86
80
|
# @param name [String]
|
87
81
|
# @return [Boolean]
|
88
82
|
def new_content?(name)
|
@@ -91,16 +85,14 @@ module Vedeu
|
|
91
85
|
|
92
86
|
# Return a boolean indicating whether the named front buffer has content.
|
93
87
|
#
|
94
|
-
# @api private
|
95
88
|
# @param name [String]
|
96
89
|
# @return [Boolean]
|
97
|
-
def old_content?(name)
|
98
|
-
|
99
|
-
end
|
90
|
+
# def old_content?(name)
|
91
|
+
# defined_value?(front_buffer(name))
|
92
|
+
# end
|
100
93
|
|
101
94
|
# Return the named back buffer.
|
102
95
|
#
|
103
|
-
# @api private
|
104
96
|
# @param name [String]
|
105
97
|
# @return [Hash|Nil]
|
106
98
|
def back_buffer(name)
|
@@ -109,14 +101,12 @@ module Vedeu
|
|
109
101
|
|
110
102
|
# Return the named front buffer.
|
111
103
|
#
|
112
|
-
# @api private
|
113
104
|
# @param name [String]
|
114
105
|
# @return [Hash|Nil]
|
115
106
|
def front_buffer(name)
|
116
107
|
find(name)[:front_buffer]
|
117
108
|
end
|
118
109
|
|
119
|
-
# @api private
|
120
110
|
# @return [Hash]
|
121
111
|
def in_memory
|
122
112
|
Hash.new do |hash, interface_name|
|
@@ -127,7 +117,6 @@ module Vedeu
|
|
127
117
|
end
|
128
118
|
end
|
129
119
|
|
130
|
-
# @api private
|
131
120
|
# @param name [String]
|
132
121
|
# @raise [BufferNotFound] When the entity cannot be found with this name.
|
133
122
|
# @return [BufferNotFound]
|
@@ -10,15 +10,10 @@ module Vedeu
|
|
10
10
|
include Repository
|
11
11
|
extend self
|
12
12
|
|
13
|
-
# System events which when called will update the cursor
|
14
|
-
#
|
15
|
-
Vedeu.event(:
|
16
|
-
Vedeu.event(:
|
17
|
-
Vedeu.event(:_cursor_down_) { Cursors.use(:move_down) }
|
18
|
-
Vedeu.event(:_cursor_left_) { Cursors.use(:move_left) }
|
19
|
-
Vedeu.event(:_cursor_hide_) { Cursors.use(:hide) }
|
20
|
-
Vedeu.event(:_cursor_show_) { Cursors.use(:show) }
|
21
|
-
Vedeu.event(:_cursor_refresh_) { Cursors.use(:refresh) }
|
13
|
+
# System events which when called will update the cursor visibility
|
14
|
+
# accordingly for the interface in focus.
|
15
|
+
Vedeu.event(:_cursor_hide_) { Cursors.hide }
|
16
|
+
Vedeu.event(:_cursor_show_) { Cursors.show }
|
22
17
|
|
23
18
|
# Adds an interface to the cursors repository.
|
24
19
|
#
|
@@ -27,50 +22,36 @@ module Vedeu
|
|
27
22
|
def add(attributes)
|
28
23
|
validate_attributes!(attributes)
|
29
24
|
|
30
|
-
Vedeu.log("
|
25
|
+
Vedeu.log("#{action(__callee__)} cursor: '#{attributes[:name]}'")
|
31
26
|
|
32
|
-
storage.store(attributes[:name],
|
33
|
-
name: attributes[:name],
|
34
|
-
x: 1,
|
35
|
-
y: 1,
|
36
|
-
state: :show
|
37
|
-
})
|
27
|
+
storage.store(attributes[:name], Cursor.new(attributes))
|
38
28
|
end
|
29
|
+
alias_method :update, :add
|
39
30
|
|
40
|
-
#
|
31
|
+
# Make the cursor of this interface invisible.
|
41
32
|
#
|
42
|
-
# @
|
43
|
-
|
44
|
-
|
45
|
-
return false unless defined_value?(attributes[:name])
|
46
|
-
|
47
|
-
Vedeu.log("Updating cursor: '#{attributes[:name]}'")
|
48
|
-
|
49
|
-
storage.store(attributes[:name], attributes)
|
33
|
+
# @return [Cursor]
|
34
|
+
def hide
|
35
|
+
find_or_create(Focus.current).hide
|
50
36
|
end
|
51
37
|
|
52
|
-
#
|
53
|
-
# state.
|
38
|
+
# Make the cursor of this interface visible.
|
54
39
|
#
|
55
|
-
# @
|
56
|
-
|
57
|
-
|
58
|
-
# of the action.
|
59
|
-
def use(action)
|
60
|
-
name = Focus.current
|
61
|
-
cursor = Cursor.new(find(name))
|
62
|
-
|
63
|
-
storage.store(name, cursor.send(action))
|
64
|
-
|
65
|
-
Terminal.output(cursor.to_s)
|
40
|
+
# @return [Cursor]
|
41
|
+
def show
|
42
|
+
find_or_create(Focus.current).show
|
66
43
|
end
|
67
44
|
|
68
45
|
private
|
69
46
|
|
47
|
+
# @return [Class]
|
48
|
+
def entity
|
49
|
+
Cursor
|
50
|
+
end
|
51
|
+
|
70
52
|
# Returns an empty collection ready for the storing of cursors by name with
|
71
53
|
# current attributes.
|
72
54
|
#
|
73
|
-
# @api private
|
74
55
|
# @example
|
75
56
|
# { 'holmium' => {
|
76
57
|
# name: 'holmium',
|
@@ -83,14 +64,6 @@ module Vedeu
|
|
83
64
|
{}
|
84
65
|
end
|
85
66
|
|
86
|
-
# @api private
|
87
|
-
# @param name [String]
|
88
|
-
# @raise [CursorNotFound] When the entity cannot be found with this name.
|
89
|
-
# @return [CursorNotFound]
|
90
|
-
def not_found(name)
|
91
|
-
fail CursorNotFound, "Cursor was not found with this name: #{name.to_s}."
|
92
|
-
end
|
93
|
-
|
94
67
|
end # Cursors
|
95
68
|
|
96
69
|
end # Vedeu
|
@@ -2,6 +2,8 @@ module Vedeu
|
|
2
2
|
|
3
3
|
# Provides a mechanism for storing and retrieving events by name. A single
|
4
4
|
# name can contain many events. Also, an event can trigger other events.
|
5
|
+
#
|
6
|
+
# @api private
|
5
7
|
module Events
|
6
8
|
|
7
9
|
include Repository
|
@@ -47,7 +49,6 @@ module Vedeu
|
|
47
49
|
# Returns an empty collection ready for the storing of events by name with
|
48
50
|
# associated event instance.
|
49
51
|
#
|
50
|
-
# @api private
|
51
52
|
# @return [Hash]
|
52
53
|
def in_memory
|
53
54
|
Hash.new { |hash, key| hash[key] = { events: [] } }
|
@@ -14,20 +14,9 @@ module Vedeu
|
|
14
14
|
# System events which when called will change which interface is currently
|
15
15
|
# focussed. When the interface is brought into focus, its cursor position
|
16
16
|
# and visibility is restored.
|
17
|
-
Vedeu.event(:_focus_by_name_)
|
18
|
-
|
19
|
-
|
20
|
-
end
|
21
|
-
|
22
|
-
Vedeu.event(:_focus_next_) do
|
23
|
-
Vedeu::Focus.next_item
|
24
|
-
Vedeu.trigger(:_cursor_refresh_)
|
25
|
-
end
|
26
|
-
|
27
|
-
Vedeu.event(:_focus_prev_) do
|
28
|
-
Vedeu::Focus.prev_item
|
29
|
-
Vedeu.trigger(:_cursor_refresh_)
|
30
|
-
end
|
17
|
+
Vedeu.event(:_focus_by_name_) { |name| Vedeu::Focus.by_name(name) }
|
18
|
+
Vedeu.event(:_focus_next_) { Vedeu::Focus.next_item }
|
19
|
+
Vedeu.event(:_focus_prev_) { Vedeu::Focus.prev_item }
|
31
20
|
|
32
21
|
# Add an interface name to the focus list unless it is already registered.
|
33
22
|
#
|
@@ -57,6 +46,8 @@ module Vedeu
|
|
57
46
|
|
58
47
|
Vedeu.log("Interface in focus: '#{current}'")
|
59
48
|
|
49
|
+
refresh
|
50
|
+
|
60
51
|
current
|
61
52
|
end
|
62
53
|
|
@@ -87,6 +78,8 @@ module Vedeu
|
|
87
78
|
|
88
79
|
Vedeu.log("Interface in focus: '#{current}'")
|
89
80
|
|
81
|
+
refresh
|
82
|
+
|
90
83
|
current
|
91
84
|
end
|
92
85
|
|
@@ -98,9 +91,18 @@ module Vedeu
|
|
98
91
|
|
99
92
|
Vedeu.log("Interface in focus: '#{current}'")
|
100
93
|
|
94
|
+
refresh
|
95
|
+
|
101
96
|
current
|
102
97
|
end
|
103
98
|
|
99
|
+
# Refresh the interface in focus.
|
100
|
+
#
|
101
|
+
# @return [Array]
|
102
|
+
def refresh
|
103
|
+
Vedeu.trigger("_refresh_#{current}_".to_sym)
|
104
|
+
end
|
105
|
+
|
104
106
|
# Returns all registered interfaces by name.
|
105
107
|
#
|
106
108
|
# @return [Array]
|
@@ -110,7 +112,6 @@ module Vedeu
|
|
110
112
|
|
111
113
|
# Returns a boolean indicating whether the named interface is registered.
|
112
114
|
#
|
113
|
-
# @api private
|
114
115
|
# @return [Boolean]
|
115
116
|
def registered?(name)
|
116
117
|
return false if storage.empty?
|
@@ -122,7 +123,6 @@ module Vedeu
|
|
122
123
|
|
123
124
|
# Returns an empty collection ready for the storing of interface names.
|
124
125
|
#
|
125
|
-
# @api private
|
126
126
|
# @return [Array]
|
127
127
|
def in_memory
|
128
128
|
[]
|
@@ -13,7 +13,7 @@ module Vedeu
|
|
13
13
|
# exist, and rejecting the interface if it is already known.
|
14
14
|
#
|
15
15
|
# @param attributes [Hash]
|
16
|
-
# @return [
|
16
|
+
# @return [Boolean]
|
17
17
|
def add(attributes)
|
18
18
|
validate_attributes!(attributes)
|
19
19
|
|
@@ -29,7 +29,6 @@ module Vedeu
|
|
29
29
|
private
|
30
30
|
|
31
31
|
# @see Vedeu::Refresh.register_event
|
32
|
-
# @api private
|
33
32
|
# @param attributes [Hash]
|
34
33
|
# @return [Boolean]
|
35
34
|
def register_event(attributes)
|
@@ -39,13 +38,11 @@ module Vedeu
|
|
39
38
|
Vedeu::Refresh.register_event(:by_group, name, delay)
|
40
39
|
end
|
41
40
|
|
42
|
-
# @api private
|
43
41
|
# @return [Hash]
|
44
42
|
def in_memory
|
45
43
|
Hash.new { |hash, key| hash[key] = Set.new }
|
46
44
|
end
|
47
45
|
|
48
|
-
# @api private
|
49
46
|
# @param name [String]
|
50
47
|
# @raise [GroupNotFound] When the entity cannot be found with this name.
|
51
48
|
# @return [GroupNotFound]
|