ncumbra 0.1.0
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 +7 -0
- data/.gitignore +25 -0
- data/Gemfile +6 -0
- data/LICENSE +21 -0
- data/README.md +48 -0
- data/README.md.bak +15 -0
- data/Rakefile +2 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/examples/ex1.rb +85 -0
- data/examples/ex2.rb +128 -0
- data/examples/ex21.rb +136 -0
- data/examples/ex3.rb +163 -0
- data/examples/ex4.rb +142 -0
- data/examples/ex5.rb +103 -0
- data/examples/exbox.rb +141 -0
- data/examples/exm1.rb +137 -0
- data/examples/keys.rb +67 -0
- data/examples/tt.rb +462 -0
- data/lib/umbra/box.rb +137 -0
- data/lib/umbra/button.rb +130 -0
- data/lib/umbra/buttongroup.rb +96 -0
- data/lib/umbra/checkbox.rb +42 -0
- data/lib/umbra/dialog.rb +214 -0
- data/lib/umbra/eventhandler.rb +134 -0
- data/lib/umbra/field.rb +503 -0
- data/lib/umbra/form.rb +473 -0
- data/lib/umbra/keymappinghandler.rb +96 -0
- data/lib/umbra/label.rb +95 -0
- data/lib/umbra/labeledfield.rb +97 -0
- data/lib/umbra/listbox.rb +384 -0
- data/lib/umbra/menu.rb +93 -0
- data/lib/umbra/messagebox.rb +348 -0
- data/lib/umbra/pad.rb +340 -0
- data/lib/umbra/radiobutton.rb +71 -0
- data/lib/umbra/textbox.rb +417 -0
- data/lib/umbra/togglebutton.rb +140 -0
- data/lib/umbra/version.rb +3 -0
- data/lib/umbra/widget.rb +220 -0
- data/lib/umbra/window.rb +270 -0
- data/lib/umbra.rb +47 -0
- data/umbra.gemspec +27 -0
- metadata +127 -0
data/examples/ex4.rb
ADDED
@@ -0,0 +1,142 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# example showing listbox
|
3
|
+
# 2018-03-19 -
|
4
|
+
require 'umbra'
|
5
|
+
require 'umbra/label'
|
6
|
+
require 'umbra/listbox'
|
7
|
+
require 'umbra/box'
|
8
|
+
require 'umbra/togglebutton'
|
9
|
+
|
10
|
+
def startup
|
11
|
+
require 'logger'
|
12
|
+
require 'date'
|
13
|
+
|
14
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"v.log")
|
15
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
16
|
+
$log = Logger.new(path)
|
17
|
+
$log.level = Logger::DEBUG
|
18
|
+
today = Time.now.to_s
|
19
|
+
$log.info "listbox demo #{$0} started on #{today}"
|
20
|
+
FFI::NCurses.init_pair(10, FFI::NCurses::BLACK, FFI::NCurses::GREEN) # statusline
|
21
|
+
end
|
22
|
+
def statusline win, str, column = 1
|
23
|
+
# LINES-2 prints on second last line so that box can be seen
|
24
|
+
win.printstring( FFI::NCurses.LINES-2, column, str, 6, REVERSE)
|
25
|
+
end
|
26
|
+
begin
|
27
|
+
include Umbra
|
28
|
+
init_curses
|
29
|
+
startup
|
30
|
+
#win = Window.new
|
31
|
+
win = Window.new #20,100, 0, 20
|
32
|
+
statusline(win, " "*(win.width-0), 0)
|
33
|
+
win.box
|
34
|
+
statusline(win, "Press C-q to quit #{win.height}:#{win.width}", 20)
|
35
|
+
str = " Demo of listbox "
|
36
|
+
win.title str
|
37
|
+
alist = ["one item"*4, "another item"*10, "yet another item"*15]
|
38
|
+
#alist = []
|
39
|
+
(1..50).each do |i|
|
40
|
+
alist << "#{i} entry"
|
41
|
+
end
|
42
|
+
|
43
|
+
# check with only a few rows - DONE
|
44
|
+
# check with exactly 20 rows
|
45
|
+
# check with long lines
|
46
|
+
catch(:close) do
|
47
|
+
form = Form.new win
|
48
|
+
win.printstring(3,1,"Just testing that listbox is correctly positioned")
|
49
|
+
box = Box.new row: 4, col: 2, width: 80, height: 20
|
50
|
+
lb = Listbox.new list: alist
|
51
|
+
box.fill lb
|
52
|
+
win.printstring(box.row+1,0,"XX")
|
53
|
+
win.printstring(box.row+1,box.col+box.width,"XX")
|
54
|
+
win.printstring(box.row+box.height,1,"This prints below the listbox")
|
55
|
+
brow = box.row+box.height+3
|
56
|
+
tb = ToggleButton.new onvalue: "Toggle", offvalue: "No Toggle", row: brow, col: 10, value: true
|
57
|
+
ab = Button.new text: "Processes" , row: brow, col: 30
|
58
|
+
logb = Button.new text: "LogFile" , row: brow, col: 50
|
59
|
+
|
60
|
+
tb.command do
|
61
|
+
if tb.value
|
62
|
+
# we no longer have border in listboxes or textboxes
|
63
|
+
#lb.border true
|
64
|
+
box.title = "Toggled"
|
65
|
+
else
|
66
|
+
#lb.border false
|
67
|
+
box.title = "Untoggled"
|
68
|
+
end
|
69
|
+
box.repaint_required = true
|
70
|
+
end
|
71
|
+
# bind the most common event for a listbox which is ENTER_ROW
|
72
|
+
lb.command do |ix|
|
73
|
+
statusline(win, "Sitting on offset #{lb.current_index}, #{ix.first} ")
|
74
|
+
end
|
75
|
+
ab.command do
|
76
|
+
lb.color_pair = create_color_pair(COLOR_BLACK, COLOR_CYAN)
|
77
|
+
#lb.attr = REVERSE
|
78
|
+
lb.list = %x{ ps aux }.split("\n")
|
79
|
+
box.title = "Processes"
|
80
|
+
box.repaint_required = true
|
81
|
+
end
|
82
|
+
logb.command do
|
83
|
+
lb.list=[]
|
84
|
+
lb.repaint_required=true
|
85
|
+
box.title = "Log File"
|
86
|
+
box.repaint_required = true
|
87
|
+
# We require a timeout in getch for this to update
|
88
|
+
# without thread process hangs and no update happens
|
89
|
+
t = Thread.new do
|
90
|
+
IO.popen("tail -f v.log") do |output|
|
91
|
+
ctr = 0
|
92
|
+
while line = output.gets do
|
93
|
+
lb.list << line.chomp
|
94
|
+
lb.goto_end
|
95
|
+
lb.repaint_required=true
|
96
|
+
form.repaint
|
97
|
+
ctr += 1
|
98
|
+
if ctr > 100
|
99
|
+
sleep(1)
|
100
|
+
ctr = 0
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
# bind to another event of listbox
|
107
|
+
lb.bind_event(:LEAVE_ROW) { |ix| statusline(win, "LEFT ROW #{ix.first}", 50) }
|
108
|
+
lb.bind_event(:LIST_SELECTION_EVENT) { |w| alert("You selected row #{w.selected_index || "none"} ") }
|
109
|
+
form.add_widget box, lb
|
110
|
+
form.add_widget tb
|
111
|
+
form.add_widget ab
|
112
|
+
form.add_widget logb
|
113
|
+
form.pack
|
114
|
+
form.select_first_field
|
115
|
+
win.wrefresh
|
116
|
+
|
117
|
+
y = x = 1
|
118
|
+
while (ch = win.getkey) != FFI::NCurses::KEY_CTRL_Q
|
119
|
+
begin
|
120
|
+
form.handle_key ch
|
121
|
+
rescue => e
|
122
|
+
puts e
|
123
|
+
puts e.backtrace.join("\n")
|
124
|
+
end
|
125
|
+
win.wrefresh
|
126
|
+
end
|
127
|
+
end # close
|
128
|
+
|
129
|
+
rescue => e
|
130
|
+
win.destroy if win
|
131
|
+
win = nil
|
132
|
+
FFI::NCurses.endwin
|
133
|
+
puts e
|
134
|
+
puts e.backtrace.join("\n")
|
135
|
+
ensure
|
136
|
+
win.destroy if win
|
137
|
+
FFI::NCurses.endwin
|
138
|
+
if e
|
139
|
+
puts e
|
140
|
+
puts e.backtrace.join("\n")
|
141
|
+
end
|
142
|
+
end
|
data/examples/ex5.rb
ADDED
@@ -0,0 +1,103 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# example showing Textbox
|
3
|
+
# 2018-03-19 -
|
4
|
+
require 'umbra'
|
5
|
+
require 'umbra/label'
|
6
|
+
require 'umbra/box'
|
7
|
+
require 'umbra/textbox'
|
8
|
+
require 'umbra/togglebutton'
|
9
|
+
|
10
|
+
def startup
|
11
|
+
require 'logger'
|
12
|
+
require 'date'
|
13
|
+
|
14
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"v.log")
|
15
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
16
|
+
$log = Logger.new(path)
|
17
|
+
$log.level = Logger::DEBUG
|
18
|
+
today = Time.now.to_s
|
19
|
+
$log.info "Textbox demo #{$0} started on #{today}"
|
20
|
+
FFI::NCurses.init_pair(10, FFI::NCurses::BLACK, FFI::NCurses::GREEN) # statusline
|
21
|
+
end
|
22
|
+
def statusline win, str, column = 1
|
23
|
+
# LINES-2 prints on second last line so that box can be seen
|
24
|
+
win.printstring( FFI::NCurses.LINES-2, column, str, 6, REVERSE)
|
25
|
+
end
|
26
|
+
begin
|
27
|
+
include Umbra
|
28
|
+
init_curses
|
29
|
+
startup
|
30
|
+
#win = Window.new
|
31
|
+
win = Window.new #20,100, 0, 20
|
32
|
+
statusline(win, " "*(win.width-0), 0)
|
33
|
+
win.box
|
34
|
+
statusline(win, "Press C-q to quit #{win.height}:#{win.width}", 20)
|
35
|
+
str = " Demo of Textbox "
|
36
|
+
win.title str
|
37
|
+
=begin
|
38
|
+
alist = ["one item"*4, "another item"*10, "yet another item"*15]
|
39
|
+
#alist = []
|
40
|
+
(1..50).each do |i|
|
41
|
+
alist << "#{i} entry"
|
42
|
+
end
|
43
|
+
=end
|
44
|
+
filename = "./notes"
|
45
|
+
|
46
|
+
catch(:close) do
|
47
|
+
form = Form.new win
|
48
|
+
win.printstring(3,1,"Just testing that Textbox is correctly positioned")
|
49
|
+
box = Box.new row: 4, col: 2, width: 50, height: 20
|
50
|
+
lb = Textbox.new file_name: filename
|
51
|
+
box.fill lb
|
52
|
+
box.title = filename
|
53
|
+
win.printstring(box.row+1,0,"XX")
|
54
|
+
win.printstring(box.row+1,box.col+box.width,"XX")
|
55
|
+
win.printstring(box.row+box.height,1,"This prints below the Textbox")
|
56
|
+
brow = box.row+box.height+3
|
57
|
+
tb = ToggleButton.new onvalue: "Left", offvalue: "Center", row: brow, col: 10, value: true
|
58
|
+
|
59
|
+
tb.command do
|
60
|
+
if tb.value
|
61
|
+
box.justify = :center
|
62
|
+
else
|
63
|
+
box.justify = :left
|
64
|
+
end
|
65
|
+
box.repaint_required = true
|
66
|
+
end
|
67
|
+
lb.bind_event(:CURSOR_MOVE) {|arr|
|
68
|
+
col_offset , current_index, curpos, pcol = arr
|
69
|
+
blen = lb.current_row().size
|
70
|
+
statusline(win, "offset: #{col_offset} , curpos: #{curpos} , currind: #{current_index} , pcol #{pcol}, len:#{blen}.....", 20)
|
71
|
+
}
|
72
|
+
form.add_widget box, lb
|
73
|
+
form.add_widget tb
|
74
|
+
form.pack
|
75
|
+
form.select_first_field
|
76
|
+
win.wrefresh
|
77
|
+
|
78
|
+
y = x = 1
|
79
|
+
while (ch = win.getkey) != FFI::NCurses::KEY_CTRL_Q
|
80
|
+
begin
|
81
|
+
form.handle_key ch
|
82
|
+
rescue => e
|
83
|
+
puts e
|
84
|
+
puts e.backtrace.join("\n")
|
85
|
+
end
|
86
|
+
win.wrefresh
|
87
|
+
end
|
88
|
+
end # close
|
89
|
+
|
90
|
+
rescue => e
|
91
|
+
win.destroy if win
|
92
|
+
win = nil
|
93
|
+
FFI::NCurses.endwin
|
94
|
+
puts e
|
95
|
+
puts e.backtrace.join("\n")
|
96
|
+
ensure
|
97
|
+
win.destroy if win
|
98
|
+
FFI::NCurses.endwin
|
99
|
+
if e
|
100
|
+
puts e
|
101
|
+
puts e.backtrace.join("\n")
|
102
|
+
end
|
103
|
+
end
|
data/examples/exbox.rb
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# example showing box
|
3
|
+
# 2018-03-19 -
|
4
|
+
require 'umbra'
|
5
|
+
require 'umbra/label'
|
6
|
+
require 'umbra/listbox'
|
7
|
+
require 'umbra/textbox'
|
8
|
+
require 'umbra/togglebutton'
|
9
|
+
require 'umbra/box'
|
10
|
+
|
11
|
+
def startup
|
12
|
+
require 'logger'
|
13
|
+
require 'date'
|
14
|
+
|
15
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"v.log")
|
16
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
17
|
+
$log = Logger.new(path)
|
18
|
+
$log.level = Logger::DEBUG
|
19
|
+
today = Time.now.to_s
|
20
|
+
$log.info "Box demo #{$0} started on #{today}"
|
21
|
+
FFI::NCurses.init_pair(10, FFI::NCurses::BLACK, FFI::NCurses::GREEN) # statusline
|
22
|
+
end
|
23
|
+
def statusline win, str, column = 1
|
24
|
+
# LINES-2 prints on second last line so that box can be seen
|
25
|
+
win.printstring( FFI::NCurses.LINES-2, column, str, 6, REVERSE)
|
26
|
+
end
|
27
|
+
begin
|
28
|
+
include Umbra
|
29
|
+
init_curses
|
30
|
+
startup
|
31
|
+
win = Window.new #20,100, 0, 20
|
32
|
+
statusline(win, " "*(win.width-0), 0)
|
33
|
+
win.box
|
34
|
+
statusline(win, "Press C-q to quit #{win.height}:#{win.width}", 20)
|
35
|
+
str = " Demo of Box "
|
36
|
+
win.title str
|
37
|
+
alist = ["one item"*4, "another item"*10, "yet another item"*15]
|
38
|
+
#alist = []
|
39
|
+
(1..50).each do |i|
|
40
|
+
alist << "#{i} entry"
|
41
|
+
end
|
42
|
+
|
43
|
+
# check with only a few rows - DONE
|
44
|
+
# check with exactly 20 rows
|
45
|
+
# check with long lines
|
46
|
+
catch(:close) do
|
47
|
+
form = Form.new win
|
48
|
+
box = Box.new row: 2,col: 2, height: 24, width: 80, title: "A box", justify: :left
|
49
|
+
win.printstring(3,1,"Just testing that listbox is correctly positioned")
|
50
|
+
#lb = Listbox.new list: alist, row: 4, col: 2, width: 70, height: 18
|
51
|
+
lb = Listbox.new list: alist
|
52
|
+
lb2 = Textbox.new list: %x{ ps aux }.split("\n")
|
53
|
+
#box.fill lb
|
54
|
+
box.add lb, lb2
|
55
|
+
win.printstring(box.row+1,0,"XX")
|
56
|
+
win.printstring(box.row+1,lb.col+lb.width,"XX")
|
57
|
+
win.printstring(box.row+box.height,1,"This prints below the listbox")
|
58
|
+
brow = box.row+box.height+3
|
59
|
+
tb = ToggleButton.new onvalue: "Border", offvalue: "No Border", row: brow, col: 10, value: true
|
60
|
+
ab = Button.new text: "Processes" , row: brow, col: 30
|
61
|
+
logb = Button.new text: "LogFile" , row: brow, col: 50
|
62
|
+
bbox = Box.new row: brow-2, col: 8, height: 3, width: 65, visible: false
|
63
|
+
bbox.flow tb,ab,logb
|
64
|
+
|
65
|
+
tb.command do
|
66
|
+
if tb.value
|
67
|
+
#lb.border true
|
68
|
+
else
|
69
|
+
#lb.border false
|
70
|
+
end
|
71
|
+
lb.repaint_required=true
|
72
|
+
end
|
73
|
+
# bind the most common event for a listbox which is ENTER_ROW
|
74
|
+
lb.command do |ix|
|
75
|
+
statusline(win, "Sitting on offset #{lb.current_index}, #{ix.first} ")
|
76
|
+
end
|
77
|
+
ab.command do
|
78
|
+
lb.color_pair = create_color_pair(COLOR_BLACK, COLOR_CYAN)
|
79
|
+
#lb.attr = REVERSE
|
80
|
+
lb.list = %x{ ps aux }.split("\n")
|
81
|
+
end
|
82
|
+
logb.command do
|
83
|
+
lb.list=[]
|
84
|
+
lb.repaint_required=true
|
85
|
+
# We require a timeout in getch for this to update
|
86
|
+
# without thread process hangs and no update happens
|
87
|
+
t = Thread.new do
|
88
|
+
IO.popen("tail -f v.log") do |output|
|
89
|
+
ctr = 0
|
90
|
+
while line = output.gets do
|
91
|
+
lb.list << line.chomp
|
92
|
+
lb.goto_end
|
93
|
+
lb.repaint_required=true
|
94
|
+
form.repaint
|
95
|
+
ctr += 1
|
96
|
+
if ctr > 100
|
97
|
+
sleep(1)
|
98
|
+
ctr = 0
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
# bind to another event of listbox
|
105
|
+
lb.bind_event(:LEAVE_ROW) { |ix| statusline(win, "LEFT ROW #{ix.first}", 50) }
|
106
|
+
lb.bind_event(:LIST_SELECTION_EVENT) { |w| alert("You selected row #{w.selected_index || "none"} ") }
|
107
|
+
form.add_widget lb, lb2
|
108
|
+
form.add_widget tb
|
109
|
+
form.add_widget ab
|
110
|
+
form.add_widget logb, box, bbox
|
111
|
+
form.pack
|
112
|
+
form.select_first_field
|
113
|
+
win.wrefresh
|
114
|
+
|
115
|
+
y = x = 1
|
116
|
+
while (ch = win.getkey) != FFI::NCurses::KEY_CTRL_Q
|
117
|
+
begin
|
118
|
+
form.handle_key ch
|
119
|
+
rescue => e
|
120
|
+
puts e
|
121
|
+
puts e.backtrace.join("\n")
|
122
|
+
alert e.to_s
|
123
|
+
end
|
124
|
+
win.wrefresh
|
125
|
+
end
|
126
|
+
end # close
|
127
|
+
|
128
|
+
rescue => e
|
129
|
+
win.destroy if win
|
130
|
+
win = nil
|
131
|
+
FFI::NCurses.endwin
|
132
|
+
puts e
|
133
|
+
puts e.backtrace.join("\n")
|
134
|
+
ensure
|
135
|
+
win.destroy if win
|
136
|
+
FFI::NCurses.endwin
|
137
|
+
if e
|
138
|
+
puts e
|
139
|
+
puts e.backtrace.join("\n")
|
140
|
+
end
|
141
|
+
end
|
data/examples/exm1.rb
ADDED
@@ -0,0 +1,137 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# example showing only labels and fields a window
|
3
|
+
# 2018-03-10
|
4
|
+
require 'umbra'
|
5
|
+
require 'umbra/label'
|
6
|
+
require 'umbra/button'
|
7
|
+
require 'umbra/labeledfield'
|
8
|
+
require 'umbra/messagebox'
|
9
|
+
|
10
|
+
def create_footer_window h = 2 , w = FFI::NCurses.COLS, t = FFI::NCurses.LINES-2, l = 0
|
11
|
+
ewin = Window.new(h, w , t, l)
|
12
|
+
end
|
13
|
+
def old_alert str
|
14
|
+
win = create_footer_window
|
15
|
+
#FFI::NCurses.init_pair(12, COLOR_WHITE, FFI::NCurses::RED)
|
16
|
+
cp = create_color_pair(COLOR_RED, COLOR_WHITE)
|
17
|
+
win.wbkgd(FFI::NCurses.COLOR_PAIR(cp)) # white on red, defined here
|
18
|
+
win.printstring(0,1, str)
|
19
|
+
win.wrefresh
|
20
|
+
win.getkey
|
21
|
+
win.destroy
|
22
|
+
end
|
23
|
+
def _alert array, title="Alert"
|
24
|
+
mb = MessageBox.new title: title, buttons: "Ok" do
|
25
|
+
text array
|
26
|
+
end
|
27
|
+
mb.run
|
28
|
+
end
|
29
|
+
def _alert_message str, title="Alert"
|
30
|
+
mb = MessageBox.new title: title, buttons: "Okay" do
|
31
|
+
message str
|
32
|
+
end
|
33
|
+
mb.run
|
34
|
+
end
|
35
|
+
def _alert_fields str
|
36
|
+
#mb = MessageBox.new height: 20, width: 60, row: 5, col: 5, title: "Enter yor name" do
|
37
|
+
mb = MessageBox.new title: "Testing Messageboxes", width: 80 do
|
38
|
+
add Label.new text: "Name"
|
39
|
+
add Field.new name:"name", default: "Rahul", width: 25, color_pair: CP_CYAN, attr: REVERSE
|
40
|
+
add LabeledField.new label:"Age:", name:"age", text:"25", col: 15, color_pair: CP_CYAN, attr: REVERSE
|
41
|
+
# unfortunately this exceeds since width only takes field into account not label
|
42
|
+
add LabeledField.new label:"Address:", name:"address", width:50 , col: 15, color_pair: CP_CYAN, attr: REVERSE
|
43
|
+
end
|
44
|
+
mb.run
|
45
|
+
end
|
46
|
+
def startup
|
47
|
+
require 'logger'
|
48
|
+
require 'date'
|
49
|
+
|
50
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"v.log")
|
51
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
52
|
+
$log = Logger.new(path)
|
53
|
+
$log.level = Logger::DEBUG
|
54
|
+
today = Date.today
|
55
|
+
$log.info "MessageBox demo #{$0} started on #{today}"
|
56
|
+
FFI::NCurses.init_pair(10, FFI::NCurses::BLACK, FFI::NCurses::GREEN) # statusline
|
57
|
+
end
|
58
|
+
def statusline win, str, col = 0
|
59
|
+
win.printstring( FFI::NCurses.LINES-1, col, str, 10)
|
60
|
+
end
|
61
|
+
begin
|
62
|
+
include Umbra
|
63
|
+
init_curses
|
64
|
+
startup
|
65
|
+
#FFI::NCurses.init_pair(12, COLOR_WHITE, FFI::NCurses::RED)
|
66
|
+
win = Window.new
|
67
|
+
statusline(win, " "*(win.width-0), 0)
|
68
|
+
statusline(win, "Press C-q to quit #{win.height}:#{win.width}", 20)
|
69
|
+
title = Label.new( :text => "Demo of MessageBox", :row => 0, :col => 0 , :width => FFI::NCurses.COLS-1,
|
70
|
+
:justify => :center, :color_pair => CP_BLACK)
|
71
|
+
|
72
|
+
form = Form.new win
|
73
|
+
form.add_widget title
|
74
|
+
|
75
|
+
b1 = Button.new text: "String", row: 10, col: 10
|
76
|
+
b2 = Button.new text: "Array", row: 10, col: 30
|
77
|
+
b3 = Button.new text: "Fields", row: 10, col: 50
|
78
|
+
b4 = Button.new text: "Confirm", row: 10, col: 70
|
79
|
+
message_label = Label.new({text: "Message comes here C-q to quit",
|
80
|
+
:name=>"message_label",:row => win.height-2, :col => 2, :width => 60,
|
81
|
+
:height => 2, :color_pair => CP_MAGENTA})
|
82
|
+
b1.command do
|
83
|
+
_alert_message "This is an alert with a string"
|
84
|
+
end
|
85
|
+
b2.command do
|
86
|
+
array = File.read($0).split("\n")
|
87
|
+
_alert(array, $0)
|
88
|
+
end
|
89
|
+
b3.command do
|
90
|
+
_alert_fields "dummy"
|
91
|
+
end
|
92
|
+
b4.command do
|
93
|
+
ret = confirm "Do you wish to go?"
|
94
|
+
message_label.text = "You selected #{ret}"
|
95
|
+
#message_label.touch
|
96
|
+
end
|
97
|
+
form.add_widget message_label, b1, b2, b3, b4
|
98
|
+
form.pack
|
99
|
+
form.select_first_field
|
100
|
+
win.wrefresh
|
101
|
+
|
102
|
+
y = x = 1
|
103
|
+
while (ch = win.getkey) != FFI::NCurses::KEY_CTRL_Q
|
104
|
+
begin
|
105
|
+
form.handle_key ch
|
106
|
+
rescue => e
|
107
|
+
#_alert(e.to_s.strip + ".")
|
108
|
+
|
109
|
+
_alert(["Error in Messagebox: #{e} ", *e.backtrace], "Exception")
|
110
|
+
#_alert(e.backtrace)
|
111
|
+
$log.error e
|
112
|
+
$log.error e.backtrace.join("\n")
|
113
|
+
e = nil
|
114
|
+
end
|
115
|
+
win.wrefresh
|
116
|
+
end
|
117
|
+
|
118
|
+
rescue => e
|
119
|
+
win.destroy if win
|
120
|
+
FFI::NCurses.endwin
|
121
|
+
$log.error e
|
122
|
+
$log.error e.backtrace.join("\n")
|
123
|
+
puts "printing inside rescue"
|
124
|
+
puts e
|
125
|
+
puts e.backtrace.join("\n")
|
126
|
+
e = nil
|
127
|
+
ensure
|
128
|
+
win.destroy if win
|
129
|
+
FFI::NCurses.endwin
|
130
|
+
if e
|
131
|
+
$log.error e
|
132
|
+
$log.error e.backtrace.join("\n")
|
133
|
+
puts "printing inside ensure"
|
134
|
+
puts e
|
135
|
+
puts e.backtrace.join("\n")
|
136
|
+
end
|
137
|
+
end
|
data/examples/keys.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
require 'umbra'
|
4
|
+
require 'umbra/form'
|
5
|
+
|
6
|
+
def startup
|
7
|
+
require 'logger'
|
8
|
+
require 'date'
|
9
|
+
|
10
|
+
path = File.join(ENV["LOGDIR"] || "./" ,"v.log")
|
11
|
+
file = File.open(path, File::WRONLY|File::TRUNC|File::CREAT)
|
12
|
+
$log = Logger.new(path)
|
13
|
+
$log.level = Logger::DEBUG
|
14
|
+
today = Date.today
|
15
|
+
$log.info "Started up on #{today}"
|
16
|
+
FFI::NCurses.init_pair(10, FFI::NCurses::BLACK, FFI::NCurses::GREEN) # statusline
|
17
|
+
end
|
18
|
+
begin
|
19
|
+
include Umbra
|
20
|
+
init_curses
|
21
|
+
startup
|
22
|
+
txt = "Demo of keys. Press various keys to see what value comes"
|
23
|
+
win = Window.new
|
24
|
+
win.printstr txt
|
25
|
+
win.printstr("Press Ctrl-Q to quit", 1, 50)
|
26
|
+
|
27
|
+
win.wrefresh
|
28
|
+
|
29
|
+
form = Form.new win
|
30
|
+
|
31
|
+
ch = 0
|
32
|
+
y = x = 1
|
33
|
+
while (ch = win.getch) != FFI::NCurses::KEY_CTRL_Q
|
34
|
+
next if ch == -1
|
35
|
+
if ch == 2727 #or ch == -1
|
36
|
+
$log.debug "t.rb got #{ch}"
|
37
|
+
break
|
38
|
+
end
|
39
|
+
rv = nil
|
40
|
+
#rv = win.mvwin(y, x)
|
41
|
+
|
42
|
+
case ch
|
43
|
+
when Integer
|
44
|
+
win.printstring y, x, "#{ch.to_s}:#{FFI::NCurses::keyname(ch)}"
|
45
|
+
when String
|
46
|
+
win.printstring y, x, "#{ch.to_s}"
|
47
|
+
end
|
48
|
+
y += 1
|
49
|
+
# start a new column if we exceed last line
|
50
|
+
if y >= FFI::NCurses.LINES-1
|
51
|
+
y = 1
|
52
|
+
x += 10
|
53
|
+
end
|
54
|
+
|
55
|
+
win.wrefresh
|
56
|
+
end
|
57
|
+
|
58
|
+
rescue Object => e
|
59
|
+
@window.destroy if @window
|
60
|
+
FFI::NCurses.endwin
|
61
|
+
puts e
|
62
|
+
puts e.backtrace.join("\n")
|
63
|
+
ensure
|
64
|
+
@window.destroy if @window
|
65
|
+
FFI::NCurses.endwin
|
66
|
+
puts
|
67
|
+
end
|