class PhusionPassenger::Utils::TerminalChoiceMenu

Constants

JRUBY

Public Class Methods

new(choices) click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 52
def initialize(choices)
        @choices = choices.map { |choice| Choice.create(choice) }
        @pointer = 0
        @index   = index_choices
end

Public Instance Methods

[](name) click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 84
def [](name)
        return @index[name]
end
display_choices() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 58
def display_choices
        display(render_to_string)
end
query() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 62
def query
        if STDIN.tty?
                done = false
                begin
                        raw_no_echo_mode
                        hide_cursor
                        while !done
                                display_choices
                                done = process_input
                                clear_screen if !done
                        end
                ensure
                        restore_mode
                        show_cursor
                        puts
                end
        else
                display_choices
                puts
        end
end
selected_choices() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 88
def selected_choices
        @choices.find_all{ |c| c.checked? }.map{ |c| c.name }
end

Private Instance Methods

clear_screen() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 164
def clear_screen
        number_of_lines = render_to_string.split("\n").size
        display("\r")
        (number_of_lines - 1).times do
                display(move_up)
        end
end
display(str) click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 159
def display(str)
        STDOUT.write(str)
        STDOUT.flush
end
getchar(io) click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 192
def getchar(io)
        char = io.getc
        char = char.chr if char.is_a?(Integer)
        return char
end
hide_cursor() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 180
def hide_cursor
        display("\x1b[?25l")
end
index_choices() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 95
def index_choices
        index = {}
        @choices.each do |choice|
                index[choice.name] = choice
        end
        return index
end
maybe_utf8(utf8, plain) click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 172
def maybe_utf8(utf8, plain)
        if ENV['UTF8_MENUS'] == '0'
                return plain
        else
                return utf8
        end
end
move_up() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 188
def move_up
        return "\x1b[0A"
end
process_cursor_move() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 121
def process_cursor_move
        if getchar(STDIN) == "["
                case getchar(STDIN)
                when "A" # up
                        @pointer = [@pointer - 1, 0].max
                when "B" # down
                        @pointer = [@pointer + 1, @choices.size - 1].min
                end
        end
end
process_disable_utf8() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 136
def process_disable_utf8
        ENV['UTF8_MENUS'] = '0'
end
process_input() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 103
def process_input
        case getchar(STDIN)
        when "\x1b"
                process_cursor_move
                return false
        when " "
                process_toggle
                return false
        when "!"
                process_disable_utf8
                return false
        when "\r"
                return true
        else
                return false
        end
end
process_toggle() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 132
def process_toggle
        @choices[@pointer].toggle!
end
raw_no_echo_mode() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 203
def raw_no_echo_mode
        input = STDIN.to_inputstream
        output = STDOUT.to_outputstream
        @console = ConsoleReader.new(input, output)
        @console.set_history_enabled(false)
        @console.set_bell_enabled(true)
        @console.set_pagination_enabled(false)
        @terminal_state = @console.getEchoCharacter
        @console.setEchoCharacter(0)
end
render_checkbox(checked) click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 155
def render_checkbox(checked)
        return checked ? maybe_utf8("⬢", "(*)") : maybe_utf8("⬡", "( )")
end
render_pointer(index) click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 151
def render_pointer(index)
        return @pointer == index ? maybe_utf8("‣", ">") : " "
end
render_to_string() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 140
def render_to_string
        str = ""
        @choices.each_with_index do |choice, i|
                pointer = render_pointer(i)
                checkbox = render_checkbox(choice.checked)
                str << " #{pointer} #{checkbox}  #{choice.name}\r\n"
        end
        str.chomp!
        return str
end
restore_mode() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 214
def restore_mode
        @console.setEchoCharacter(@terminal_state)
        @console.get_terminal.restore
end
show_cursor() click to toggle source
# File lib/phusion_passenger/utils/terminal_choice_menu.rb, line 184
def show_cursor
        display("\x1b[?25h")
end