vedeu 0.6.59 → 0.6.60
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/vedeu/borders/all.rb +0 -1
- data/lib/vedeu/borders/repository.rb +1 -1
- data/lib/vedeu/editor/all.rb +0 -1
- data/lib/vedeu/input/capture.rb +74 -41
- data/lib/vedeu/input/mouse.rb +2 -0
- data/lib/vedeu/repositories/repository.rb +4 -2
- data/lib/vedeu/runtime/application.rb +1 -1
- data/lib/vedeu/terminal/terminal.rb +0 -17
- data/lib/vedeu/version.rb +1 -1
- data/test/lib/vedeu/groups/refresh_test.rb +1 -1
- data/test/lib/vedeu/input/capture_test.rb +199 -80
- data/test/lib/vedeu/input/mouse_test.rb +4 -0
- data/test/lib/vedeu/output/viewport_test.rb +8 -2
- data/test/lib/vedeu/terminal/terminal_test.rb +0 -34
- data/test/support/examples/material_colours_app.rb +6 -8
- metadata +2 -8
- data/lib/vedeu/borders/null.rb +0 -63
- data/lib/vedeu/editor/capture.rb +0 -66
- data/test/lib/vedeu/borders/null_test.rb +0 -52
- data/test/lib/vedeu/editor/capture_test.rb +0 -63
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 686a2b4fb8270f973081dc3c7d108cdb49e6449a
|
4
|
+
data.tar.gz: 4ad07b62d0523da5bcfa758b53d1602b12396bc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 019242a5c896bf72c9e396f389ec4e185b461d9839087ae68f208a17c62307137aece08f65174ba3d4aa68f4d90233b327138dcaec1de35f858fa916ac58f43c
|
7
|
+
data.tar.gz: f1489ca293258577eef48e095e8cea55cc22502d14c0a2df0f3fd281b0b200348cb6dd9486a92a845c68638d766514a7771d01dc63d1a6e4fe0b15c3abfa2ef0
|
data/lib/vedeu/borders/all.rb
CHANGED
data/lib/vedeu/editor/all.rb
CHANGED
data/lib/vedeu/input/capture.rb
CHANGED
@@ -2,27 +2,31 @@ module Vedeu
|
|
2
2
|
|
3
3
|
module Input
|
4
4
|
|
5
|
-
# Captures input from the user via
|
5
|
+
# Captures input from the user terminal via 'getch' and
|
6
6
|
# translates special characters into symbols.
|
7
7
|
#
|
8
8
|
class Capture
|
9
9
|
|
10
|
+
ESCAPE_KEY_CODE = 27 # \e
|
11
|
+
|
12
|
+
extend Forwardable
|
13
|
+
|
14
|
+
def_delegators Vedeu::Terminal::Mode,
|
15
|
+
:cooked_mode?,
|
16
|
+
:fake_mode?,
|
17
|
+
:raw_mode?
|
18
|
+
|
10
19
|
# Instantiate Vedeu::Input::Input and capture keypress(es).
|
11
20
|
#
|
12
|
-
# @param (see #initialize)
|
13
21
|
# @return (see #read)
|
14
|
-
def self.read
|
15
|
-
new
|
22
|
+
def self.read
|
23
|
+
new.read
|
16
24
|
end
|
17
25
|
|
18
26
|
# Returns a new instance of Vedeu::Input::Input.
|
19
27
|
#
|
20
|
-
# @param reader [IO] An object that responds to `#read`.
|
21
|
-
# Typically, this is Vedeu::Terminal.
|
22
28
|
# @return [Vedeu::Input::Input]
|
23
|
-
def initialize
|
24
|
-
@reader = reader
|
25
|
-
end
|
29
|
+
def initialize; end
|
26
30
|
|
27
31
|
# Triggers various events dependent on the terminal mode.
|
28
32
|
#
|
@@ -42,68 +46,97 @@ module Vedeu
|
|
42
46
|
#
|
43
47
|
# @return [Array|String|Symbol]
|
44
48
|
def read
|
45
|
-
|
46
|
-
Vedeu.trigger(:_mouse_event_, keypress)
|
49
|
+
Vedeu.log(type: :input, message: 'Waiting for user input...'.freeze)
|
47
50
|
|
48
|
-
|
51
|
+
if raw_mode?
|
49
52
|
Vedeu.trigger(:_keypress_, keypress)
|
50
53
|
|
51
|
-
elsif
|
52
|
-
|
53
|
-
|
54
|
-
key
|
54
|
+
elsif fake_mode?
|
55
|
+
@key ||= keypress
|
56
|
+
|
57
|
+
if click?(@key)
|
58
|
+
Vedeu.trigger(:_mouse_event_, @key)
|
55
59
|
|
56
|
-
|
57
|
-
Vedeu.trigger(:_keypress_, key, name)
|
60
|
+
elsif Vedeu::Input::Mapper.registered?(@key, name)
|
61
|
+
Vedeu.trigger(:_keypress_, @key, name)
|
58
62
|
|
59
63
|
elsif interface.editable?
|
60
|
-
Vedeu.trigger(:_editor_, key)
|
64
|
+
Vedeu.trigger(:_editor_, @key)
|
65
|
+
|
66
|
+
elsif @key.nil?
|
67
|
+
nil
|
61
68
|
|
62
69
|
else
|
63
|
-
Vedeu.trigger(:key, key)
|
70
|
+
Vedeu.trigger(:key, @key)
|
64
71
|
|
65
72
|
end
|
66
|
-
|
73
|
+
|
74
|
+
elsif cooked_mode?
|
67
75
|
Vedeu.trigger(:_command_, command)
|
68
76
|
|
69
77
|
end
|
70
78
|
end
|
71
79
|
|
72
|
-
|
80
|
+
private
|
73
81
|
|
74
|
-
#
|
75
|
-
#
|
76
|
-
|
82
|
+
# Returns the translated (when possible) keypress(es).
|
83
|
+
#
|
84
|
+
# @return [String|Symbol]
|
85
|
+
def keypress
|
86
|
+
Vedeu::Input::Translator.translate(input)
|
87
|
+
end
|
77
88
|
|
78
|
-
|
89
|
+
# Takes input from the user via the keyboard. Accepts special
|
90
|
+
# keys like the F-Keys etc, by capturing the entire sequence.
|
91
|
+
#
|
92
|
+
# @return [String]
|
93
|
+
def input
|
94
|
+
keys = console.getch
|
95
|
+
|
96
|
+
if keys.ord == ESCAPE_KEY_CODE
|
97
|
+
keys << console.read_nonblock(4) rescue nil
|
98
|
+
keys << console.read_nonblock(3) rescue nil
|
99
|
+
keys << console.read_nonblock(2) rescue nil
|
100
|
+
end
|
101
|
+
|
102
|
+
return Vedeu::Input::Mouse.click(keys) if click?(keys)
|
103
|
+
|
104
|
+
keys
|
105
|
+
end
|
79
106
|
|
80
107
|
# Returns a boolean indicating whether a mouse click was
|
81
108
|
# received.
|
82
109
|
#
|
83
|
-
# @param key [String]
|
110
|
+
# @param key [NilClass|String|Symbol|Vedeu::Cursors::Cursor]
|
84
111
|
# @return [Boolean]
|
85
|
-
def click?(
|
86
|
-
return false if
|
112
|
+
def click?(input)
|
113
|
+
return false if input.nil? || input.is_a?(Symbol)
|
87
114
|
|
88
|
-
|
115
|
+
input.is_a?(Vedeu::Cursors::Cursor) || input.start_with?("\e[M")
|
89
116
|
end
|
90
117
|
|
91
|
-
#
|
92
|
-
|
93
|
-
|
94
|
-
def keypress
|
95
|
-
key = input
|
96
|
-
|
97
|
-
@keypress ||= Vedeu::Input::Translator.translate(key)
|
118
|
+
# @return [IO]
|
119
|
+
def console
|
120
|
+
@console ||= Vedeu::Terminal.console
|
98
121
|
end
|
99
122
|
|
100
|
-
#
|
123
|
+
# Takes input from the user via the keyboard. Accepts special
|
124
|
+
# keys like the F-Keys etc, by capturing the entire sequence.
|
101
125
|
#
|
102
126
|
# @return [String]
|
103
|
-
def
|
104
|
-
|
127
|
+
def command
|
128
|
+
console.gets.chomp
|
129
|
+
end
|
130
|
+
|
131
|
+
# @return [String|Symbol]
|
132
|
+
def name
|
133
|
+
Vedeu.focus
|
134
|
+
end
|
135
|
+
|
136
|
+
# @return [Vedeu::Interfaces::Interface]
|
137
|
+
def interface
|
138
|
+
Vedeu.interfaces.by_name(name)
|
105
139
|
end
|
106
|
-
alias_method :command, :input
|
107
140
|
|
108
141
|
end # Input
|
109
142
|
|
data/lib/vedeu/input/mouse.rb
CHANGED
@@ -62,8 +62,10 @@ module Vedeu
|
|
62
62
|
#
|
63
63
|
# @param name [String|Symbol] The name of the stored model.
|
64
64
|
# @return [void]
|
65
|
-
def by_name(name =
|
66
|
-
|
65
|
+
def by_name(name = nil)
|
66
|
+
name = present?(name) ? name : Vedeu.focus
|
67
|
+
|
68
|
+
return find(name) if registered?(name)
|
67
69
|
|
68
70
|
attrs = if null_attributes.any?
|
69
71
|
null_attributes.merge!(name: name)
|
@@ -29,23 +29,6 @@ module Vedeu
|
|
29
29
|
restore_screen
|
30
30
|
end
|
31
31
|
|
32
|
-
# Takes input from the user via the keyboard. Accepts special keys
|
33
|
-
# like the F-Keys etc, by capturing the entire sequence.
|
34
|
-
#
|
35
|
-
# @return [String]
|
36
|
-
def input
|
37
|
-
Vedeu.log(type: :input, message: 'Waiting for user input...'.freeze)
|
38
|
-
|
39
|
-
if raw_mode? || fake_mode?
|
40
|
-
Vedeu::Editor::Capture.read(console)
|
41
|
-
|
42
|
-
else
|
43
|
-
console.gets.chomp
|
44
|
-
|
45
|
-
end
|
46
|
-
end
|
47
|
-
alias_method :read, :input
|
48
|
-
|
49
32
|
# Prints the streams to the screen and returns the streams.
|
50
33
|
#
|
51
34
|
# @param streams [String|Array]
|
data/lib/vedeu/version.rb
CHANGED
@@ -49,7 +49,7 @@ module Vedeu
|
|
49
49
|
context 'when no interfaces/views have been registered' do
|
50
50
|
before { Vedeu::Models::Focus.reset }
|
51
51
|
|
52
|
-
it { proc { subject }.must_raise(Vedeu::Error::
|
52
|
+
it { proc { subject }.must_raise(Vedeu::Error::Fatal) }
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -6,132 +6,251 @@ module Vedeu
|
|
6
6
|
|
7
7
|
describe Capture do
|
8
8
|
|
9
|
-
let(:reader) { Vedeu::Terminal }
|
10
|
-
let(:keypress) { 'a' }
|
11
9
|
let(:described) { Vedeu::Input::Capture }
|
12
|
-
let(:instance) { described.new
|
13
|
-
let(:raw_mode) { true }
|
10
|
+
let(:instance) { described.new }
|
14
11
|
|
15
12
|
describe '#initialize' do
|
16
13
|
it { instance.must_be_instance_of(described) }
|
17
|
-
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#read' do
|
17
|
+
it { instance.must_respond_to(:read) }
|
18
18
|
end
|
19
19
|
|
20
20
|
describe '.read' do
|
21
|
+
let(:is_cooked_mode) { false }
|
22
|
+
let(:is_fake_mode) { false }
|
23
|
+
let(:is_raw_mode) { false }
|
24
|
+
let(:keypress) {}
|
25
|
+
let(:_name) { 'Vedeu::Input::Capture' }
|
26
|
+
let(:interface) {
|
27
|
+
Vedeu::Interfaces::Interface.new(editable: editable,
|
28
|
+
name: _name)
|
29
|
+
}
|
30
|
+
let(:editable) { false }
|
31
|
+
|
21
32
|
before do
|
22
|
-
|
23
|
-
|
24
|
-
Vedeu.stubs(:
|
33
|
+
Vedeu::Terminal::Mode.stubs(:cooked_mode?).returns(is_cooked_mode)
|
34
|
+
Vedeu::Terminal::Mode.stubs(:fake_mode?).returns(is_fake_mode)
|
35
|
+
Vedeu::Terminal::Mode.stubs(:raw_mode?).returns(is_raw_mode)
|
36
|
+
Vedeu.stubs(:focus).returns(_name)
|
25
37
|
end
|
26
38
|
|
27
|
-
subject { described.read
|
39
|
+
subject { described.read }
|
28
40
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
41
|
+
it 'appends "Waiting for user input..." to the log' do
|
42
|
+
Vedeu.expects(:log)
|
43
|
+
subject
|
44
|
+
end
|
33
45
|
|
34
|
-
|
46
|
+
context 'when the terminal mode is :fake' do
|
47
|
+
let(:is_fake_mode) { true }
|
48
|
+
let(:registered) { false }
|
35
49
|
|
36
|
-
|
37
|
-
Vedeu.
|
38
|
-
|
50
|
+
before do
|
51
|
+
Vedeu::Terminal.console.stubs(:getch).returns(keypress)
|
52
|
+
Vedeu::Input::Mapper.stubs(:registered?).with(translated, _name).returns(registered)
|
53
|
+
Vedeu.interfaces.stubs(:by_name).returns(interface)
|
39
54
|
end
|
40
|
-
end
|
41
55
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
56
|
+
context 'when the keypress is an escape sequence' do
|
57
|
+
context 'when the key is :shift_f5 (read_nonblock(7))' do
|
58
|
+
let(:keypress) { "\e[15;2~" }
|
59
|
+
let(:translated) { :shift_f5 }
|
46
60
|
|
47
|
-
|
61
|
+
context 'when the key is registered with a keymap' do
|
62
|
+
let(:registered) { true }
|
48
63
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
64
|
+
it {
|
65
|
+
Vedeu::Input::Mapper.expects(:registered?).with(translated, _name)
|
66
|
+
subject
|
67
|
+
}
|
68
|
+
|
69
|
+
it {
|
70
|
+
Vedeu.expects(:trigger).with(:_keypress_, translated, 'Vedeu::Input::Capture')
|
71
|
+
subject
|
72
|
+
}
|
73
|
+
end
|
56
74
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
75
|
+
context 'when the key is not registered with a keymap' do
|
76
|
+
context 'when the interface is editable' do
|
77
|
+
let(:editable) { true }
|
78
|
+
|
79
|
+
it {
|
80
|
+
Vedeu.expects(:trigger).with(:_editor_, :shift_f5)
|
81
|
+
subject
|
82
|
+
}
|
83
|
+
end
|
84
|
+
|
85
|
+
context 'when the interface is not editable' do
|
86
|
+
it {
|
87
|
+
Vedeu.expects(:trigger).with(:key, :shift_f5)
|
88
|
+
subject
|
89
|
+
}
|
90
|
+
end
|
91
|
+
end
|
61
92
|
end
|
62
93
|
|
63
|
-
context 'when the
|
64
|
-
let(:
|
94
|
+
context 'when the key is really a mouse click (read_nonblock(6))' do
|
95
|
+
let(:keypress) { "\e[M`6E" }
|
96
|
+
let(:translated) {}
|
65
97
|
|
66
|
-
it
|
67
|
-
Vedeu.expects(:trigger).with(:
|
98
|
+
it {
|
99
|
+
Vedeu.expects(:trigger).with(:_cursor_up_, _name)
|
100
|
+
Vedeu.expects(:trigger).with(:_mouse_event_, "\e[M`6E")
|
68
101
|
subject
|
69
|
-
|
102
|
+
}
|
70
103
|
end
|
71
104
|
|
72
|
-
context 'when the
|
73
|
-
let(:
|
105
|
+
context 'when the key is :f6 key (read_nonblock(5))' do
|
106
|
+
let(:keypress) { "\e[17~" }
|
107
|
+
let(:translated) { :f6 }
|
74
108
|
|
75
|
-
|
76
|
-
|
109
|
+
it {
|
110
|
+
Vedeu.expects(:trigger).with(:key, translated)
|
111
|
+
subject
|
112
|
+
}
|
113
|
+
end
|
77
114
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
end
|
82
|
-
end
|
115
|
+
context 'when the key is :delete (read_nonblock(4))' do
|
116
|
+
let(:keypress) { "\e[3~" }
|
117
|
+
let(:translated) { :delete }
|
83
118
|
|
84
|
-
|
85
|
-
|
119
|
+
it {
|
120
|
+
Vedeu.expects(:trigger).with(:key, translated)
|
121
|
+
subject
|
122
|
+
}
|
123
|
+
end
|
86
124
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
125
|
+
context 'when the key is :up (read_nonblock(3))' do
|
126
|
+
let(:keypress) { "\e[A" }
|
127
|
+
let(:translated) { :up }
|
128
|
+
|
129
|
+
it {
|
130
|
+
Vedeu.expects(:trigger).with(:key, translated)
|
131
|
+
subject
|
132
|
+
}
|
133
|
+
end
|
134
|
+
|
135
|
+
context 'when the key is :escape (read_nonblock(1))' do
|
136
|
+
let(:keypress) { "\e" }
|
137
|
+
let(:translated) { :escape }
|
138
|
+
|
139
|
+
it {
|
140
|
+
Vedeu.expects(:trigger).with(:key, translated)
|
141
|
+
subject
|
142
|
+
}
|
92
143
|
end
|
93
144
|
end
|
94
145
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
# Vedeu.interfaces.reset
|
99
|
-
# }
|
146
|
+
context 'when the keypress is not an escape sequence' do
|
147
|
+
let(:keypress) { 'r' }
|
148
|
+
let(:translated) { 'r' }
|
100
149
|
|
101
|
-
|
102
|
-
|
150
|
+
it {
|
151
|
+
Vedeu.expects(:trigger).with(:key, keypress)
|
152
|
+
subject
|
153
|
+
}
|
154
|
+
end
|
103
155
|
end
|
104
156
|
|
105
|
-
context 'when
|
106
|
-
let(:
|
107
|
-
let(:fake_mode) { false }
|
108
|
-
let(:keypress) { 'a' }
|
157
|
+
context 'when the terminal mode is :raw' do
|
158
|
+
let(:is_raw_mode) { true }
|
109
159
|
|
110
|
-
before
|
160
|
+
before do
|
161
|
+
Vedeu::Terminal.console.stubs(:getch).returns(keypress)
|
162
|
+
end
|
111
163
|
|
112
|
-
context 'when the
|
113
|
-
|
114
|
-
|
115
|
-
|
164
|
+
context 'when the keypress is an escape sequence' do
|
165
|
+
context 'when the key is :shift_f5 (read_nonblock(7))' do
|
166
|
+
let(:keypress) { "\e[15;2~" }
|
167
|
+
|
168
|
+
it {
|
169
|
+
Vedeu.expects(:trigger).with(:_keypress_, :shift_f5)
|
170
|
+
subject
|
171
|
+
}
|
116
172
|
end
|
117
|
-
end
|
118
173
|
|
119
|
-
|
120
|
-
|
174
|
+
context 'when the key is really a mouse click (read_nonblock(6))' do
|
175
|
+
let(:keypress) { "\e[M`6E" }
|
121
176
|
|
122
|
-
|
123
|
-
|
124
|
-
|
177
|
+
it {
|
178
|
+
Vedeu.expects(:trigger).with(:_cursor_up_, _name)
|
179
|
+
Vedeu.expects(:trigger).with(:_mouse_event_, "\e[M`6E")
|
180
|
+
Vedeu.expects(:trigger).with(:_keypress_, nil)
|
181
|
+
subject
|
182
|
+
}
|
125
183
|
end
|
126
184
|
|
127
|
-
context 'when the key is
|
185
|
+
context 'when the key is :f6 key (read_nonblock(5))' do
|
128
186
|
let(:keypress) { "\e[17~" }
|
129
187
|
|
130
|
-
it
|
188
|
+
it {
|
131
189
|
Vedeu.expects(:trigger).with(:_keypress_, :f6)
|
132
190
|
subject
|
133
|
-
|
191
|
+
}
|
192
|
+
end
|
193
|
+
|
194
|
+
context 'when the key is :delete (read_nonblock(4))' do
|
195
|
+
let(:keypress) { "\e[3~" }
|
196
|
+
|
197
|
+
it {
|
198
|
+
Vedeu.expects(:trigger).with(:_keypress_, :delete)
|
199
|
+
subject
|
200
|
+
}
|
134
201
|
end
|
202
|
+
|
203
|
+
context 'when the key is :up (read_nonblock(3))' do
|
204
|
+
let(:keypress) { "\e[A" }
|
205
|
+
|
206
|
+
it {
|
207
|
+
Vedeu.expects(:trigger).with(:_keypress_, :up)
|
208
|
+
subject
|
209
|
+
}
|
210
|
+
end
|
211
|
+
|
212
|
+
context 'when the key is :escape (read_nonblock(1))' do
|
213
|
+
let(:keypress) { "\e" }
|
214
|
+
|
215
|
+
it {
|
216
|
+
Vedeu.expects(:trigger).with(:_keypress_, :escape)
|
217
|
+
subject
|
218
|
+
}
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'when the keypress is not an escape sequence' do
|
223
|
+
let(:keypress) { 'r' }
|
224
|
+
|
225
|
+
it {
|
226
|
+
Vedeu.expects(:trigger).with(:_keypress_, keypress)
|
227
|
+
subject
|
228
|
+
}
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
context 'when the terminal mode is :cooked' do
|
233
|
+
let(:command) { "help\n" }
|
234
|
+
let(:is_cooked_mode) { true }
|
235
|
+
|
236
|
+
before do
|
237
|
+
Vedeu::Terminal.console.stubs(:gets).returns(command)
|
238
|
+
end
|
239
|
+
|
240
|
+
context 'when the input is a mouse click' do
|
241
|
+
let(:command) { "\e[M`6E" }
|
242
|
+
|
243
|
+
it {
|
244
|
+
Vedeu.expects(:trigger).with(:_command_, command)
|
245
|
+
subject
|
246
|
+
}
|
247
|
+
end
|
248
|
+
|
249
|
+
context 'when the input is not a mouse click' do
|
250
|
+
it {
|
251
|
+
Vedeu.expects(:trigger).with(:_command_, 'help')
|
252
|
+
subject
|
253
|
+
}
|
135
254
|
end
|
136
255
|
end
|
137
256
|
end
|
@@ -25,6 +25,7 @@ module Vedeu
|
|
25
25
|
let(:input) { "\e[M ,%" }
|
26
26
|
|
27
27
|
it {
|
28
|
+
Vedeu.expects(:trigger).with(:_mouse_event_, input)
|
28
29
|
Vedeu.expects(:trigger).with(:_cursor_reposition_, Vedeu.focus, 5, 12)
|
29
30
|
subject
|
30
31
|
}
|
@@ -34,6 +35,7 @@ module Vedeu
|
|
34
35
|
let(:input) { "\e[M`6E" }
|
35
36
|
|
36
37
|
it {
|
38
|
+
Vedeu.expects(:trigger).with(:_mouse_event_, input)
|
37
39
|
Vedeu.expects(:trigger).with(:_cursor_up_, Vedeu.focus)
|
38
40
|
subject
|
39
41
|
}
|
@@ -43,6 +45,7 @@ module Vedeu
|
|
43
45
|
let(:input) { "\e[MaN5" }
|
44
46
|
|
45
47
|
it {
|
48
|
+
Vedeu.expects(:trigger).with(:_mouse_event_, input)
|
46
49
|
Vedeu.expects(:trigger).with(:_cursor_down_, Vedeu.focus)
|
47
50
|
subject
|
48
51
|
}
|
@@ -52,6 +55,7 @@ module Vedeu
|
|
52
55
|
let(:input) { "\e[Mb0(" }
|
53
56
|
|
54
57
|
it {
|
58
|
+
Vedeu.expects(:trigger).with(:_mouse_event_, input)
|
55
59
|
subject.must_equal("\e[93m[input] \e[39m\e[33mVedeu does not " \
|
56
60
|
"support mouse button '66' yet.\e[39m")
|
57
61
|
}
|
@@ -22,9 +22,15 @@ module Vedeu
|
|
22
22
|
}
|
23
23
|
let(:visible) { true }
|
24
24
|
let(:interface) {
|
25
|
-
Vedeu::Interfaces::Interface.new(
|
25
|
+
Vedeu::Interfaces::Interface.new(name: 'lithium',
|
26
|
+
style: nil,
|
27
|
+
visible: visible)
|
28
|
+
}
|
29
|
+
let(:geometry) {
|
30
|
+
Vedeu::Geometry::Geometry.new(name: 'lithium',
|
31
|
+
height: 3,
|
32
|
+
width: 3)
|
26
33
|
}
|
27
|
-
let(:geometry) { Vedeu::Geometry::Geometry.new(height: 3, width: 3) }
|
28
34
|
let(:ready) { true }
|
29
35
|
|
30
36
|
before do
|
@@ -44,40 +44,6 @@ module Vedeu
|
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
describe '.input' do
|
48
|
-
before { Vedeu.stubs(:log) }
|
49
|
-
|
50
|
-
subject { Vedeu::Terminal.input }
|
51
|
-
|
52
|
-
it { described.must_respond_to(:read) }
|
53
|
-
|
54
|
-
context 'when the terminal is in cooked mode' do
|
55
|
-
let(:mode) { :cooked }
|
56
|
-
let(:input) { "Some input\r\n" }
|
57
|
-
|
58
|
-
before do
|
59
|
-
Vedeu::Terminal.stubs(:mode).returns(mode)
|
60
|
-
console.stubs(:gets).returns(input)
|
61
|
-
end
|
62
|
-
|
63
|
-
it { subject.must_equal('Some input') }
|
64
|
-
end
|
65
|
-
|
66
|
-
# context 'when the terminal is in raw mode' do
|
67
|
-
# let(:mode) { :raw }
|
68
|
-
# let(:input) { "\e[A" }
|
69
|
-
|
70
|
-
# before do
|
71
|
-
# Vedeu::Terminal.stubs(:mode).returns(mode)
|
72
|
-
# # console.stubs(:getch).returns(input)
|
73
|
-
# # input.stubs(:ord).returns(27)
|
74
|
-
# # console.stubs(:read_nonblock)
|
75
|
-
# end
|
76
|
-
|
77
|
-
# it { subject.must_be_instance_of(Symbol) }
|
78
|
-
# end
|
79
|
-
end
|
80
|
-
|
81
47
|
describe '.output' do
|
82
48
|
before { IO.console.stubs(:print) }
|
83
49
|
|
@@ -270,14 +270,12 @@ class VedeuMaterialColoursApp
|
|
270
270
|
zindex(0)
|
271
271
|
end
|
272
272
|
|
273
|
-
|
274
|
-
|
275
273
|
Vedeu.keymap('_global_') do
|
276
|
-
key(:up) { Vedeu.trigger(:_cursor_up_)
|
277
|
-
key(:right) { Vedeu.trigger(:_cursor_right_)
|
278
|
-
key(:down) { Vedeu.trigger(:_cursor_down_)
|
279
|
-
key(:left) { Vedeu.trigger(:_cursor_left_)
|
280
|
-
key(:home) { Vedeu.trigger(:_cursor_top_)
|
274
|
+
key(:up) { Vedeu.trigger(:_cursor_up_) }
|
275
|
+
key(:right) { Vedeu.trigger(:_cursor_right_) }
|
276
|
+
key(:down) { Vedeu.trigger(:_cursor_down_) }
|
277
|
+
key(:left) { Vedeu.trigger(:_cursor_left_) }
|
278
|
+
key(:home) { Vedeu.trigger(:_cursor_top_) }
|
281
279
|
key(:end) { Vedeu.trigger(:_cursor_bottom_) }
|
282
280
|
|
283
281
|
key(:insert) do
|
@@ -373,7 +371,7 @@ class VedeuMaterialColoursApp
|
|
373
371
|
end
|
374
372
|
|
375
373
|
view 'keys_interface' do
|
376
|
-
|
374
|
+
cursor false
|
377
375
|
line {
|
378
376
|
stream {
|
379
377
|
left "\u2190 \u2193 \u2191 \u2192",
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vedeu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.60
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gavin Laking
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: guard
|
@@ -332,7 +332,6 @@ files:
|
|
332
332
|
- lib/vedeu/borders/border.rb
|
333
333
|
- lib/vedeu/borders/caption.rb
|
334
334
|
- lib/vedeu/borders/dsl.rb
|
335
|
-
- lib/vedeu/borders/null.rb
|
336
335
|
- lib/vedeu/borders/refresh.rb
|
337
336
|
- lib/vedeu/borders/repository.rb
|
338
337
|
- lib/vedeu/borders/title.rb
|
@@ -387,7 +386,6 @@ files:
|
|
387
386
|
- lib/vedeu/dsl/use.rb
|
388
387
|
- lib/vedeu/dsl/view.rb
|
389
388
|
- lib/vedeu/editor/all.rb
|
390
|
-
- lib/vedeu/editor/capture.rb
|
391
389
|
- lib/vedeu/editor/cropper.rb
|
392
390
|
- lib/vedeu/editor/cursor.rb
|
393
391
|
- lib/vedeu/editor/delete.rb
|
@@ -537,7 +535,6 @@ files:
|
|
537
535
|
- test/lib/vedeu/borders/border_test.rb
|
538
536
|
- test/lib/vedeu/borders/caption_test.rb
|
539
537
|
- test/lib/vedeu/borders/dsl_test.rb
|
540
|
-
- test/lib/vedeu/borders/null_test.rb
|
541
538
|
- test/lib/vedeu/borders/refresh_test.rb
|
542
539
|
- test/lib/vedeu/borders/repository_test.rb
|
543
540
|
- test/lib/vedeu/borders/title_test.rb
|
@@ -576,7 +573,6 @@ files:
|
|
576
573
|
- test/lib/vedeu/dsl/text_test.rb
|
577
574
|
- test/lib/vedeu/dsl/use_test.rb
|
578
575
|
- test/lib/vedeu/dsl/view_test.rb
|
579
|
-
- test/lib/vedeu/editor/capture_test.rb
|
580
576
|
- test/lib/vedeu/editor/cropper_test.rb
|
581
577
|
- test/lib/vedeu/editor/cursor_test.rb
|
582
578
|
- test/lib/vedeu/editor/delete_test.rb
|
@@ -750,7 +746,6 @@ test_files:
|
|
750
746
|
- test/lib/vedeu/borders/border_test.rb
|
751
747
|
- test/lib/vedeu/borders/caption_test.rb
|
752
748
|
- test/lib/vedeu/borders/dsl_test.rb
|
753
|
-
- test/lib/vedeu/borders/null_test.rb
|
754
749
|
- test/lib/vedeu/borders/refresh_test.rb
|
755
750
|
- test/lib/vedeu/borders/repository_test.rb
|
756
751
|
- test/lib/vedeu/borders/title_test.rb
|
@@ -789,7 +784,6 @@ test_files:
|
|
789
784
|
- test/lib/vedeu/dsl/text_test.rb
|
790
785
|
- test/lib/vedeu/dsl/use_test.rb
|
791
786
|
- test/lib/vedeu/dsl/view_test.rb
|
792
|
-
- test/lib/vedeu/editor/capture_test.rb
|
793
787
|
- test/lib/vedeu/editor/cropper_test.rb
|
794
788
|
- test/lib/vedeu/editor/cursor_test.rb
|
795
789
|
- test/lib/vedeu/editor/delete_test.rb
|
data/lib/vedeu/borders/null.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
module Borders
|
4
|
-
|
5
|
-
# Provides a non-existent Vedeu::Borders::Border that acts like
|
6
|
-
# the real thing, but does nothing.
|
7
|
-
#
|
8
|
-
# @api private
|
9
|
-
#
|
10
|
-
class Null
|
11
|
-
|
12
|
-
extend Forwardable
|
13
|
-
|
14
|
-
def_delegators :geometry,
|
15
|
-
:bordered_width,
|
16
|
-
:bordered_height,
|
17
|
-
:bx,
|
18
|
-
:bxn,
|
19
|
-
:by,
|
20
|
-
:byn,
|
21
|
-
:x,
|
22
|
-
:xn,
|
23
|
-
:y,
|
24
|
-
:yn
|
25
|
-
|
26
|
-
# @!attribute [r] name
|
27
|
-
# @return [String|Symbol|NilClass]
|
28
|
-
attr_reader :name
|
29
|
-
|
30
|
-
# Returns a new instance of Vedeu::Borders::Null.
|
31
|
-
#
|
32
|
-
# @param attributes [Hash<Symbol => void>]
|
33
|
-
# @option attributes name [String|Symbol|NilClass]
|
34
|
-
# @return [Vedeu::Borders::Null]
|
35
|
-
def initialize(attributes = {})
|
36
|
-
@attributes = attributes
|
37
|
-
@name = @attributes[:name]
|
38
|
-
end
|
39
|
-
|
40
|
-
# @return [Boolean]
|
41
|
-
def enabled?
|
42
|
-
false
|
43
|
-
end
|
44
|
-
|
45
|
-
# @return [Array]
|
46
|
-
def render
|
47
|
-
[]
|
48
|
-
end
|
49
|
-
|
50
|
-
private
|
51
|
-
|
52
|
-
# Returns the geometry for the interface.
|
53
|
-
#
|
54
|
-
# @return (see Vedeu::Geometry::Repository#by_name)
|
55
|
-
def geometry
|
56
|
-
@geometry ||= Vedeu.geometries.by_name(name)
|
57
|
-
end
|
58
|
-
|
59
|
-
end # Null
|
60
|
-
|
61
|
-
end # Borders
|
62
|
-
|
63
|
-
end # Vedeu
|
data/lib/vedeu/editor/capture.rb
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
module Vedeu
|
2
|
-
|
3
|
-
module Editor
|
4
|
-
|
5
|
-
# Capture input from the terminal via 'getch'.
|
6
|
-
#
|
7
|
-
class Capture
|
8
|
-
|
9
|
-
ESCAPE_KEY_CODE = 27 # \e
|
10
|
-
|
11
|
-
# @param console [IO]
|
12
|
-
# @return [String|Symbol]
|
13
|
-
def self.read(console)
|
14
|
-
new(console).read
|
15
|
-
end
|
16
|
-
|
17
|
-
# Returns a new instance of Vedeu::Editor::Capture.
|
18
|
-
#
|
19
|
-
# @param console [IO]
|
20
|
-
# @return [Vedeu::Editor::Capture]
|
21
|
-
def initialize(console)
|
22
|
-
@console = console
|
23
|
-
end
|
24
|
-
|
25
|
-
# @return [String|Symbol]
|
26
|
-
def read
|
27
|
-
Vedeu::Input::Translator.translate(keys)
|
28
|
-
end
|
29
|
-
|
30
|
-
private
|
31
|
-
|
32
|
-
# @return [String]
|
33
|
-
def keys
|
34
|
-
keys = console.getch
|
35
|
-
|
36
|
-
if keys.ord == ESCAPE_KEY_CODE
|
37
|
-
keys << console.read_nonblock(5) rescue nil
|
38
|
-
keys << console.read_nonblock(4) rescue nil
|
39
|
-
keys << console.read_nonblock(3) rescue nil
|
40
|
-
keys << console.read_nonblock(2) rescue nil
|
41
|
-
end
|
42
|
-
|
43
|
-
return Vedeu::Input::Mouse.click(keys) if click?(keys)
|
44
|
-
|
45
|
-
keys
|
46
|
-
end
|
47
|
-
|
48
|
-
# Returns a boolean indicating whether a mouse click was
|
49
|
-
# received.
|
50
|
-
#
|
51
|
-
# @param keys [String]
|
52
|
-
# @return [Boolean]
|
53
|
-
def click?(keys)
|
54
|
-
keys.start_with?("\e[M")
|
55
|
-
end
|
56
|
-
|
57
|
-
# @return [IO]
|
58
|
-
def console
|
59
|
-
@console || Vedeu::Terminal.console
|
60
|
-
end
|
61
|
-
|
62
|
-
end # Capture
|
63
|
-
|
64
|
-
end # Editor
|
65
|
-
|
66
|
-
end # Vedeu
|
@@ -1,52 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
module Borders
|
6
|
-
|
7
|
-
describe Null do
|
8
|
-
|
9
|
-
let(:described) { Vedeu::Borders::Null }
|
10
|
-
let(:instance) { described.new(attributes) }
|
11
|
-
let(:attributes){
|
12
|
-
{
|
13
|
-
name: _name
|
14
|
-
}
|
15
|
-
}
|
16
|
-
let(:_name) { 'null_border' }
|
17
|
-
let(:geometry) {
|
18
|
-
Vedeu::Geometry::Geometry.new(name: _name, x: 4, y: 6, xn: 10, yn: 12)
|
19
|
-
}
|
20
|
-
|
21
|
-
before { Vedeu.geometries.stubs(:by_name).returns(geometry) }
|
22
|
-
|
23
|
-
describe '#initialize' do
|
24
|
-
it { instance.must_be_instance_of(described) }
|
25
|
-
it {
|
26
|
-
instance.instance_variable_get('@attributes').must_equal(attributes)
|
27
|
-
}
|
28
|
-
it { instance.instance_variable_get('@name').must_equal(_name) }
|
29
|
-
end
|
30
|
-
|
31
|
-
describe 'accessors' do
|
32
|
-
it { instance.must_respond_to(:name) }
|
33
|
-
end
|
34
|
-
|
35
|
-
describe '#enabled' do
|
36
|
-
subject { instance.enabled? }
|
37
|
-
|
38
|
-
it { subject.must_equal(false) }
|
39
|
-
end
|
40
|
-
|
41
|
-
describe '#render' do
|
42
|
-
subject { instance.render }
|
43
|
-
|
44
|
-
it { subject.must_be_instance_of(Array) }
|
45
|
-
it { subject.must_equal([]) }
|
46
|
-
end
|
47
|
-
|
48
|
-
end # Null
|
49
|
-
|
50
|
-
end # Borders
|
51
|
-
|
52
|
-
end # Vedeu
|
@@ -1,63 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module Vedeu
|
4
|
-
|
5
|
-
module Editor
|
6
|
-
|
7
|
-
describe Capture do
|
8
|
-
|
9
|
-
let(:described) { Vedeu::Editor::Capture }
|
10
|
-
let(:instance) { described.new(console) }
|
11
|
-
let(:console) { mock }
|
12
|
-
|
13
|
-
describe '#initialize' do
|
14
|
-
it { instance.must_be_instance_of(described) }
|
15
|
-
it { instance.instance_variable_get('@console').must_equal(console) }
|
16
|
-
end
|
17
|
-
|
18
|
-
describe '.read' do
|
19
|
-
subject { described.read(console) }
|
20
|
-
|
21
|
-
before do
|
22
|
-
Vedeu::Terminal.stubs(:console).returns(console)
|
23
|
-
console.stubs(:getch).returns(keys)
|
24
|
-
end
|
25
|
-
|
26
|
-
context 'when nothing is given' do
|
27
|
-
let(:keys) { nil }
|
28
|
-
end
|
29
|
-
|
30
|
-
context 'when a single keypress is given' do
|
31
|
-
let(:keys) { 'a' }
|
32
|
-
|
33
|
-
it { subject.must_equal('a') }
|
34
|
-
end
|
35
|
-
|
36
|
-
context 'when a ctrl+keypress is given' do
|
37
|
-
let(:keys) { "\u0001" }
|
38
|
-
|
39
|
-
it { subject.must_equal(:ctrl_a) }
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'when a shift+keypress is given' do
|
43
|
-
let(:keys) { 'A' }
|
44
|
-
|
45
|
-
it { subject.must_equal('A') }
|
46
|
-
end
|
47
|
-
|
48
|
-
context 'when a alt+keypress is given' do
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'when a super+keypress is given' do
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe '#read' do
|
56
|
-
it { instance.must_respond_to(:read) }
|
57
|
-
end
|
58
|
-
|
59
|
-
end # Capture
|
60
|
-
|
61
|
-
end # Editor
|
62
|
-
|
63
|
-
end # Vedeu
|