class TTY::Prompt::Slider
A class responsible for gathering numeric input from range
@api public
Constants
- FORMAT
- HELP
Public Class Methods
Initailize a Slider
@param [Prompt] prompt
the prompt
@param [Hash] options
the options to configure this slider
@option options [Integer] :min The minimum value @option options [Integer] :max The maximum value @option options [Integer] :step The step value @option options [String] :format The display format
@api public
# File lib/tty/prompt/slider.rb, line 26 def initialize(prompt, **options) @prompt = prompt @prefix = options.fetch(:prefix) { @prompt.prefix } @choices = Choices.new @min = options.fetch(:min, 0) @max = options.fetch(:max, 10) @step = options.fetch(:step, 1) @default = options[:default] @active_color = options.fetch(:active_color) { @prompt.active_color } @help_color = options.fetch(:help_color) { @prompt.help_color } @format = options.fetch(:format) { FORMAT } @quiet = options.fetch(:quiet) { @prompt.quiet } @help = options[:help] @show_help = options.fetch(:show_help) { :start } @symbols = @prompt.symbols.merge(options.fetch(:symbols, {})) @first_render = true @done = false end
Public Instance Methods
Call the slider by passing question
@param [String] question
the question to ask
@apu public
# File lib/tty/prompt/slider.rb, line 166 def call(question, possibilities = nil, &block) @question = question choices(possibilities) if possibilities block.call(self) if block # set up a Choices collection for min, max, step # if no possibilities were supplied choices((@min..@max).step(@step).to_a) if @choices.empty? @active = initial @prompt.subscribe(self) do render end end
Add a single choice
@api public
# File lib/tty/prompt/slider.rb, line 126 def choice(*value, &block) if block @choices << (value << block) else @choices << value end end
Add multiple choices
@param [Array] values
the values to add as choices
@api public
# File lib/tty/prompt/slider.rb, line 140 def choices(values = (not_set = true)) if not_set @choices else values.each { |val| @choices << val } end end
@api public
# File lib/tty/prompt/slider.rb, line 104 def default(value) @default = value end
Default help text
@api public
# File lib/tty/prompt/slider.rb, line 78 def default_help arrows = @symbols[:arrow_left] + "/" + @symbols[:arrow_right] sprintf(HELP, arrows) end
@api public
# File lib/tty/prompt/slider.rb, line 149 def format(value) @format = value end
Set help text
@param [String] text
@api private
# File lib/tty/prompt/slider.rb, line 88 def help(text = (not_set = true)) return @help if !@help.nil? && not_set @help = (@help.nil? && not_set) ? default_help : text end
Setup initial active position
@return [Integer]
@api private
# File lib/tty/prompt/slider.rb, line 62 def initial if @default.nil? # no default - choose the middle option choices.size / 2 elsif default_choice = choices.find_by(:name, @default) # found a Choice by name - use it choices.index(default_choice) else # default is the index number @default - 1 end end
# File lib/tty/prompt/slider.rb, line 180 def keyleft(*) @active -= 1 if @active > 0 end
# File lib/tty/prompt/slider.rb, line 190 def keyreturn(*) @done = true end
# File lib/tty/prompt/slider.rb, line 185 def keyright(*) @active += 1 if (@active + 1) < choices.size end
@api public
# File lib/tty/prompt/slider.rb, line 114 def max(value) @max = value end
@api public
# File lib/tty/prompt/slider.rb, line 109 def min(value) @min = value end
Set quiet mode.
@api public
# File lib/tty/prompt/slider.rb, line 156 def quiet(value) @quiet = value end
Change when help is displayed
@api public
# File lib/tty/prompt/slider.rb, line 97 def show_help(value = (not_set = true)) return @show_ehlp if not_set @show_help = value end
@api public
# File lib/tty/prompt/slider.rb, line 119 def step(value) @step = value end
Change symbols used by this prompt
@param [Hash] new_symbols
the new symbols to use
@api public
# File lib/tty/prompt/slider.rb, line 51 def symbols(new_symbols = (not_set = true)) return @symbols if not_set @symbols.merge!(new_symbols) end
Private Instance Methods
@return [Integer, String]
@api private
# File lib/tty/prompt/slider.rb, line 242 def answer choices[@active].value end
Check if help is always displayed
@api private
# File lib/tty/prompt/slider.rb, line 208 def help_always? @show_help =~ /always/i end
Check if help is shown only on start
@api private
# File lib/tty/prompt/slider.rb, line 201 def help_start? @show_help =~ /start/i end
Clear screen
@param [Integer] lines
the lines to clear
@api private
# File lib/tty/prompt/slider.rb, line 235 def refresh(lines) @prompt.print(@prompt.clear_lines(lines)) end
Render an interactive range slider.
@api private
# File lib/tty/prompt/slider.rb, line 215 def render @prompt.print(@prompt.hide) until @done question = render_question @prompt.print(question) @prompt.read_keypress refresh(question.lines.count) end @prompt.print(render_question) unless @quiet answer ensure @prompt.print(@prompt.show) end
Render question with the slider
@return [String]
@api private
# File lib/tty/prompt/slider.rb, line 251 def render_question header = ["#{@prefix}#{@question} "] if @done header << @prompt.decorate(choices[@active].to_s, @active_color) header << "\n" else header << render_slider end if @first_render && (help_start? || help_always?) || (help_always? && !@done) header << "\n" + @prompt.decorate(help, @help_color) @first_render = false end header.join end
Render slider representation
@return [String]
@api private
# File lib/tty/prompt/slider.rb, line 272 def render_slider slider = (@symbols[:line] * @active) + @prompt.decorate(@symbols[:bullet], @active_color) + (@symbols[:line] * (choices.size - @active - 1)) value = choices[@active].name case @format when Proc @format.call(slider, value) else @format.gsub(":slider", slider) % [value] end end