reterm 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/designer/src/ComponentParams.rb +89 -42
- data/designer/src/ComponentsList.rb +26 -25
- data/designer/src/CreatedList.rb +9 -0
- data/designer/src/Designer.rb +23 -1
- data/designer/src/ToggleArea.rb +20 -3
- data/designer/src/about.rb +35 -0
- data/designer/src/component_factory.rb +18 -0
- data/designer/src/component_map.rb +7 -0
- data/designer/src/file_chooser.rb +25 -0
- data/designer/src/glade/Designer.glade +1 -19
- data/designer/src/images/{slist.png → scroll_list.png} +0 -0
- data/lib/reterm.rb +10 -1
- data/lib/reterm/color_pair.rb +166 -10
- data/lib/reterm/component.rb +89 -2
- data/lib/reterm/components.rb +16 -1
- data/lib/reterm/components/alphalist.rb +45 -0
- data/lib/reterm/components/ascii_text.rb +14 -1
- data/lib/reterm/components/asciimator.rb +1 -0
- data/lib/reterm/components/button.rb +35 -5
- data/lib/reterm/components/button_box.rb +108 -0
- data/lib/reterm/components/close_button.rb +22 -0
- data/lib/reterm/components/cmd_output.rb +69 -0
- data/lib/reterm/components/dial.rb +11 -2
- data/lib/reterm/components/dialog.rb +41 -1
- data/lib/reterm/components/drop_down_menu.rb +140 -0
- data/lib/reterm/components/entry.rb +42 -14
- data/lib/reterm/components/histogram.rb +55 -0
- data/lib/reterm/components/hslider.rb +9 -0
- data/lib/reterm/components/image.rb +9 -0
- data/lib/reterm/components/isometric.rb +38 -0
- data/lib/reterm/components/label.rb +20 -3
- data/lib/reterm/components/matrix.rb +9 -0
- data/lib/reterm/components/multi_line_entry.rb +54 -0
- data/lib/reterm/components/password_entry.rb +15 -0
- data/lib/reterm/components/radio.rb +10 -0
- data/lib/reterm/components/revealing_label.rb +126 -0
- data/lib/reterm/components/rocker.rb +21 -11
- data/lib/reterm/components/scroll_list.rb +96 -0
- data/lib/reterm/components/scrolling_area.rb +50 -0
- data/lib/reterm/components/select_list.rb +67 -0
- data/lib/reterm/components/splash.rb +85 -0
- data/lib/reterm/components/template.rb +12 -1
- data/lib/reterm/components/treeview.rb +1 -0
- data/lib/reterm/components/vslider.rb +11 -2
- data/lib/reterm/components/youtube.rb +20 -0
- data/lib/reterm/config.rb +22 -0
- data/lib/reterm/init.rb +131 -6
- data/lib/reterm/layout.rb +147 -11
- data/lib/reterm/layouts.rb +1 -0
- data/lib/reterm/layouts/grid.rb +69 -0
- data/lib/reterm/layouts/horizontal.rb +25 -4
- data/lib/reterm/layouts/vertical.rb +26 -5
- data/lib/reterm/loader.rb +2 -2
- data/lib/reterm/mixins/button_helpers.rb +7 -0
- data/lib/reterm/mixins/cdk_component.rb +66 -2
- data/lib/reterm/mixins/common_controls.rb +15 -0
- data/lib/reterm/mixins/common_keys.rb +20 -0
- data/lib/reterm/mixins/component_input.rb +62 -14
- data/lib/reterm/mixins/event_dispatcher.rb +2 -0
- data/lib/reterm/mixins/item_helpers.rb +8 -0
- data/lib/reterm/mixins/key_bindings.rb +23 -0
- data/lib/reterm/mixins/log_helpers.rb +13 -0
- data/lib/reterm/mixins/mouse_input.rb +58 -0
- data/lib/reterm/mixins/nav_controls.rb +33 -0
- data/lib/reterm/mixins/nav_input.rb +161 -69
- data/lib/reterm/terminal.rb +6 -2
- data/lib/reterm/util.rb +121 -0
- data/lib/reterm/version.rb +1 -1
- data/lib/reterm/window.rb +295 -29
- metadata +33 -17
- data/designer/src/images/orig/Check.png +0 -0
- data/designer/src/images/orig/ascii_text.png +0 -0
- data/designer/src/images/orig/button.png +0 -0
- data/designer/src/images/orig/dial.png +0 -0
- data/designer/src/images/orig/entry.png +0 -0
- data/designer/src/images/orig/hslider.png +0 -0
- data/designer/src/images/orig/label.png +0 -0
- data/designer/src/images/orig/matrix.png +0 -0
- data/designer/src/images/orig/radio.png +0 -0
- data/designer/src/images/orig/rocker.png +0 -0
- data/designer/src/images/orig/slist.png +0 -0
- data/designer/src/images/orig/vslider.png +0 -0
- data/lib/reterm/components/slist.rb +0 -32
- data/lib/reterm/menu.rb +0 -81
@@ -0,0 +1,45 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
# Alpha List CDK Component
|
4
|
+
class AlphaList < Component
|
5
|
+
include CDKComponent
|
6
|
+
include ItemHelpers
|
7
|
+
|
8
|
+
# Initialize the AlphaList component
|
9
|
+
#
|
10
|
+
# @param [Hash] args list params
|
11
|
+
# @option args [String] :title title of list
|
12
|
+
# @option args [String] :label title of list
|
13
|
+
# @option args [Array<String>] :items items to
|
14
|
+
# populate list with
|
15
|
+
def initialize(args={})
|
16
|
+
super
|
17
|
+
@title = args[:title] || ""
|
18
|
+
@label = args[:label] || ""
|
19
|
+
@items = args[:items] || []
|
20
|
+
end
|
21
|
+
|
22
|
+
def requested_rows
|
23
|
+
[@items.size + 5, 10].min
|
24
|
+
end
|
25
|
+
|
26
|
+
def requested_cols
|
27
|
+
[@title.size, @label.size, max_item_size, 20].max + 2
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def _component
|
33
|
+
CDK::ALPHALIST.new(window.cdk_scr,
|
34
|
+
2, 1, # x, y
|
35
|
+
window.rows - 2, # height
|
36
|
+
window.cols - 2, # width
|
37
|
+
@title, @label,
|
38
|
+
@items, @items.size,
|
39
|
+
'_', # filler char
|
40
|
+
Ncurses::A_REVERSE, # highlight
|
41
|
+
true, false) # box, shadow
|
42
|
+
end
|
43
|
+
end # AlphaList
|
44
|
+
end # module Components
|
45
|
+
end # module RETerm
|
@@ -12,10 +12,19 @@ module RETerm
|
|
12
12
|
# default empty string
|
13
13
|
# @option args [String] :font font to use
|
14
14
|
def initialize(args={})
|
15
|
+
super
|
15
16
|
@text = args[:text] || ""
|
16
17
|
@font = args[:font]
|
17
18
|
end
|
18
19
|
|
20
|
+
def requested_rows
|
21
|
+
lines.size + 1
|
22
|
+
end
|
23
|
+
|
24
|
+
def requested_cols
|
25
|
+
lines.max { |l1, l2| l1.size <=> l2.size }.size + 1
|
26
|
+
end
|
27
|
+
|
19
28
|
def draw!
|
20
29
|
refresh_win
|
21
30
|
end
|
@@ -31,9 +40,13 @@ module RETerm
|
|
31
40
|
end
|
32
41
|
end
|
33
42
|
|
43
|
+
def lines
|
44
|
+
@lines ||= atext.split("\n")
|
45
|
+
end
|
46
|
+
|
34
47
|
def refresh_win
|
35
48
|
y = 1
|
36
|
-
|
49
|
+
lines.each { |t|
|
37
50
|
window.mvaddstr(y, 1, t)
|
38
51
|
y += 1
|
39
52
|
}
|
@@ -0,0 +1 @@
|
|
1
|
+
# TODO https://www.asciimator.net integration
|
@@ -9,22 +9,52 @@ module RETerm
|
|
9
9
|
# @param [Hash] args button params
|
10
10
|
# @option args [String] :title title of button
|
11
11
|
def initialize(args={})
|
12
|
+
super
|
12
13
|
@title = args[:title] || ""
|
13
14
|
end
|
14
15
|
|
16
|
+
attr_reader :title
|
17
|
+
|
18
|
+
def title=(t)
|
19
|
+
@title = t
|
20
|
+
component.setMessage(t)
|
21
|
+
end
|
22
|
+
|
23
|
+
def skip_formatting=(b)
|
24
|
+
component.skip_formatting = b
|
25
|
+
end
|
26
|
+
|
27
|
+
def requested_rows
|
28
|
+
2
|
29
|
+
end
|
30
|
+
|
31
|
+
def requested_cols
|
32
|
+
@title.size + 1
|
33
|
+
end
|
34
|
+
|
35
|
+
def activate!
|
36
|
+
dispatch :clicked
|
37
|
+
deactivate!
|
38
|
+
end
|
39
|
+
|
40
|
+
def click!
|
41
|
+
activate!
|
42
|
+
end
|
43
|
+
|
15
44
|
private
|
16
45
|
|
17
46
|
def callback
|
18
47
|
proc { |b|
|
19
|
-
|
48
|
+
dispatch :clicked
|
20
49
|
}
|
21
50
|
end
|
22
51
|
|
23
52
|
def _component
|
24
|
-
CDK::BUTTON.new(window.cdk_scr,
|
25
|
-
|
26
|
-
|
27
|
-
|
53
|
+
CDK::BUTTON.new(window.cdk_scr, # cdk screen
|
54
|
+
CDK::CENTER, CDK::CENTER, # x, y
|
55
|
+
@title, # title
|
56
|
+
callback, # click callback
|
57
|
+
false, false) # box, shadow
|
28
58
|
end
|
29
59
|
end # Button
|
30
60
|
end # module Components
|
@@ -0,0 +1,108 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
# CDK ButtonBox Component
|
4
|
+
class ButtonBox < Component
|
5
|
+
include CDKComponent
|
6
|
+
include ButtonHelpers
|
7
|
+
|
8
|
+
attr_accessor :widget
|
9
|
+
|
10
|
+
# Initialize the ButtonBox component
|
11
|
+
#
|
12
|
+
# @param [Hash] args button box params
|
13
|
+
# @option args [Component] :widget component
|
14
|
+
# to include in the button box
|
15
|
+
# @option args [String] :title title
|
16
|
+
# to assign to button box
|
17
|
+
# @option args [String, Array<String>] :buttons string
|
18
|
+
# buttons to assign to dialog
|
19
|
+
#
|
20
|
+
def initialize(args={})
|
21
|
+
super
|
22
|
+
@widget = args[:widget]
|
23
|
+
@title = args[:title] || ""
|
24
|
+
@buttons = [args[:buttons]].flatten.compact
|
25
|
+
|
26
|
+
@buttons = ["OK", "Cancel"] if @buttons.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
def requested_rows
|
30
|
+
@widget.requested_rows
|
31
|
+
end
|
32
|
+
|
33
|
+
def requested_cols
|
34
|
+
[@title.size, total_button_size, @widget.requested_cols].max
|
35
|
+
end
|
36
|
+
|
37
|
+
def close!
|
38
|
+
widget.erase
|
39
|
+
widget.finalize!
|
40
|
+
|
41
|
+
window.erase
|
42
|
+
window.finalize!
|
43
|
+
end
|
44
|
+
|
45
|
+
def window=(win)
|
46
|
+
super(win)
|
47
|
+
cw = win.create_child :rows => widget.requested_rows,
|
48
|
+
:cols => [widget.requested_cols, requested_cols].max
|
49
|
+
raise ArgumentError, "could not create child" if cw.win.nil?
|
50
|
+
cw.component = widget
|
51
|
+
end
|
52
|
+
|
53
|
+
def activate!(*input)
|
54
|
+
widget.draw!
|
55
|
+
component.draw(true)
|
56
|
+
|
57
|
+
if widget.activatable?
|
58
|
+
widget.activate!(*input)
|
59
|
+
else
|
60
|
+
super
|
61
|
+
end
|
62
|
+
|
63
|
+
@buttons[component.current_button]
|
64
|
+
end
|
65
|
+
|
66
|
+
def selected
|
67
|
+
@buttons[component.current_button]
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
|
72
|
+
def _component
|
73
|
+
w = CDK::BUTTONBOX.new(window.cdk_scr,
|
74
|
+
window.win.getbegx,
|
75
|
+
window.win.getbegy +
|
76
|
+
widget.window.rows - 1,
|
77
|
+
(@title.nil? || @title.empty?) ? 1 : 2, # height
|
78
|
+
widget.window.cols - 1, # width
|
79
|
+
@title,
|
80
|
+
1, 2, # rows / cols
|
81
|
+
@buttons, @buttons.size,
|
82
|
+
Ncurses::A_REVERSE, # highligh
|
83
|
+
true, false) # box, shadow
|
84
|
+
|
85
|
+
widget.window.border!
|
86
|
+
|
87
|
+
widget.component.setLLchar(Ncurses::ACS_LTEE) if widget.cdk? && widget.component.respond_to?(:setLLchar)
|
88
|
+
widget.component.setLRchar(Ncurses::ACS_RTEE) if widget.cdk? && widget.component.respond_to?(:setLRchar)
|
89
|
+
|
90
|
+
w.setULchar(Ncurses::ACS_LTEE)
|
91
|
+
w.setURchar(Ncurses::ACS_RTEE)
|
92
|
+
|
93
|
+
# bind tab/left/right key to button box
|
94
|
+
widget_cb = lambda do |widget, key|
|
95
|
+
w.inject(key)
|
96
|
+
return true
|
97
|
+
end
|
98
|
+
|
99
|
+
# TODO allow specific keys overriding of specific keys to be disabled
|
100
|
+
widget.bind_key(CDK::KEY_TAB, widget_cb)
|
101
|
+
widget.bind_key(Ncurses::KEY_LEFT, widget_cb)
|
102
|
+
widget.bind_key(Ncurses::KEY_RIGHT, widget_cb)
|
103
|
+
|
104
|
+
w
|
105
|
+
end
|
106
|
+
end # Dialog
|
107
|
+
end # module Components
|
108
|
+
end # module RETerm
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
class CloseButton < Button
|
4
|
+
def initialize(args={})
|
5
|
+
super({:title => "X"}.merge(args))
|
6
|
+
end
|
7
|
+
|
8
|
+
def activate_focus?
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def callback
|
15
|
+
proc { |b|
|
16
|
+
dispatch :clicked
|
17
|
+
shutdown!
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end # CloseButton
|
21
|
+
end # module Components
|
22
|
+
end # module RETerm
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'timeout'
|
2
|
+
require 'pty'
|
3
|
+
|
4
|
+
module RETerm
|
5
|
+
module Components
|
6
|
+
# Run command, capture and display output
|
7
|
+
class CmdOutput < ScrollingArea
|
8
|
+
# Initialize the CmdOutput component
|
9
|
+
#
|
10
|
+
# @param [Hash] args cmd output params
|
11
|
+
# @option args [String] :cmd command to run
|
12
|
+
def initialize(args={})
|
13
|
+
activate_sync!
|
14
|
+
|
15
|
+
super
|
16
|
+
@cmd = args[:cmd]
|
17
|
+
end
|
18
|
+
|
19
|
+
def running?
|
20
|
+
!!@pid && process_alive?(@pid)
|
21
|
+
end
|
22
|
+
|
23
|
+
def sync!
|
24
|
+
out = nil
|
25
|
+
begin
|
26
|
+
out = @stdout.gets
|
27
|
+
rescue Errno::EIO
|
28
|
+
end
|
29
|
+
self << out if out
|
30
|
+
end
|
31
|
+
|
32
|
+
def finalize!
|
33
|
+
if running?
|
34
|
+
Process.kill @pid
|
35
|
+
@stdout.close
|
36
|
+
@stdout.close
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def start!
|
41
|
+
@stdout, @stdin, @pid = PTY.spawn(@cmd)
|
42
|
+
self
|
43
|
+
end
|
44
|
+
|
45
|
+
def wait
|
46
|
+
while running?
|
47
|
+
begin
|
48
|
+
Timeout.timeout(SYNC_TIMEOUT.to_f/1000) do
|
49
|
+
begin
|
50
|
+
Process.waitpid @pid
|
51
|
+
rescue
|
52
|
+
# rescue needed incase process exit between
|
53
|
+
# running? check and waitpid
|
54
|
+
end
|
55
|
+
end
|
56
|
+
rescue Timeout::Error
|
57
|
+
run_sync!
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# NOTE: at this point process will be closed but
|
62
|
+
# there may still be unread data in stdout/stderr
|
63
|
+
# buffers!!!
|
64
|
+
|
65
|
+
self
|
66
|
+
end
|
67
|
+
end # CmdOutput
|
68
|
+
end # module Components
|
69
|
+
end # module RETerm
|
@@ -20,6 +20,7 @@ module RETerm
|
|
20
20
|
# val = dial.activate!
|
21
21
|
#
|
22
22
|
def initialize(args={})
|
23
|
+
super
|
23
24
|
@initial_value = 0
|
24
25
|
@increment = 0.01
|
25
26
|
@range = [0, 1]
|
@@ -27,6 +28,14 @@ module RETerm
|
|
27
28
|
@value = initial_value
|
28
29
|
end
|
29
30
|
|
31
|
+
def requested_rows
|
32
|
+
7
|
33
|
+
end
|
34
|
+
|
35
|
+
def requested_cols
|
36
|
+
7
|
37
|
+
end
|
38
|
+
|
30
39
|
def draw!
|
31
40
|
refresh_win
|
32
41
|
end
|
@@ -35,9 +44,9 @@ module RETerm
|
|
35
44
|
true
|
36
45
|
end
|
37
46
|
|
38
|
-
def activate!
|
47
|
+
def activate!(*input)
|
39
48
|
refresh_win
|
40
|
-
handle_input
|
49
|
+
handle_input(*input)
|
41
50
|
@value
|
42
51
|
end
|
43
52
|
|
@@ -4,6 +4,13 @@ module RETerm
|
|
4
4
|
class Dialog < Component
|
5
5
|
include CDKComponent
|
6
6
|
|
7
|
+
attr_reader :buttons
|
8
|
+
|
9
|
+
BUTTONS = {
|
10
|
+
:ok => ["</B/24>OK"],
|
11
|
+
:ok_cancel => ["</B/24>OK", "</B16>Cancel"]
|
12
|
+
}
|
13
|
+
|
7
14
|
# Initialize the Dialog component
|
8
15
|
#
|
9
16
|
# @param [Hash] args dialog params
|
@@ -13,10 +20,43 @@ module RETerm
|
|
13
20
|
# buttons to assign to dialog
|
14
21
|
#
|
15
22
|
def initialize(args={})
|
23
|
+
super
|
16
24
|
@message = [args[:message]].flatten.compact
|
17
25
|
@buttons = [args[:buttons]].flatten.compact
|
18
26
|
|
19
|
-
@buttons = [
|
27
|
+
@buttons = BUTTONS[:ok_cancel] if @buttons.empty?
|
28
|
+
end
|
29
|
+
|
30
|
+
def selected
|
31
|
+
strip_formatting(buttons[component.current_button])
|
32
|
+
end
|
33
|
+
|
34
|
+
# Client may invoke this to
|
35
|
+
# - create dialog and window
|
36
|
+
# - activate it
|
37
|
+
# - close / cleanup
|
38
|
+
def self.show(args={})
|
39
|
+
dlg = self.new args
|
40
|
+
win = Window.new
|
41
|
+
win.component = dlg
|
42
|
+
dlg.activate!
|
43
|
+
dlg.close!
|
44
|
+
return "" unless dlg.normal_exit?
|
45
|
+
dlg.selected
|
46
|
+
end
|
47
|
+
|
48
|
+
def requested_rows
|
49
|
+
5
|
50
|
+
end
|
51
|
+
|
52
|
+
def requested_cols
|
53
|
+
[message.size, total_button_size].max
|
54
|
+
end
|
55
|
+
|
56
|
+
def close!
|
57
|
+
window.erase
|
58
|
+
window.finalize!
|
59
|
+
self
|
20
60
|
end
|
21
61
|
|
22
62
|
private
|
@@ -0,0 +1,140 @@
|
|
1
|
+
module RETerm
|
2
|
+
module Components
|
3
|
+
# CDK Drop Down Menu Component
|
4
|
+
class DropDownMenu < Component
|
5
|
+
include CDKComponent
|
6
|
+
|
7
|
+
# Initialize the Menu component
|
8
|
+
#
|
9
|
+
# @param [Hash] args menu params
|
10
|
+
# @option args [Array<Hash<String, Symbol>>] :menus array of menus,
|
11
|
+
# each an hash of item labels / values
|
12
|
+
# @option args [Array<Symbol>] :locs locations of menus
|
13
|
+
# @option args [Symbol] :pos menu position (default top)
|
14
|
+
# @option args [ColorPair] :color color to assign to drop down
|
15
|
+
# menu items
|
16
|
+
# @option args [ColorPair] :backound color pair to assign to
|
17
|
+
# menu bar background color
|
18
|
+
def initialize(args={})
|
19
|
+
super
|
20
|
+
@menus = args[:menus] || []
|
21
|
+
@locs = args[:locs] || 0.upto(size-1).collect { :left }
|
22
|
+
@pos = args[:pos] || :top
|
23
|
+
@color = args[:color]
|
24
|
+
@background = args[:background]
|
25
|
+
|
26
|
+
@prev = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def background?
|
30
|
+
!!@background
|
31
|
+
end
|
32
|
+
|
33
|
+
def finalize!
|
34
|
+
@bgwin.finalize! if background?
|
35
|
+
end
|
36
|
+
|
37
|
+
def menu_list
|
38
|
+
@menus.collect { |m| m.keys }
|
39
|
+
end
|
40
|
+
|
41
|
+
def colored_menu_list
|
42
|
+
return menu_list unless !!@color
|
43
|
+
menu_list.collect { |ms| ms.collect { |m| "#{@color.cdk_fmt}#{m}" }}
|
44
|
+
end
|
45
|
+
|
46
|
+
def size
|
47
|
+
@menus.size
|
48
|
+
end
|
49
|
+
|
50
|
+
def requested_cols
|
51
|
+
total_cols + total_sp + 3
|
52
|
+
end
|
53
|
+
|
54
|
+
def requested_rows
|
55
|
+
max_items + 2
|
56
|
+
end
|
57
|
+
|
58
|
+
def draw!
|
59
|
+
super
|
60
|
+
@bgwin.mvaddstr(0, 0, ' ' * requested_cols) if background?
|
61
|
+
end
|
62
|
+
|
63
|
+
def window=(w)
|
64
|
+
win = super(w)
|
65
|
+
|
66
|
+
# add a window to render menu bar background
|
67
|
+
if background?
|
68
|
+
c = win.create_child :x => 0,
|
69
|
+
:y => 0,
|
70
|
+
:rows => 1,
|
71
|
+
:cols => requested_cols - 2
|
72
|
+
c.colors = @background
|
73
|
+
@bgwin = c
|
74
|
+
end
|
75
|
+
|
76
|
+
win
|
77
|
+
end
|
78
|
+
|
79
|
+
def submenu_sizes
|
80
|
+
@menus.collect { |m| m.size }
|
81
|
+
end
|
82
|
+
|
83
|
+
def selected
|
84
|
+
@menus[component.current_title][@menus[component.current_title].keys[component.current_subtitle+1]]
|
85
|
+
end
|
86
|
+
|
87
|
+
def activate!(*input)
|
88
|
+
r = super
|
89
|
+
return nil if early_exit?
|
90
|
+
m = r / 100
|
91
|
+
i = r % 100
|
92
|
+
|
93
|
+
@menus[m][@menus[m].keys[i+1]]
|
94
|
+
end
|
95
|
+
|
96
|
+
def highlight_focus?
|
97
|
+
false
|
98
|
+
end
|
99
|
+
|
100
|
+
private
|
101
|
+
|
102
|
+
def total_cols
|
103
|
+
menu_list.sum { |m| m.first.size }
|
104
|
+
end
|
105
|
+
|
106
|
+
def total_sp
|
107
|
+
menu_list.size - 1
|
108
|
+
end
|
109
|
+
|
110
|
+
def max_items
|
111
|
+
@menus.max { |m1, m2| m1.size <=> m2.size }.size
|
112
|
+
end
|
113
|
+
|
114
|
+
def _component
|
115
|
+
locs = @locs.collect { |l| (l == :left) ? CDK::LEFT :
|
116
|
+
(l == :right ? CDK::RIGHT : l)}
|
117
|
+
pos = (@pos == :top) ? CDK::TOP :
|
118
|
+
(@pos == :bottom) ? CDK::BOTTOM : @pos
|
119
|
+
|
120
|
+
c = CDK::MENU.new(window.cdk_scr,
|
121
|
+
colored_menu_list, size,
|
122
|
+
submenu_sizes,
|
123
|
+
locs, pos,
|
124
|
+
Ncurses::A_UNDERLINE,
|
125
|
+
Ncurses::A_REVERSE)
|
126
|
+
|
127
|
+
m = self
|
128
|
+
callback = lambda do |cdktype, menu, component, key|
|
129
|
+
component.dispatch :changed
|
130
|
+
end
|
131
|
+
|
132
|
+
c.setPostProcess(callback, self)
|
133
|
+
|
134
|
+
c
|
135
|
+
end
|
136
|
+
end # class DropDownMenu
|
137
|
+
|
138
|
+
DropDown = DropDownMenu
|
139
|
+
end # module Components
|
140
|
+
end # module RETerm
|