mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[ruby/reline] Enable to change the background color of dialogs. (https://github.com/ruby/reline/pull/413)
https://github.com/ruby/reline/commit/bd49537964
This commit is contained in:
parent
b6b9a6190d
commit
8c6c3e30f3
4 changed files with 83 additions and 25 deletions
|
@ -33,7 +33,18 @@ module Reline
|
|||
alias_method :==, :match?
|
||||
end
|
||||
CursorPos = Struct.new(:x, :y)
|
||||
DialogRenderInfo = Struct.new(:pos, :contents, :bg_color, :width, :height, :scrollbar, keyword_init: true)
|
||||
DialogRenderInfo = Struct.new(
|
||||
:pos,
|
||||
:contents,
|
||||
:bg_color,
|
||||
:pointer_bg_color,
|
||||
:fg_color,
|
||||
:pointer_fg_color,
|
||||
:width,
|
||||
:height,
|
||||
:scrollbar,
|
||||
keyword_init: true
|
||||
)
|
||||
|
||||
class Core
|
||||
ATTR_READER_NAMES = %i(
|
||||
|
@ -58,6 +69,19 @@ module Reline
|
|||
attr_accessor :last_incremental_search
|
||||
attr_reader :output
|
||||
|
||||
extend Forwardable
|
||||
def_delegators :config,
|
||||
:autocompletion,
|
||||
:autocompletion=,
|
||||
:dialog_default_bg_color,
|
||||
:dialog_default_bg_color=,
|
||||
:dialog_default_fg_color,
|
||||
:dialog_default_fg_color=,
|
||||
:dialog_pointer_bg_color,
|
||||
:dialog_pointer_bg_color=,
|
||||
:dialog_pointer_fg_color,
|
||||
:dialog_pointer_fg_color=
|
||||
|
||||
def initialize
|
||||
self.output = STDOUT
|
||||
@dialog_proc_list = {}
|
||||
|
@ -123,14 +147,6 @@ module Reline
|
|||
@completion_proc = p
|
||||
end
|
||||
|
||||
def autocompletion
|
||||
@config.autocompletion
|
||||
end
|
||||
|
||||
def autocompletion=(val)
|
||||
@config.autocompletion = val
|
||||
end
|
||||
|
||||
def output_modifier_proc=(p)
|
||||
raise ArgumentError unless p.respond_to?(:call) or p.nil?
|
||||
@output_modifier_proc = p
|
||||
|
@ -243,7 +259,16 @@ module Reline
|
|||
context.push(cursor_pos_to_render, result, pointer, dialog)
|
||||
end
|
||||
dialog.pointer = pointer
|
||||
DialogRenderInfo.new(pos: cursor_pos_to_render, contents: result, scrollbar: true, height: 15)
|
||||
DialogRenderInfo.new(
|
||||
pos: cursor_pos_to_render,
|
||||
contents: result,
|
||||
scrollbar: true,
|
||||
height: 15,
|
||||
bg_color: config.dialog_default_bg_color,
|
||||
pointer_bg_color: config.dialog_pointer_bg_color,
|
||||
fg_color: config.dialog_default_fg_color,
|
||||
pointer_fg_color: config.dialog_pointer_fg_color
|
||||
)
|
||||
}
|
||||
Reline::DEFAULT_DIALOG_CONTEXT = Array.new
|
||||
|
||||
|
@ -528,6 +553,10 @@ module Reline
|
|||
def_single_delegators :core, :add_dialog_proc
|
||||
def_single_delegators :core, :dialog_proc
|
||||
def_single_delegators :core, :autocompletion, :autocompletion=
|
||||
def_single_delegators :core, :dialog_default_bg_color, :dialog_default_bg_color=
|
||||
def_single_delegators :core, :dialog_pointer_bg_color, :dialog_pointer_bg_color=
|
||||
def_single_delegators :core, :dialog_default_fg_color, :dialog_default_fg_color=
|
||||
def_single_delegators :core, :dialog_pointer_fg_color, :dialog_pointer_fg_color=
|
||||
|
||||
def_single_delegators :core, :readmultiline
|
||||
def_instance_delegators self, :readmultiline
|
||||
|
@ -550,6 +579,10 @@ module Reline
|
|||
core.filename_quote_characters = ""
|
||||
core.special_prefixes = ""
|
||||
core.add_dialog_proc(:autocomplete, Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE, Reline::DEFAULT_DIALOG_CONTEXT)
|
||||
core.dialog_default_bg_color = 46 # Cyan
|
||||
core.dialog_default_fg_color = 37 # White
|
||||
core.dialog_pointer_bg_color = 45 # Magenta
|
||||
core.dialog_pointer_fg_color = 37 # White
|
||||
}
|
||||
end
|
||||
|
||||
|
|
|
@ -45,6 +45,14 @@ class Reline::Config
|
|||
attr_accessor v
|
||||
end
|
||||
|
||||
attr_accessor(
|
||||
:autocompletion,
|
||||
:dialog_default_bg_color,
|
||||
:dialog_default_fg_color,
|
||||
:dialog_pointer_bg_color,
|
||||
:dialog_pointer_fg_color,
|
||||
)
|
||||
|
||||
def initialize
|
||||
@additional_key_bindings = {} # from inputrc
|
||||
@additional_key_bindings[:emacs] = {}
|
||||
|
@ -69,6 +77,10 @@ class Reline::Config
|
|||
@test_mode = false
|
||||
@autocompletion = false
|
||||
@convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding)
|
||||
@dialog_default_bg_color = nil
|
||||
@dialog_pointer_bg_color = nil
|
||||
@dialog_default_fg_color = nil
|
||||
@dialog_pointer_fg_color = nil
|
||||
end
|
||||
|
||||
def reset
|
||||
|
@ -94,14 +106,6 @@ class Reline::Config
|
|||
(val.respond_to?(:any?) ? val : [val]).any?(@editing_mode_label)
|
||||
end
|
||||
|
||||
def autocompletion=(val)
|
||||
@autocompletion = val
|
||||
end
|
||||
|
||||
def autocompletion
|
||||
@autocompletion
|
||||
end
|
||||
|
||||
def keymap
|
||||
@key_actors[@keymap_label]
|
||||
end
|
||||
|
@ -334,6 +338,14 @@ class Reline::Config
|
|||
@vi_ins_mode_string = retrieve_string(value)
|
||||
when 'emacs-mode-string'
|
||||
@emacs_mode_string = retrieve_string(value)
|
||||
when 'dialog-default-bg-color'
|
||||
@dialog_default_bg_color = value.to_i
|
||||
when 'dialog-pointer-bg-color'
|
||||
@dialog_pointer_bg_color = value.to_i
|
||||
when 'dialog-default-fg-color'
|
||||
@dialog_default_fg_color = value.to_i
|
||||
when 'dialog-pointer-fg-color'
|
||||
@dialog_pointer_fg_color = value.to_i
|
||||
when *VARIABLE_NAMES then
|
||||
variable_name = :"@#{name.tr(?-, ?_)}"
|
||||
instance_variable_set(variable_name, value.nil? || value == '1' || value == 'on')
|
||||
|
|
|
@ -743,17 +743,15 @@ class Reline::LineEditor
|
|||
Reline::IOGate.move_cursor_column(dialog.column)
|
||||
dialog.contents.each_with_index do |item, i|
|
||||
if i == pointer
|
||||
bg_color = '45'
|
||||
fg_color = dialog_render_info.pointer_fg_color
|
||||
bg_color = dialog_render_info.pointer_bg_color
|
||||
else
|
||||
if dialog_render_info.bg_color
|
||||
bg_color = dialog_render_info.bg_color
|
||||
else
|
||||
bg_color = '46'
|
||||
end
|
||||
fg_color = dialog_render_info.fg_color
|
||||
bg_color = dialog_render_info.bg_color
|
||||
end
|
||||
str_width = dialog.width - (dialog.scrollbar_pos.nil? ? 0 : @block_elem_width)
|
||||
str = padding_space_with_escape_sequences(Reline::Unicode.take_range(item, 0, str_width), str_width)
|
||||
@output.write "\e[#{bg_color}m#{str}"
|
||||
@output.write "\e[#{bg_color}m\e[#{fg_color}m#{str}"
|
||||
if dialog.scrollbar_pos and (dialog.scrollbar_pos != old_dialog.scrollbar_pos or dialog.column != old_dialog.column)
|
||||
@output.write "\e[37m"
|
||||
if dialog.scrollbar_pos <= (i * 2) and (i * 2 + 1) < (dialog.scrollbar_pos + bar_height)
|
||||
|
|
|
@ -408,4 +408,19 @@ class Reline::Config::Test < Reline::TestCase
|
|||
ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup
|
||||
ENV['HOME'] = home_backup
|
||||
end
|
||||
|
||||
def test_dialog_configurations
|
||||
@config.read_lines(<<~LINES.lines)
|
||||
set dialog-default-bg-color 1
|
||||
set dialog-pointer-bg-color 2
|
||||
set dialog-default-fg-color 3
|
||||
set dialog-pointer-fg-color 4
|
||||
LINES
|
||||
|
||||
assert_equal 1, @config.dialog_default_bg_color
|
||||
assert_equal 2, @config.dialog_pointer_bg_color
|
||||
assert_equal 3, @config.dialog_default_fg_color
|
||||
assert_equal 4, @config.dialog_pointer_fg_color
|
||||
end
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue