rubytext 0.1.20 → 0.1.21
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/keys.rb +38 -17
- data/lib/menu.rb +77 -2
- data/lib/output.rb +21 -10
- data/lib/rubytext_version.rb +1 -1
- data/lib/widgets.rb +9 -6
- data/lib/window.rb +19 -5
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 90fd407e8a80cfc0fb79bdfed6f97184984ed43df8598b23bc166a5427402c5e
|
4
|
+
data.tar.gz: 491e23b7274377c3e26f5b5375d965eaf666d009f373c74c72fc563c4f2ee4a2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a434a77e4195559a342ff089dc764999b36faeb33de55a9d703b6c3d87051c1643c13ab7f41600587f26757ef38fd3d598a291c595d94d9c4b3e8befcd06a56c
|
7
|
+
data.tar.gz: e6b6b2e88ba130c1da44316d911925a4ed9743d5368e69f7d28a71425d8fa07dd449dde25bac7681c1cff69b2b53946f55bf4b1933778c803a8b6d513177c400
|
data/lib/keys.rb
CHANGED
@@ -1,20 +1,41 @@
|
|
1
1
|
module RubyText::Keys
|
2
|
-
Down
|
3
|
-
Up
|
4
|
-
Left
|
5
|
-
Right
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
2
|
+
Down = 258
|
3
|
+
Up = 259
|
4
|
+
Left = 260
|
5
|
+
Right = 261
|
6
|
+
|
7
|
+
Enter = 10
|
8
|
+
NL = 10
|
9
|
+
LF = 10
|
10
|
+
|
11
|
+
EOF = 4
|
12
|
+
CtlD = 4
|
13
|
+
|
14
|
+
Back = 8 # backspace
|
15
|
+
BS = 8
|
16
|
+
|
17
|
+
Tab = 9
|
18
|
+
TAB = 9
|
19
|
+
|
20
|
+
Escape = 27
|
21
|
+
ESC = 27
|
22
|
+
Esc = 27
|
23
|
+
|
24
|
+
Delete = 127
|
25
|
+
DEL = 127
|
26
|
+
Del = 127
|
27
|
+
|
28
|
+
F1 = 265
|
29
|
+
F2 = 266
|
30
|
+
F3 = 267
|
31
|
+
F4 = 268
|
32
|
+
F5 = 269
|
33
|
+
F6 = 270
|
34
|
+
F7 = 271
|
35
|
+
F8 = 272
|
36
|
+
F9 = 273
|
37
|
+
F10 = 274
|
38
|
+
F11 = 275
|
39
|
+
F12 = 276
|
19
40
|
end
|
20
41
|
|
data/lib/menu.rb
CHANGED
@@ -1,6 +1,75 @@
|
|
1
1
|
module RubyText
|
2
2
|
|
3
3
|
class Window
|
4
|
+
def topmenu(items:, curr: 0,
|
5
|
+
title: nil, fg: Green, bg: Black)
|
6
|
+
r, c = 0, 0
|
7
|
+
border = false
|
8
|
+
high = 1
|
9
|
+
|
10
|
+
RubyText.hide_cursor
|
11
|
+
if items.is_a?(Hash)
|
12
|
+
results = items.values
|
13
|
+
items = items.keys
|
14
|
+
hash_flag = true
|
15
|
+
else
|
16
|
+
results = items
|
17
|
+
end
|
18
|
+
|
19
|
+
tlen = title.length + 8 rescue 0
|
20
|
+
width = 0 # total width
|
21
|
+
cols = [] # start-column of each item
|
22
|
+
items.each do |item|
|
23
|
+
cols << width
|
24
|
+
iwide = item.to_s.length + 2
|
25
|
+
width += iwide
|
26
|
+
end
|
27
|
+
|
28
|
+
r, c = self.coords(r, c)
|
29
|
+
# puts "topmenu saved"
|
30
|
+
# sleep 2
|
31
|
+
self.saveback(high, width, r, c)
|
32
|
+
mr, mc = r+self.r0, c+self.c0
|
33
|
+
title = nil
|
34
|
+
mwin = RubyText.window(high, width, r: mr, c: mc, border: border,
|
35
|
+
fg: fg, bg: bg, title: title)
|
36
|
+
Curses.stdscr.keypad(true)
|
37
|
+
sel = curr
|
38
|
+
max = items.size - 1
|
39
|
+
loop do
|
40
|
+
items.each.with_index do |item, num|
|
41
|
+
item = " #{item} "
|
42
|
+
mwin.go 0, cols[num]
|
43
|
+
style = (sel == num) ? :reverse : :normal
|
44
|
+
mwin.print fx(item, style)
|
45
|
+
end
|
46
|
+
ch = getch
|
47
|
+
case ch
|
48
|
+
when Curses::KEY_LEFT
|
49
|
+
sel -= 1 if sel > 0
|
50
|
+
when Curses::KEY_RIGHT
|
51
|
+
sel += 1 if sel < max
|
52
|
+
when 27
|
53
|
+
self.restback(high, width, r, c)
|
54
|
+
RubyText.show_cursor
|
55
|
+
return [nil, nil]
|
56
|
+
when 10
|
57
|
+
self.restback(high, width, r, c)
|
58
|
+
# puts "topmenu restored"
|
59
|
+
# sleep 2
|
60
|
+
RubyText.show_cursor
|
61
|
+
choice = results[sel]
|
62
|
+
return [sel, choice] if choice.is_a? String
|
63
|
+
result = choice.call
|
64
|
+
next if result.nil?
|
65
|
+
next if result.empty?
|
66
|
+
return result
|
67
|
+
else Curses.beep
|
68
|
+
end
|
69
|
+
RubyText.show_cursor
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
4
73
|
def menu(r: :center, c: :center, items:, curr: 0,
|
5
74
|
border: true,
|
6
75
|
title: nil, fg: Green, bg: Black)
|
@@ -24,6 +93,8 @@ module RubyText
|
|
24
93
|
row = row - high/2 if r == :center
|
25
94
|
col = col - wide/2 if c == :center
|
26
95
|
r, c = row, col
|
96
|
+
# puts "menu2 saved"
|
97
|
+
# sleep 2
|
27
98
|
self.saveback(high, wide, r, c)
|
28
99
|
mr, mc = r+self.r0, c+self.c0
|
29
100
|
title = nil unless border
|
@@ -37,7 +108,7 @@ module RubyText
|
|
37
108
|
items.each.with_index do |item, row|
|
38
109
|
mwin.go row, 0
|
39
110
|
style = (sel == row) ? :reverse : :normal
|
40
|
-
label = (" "*2 + item + " "*8)[0..wide-1]
|
111
|
+
label = (" "*2 + item.to_s + " "*8)[0..wide-1]
|
41
112
|
mwin.print fx(label, style)
|
42
113
|
end
|
43
114
|
ch = getch
|
@@ -53,7 +124,11 @@ module RubyText
|
|
53
124
|
when 10
|
54
125
|
self.restback(high, wide, r, c)
|
55
126
|
RubyText.show_cursor
|
56
|
-
|
127
|
+
choice = results[sel]
|
128
|
+
return [sel, choice] if choice.is_a? String
|
129
|
+
result = choice.call
|
130
|
+
return [nil, nil] if result.nil? || result.empty?
|
131
|
+
return result
|
57
132
|
else Curses.beep
|
58
133
|
end
|
59
134
|
RubyText.show_cursor
|
data/lib/output.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
$LOAD_PATH << "lib"
|
2
2
|
|
3
|
+
require 'keys'
|
4
|
+
|
3
5
|
class RubyText::Window
|
6
|
+
include ::RubyText::Keys
|
7
|
+
|
4
8
|
def center(str)
|
5
9
|
r, c = self.rc
|
6
10
|
n = @cwin.maxx - str.length
|
@@ -249,29 +253,36 @@ class RubyText::Window
|
|
249
253
|
# echo assumed to be OFF, keypad ON
|
250
254
|
@history = history
|
251
255
|
gs = GetString.new(self, default, history: history, limit: limit, tab: tab)
|
256
|
+
count = 0
|
252
257
|
loop do
|
258
|
+
count += 1 # Escape has special meaning if first char
|
253
259
|
ch = self.getch
|
254
260
|
case ch
|
255
|
-
when
|
261
|
+
when Escape
|
262
|
+
return Escape if count == 1
|
263
|
+
gs.enter
|
264
|
+
break
|
265
|
+
when CtlD
|
266
|
+
return CtlD if count == 1
|
256
267
|
gs.enter
|
257
268
|
break
|
258
|
-
when
|
269
|
+
when Enter
|
270
|
+
gs.enter
|
271
|
+
break
|
272
|
+
when BS, DEL, 63 # backspace, del, ^H (huh?)
|
259
273
|
gs.backspace
|
260
|
-
when
|
274
|
+
when Tab
|
261
275
|
gs.complete
|
262
|
-
when
|
276
|
+
when Left
|
263
277
|
gs.left_arrow
|
264
|
-
when
|
278
|
+
when Right
|
265
279
|
gs.right_arrow
|
266
|
-
when
|
280
|
+
when Up
|
267
281
|
next if @history.nil? # move this?
|
268
282
|
gs.history_prev
|
269
|
-
when
|
283
|
+
when Down
|
270
284
|
next if @history.nil? # move this?
|
271
285
|
gs.history_next
|
272
|
-
when 27 # escape
|
273
|
-
gs.enter
|
274
|
-
break
|
275
286
|
when Integer
|
276
287
|
Curses.beep
|
277
288
|
else
|
data/lib/rubytext_version.rb
CHANGED
data/lib/widgets.rb
CHANGED
@@ -37,14 +37,17 @@ module RubyText
|
|
37
37
|
|
38
38
|
def self.splash(msg)
|
39
39
|
lines = msg.split("\n")
|
40
|
-
high = lines.size +
|
41
|
-
wide = lines.map {|x| x.length }.max +
|
42
|
-
STDSCR.
|
43
|
-
|
40
|
+
high = lines.size + 4
|
41
|
+
wide = lines.map {|x| x.length }.max + 4
|
42
|
+
r0 = (STDSCR.rows - high)/2
|
43
|
+
c0 = (STDSCR.cols - wide)/2
|
44
|
+
STDSCR.saveback(high, wide, r0, c0)
|
45
|
+
win = RubyText.window(high, wide, r: r0, c: c0,
|
46
|
+
fg: White, bg: Red, title: "[Press any key]")
|
47
|
+
win.print "\n "
|
44
48
|
win.puts msg
|
45
49
|
getch
|
46
|
-
STDSCR.restback(high, wide,
|
50
|
+
STDSCR.restback(high, wide, r0, c0)
|
47
51
|
end
|
48
52
|
|
49
|
-
# TODO add splash
|
50
53
|
end
|
data/lib/window.rb
CHANGED
@@ -13,6 +13,7 @@ end
|
|
13
13
|
|
14
14
|
class RubyText::Window
|
15
15
|
Vert, Horiz = Curses::A_VERTICAL, Curses::A_HORIZONTAL
|
16
|
+
ScreenStack = []
|
16
17
|
|
17
18
|
attr_reader :cwin, :rows, :cols, :width, :height, :scrolling
|
18
19
|
attr_reader :r0, :c0
|
@@ -120,32 +121,45 @@ class RubyText::Window
|
|
120
121
|
lines
|
121
122
|
end
|
122
123
|
|
124
|
+
def background(high=STDSCR.rows, wide=STDSCR.cols, r=0, c=0)
|
125
|
+
saveback(high, wide, r, c)
|
126
|
+
yield
|
127
|
+
restback(high, wide, r, c)
|
128
|
+
end
|
129
|
+
|
123
130
|
def saveback(high=STDSCR.rows, wide=STDSCR.cols, r=0, c=0)
|
124
131
|
debug "saveback: #{[high, wide, r, c].inspect}"
|
125
|
-
|
126
|
-
@save = []
|
132
|
+
save = [self.rc]
|
127
133
|
0.upto(high-1) do |h|
|
128
134
|
0.upto(wide-1) do |w|
|
129
135
|
row, col = h+r-1, w+c-1
|
130
136
|
row += 1 if self == STDSCR # wtf?
|
131
137
|
col += 1 if self == STDSCR
|
132
|
-
|
138
|
+
save << self[row, col]
|
133
139
|
end
|
134
140
|
end
|
141
|
+
ScreenStack.push save
|
135
142
|
end
|
136
143
|
|
137
144
|
def restback(high=STDSCR.rows, wide=STDSCR.cols, r=0, c=0)
|
145
|
+
save = ScreenStack.pop
|
146
|
+
pos = save.shift
|
138
147
|
0.upto(high-1) do |h|
|
139
148
|
line = ""
|
140
|
-
0.upto(wide-1) {|w| line <<
|
149
|
+
0.upto(wide-1) {|w| line << save.shift }
|
141
150
|
row, col = h+r-1, c-1
|
142
151
|
row += 1 if self == STDSCR # wtf?
|
143
152
|
col += 1 if self == STDSCR
|
144
153
|
self.go row, col
|
145
154
|
self.print line
|
146
155
|
end
|
147
|
-
self.go
|
156
|
+
self.go *pos
|
148
157
|
@cwin.refresh
|
158
|
+
rescue => err
|
159
|
+
puts "Error!"
|
160
|
+
puts err
|
161
|
+
puts err.backtrace.join("\n")
|
162
|
+
sleep 8
|
149
163
|
end
|
150
164
|
|
151
165
|
def fg=(sym)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rubytext
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hal Fulton
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: curses
|